Esempio n. 1
0
def assign(self, scope: dict, tree: TypeTree, value):
    if tree.data == "object":
        self.assert_(isinstance(value, VolpeObject),
                     "can only destructure object", tree)
        self.assert_(
            len(tree.children) == len(value.type_dict),
            "only full deconstruction is allowed", tree)
        used = set()
        for i, child in enumerate(tree.children):
            key, attribute = get_obj_key_value(child, i)
            self.assert_(key in value.type_dict,
                         f"object doesn't have attribute {key}", child)
            self.assert_(key not in used, f"{key} has already been used",
                         child)
            used.add(key)
            assign(self, scope, attribute, value.type_dict[key])

    elif tree.data == "attribute":
        self.assert_(
            self.visit(tree) == value, "wrong type in attribute assignment",
            tree)

    elif tree.data == "array":
        self.assert_(isinstance(value, VolpeArray),
                     "can only destructure array", tree)
        self.assert_(value.count == len(tree.children),
                     "array has wrong length", tree)
        for child in tree.children:
            assign(self, scope, child, value.element)

    elif tree.data == "array_index":
        self.assert_(
            self.visit(tree) == value, "wrong type in array assignment", tree)

    else:
        self.assert_(tree.data == "symbol", f"cannot assign to {tree.data}",
                     tree)
        scope[tree.children[0].value] = value

    tree.return_type = value
Esempio n. 2
0
 def escaped_character(tree: TypeTree):
     # let Python parse the escaped character (guaranteed ascii by lark)
     evaluated = eval(f"{tree.children[0]}")
     return tree.return_type(ord(evaluated))
Esempio n. 3
0
 def character(tree: TypeTree):
     return tree.return_type(ord(tree.children[0].value[1]))
Esempio n. 4
0
 def integer(tree: TypeTree):
     return tree.return_type(int(tree.children[0].value))
Esempio n. 5
0
 def visit(self, tree: TypeTree):
     tree.return_type = getattr(self, tree.data)(tree)
     if tree.return_type is None:
         tree.return_type = int1
     return tree.return_type