|
@@ -2,6 +2,10 @@ import string
|
|
|
from visitor import Visitor
|
|
|
import json
|
|
|
|
|
|
+class Action():
|
|
|
+ def __init__(self, value):
|
|
|
+ self.value = value
|
|
|
+
|
|
|
class PrimitivesVisitor(Visitor):
|
|
|
def __init__(self, args):
|
|
|
Visitor.__init__(self, args)
|
|
@@ -22,10 +26,14 @@ class PrimitivesVisitor(Visitor):
|
|
|
def dict(self, src, val, trgt):
|
|
|
if src is None or trgt is None:
|
|
|
raise Exception("Got None")
|
|
|
- self.output.append(("D", (src, val, trgt)))
|
|
|
+ self.output.append(("D", (src, json.dumps(val), trgt)))
|
|
|
|
|
|
def value(self, value):
|
|
|
- self.output.append(("V", (self.free_id, json.dumps(value))))
|
|
|
+ if isinstance(value, Action):
|
|
|
+ v = value.value
|
|
|
+ else:
|
|
|
+ v = json.dumps(value)
|
|
|
+ self.output.append(("V", (self.free_id, v)))
|
|
|
self.free_id += 1
|
|
|
return self.free_id - 1
|
|
|
|
|
@@ -99,10 +107,10 @@ class PrimitivesVisitor(Visitor):
|
|
|
symbol = self.get_symbol(tree)
|
|
|
|
|
|
if symbol.is_global:
|
|
|
- d = self.value("global")
|
|
|
+ d = self.value(Action("global"))
|
|
|
n = self.value(symbol.name)
|
|
|
else:
|
|
|
- d = self.value("declare")
|
|
|
+ d = self.value(Action("declare"))
|
|
|
n = self.node()
|
|
|
|
|
|
symbol.node = n
|
|
@@ -114,7 +122,7 @@ class PrimitivesVisitor(Visitor):
|
|
|
def visit_assignment(self, tree):
|
|
|
self.visit_children(tree)
|
|
|
|
|
|
- a = self.value("assign")
|
|
|
+ a = self.value(Action("assign"))
|
|
|
var = self.get_primitive(tree.get_tail()[0])
|
|
|
value = self.get_primitive(tree.get_tail()[-1])
|
|
|
self.dict(a, "var", var)
|
|
@@ -176,11 +184,12 @@ class PrimitivesVisitor(Visitor):
|
|
|
# n = self.new_value(tree.get_text())
|
|
|
# self.set_id(tree, n)
|
|
|
# else:
|
|
|
- c = self.value("constant")
|
|
|
+ c = self.value(Action("constant"))
|
|
|
if tree.get_text()[0] == "!":
|
|
|
v = tree.get_text()[1:]
|
|
|
else:
|
|
|
v = tree.get_text()
|
|
|
+ #TODO does this work for actions?
|
|
|
n = self.value(v)
|
|
|
self.dict(c, "node", n)
|
|
|
self.debug(c, tree)
|
|
@@ -198,7 +207,7 @@ class PrimitivesVisitor(Visitor):
|
|
|
r = self.get_primitive(tree)
|
|
|
if r is None:
|
|
|
return
|
|
|
- a = self.value("access")
|
|
|
+ a = self.value(Action("access"))
|
|
|
self.dict(a, "var", r)
|
|
|
self.debug(a, tree)
|
|
|
self.set_primitive(tree, a)
|
|
@@ -207,7 +216,7 @@ class PrimitivesVisitor(Visitor):
|
|
|
symbol = self.get_symbol(tree)
|
|
|
if symbol.name in ["input", "output"]:
|
|
|
return
|
|
|
- r = self.value("resolve")
|
|
|
+ r = self.value(Action("resolve"))
|
|
|
# print symbol.name, symbol.is_func(), symbol.node
|
|
|
self.dict(r, "var", symbol.node)
|
|
|
self.debug(r, tree)
|
|
@@ -238,7 +247,7 @@ class PrimitivesVisitor(Visitor):
|
|
|
|
|
|
arg_nodes_reversed.append(arg_node)
|
|
|
|
|
|
- c = self.value("call")
|
|
|
+ c = self.value(Action("call"))
|
|
|
a = self.get_primitive(tree.get_tail()[0])
|
|
|
self.dict(c, "func", a)
|
|
|
self.debug(c, tree)
|
|
@@ -251,13 +260,13 @@ class PrimitivesVisitor(Visitor):
|
|
|
|
|
|
def visit_input(self, tree):
|
|
|
self.visit_children(tree)
|
|
|
- v = self.value("input")
|
|
|
+ v = self.value(Action("input"))
|
|
|
self.debug(v, tree)
|
|
|
self.set_primitive(tree, v)
|
|
|
|
|
|
def visit_output(self, tree):
|
|
|
self.visit_children(tree)
|
|
|
- v = self.value("output")
|
|
|
+ v = self.value(Action("output"))
|
|
|
self.debug(v, tree)
|
|
|
value = self.get_primitive(tree.get_child("expression"))
|
|
|
self.dict(v, "value", value)
|
|
@@ -272,7 +281,7 @@ class PrimitivesVisitor(Visitor):
|
|
|
first = None
|
|
|
prev = None
|
|
|
for e, b in zip(expressions, blocks):
|
|
|
- v = self.value("if")
|
|
|
+ v = self.value(Action("if"))
|
|
|
self.debug(v, tree)
|
|
|
if first is None:
|
|
|
first = v
|
|
@@ -290,7 +299,7 @@ class PrimitivesVisitor(Visitor):
|
|
|
def visit_while(self, tree):
|
|
|
self.visit_children(tree)
|
|
|
|
|
|
- w = self.value("while")
|
|
|
+ w = self.value(Action("while"))
|
|
|
self.debug(w, tree)
|
|
|
c = self.get_primitive(tree.get_child("expression"))
|
|
|
b = self.get_primitive(tree.get_child("block"))
|
|
@@ -332,16 +341,16 @@ class PrimitivesVisitor(Visitor):
|
|
|
|
|
|
root = self.value(symbol.name)
|
|
|
symbol.node = root
|
|
|
- declare = self.value("global")
|
|
|
+ declare = self.value(Action("global"))
|
|
|
self.dict(declare, "var", root)
|
|
|
|
|
|
- resolve = self.value("resolve")
|
|
|
+ resolve = self.value(Action("resolve"))
|
|
|
self.dict(resolve, "var", root)
|
|
|
|
|
|
- assign = self.value("assign")
|
|
|
+ assign = self.value(Action("assign"))
|
|
|
self.dict(assign, "var", resolve)
|
|
|
|
|
|
- const = self.value("constant")
|
|
|
+ const = self.value(Action("constant"))
|
|
|
self.dict(const, "node", new_value)
|
|
|
self.dict(assign, "value", const)
|
|
|
|
|
@@ -382,17 +391,17 @@ class PrimitivesVisitor(Visitor):
|
|
|
else:
|
|
|
return
|
|
|
|
|
|
- declare = self.value("global")
|
|
|
+ declare = self.value(Action("global"))
|
|
|
self.dict(declare, "var", root)
|
|
|
self.debug(declare, tree)
|
|
|
|
|
|
- resolve = self.value("resolve")
|
|
|
+ resolve = self.value(Action("resolve"))
|
|
|
self.dict(resolve, "var", root)
|
|
|
|
|
|
- assign = self.value("assign")
|
|
|
+ assign = self.value(Action("assign"))
|
|
|
self.dict(assign, "var", resolve)
|
|
|
|
|
|
- const = self.value("constant")
|
|
|
+ const = self.value(Action("constant"))
|
|
|
self.dict(const, "node", new_value)
|
|
|
self.dict(assign, "value", const)
|
|
|
|
|
@@ -402,25 +411,25 @@ class PrimitivesVisitor(Visitor):
|
|
|
symbol = self.get_symbol(tree)
|
|
|
root = self.value(symbol.name)
|
|
|
|
|
|
- declare = self.value("global")
|
|
|
+ declare = self.value(Action("global"))
|
|
|
self.dict(declare, "var", root)
|
|
|
self.debug(declare, tree)
|
|
|
|
|
|
symbol.node = root
|
|
|
|
|
|
- resolve = self.value("resolve")
|
|
|
+ resolve = self.value(Action("resolve"))
|
|
|
self.dict(resolve, "var", root)
|
|
|
|
|
|
- assign = self.value("assign")
|
|
|
+ assign = self.value(Action("assign"))
|
|
|
self.dict(assign, "var", resolve)
|
|
|
|
|
|
self.visit_atomvalue(tree.get_tail()[-1])
|
|
|
value = self.get_primitive(tree.get_tail()[-1])
|
|
|
|
|
|
if value is None:
|
|
|
- call = self.value("call")
|
|
|
- access = self.value("access")
|
|
|
- resolve = self.value("resolve")
|
|
|
+ call = self.value(Action("call"))
|
|
|
+ access = self.value(Action("access"))
|
|
|
+ resolve = self.value(Action("resolve"))
|
|
|
self.dict(call, "func", access)
|
|
|
self.dict(access, "var", resolve)
|
|
|
self.dict(resolve, "var", self.value("create_node"))
|
|
@@ -440,7 +449,7 @@ class PrimitivesVisitor(Visitor):
|
|
|
|
|
|
def visit_return(self, tree):
|
|
|
self.visit_children(tree)
|
|
|
- r = self.value("return")
|
|
|
+ r = self.value(Action("return"))
|
|
|
self.debug(r, tree)
|
|
|
if len(tree.get_tail()) > 2:
|
|
|
v = self.get_primitive(tree.get_tail()[1])
|