print parse tree

This commit is contained in:
Irmen de Jong 2018-01-05 02:41:38 +01:00
parent 3c70790fbf
commit c587125674
6 changed files with 47 additions and 9 deletions

View File

@ -127,7 +127,7 @@ def t_inlineasm_lbrace(t):
def t_inlineasm_rbrace(t): def t_inlineasm_rbrace(t):
r"\}" r"\}"
t.lexer.level -= 1 t.lexer.level -= 1
#if closing brace, return code fragment # if closing brace, return code fragment
if t.lexer.level == 0: if t.lexer.level == 0:
t.value = t.lexer.lexdata[t.lexer.code_start:t.lexer.lexpos-1] t.value = t.lexer.lexdata[t.lexer.code_start:t.lexer.lexpos-1]
t.type = "INLINEASM" t.type = "INLINEASM"
@ -285,5 +285,5 @@ lexer.error_function = error_function # can override this
if __name__ == "__main__": if __name__ == "__main__":
ply.lex.runmain() ply.lex.runmain()
#lexer = ply.lex.Lexer() # lexer = ply.lex.Lexer()
#ply.lex.runmain(lexer=lexer) # ply.lex.runmain(lexer=lexer)

View File

@ -486,7 +486,7 @@ class Parser:
break # the first import directive actually is not part of the header anymore break # the first import directive actually is not part of the header anymore
else: else:
raise self.PError("invalid directive") raise self.PError("invalid directive")
break # no more directives, header parsing finished! break # no more directives, header parsing finished!
self.prev_line() self.prev_line()
if not self.result.start_address: if not self.result.start_address:
# set the proper default start address # set the proper default start address
@ -844,7 +844,8 @@ class Parser:
groups = match.groupdict() groups = match.groupdict()
subname = groups["subname"] subname = groups["subname"]
return self.parse_call_or_goto(subname, groups["arguments"], None, None, True) return self.parse_call_or_goto(subname, groups["arguments"], None, None, True)
match = re.fullmatch(r"(?P<outputs>[^\(]*\s*=)?\s*(?P<subname>[\S]+?)\s*(?P<preserve>!\s*[A-Z]*)?\s*(\((?P<arguments>.*)\))?\s*", line) match = re.fullmatch(
r"(?P<outputs>[^\(]*\s*=)?\s*(?P<subname>[\S]+?)\s*(?P<preserve>!\s*[A-Z]*)?\s*(\((?P<arguments>.*)\))?\s*", line)
if match: if match:
# subroutine call (not a goto) with possible output param assignment # subroutine call (not a goto) with possible output param assignment
groups = match.groupdict() groups = match.groupdict()

View File

@ -244,7 +244,7 @@ def p_type_opt(p):
def p_dimensions(p): def p_dimensions(p):
"""dimensions : INTEGER """dimensions : INTEGER
| dimensions ',' INTEGER""" | dimensions ',' INTEGER"""
if len(p)==2: if len(p) == 2:
p[0] = [p[1]] p[0] = [p[1]]
else: else:
p[0] = p[1] + [p[3]] p[0] = p[1] + [p[3]]
@ -480,7 +480,7 @@ parser = yacc()
if __name__ == "__main__": if __name__ == "__main__":
import sys import sys
file=sys.stdin # open(sys.argv[1], "rU") file = sys.stdin # open(sys.argv[1], "rU")
result = parser.parse(input=file.read()) or Module(None, SourceRef("@todo-sfile", 1, 1)) result = parser.parse(input=file.read()) or Module(None, SourceRef("@todo-sfile", 1, 1))
print("RESULT") print("RESULT")
print(result.nodes) print(str(result))

View File

@ -702,6 +702,40 @@ class AstNode:
def lineref(self) -> str: def lineref(self) -> str:
return "src l. " + str(self.sourceref.line) return "src l. " + str(self.sourceref.line)
def __str__(self) -> str:
def tostr(node: Any, level: int) -> str:
indent = " "
clsname = node.__class__.__name__
attrs = []
try:
nvars = vars(node)
except TypeError:
if type(node) is str:
sv = repr(node)
if len(sv) > 20:
sv = sv[:20] + "...'"
return sv
return str(node)
for name, value in nvars.items():
if name == "sourceref":
continue
if type(value) in (str, int, float, bool, type(None)):
attrs.append((name, tostr(value, level+1)))
for name, value in nvars.items():
if type(value) is list:
strvalue = "["
strvalue += (",\n" + indent*(level+1)).join(tostr(v, level+1) for v in value) + "\n" + (1+level)*indent + "]"
attrs.append((name, strvalue))
for name, value in nvars.items():
if name == "sourceref":
continue
if type(value) is not list and type(value) not in (str, int, float, bool, type(None)):
attrs.append((name, tostr(value, level+2)))
attrstr = ("\n" + indent*(1+level)).join("{} = {}".format(name, sv) for name, sv in attrs)
result = "\n" + indent * level + "<{0:s} l={1:d} c={2:d}".format(clsname, node.sourceref.line, node.sourceref.column)
return result + "{} |end {} l={:d}|>".format(attrstr, clsname, node.sourceref.line)
return tostr(self, 0)
class Block(AstNode): class Block(AstNode):
_unnamed_block_labels = {} # type: Dict[Block, str] _unnamed_block_labels = {} # type: Dict[Block, str]

View File

@ -2,3 +2,6 @@
follow_imports = normal follow_imports = normal
ignore_missing_imports = True ignore_missing_imports = True
incremental = True incremental = True
[mypy-il65/parsetab.*]
ignore_errors = True

View File

@ -1,3 +1,3 @@
[pycodestyle] [pycodestyle]
max-line-length = 140 max-line-length = 140
exclude = .git,__pycache__,.tox,docs,tests,build,dist exclude = .git,__pycache__,.tox,docs,tests,build,dist,parsetab.py