diff options
| author | s-ol <s-ol@users.noreply.github.com> | 2020-05-29 10:41:25 +0000 |
|---|---|---|
| committer | s-ol <s-ol@users.noreply.github.com> | 2020-05-29 11:49:42 +0000 |
| commit | 212ea358c73cd5f3c70d143987472327cf15f653 (patch) | |
| tree | b8ee641d14ae68c5558341a58e6a825930c7b83d /subv.py | |
| parent | fix permissions (diff) | |
| download | subv-212ea358c73cd5f3c70d143987472327cf15f653.tar.gz subv-212ea358c73cd5f3c70d143987472327cf15f653.zip | |
new label-slice syntax in format.py; switch to doctest
Diffstat (limited to 'subv.py')
| -rw-r--r-- | subv.py | 38 |
1 files changed, 37 insertions, 1 deletions
@@ -1,6 +1,8 @@ import re white = re.compile('[ \t\.\n]+') hex = re.compile(r'^\-?(0x)?[0-9a-f]+$') +slice_re = re.compile(r'^([^\[]+)(?:\[(\d+):(\d+)\])?$') +field_re = re.compile(r'^(imm|off)(\d+)$') # parsing @@ -22,6 +24,26 @@ def parse_segment(line): def parse_label(line): return line[:-1] +def parse_reference(part): + ref = part[0] + field = part[1] + + label, hi, lo = slice_re.match(ref).groups() + mode, size = field_re.match(field).groups() + + ref = { + 'label': label, + 'mode': mode, + 'size': int(size), + 'meta': part[2:], + } + + if hi is not None: + ref['hi'] = int(hi) + ref['lo'] = int(lo) + + return ref + def classify(line): if line == '': return 'empty' @@ -71,7 +93,7 @@ def untag(part, expect=None): def format_part(part): if not is_lref(part): first = '{:02x}'.format(part[0]) - part = (first,) + part[1:] + part = (first, *part[1:]) return '/'.join([str(p) for p in part]) def format_instr(inst, comment=None): @@ -80,6 +102,10 @@ def format_instr(inst, comment=None): packed = packed + ' # ' + comment return packed +def join_all(gen): + res = '\n'.join(gen) + return res + import unittest class TestParsing(unittest.TestCase): def test_parse_part(self): @@ -101,6 +127,16 @@ class TestParsing(unittest.TestCase): self.assertEqual(parse_part('label:suff/tag*'), ('label:suff', 'tag*')) self.assertEqual(parse_part('$label:suff/tag*'), ('$label:suff', 'tag*')) + def test_parse_reference(self): + self.assertEqual( + parse_reference(('lbl', 'imm32')), + { 'label': 'lbl', 'hi': None, 'lo': None, 'mode': 'imm', 'size': 32, 'meta': () } + ) + self.assertEqual( + parse_reference(('x[11:0]', 'off12')), + { 'label': 'x', 'hi': 11, 'lo': 0, 'mode': 'off', 'size': 12, 'meta': () } + ) + class TestChecks(unittest.TestCase): def test_is_lref(self): self.assertTrue(is_lref(('hello',))) |
