diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2012-12-30 01:31:39 +0200 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2012-12-30 01:31:39 +0200 |
commit | 676dc51ac9324a7cb992eddc47ae94d941501c4a (patch) | |
tree | be12beea3cc996f6193d31c85693014fde86f7c6 | |
parent | 9f7e1bd826ebce0cab45b9e8c490150a0afd85fc (diff) | |
download | meson-676dc51ac9324a7cb992eddc47ae94d941501c4a.zip meson-676dc51ac9324a7cb992eddc47ae94d941501c4a.tar.gz meson-676dc51ac9324a7cb992eddc47ae94d941501c4a.tar.bz2 |
Can assign values to variables.
-rwxr-xr-x | interpreter.py | 39 |
1 files changed, 28 insertions, 11 deletions
diff --git a/interpreter.py b/interpreter.py index 01064dd..632de0d 100755 --- a/interpreter.py +++ b/interpreter.py @@ -62,6 +62,7 @@ class Interpreter(): self.project = None self.compilers = [] self.executables = {} + self.variables = {} def get_project(self): return self.project @@ -83,11 +84,16 @@ class Interpreter(): statements = self.ast.get_statements() while i < len(statements): cur = statements[i] - if isinstance(cur, nodes.FunctionCall): - self.function_call(cur) - else: - print("Unknown statement in line %d." % cur.lineno()) - i += 1 + self.evaluate_expression(cur) + i += 1 # In THE FUTURE jump over blocks and stuff. + + def evaluate_expression(self, cur): + if isinstance(cur, nodes.FunctionCall): + return self.function_call(cur) + elif isinstance(cur, nodes.Assignment): + return self.assignment(cur) + else: + raise InvalidCode("Unknown statement in line %d." % cur.lineno()) def validate_arguments(self, args, argcount, arg_types): if argcount is not None: @@ -137,22 +143,33 @@ class Interpreter(): func_name = node.get_function_name() args = node.arguments.arguments if func_name == 'project': - self.func_project(node, args) + return self.func_project(node, args) elif func_name == 'message': - self.func_message(node, args) + return self.func_message(node, args) elif func_name == 'language': - self.func_language(node, args) + return self.func_language(node, args) elif func_name == 'executable': - self.func_executable(node, args) + return self.func_executable(node, args) else: raise InvalidCode('Unknown function "%s".' % func_name) + + def assignment(self, node): + var_name = node.var_name + if not isinstance(var_name, nodes.AtomExpression): + raise InvalidArguments('Line %d: Tried to assign value to a non-variable.' % node.lineno()) + value = self.evaluate_expression(node.value) + if value is None: + raise InvalidCode('Line %d: Can not assign None to variable.' % node.lineno()) + if not isinstance(value, InterpreterObject): + raise InvalidCode('Line %d: Tried to assign an invalid value to variable.' % node.lineno()) + self.variables[var_name] = value + return value if __name__ == '__main__': code = """project('myawesomeproject') message('I can haz text printed out?') - message('It workses!') language('c') - executable('prog', 'prog.c') + prog = executable('prog', 'prog.c') """ i = Interpreter(code) i.run() |