Refactored table parsing.
This commit is contained in:
parent
9ded99fbc6
commit
24b1fef890
68
main.py
68
main.py
|
@ -1,6 +1,42 @@
|
||||||
|
from typing import Optional, Dict
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
def parse_table_entries(fields, pattern, lines):
|
||||||
|
"""Parse aligned table entries"""
|
||||||
|
prev: Optional[Dict] = None
|
||||||
|
entries = []
|
||||||
|
def flush():
|
||||||
|
nonlocal prev
|
||||||
|
if prev is not None:
|
||||||
|
entries.append(prev['data'])
|
||||||
|
prev = None
|
||||||
|
for line in lines:
|
||||||
|
if len(line.strip()) == 0:
|
||||||
|
flush()
|
||||||
|
continue
|
||||||
|
|
||||||
|
match = pattern.search(line.strip())
|
||||||
|
if match is not None:
|
||||||
|
flush()
|
||||||
|
starts = [match.span(v)[0] for v in fields] + [len(line)]
|
||||||
|
prev = {
|
||||||
|
'data': {v: match.group(v) for v in fields},
|
||||||
|
'starts': starts
|
||||||
|
}
|
||||||
|
elif prev is not None:
|
||||||
|
for i, field in enumerate(fields):
|
||||||
|
v = line[prev['starts'][i]:prev['starts'][i + 1]].strip()
|
||||||
|
if len(v) == 0:
|
||||||
|
continue
|
||||||
|
if prev['data'][field][-1] not in ['-', '_']:
|
||||||
|
v = ' ' + v
|
||||||
|
prev['data'][field] += v
|
||||||
|
|
||||||
|
flush()
|
||||||
|
return entries
|
||||||
|
|
||||||
|
|
||||||
def parse_registers(lines):
|
def parse_registers(lines):
|
||||||
"""Parse register entry from `pdftotext -layout output` from TRM table"""
|
"""Parse register entry from `pdftotext -layout output` from TRM table"""
|
||||||
fields = ['id', 'address', 'size', 'type', 'reset_value', 'description']
|
fields = ['id', 'address', 'size', 'type', 'reset_value', 'description']
|
||||||
|
@ -12,37 +48,7 @@ def parse_registers(lines):
|
||||||
r'(?P<type>\w+)\s+'
|
r'(?P<type>\w+)\s+'
|
||||||
r'(?P<reset_value>0x[0-9A-F]+)\s+'
|
r'(?P<reset_value>0x[0-9A-F]+)\s+'
|
||||||
r'(?P<description>.+)$')
|
r'(?P<description>.+)$')
|
||||||
prev = None
|
return parse_table_entries(fields, ENTRY_PATTERN, lines)
|
||||||
registers = []
|
|
||||||
for line in lines:
|
|
||||||
if len(line.strip()) == 0:
|
|
||||||
if prev is not None:
|
|
||||||
registers.append(prev['reg'])
|
|
||||||
prev = None
|
|
||||||
continue
|
|
||||||
|
|
||||||
match = ENTRY_PATTERN.search(line.strip())
|
|
||||||
if match is not None:
|
|
||||||
if prev is not None:
|
|
||||||
registers.append(prev['reg'])
|
|
||||||
starts = [match.span(v)[0] for v in fields] + [len(line)]
|
|
||||||
prev = {
|
|
||||||
'reg': {v: match.group(v) for v in fields},
|
|
||||||
'starts': starts
|
|
||||||
}
|
|
||||||
elif prev is not None:
|
|
||||||
for i, field in enumerate(fields):
|
|
||||||
v = line[prev['starts'][i]:prev['starts'][i + 1]].strip()
|
|
||||||
if len(v) == 0:
|
|
||||||
continue
|
|
||||||
if prev['reg'][field][-1] not in ['-', '_']:
|
|
||||||
v = ' ' + v
|
|
||||||
prev['reg'][field] += v
|
|
||||||
|
|
||||||
if prev is not None:
|
|
||||||
registers.append(prev['reg'])
|
|
||||||
|
|
||||||
return registers
|
|
||||||
|
|
||||||
def emit_rust(base_addr, ending_addr, registers):
|
def emit_rust(base_addr, ending_addr, registers):
|
||||||
current_addr = base_addr
|
current_addr = base_addr
|
||||||
|
|
Loading…
Reference in New Issue