diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2012-12-26 20:58:48 +0200 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2012-12-26 20:58:48 +0200 |
commit | cfad3eb37147c3cbe36f53bca54ebb6f10b4c1ce (patch) | |
tree | 63f20cf7b9634d8ab63b07040b19c89a92987c28 | |
parent | f842ef627e9387ed92b6d7e3a0b2a6e087736d7b (diff) | |
download | meson-cfad3eb37147c3cbe36f53bca54ebb6f10b4c1ce.zip meson-cfad3eb37147c3cbe36f53bca54ebb6f10b4c1ce.tar.gz meson-cfad3eb37147c3cbe36f53bca54ebb6f10b4c1ce.tar.bz2 |
Created an interpreter class and even made it interpret something.
-rwxr-xr-x | interpreter.py | 44 | ||||
-rw-r--r-- | nodes.py | 6 | ||||
-rwxr-xr-x | parser.py | 7 |
3 files changed, 56 insertions, 1 deletions
diff --git a/interpreter.py b/interpreter.py new file mode 100755 index 0000000..91b6a7c --- /dev/null +++ b/interpreter.py @@ -0,0 +1,44 @@ +#!/usr/bin/python3 -tt + +# Copyright 2012 Jussi Pakkanen + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import parser +import nodes + +class InterpreterException(Exception): + pass + +class InvalidCode(InterpreterException): + pass + +class Interpreter(): + + def __init__(self, code): + self.ast = parser.build_ast(code) + self.sanity_check_ast() + + def sanity_check_ast(self): + if not isinstance(self.ast, nodes.CodeBlock): + raise InvalidCode('AST is of invalid type. Possibly a bug in the parser.') + if len(self.ast.get_statements()) == 0: + raise InvalidCode('No statements in code.') + first = self.ast.get_statements()[0] + if not isinstance(first, nodes.FunctionCall) or first.get_function_name() != 'project': + raise InvalidCode('First statement must be a call to project') + + +if __name__ == '__main__': + code = "project('myawesomeproject')" + i = Interpreter(code) @@ -50,6 +50,9 @@ class FunctionCall(Statement): Statement.__init__(self) self.func_name = func_name self.arguments = arguments + + def get_function_name(self): + return self.func_name.value class MethodCall(Statement): def __init__(self, object_name, method_name, arguments): @@ -71,6 +74,9 @@ class CodeBlock(Statement): def prepend(self, statement): self.statements = [statement] + self.statements + + def get_statements(self): + return self.statements class Arguments(Statement): def __init__(self): @@ -143,10 +143,15 @@ def test_parser(): objectname.methodname(abc) emptycall() """ + print(build_ast(code)) + +def build_ast(code): + if not code.endswith('\n'): + code = code + '\n' lex.lex() parser = yacc.yacc() result = parser.parse(code) - print(result) + return result if __name__ == '__main__': #test_lexer() |