From 5672ce8542ed6ed77083041c419fc7849e4aa59f Mon Sep 17 00:00:00 2001 From: pca006132 Date: Wed, 29 Jul 2020 10:15:58 +0800 Subject: [PATCH] Updated parser. --- main.py | 84 +++++++++++++++++++++++++++++---------------------------- 1 file changed, 43 insertions(+), 41 deletions(-) diff --git a/main.py b/main.py index 0c423e6..ff85419 100644 --- a/main.py +++ b/main.py @@ -1,5 +1,6 @@ import re import sys +import json def parse_table_entries(fields): """Parse aligned table entries""" @@ -19,10 +20,11 @@ def parse_table_entries(fields): line = yield if line == None: break + line = line.rstrip() if len(line.strip()) == 0: flush() continue - match = pattern.fullmatch(line.strip()) + match = pattern.fullmatch(line) if match is not None: flush() starts = [match.span(v)[0] for v in fields] @@ -42,18 +44,6 @@ def parse_table_entries(fields): flush() return entries -# def parse_register_list(lines): -# """Parse register entry from `pdftotext -layout output` from TRM table""" -# fields = [ -# r'id: \w+', -# r'address: 0x[0-9A-F]+', -# r'size: \d+', -# r'type: \w+', -# r'reset_value: 0x[0-9A-F]+', -# r'description: .+' -# ] -# return parse_table_entries(fields, lines) - def parse_register_fields(): fields = [ r'name: \w+', @@ -73,28 +63,53 @@ def end_iterator(it): return e.value def parse_registers(): + def two_column(width): + fields = [ + f'key: \\w.{{1,{width-2}}}\\s', + r'value: .+' + ] + it = parse_table_entries(fields) + next(it) + return it + def inner(): - pattern = re.compile(r'Name\s+(\w+)') + def_start = re.compile(r'Name\s+(\w+)\s+') + field_start = re.compile(r'\s+Field Name\s+Bits\s+Type\s+Reset ' + r'Value\s+Description\s+') + state = 0 - name = '' it = None - results = {} + results = [] while True: line = yield if line == None: break - line = line.strip() - m = pattern.fullmatch(line) - if m is not None: - if it is not None: - results[name] = end_iterator(it) - name = m.group(1) - it = parse_register_fields() - else: - if it is not None: + line = line + if state == 0: + m = def_start.fullmatch(line) + if m is not None: + if it is not None: + results[-1]['fields']= end_iterator(it) + it = two_column(m.span(1)[0]) it.send(line) + state = 1 + else: + if it is not None: + it.send(line) + elif state == 1: + m = field_start.fullmatch(line) + if m is not None: + if it is not None: + results.append({'def': end_iterator(it)}) + it = parse_register_fields() + state = 0 + else: + if it is not None: + it.send(line) + if it is not None: - results[name] = end_iterator(it) + if state == 0: + results[-1]['fields']= end_iterator(it) return results it = inner() next(it) @@ -139,21 +154,8 @@ def emit_rust(base_addr, ending_addr, registers): code.append(line) return code - - -# if len(sys.argv) != 3: -# print("Pipe pdftotext to stdin, and give starting and ending address" -# "(inclusive) for the registers") -# exit() - -# for line in emit_rust(int(sys.argv[1], 0), int(sys.argv[2], 0), parse_register_list(sys.stdin)): -# print(line) - parser = parse_registers() for line in sys.stdin: parser.send(line) -for k, v in end_iterator(parser).items(): - print(k) - for entry in v: - print(entry) - print('------------') +v = end_iterator(parser) +print(json.dumps(v, indent = 4))