aboutsummaryrefslogtreecommitdiff
path: root/interpreter.py
diff options
context:
space:
mode:
Diffstat (limited to 'interpreter.py')
-rwxr-xr-xinterpreter.py44
1 files changed, 44 insertions, 0 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)