Browse Source

First commit in making dict_read possible through dictionary access

Yentl Van Tendeloo 9 years ago
parent
commit
24aea38130

+ 5 - 2
interface/HUTN/hutn_compiler/constructors_visitor.py

@@ -124,8 +124,11 @@ class ConstructorsVisitor(Visitor):
         self.visit_literal(tree)
 
     def visit_rvalue(self, tree):
-        self.add_constructors('"access"')
-        self.visit_lvalue(tree)
+        if tree.get_tail()[0].head == "expression":
+            self.visit_expression(tree.get_tail()[0])
+        else:
+            self.add_constructors('"access"')
+            self.visit_lvalue(tree)
 
     def visit_lvalue(self, tree):
         symbol = self.get_symbol(tree)

+ 12 - 7
interface/HUTN/hutn_compiler/primitives_visitor.py

@@ -181,13 +181,18 @@ class PrimitivesVisitor(Visitor):
         self.visit_literal(tree)
 
     def visit_rvalue(self, tree):
-        self.visit_lvalue(tree)
-        r = self.get_primitive(tree)
-        if r is None:
-            return
-        a = self.value("access")
-        self.dict(a, "var", r)
-        self.set_primitive(tree, a)
+        if tree.get_tail()[0].head == "expression":
+            self.visit_expression(tree.get_tail()[0])
+            r = self.get_primitive(tree)
+            self.set_primitive(tree, r)
+        else:
+            self.visit_lvalue(tree)
+            r = self.get_primitive(tree)
+            if r is None:
+                return
+            a = self.value("access")
+            self.dict(a, "var", r)
+            self.set_primitive(tree, a)
 
     def visit_lvalue(self, tree):
         symbol = self.get_symbol(tree)

+ 40 - 2
interface/HUTN/hutn_compiler/semantics_visitor.py

@@ -493,8 +493,46 @@ class SemanticsVisitor(Visitor):
 
     def visit_rvalue(self, tree):
         if len(tree.get_tail()) > 1:
-            # Complex
-            raise Exception("TODO")
+            # Complex: dict_read operation needed
+            child = tree.get_tail()[0]
+            node = tree.get_child("rvalue")
+            expression = tree.get_child("expression")
+            operation = "dict_read"
+            call_tree = SemanticsVisitor.func_call(operation, [node, expression])
+            self.visit(call_tree)
+            tree.replace_child(child, call_tree)
+            self.set_type(tree, self.get_type(node))
+            """
+            child = tree.get_tail()[0]
+            if len(child.get_tail()) > 1:
+                l, op, r = child.get_tail()
+                l_type, r_type = self.get_type(l), self.get_type(r)
+                if type(l_type) != type(r_type):
+                    print("Error: " + str(l_type) + " <-> " + str(r_type))
+                    raise RuntimeError(
+                        "{}:{}:{}: error: children were not casted".format(
+                            self.inputfiles[0],
+                            tree.startpos['line'],
+                            tree.startpos['column']
+                        ))
+                call_name = SemanticsVisitor.call_name_binary(l_type, op)
+                call_tree = SemanticsVisitor.func_call(call_name, [l, r])
+                try:
+                    self.visit(call_tree)
+                except RuntimeError:
+                    call_signature = "{0} function {1}({2}, {2})".format(
+                        str(types_mv.Boolean()), call_name, l_type)
+                    raise RuntimeError(
+                        "{}:{}:{}: error: cannot perform {}: function '{}' is "
+                        "not found".format(
+                            self.inputfiles[0],
+                            tree.startpos['line'],
+                            tree.startpos['column'],
+                            child.head,
+                            call_signature))
+                tree.replace_child(child, call_tree)
+            self.set_type(tree, self.get_type(tree.get_tail()[i]))
+            """
         else:
             # Simple
             self.visit_id(tree)

+ 3 - 1
interface/HUTN/test/constructor_compilation_action_language/code/dict_access.al

@@ -1,6 +1,8 @@
+include "primitives.alh"
+
 Void function my_func():
 	Element d
 	Integer a
 	a = d["a"]["b"]["c"]
 	a = d[a]
-	a = d[123]["e"] + d[111]
+	a = integer_addition(d[123]["e"], d[111])

File diff suppressed because it is too large
+ 1 - 0
interface/HUTN/test/constructor_compilation_action_language/expected/dict_access