aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2012-12-26 20:58:48 +0200
committerJussi Pakkanen <jpakkane@gmail.com>2012-12-26 20:58:48 +0200
commitcfad3eb37147c3cbe36f53bca54ebb6f10b4c1ce (patch)
tree63f20cf7b9634d8ab63b07040b19c89a92987c28
parentf842ef627e9387ed92b6d7e3a0b2a6e087736d7b (diff)
downloadmeson-cfad3eb37147c3cbe36f53bca54ebb6f10b4c1ce.zip
meson-cfad3eb37147c3cbe36f53bca54ebb6f10b4c1ce.tar.gz
meson-cfad3eb37147c3cbe36f53bca54ebb6f10b4c1ce.tar.bz2
Created an interpreter class and even made it interpret something.
-rwxr-xr-xinterpreter.py44
-rw-r--r--nodes.py6
-rwxr-xr-xparser.py7
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)
diff --git a/nodes.py b/nodes.py
index 850cffb..952319d 100644
--- a/nodes.py
+++ b/nodes.py
@@ -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):
diff --git a/parser.py b/parser.py
index a04e423..639a19a 100755
--- a/parser.py
+++ b/parser.py
@@ -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()