diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2012-12-26 18:50:49 +0200 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2012-12-26 18:50:49 +0200 |
commit | 31f72e0a9170e15e372377aa0064a92f31363079 (patch) | |
tree | 8a3edb42d7bb4177058e774a381fba049a6563d4 | |
parent | 7a6713bfe87b2c8d61f5a0800f08ade01fdf93ea (diff) | |
download | meson-31f72e0a9170e15e372377aa0064a92f31363079.zip meson-31f72e0a9170e15e372377aa0064a92f31363079.tar.gz meson-31f72e0a9170e15e372377aa0064a92f31363079.tar.bz2 |
Build AST.
-rwxr-xr-x | builderparser.py | 41 | ||||
-rw-r--r-- | nodes.py | 15 |
2 files changed, 33 insertions, 23 deletions
diff --git a/builderparser.py b/builderparser.py index e3411db..a04e423 100755 --- a/builderparser.py +++ b/builderparser.py @@ -70,56 +70,55 @@ def t_error(t): def p_codeblock(t): 'codeblock : statement EOL codeblock' - print('Codeblock') - pass + cb = t[3] + cb.prepend(t[1]) + t[0] = cb def p_codeblock_last(t): 'codeblock : statement EOL' - print('Single line') - pass - -#def p_codeblock_empty(t): -# 'codeblock :' -# pass + cb = nodes.CodeBlock() + cb.prepend(t[1]) + t[0] = cb def p_expression_atom(t): 'expression : ATOM' - print('Atom: ' + t[1]) - t[0] = t[1] + t[0] = nodes.AtomExpression(t[1]) def p_expression_string(t): 'expression : STRING' - print('String: ' + t[1]) - t[0] = t[1] + t[0] = nodes.StringExpression(t[1]) def p_statement_assign(t): 'statement : expression EQUALS statement' - pass + t[0] = nodes.Assignment(t[1], t[3]) def p_statement_func_call(t): 'statement : expression LPAREN args RPAREN' - print('Function call: %s. Args: %s' % (str(t[1]), str(t[3]))) # t[1]) + t[0] = nodes.FunctionCall(t[1], t[3]) def p_statement_method_call(t): 'statement : expression DOT expression LPAREN args RPAREN' - print('Method call: %s %s. Args: %s' % (str(t[1]), str(t[3]), str(t[5]))) + t[0] = nodes.MethodCall(t[1], t[3], t[5]) def p_statement_expression(t): 'statement : expression' - #print('s-e: ' + t[1]) - t[0] = t[1] + t[0] = nodes.statement_from_expression(t[1]) def p_args_multiple(t): 'args : statement COMMA args' - t[0] = [t[1]] + t[3] + args = t[3] + args.prepend(t[1]) + t[0] = args def p_args_single(t): 'args : statement' - t[0] = [t[1]] + args = nodes.Arguments() + args.prepend(t[1]) + t[0] = args def p_args_none(t): 'args :' - t[0] = [] + t[0] = nodes.Arguments() def p_error(t): print('Parser errored out at: ' + t.value) @@ -144,7 +143,7 @@ def test_parser(): objectname.methodname(abc) emptycall() """ - lexer = lex.lex() + lex.lex() parser = yacc.yacc() result = parser.parse(code) print(result) @@ -68,10 +68,21 @@ class CodeBlock(Statement): def __init__(self): Statement.__init__(self) self.statements = [] + + def prepend(self, statement): + self.statements = [statement] + self.statements + +class Arguments(Statement): + def __init__(self): + Statement.__init__(self) + self.arguments = [] + + def prepend(self, statement): + self.arguments = [statement] + self.arguments def statement_from_expression(expr): - if type(expr) == type(AtomExpression(None)): + if isinstance(expr, AtomExpression): return AtomStatement(expr.value) - if type(expr) == type(StringExpression(None)): + if isinstance(expr, StringExpression): return StringStatement(expr.value) raise RuntimeError('Can not convert unknown expression to a statement.') |