Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
146 changes: 85 additions & 61 deletions src/compiler/cmp/cil_ast.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# AST
class Node:
pass

Expand All @@ -16,20 +17,6 @@ def __init__(self, name):
self.methods = []


class InstructionNode(Node):
pass


class TypeNameNode(InstructionNode):
def __init__(self, dest, source):
self.dest = dest
self.source = source


class ExitNode(InstructionNode):
pass


class DataNode(Node):
def __init__(self, vname, value):
self.name = vname
Expand All @@ -56,11 +43,19 @@ def __init__(self, name):
self.name = name


class InstructionNode(Node):
def __init__(self):
self.leader = False


class AssignNode(InstructionNode):
def __init__(self, dest, source):
self.dest = dest
self.source = source

def __repr__(self):
return f"{self.dest} = {self.source}"


class ArithmeticNode(InstructionNode):
def __init__(self, dest, left, right):
Expand Down Expand Up @@ -94,34 +89,24 @@ class LessNode(ArithmeticNode):


class EqualNode(ArithmeticNode):
pass
def __repr__(self):
return f"{self.dest} = {self.left} == {self.right}"


class EqualStrNode(ArithmeticNode):
pass


class VoidNode(InstructionNode):
pass


class NotNode(ArithmeticNode):
pass


class ComplementNode(InstructionNode):
def __init__(self, dest, obj):
self.dest = dest
self.obj = obj


class GetAttribNode(InstructionNode):
def __init__(self, dest, obj, attr, computed_type):
self.dest = dest
self.obj = obj
self.attr = attr
self.computed_type = computed_type

def __repr__(self):
return f"{self.dest} = GETATTR {self.obj} {self.attr}"


class SetAttribNode(InstructionNode):
def __init__(self, obj, attr, value, computed_type):
Expand Down Expand Up @@ -150,43 +135,46 @@ class ArrayNode(InstructionNode):


class TypeOfNode(InstructionNode):
def __init__(self, dest, obj):
self.dest = dest
def __init__(self, obj, dest):
self.obj = obj


class NameNode(InstructionNode):
def __init__(self, dest, name):
self.dest = dest
self.name = name

def __repr__(self):
return f"{self.dest} = TYPEOF {self.obj}"


class LabelNode(InstructionNode):
def __init__(self, label):
self.label = label

def __repr__(self):
return f"LABEL {self.label}:"


class GotoNode(InstructionNode):
def __init__(self, label):
self.label = label

def __repr__(self):
return f"GOTO {self.label}"


class GotoIfNode(InstructionNode):
def __init__(self, condition, label):
self.condition = condition
self.label = label

def __repr__(self):
return f"GOTO {self.label} if {self.condition}"


class StaticCallNode(InstructionNode):
def __init__(self, function, dest):
self.function = function
self.dest = dest


class CopyNode(InstructionNode):
def __init__(self, dest, source):
self.dest = dest
self.source = source
def __repr__(self):
return f"{self.dest} = CALL {self.function}"


class DynamicCallNode(InstructionNode):
Expand All @@ -196,22 +184,62 @@ def __init__(self, xtype, method, dest, computed_type):
self.dest = dest
self.computed_type = computed_type

def __repr__(self):
return f"{self.dest} = VCALL {self.type} {self.method}"


class ArgNode(InstructionNode):
def __init__(self, name):
self.name = name

def __repr__(self):
return f"ARG {self.name}"


class ReturnNode(InstructionNode):
def __init__(self, value=None):
self.value = value

def __repr__(self):
return f"RETURN {self.value}"


class LoadNode(InstructionNode):
def __init__(self, dest, msg):
self.dest = dest
self.msg = msg

def __repr__(self):
return f"{self.dest} LOAD {self.msg}"


class ExitNode(InstructionNode):
pass


class TypeNameNode(InstructionNode):
def __init__(self, dest, source):
self.dest = dest
self.source = source

def __repr__(self):
return f"{self.dest} = TYPENAME {self.source}"


class NameNode(InstructionNode):
def __init__(self, dest, name):
self.dest = dest
self.name = name

def __repr__(self):
return f"{self.dest} = NAME {self.name}"


class CopyNode(InstructionNode):
def __init__(self, dest, source):
self.dest = dest
self.source = source


class LengthNode(InstructionNode):
def __init__(self, dest, source):
Expand All @@ -227,10 +255,6 @@ def __init__(self, dest, prefix, suffix, length):
self.length = length


class PrefixNode(InstructionNode):
pass


class SubstringNode(InstructionNode):
def __init__(self, dest, str_value, index, length):
self.dest = dest
Expand All @@ -239,17 +263,6 @@ def __init__(self, dest, str_value, index, length):
self.length = length


class ToStrNode(InstructionNode):
def __init__(self, dest, ivalue):
self.dest = dest
self.ivalue = ivalue


class ReadNode(InstructionNode):
def __init__(self, dest):
self.dest = dest


class ReadStrNode(InstructionNode):
def __init__(self, dest):
self.dest = dest
Expand All @@ -260,21 +273,32 @@ def __init__(self, dest):
self.dest = dest


class PrintNode(InstructionNode):
def __init__(self, str_addr):
self.str_addr = str_addr


class PrintStrNode(InstructionNode):
def __init__(self, value):
self.value = value

def __repr__(self):
return f"PRINTSTR {self.value}"


class PrintIntNode(InstructionNode):
def __init__(self, value):
self.value = value


class ComplementNode(InstructionNode):
def __init__(self, dest, obj):
self.dest = dest
self.obj = obj


class VoidNode(InstructionNode):
pass


class ErrorNode(InstructionNode):
def __init__(self, data_node):
self.data_node = data_node

def __repr__(self):
return f"ERROR {self.data_node}"
12 changes: 0 additions & 12 deletions src/compiler/visitors/cil_formatter.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,10 +82,6 @@ def visit(self, node):
def visit(self, node):
return f"{node.dest} = {node.left} == {node.right}"

@visitor.when(NotNode)
def visit(self, node):
return f"{node.dest} = NOT {node.obj}"

@visitor.when(ComplementNode)
def visit(self, node):
return f"{node.dest} = COMPL {node.obj}"
Expand Down Expand Up @@ -150,14 +146,6 @@ def visit(self, node):
def visit(self, node):
return f"{node.dest} = SUBSTRING {node.index} {node.length}"

@visitor.when(ReadNode)
def visit(self, node):
return f"{node.dest} = READ"

@visitor.when(PrintNode)
def visit(self, node):
return f"PRINT {node.value}"

@visitor.when(ExitNode)
def visit(self, node):
return f"EXIT"
Expand Down
Loading