🐐 __eq__ and precendence rules

This commit is contained in:
2026-04-01 11:12:11 +02:00
parent 58149b5f65
commit 83657f17f5
2 changed files with 546 additions and 139 deletions

View File

@@ -130,6 +130,9 @@ class ExpressionStatement(Node):
def __init__(self, expression) -> None:
self.expression = expression
def __eq__(self, other):
return type(self) == type(other) and self.expression == other.expression
def __repr__(self) -> str:
return self.expression.__repr__()
@@ -141,6 +144,9 @@ class DataArray(Node):
def __init__(self, content) -> None:
self.content = content
def __eq__(self, other):
return type(self) == type(other) and self.content == other.content
def __repr__(self) -> str:
content_string = rep_join(self.content)
return f"Array([{content_string}])"
@@ -158,6 +164,9 @@ class DataRangeArray(Node):
self.from_value = from_value
self.to_value = to_value
def __eq__(self, other):
return type(self) == type(other) and self.from_value == other.from_value and self.to_value == other.to_value
def __repr__(self) -> str:
content_string = rep_join([self.from_value, self.to_value])
return f"RangeArray([{content_string}])"
@@ -172,6 +181,9 @@ class String(Node):
def __init__(self, value) -> None:
self.value = value
def __eq__(self, other):
return type(self) == type(other) and self.value == other.value
def __repr__(self):
return f"String({self.value})"
@@ -183,6 +195,9 @@ class Numeral(Node):
def __init__(self, value) -> None:
self.value = value
def __eq__(self, other):
return type(self) == type(other) and self.value == other.value
def __repr__(self):
return f"Numeral({self.value})"
@@ -194,6 +209,9 @@ class Bool(Node):
def __init__(self, value) -> None:
self.value = value
def __eq__(self, other):
return type(self) == type(other) and self.value == other.value
def __repr__(self):
return f"Bool({self.value})"
@@ -205,6 +223,9 @@ class ModuleCall(BaseBox):
def __init__(self, module_name) -> None:
self.module_name = module_name
def __eq__(self, other):
return type(self) == type(other) and self.module_name == other.module_name
def __repr__(self) -> str:
return f"{self.module_name}"
@@ -213,6 +234,9 @@ class ID(Node):
def __init__(self, name: str) -> None:
self.name = name
def __eq__(self, other):
return type(self) == type(other) and self.name == other.name
def __repr__(self) -> str:
return f"ID({self.name})"
@@ -225,6 +249,9 @@ class Designa(Node):
self.id = variable
self.value = value
def __eq__(self, other):
return type(self) == type(other) and self.id == other.id and self.value == other.value
def __repr__(self) -> str:
id_string = repr(self.id).replace('\n', '\n ')
value_string = repr(self.value).replace('\n', '\n ')
@@ -242,6 +269,9 @@ class Defini(Node):
self.parameters = parameters
self.statements = statements
def __eq__(self, other):
return type(self) == type(other) and self.name == other.name and self.parameters == other.parameters and self.statements == other.statements
def __repr__(self) -> str:
parameter_string = f"parameters([{rep_join(self.parameters)}])"
statements_string = f"statements([{rep_join(self.statements)}])"
@@ -259,6 +289,9 @@ class Redi(Node):
def __init__(self, values) -> None:
self.values = values
def __eq__(self, other):
return type(self) == type(other) and self.values == other.values
def __repr__(self) -> str:
values_string = f"[{rep_join(self.values)}]"
return f"Redi({values_string})"
@@ -276,6 +309,9 @@ class Redi(Node):
class Erumpe(Node):
def __eq__(self, other):
return type(self) == type(other)
def __repr__(self) -> str:
return "Erumpe()"
@@ -285,6 +321,9 @@ class Erumpe(Node):
class Nullus(Node):
def __eq__(self, other):
return type(self) == type(other)
def __repr__(self) -> str:
return "Nullus()"
@@ -298,6 +337,9 @@ class BinOp(Node):
self.right = right
self.op = op
def __eq__(self, other):
return type(self) == type(other) and self.left == other.left and self.right == other.right and self.op == other.op
def __repr__(self) -> str:
binop_string = rep_join([self.left, self.right, self.op])
return f"BinOp({binop_string})"
@@ -334,6 +376,9 @@ class UnaryMinus(Node):
def __init__(self, expr):
self.expr = expr
def __eq__(self, other):
return type(self) == type(other) and self.expr == other.expr
def __repr__(self):
return f"UnaryMinus({self.expr!r})"
@@ -347,6 +392,9 @@ class ArrayIndex(Node):
self.array = array
self.index = index
def __eq__(self, other):
return type(self) == type(other) and self.array == other.array and self.index == other.index
def __repr__(self) -> str:
return f"ArrayIndex({self.array!r}, {self.index!r})"
@@ -366,6 +414,9 @@ class SiStatement(Node):
self.statements = statements
self.else_part = else_part
def __eq__(self, other):
return type(self) == type(other) and self.test == other.test and self.statements == other.statements and self.else_part == other.else_part
def __repr__(self) -> str:
test = repr(self.test)
statements = f"statements([{rep_join(self.statements)}])"
@@ -390,6 +441,9 @@ class DumStatement(Node):
self.test = test
self.statements = statements
def __eq__(self, other):
return type(self) == type(other) and self.test == other.test and self.statements == other.statements
def __repr__(self) -> str:
test = repr(self.test)
statements = f"statements([{rep_join(self.statements)}])"
@@ -418,6 +472,9 @@ class PerStatement(Node):
self.variable_name = variable_name
self.statements = statements
def __eq__(self, other):
return type(self) == type(other) and self.data_list == other.data_list and self.variable_name == other.variable_name and self.statements == other.statements
def __repr__(self) -> str:
test = repr(self.data_list)
variable_name = repr(self.variable_name)
@@ -447,6 +504,9 @@ class Invoca(Node):
self.name = name
self.parameters = parameters
def __eq__(self, other):
return type(self) == type(other) and self.name == other.name and self.parameters == other.parameters
def __repr__(self) -> str:
parameters_string = f"parameters([{rep_join(self.parameters)}])"
invoca_string = rep_join([self.name, parameters_string])
@@ -475,6 +535,9 @@ class BuiltIn(Node):
self.builtin = builtin
self.parameters = parameters
def __eq__(self, other):
return type(self) == type(other) and self.builtin == other.builtin and self.parameters == other.parameters
def __repr__(self) -> str:
parameter_string = f"parameters([{rep_join(self.parameters)}])"
builtin_string = rep_join([self.builtin, parameter_string])
@@ -521,6 +584,9 @@ class Program(BaseBox):
self.modules = module_calls
self.statements = statements
def __eq__(self, other):
return type(self) == type(other) and self.modules == other.modules and self.statements == other.statements
def __repr__(self) -> str:
modules_string = f"modules([{rep_join(self.modules)}])"
statements_string = f"statements([{rep_join(self.statements)}])"