diff options
Diffstat (limited to 'sgfyacc.py')
-rwxr-xr-x | sgfyacc.py | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/sgfyacc.py b/sgfyacc.py new file mode 100755 index 0000000..e48e6b9 --- /dev/null +++ b/sgfyacc.py @@ -0,0 +1,67 @@ +#!/usr/bin/python + +# -------------------------------------- +# sgyacc.py +""" Parser for SGF """ +# -------------------------------------- + +import ply.yacc as yacc + +from imago.sgfParser.sgflex import tokens +from imago.sgfParser.astNode import ASTNode, Property + +def p_tree(p): + '''tree : LPAREN node RPAREN + | LPAREN tree RPAREN''' + p[0] = p[2] + +def p_node_sequence(p): + '''node : node node''' + p[1].addToSequence(p[2]) + p[0] = p[1] + +def p_node_tree(p): + '''node : node tree''' + p[1].children.append(p[2]) + p[0] = p[1] + +def p_node(p): + 'node : SCOLON' + p[0] = ASTNode() + +def p_node_prop(p): + 'node : node property' + p[1].props[p[2].name] = p[2].value + p[0] = p[1] + +def p_property(p): + 'property : PROPID PROPVALUE' + p[0] = Property(p[1], p[2]) + +def p_property_value(p): + 'property : property PROPVALUE' + p[1].addValue(p[2]) + p[0] = p[1] + +def p_error(_): + """Error rule for syntax errors""" + print("Syntax error in input!") + +def main(): + + # Build the parser + parser = yacc.yacc() + + s = "" + while True: + try: + s = input('calc > ') + except EOFError: + break + if not s: + continue + result = parser.parse(s) + print(result.toString()) + +if __name__ == '__main__': + main() |