🐐 index assignment
This commit is contained in:
@@ -307,6 +307,33 @@ class Designa(Node):
|
||||
return vtable, ValNul()
|
||||
|
||||
|
||||
class DesignaIndex(Node):
|
||||
def __init__(self, variable: ID, index, value) -> None:
|
||||
self.id = variable
|
||||
self.index = index
|
||||
self.value = value
|
||||
|
||||
def __eq__(self, other):
|
||||
return type(self) == type(other) and self.id == other.id and self.index == other.index and self.value == other.value
|
||||
|
||||
def __repr__(self) -> str:
|
||||
return f"DesignaIndex({self.id!r}, {self.index!r}, {self.value!r})"
|
||||
|
||||
def print(self):
|
||||
return f"DESIGNA {self.id.print()}[{self.index.print()}] VT {self.value.print()}"
|
||||
|
||||
def _eval(self, vtable):
|
||||
vtable, index = self.index.eval(vtable)
|
||||
vtable, val = self.value.eval(vtable)
|
||||
i = index.value()
|
||||
lst = list(vtable[self.id.name].value())
|
||||
if i < 1 or i > len(lst):
|
||||
raise IndexError(f"Index {i} out of range for array of length {len(lst)}")
|
||||
lst[i - 1] = val
|
||||
vtable[self.id.name] = ValList(lst)
|
||||
return vtable, ValNul()
|
||||
|
||||
|
||||
class Defini(Node):
|
||||
def __init__(self, name, parameters, statements) -> None:
|
||||
self.name = name
|
||||
|
||||
@@ -70,6 +70,10 @@ class Parser():
|
||||
def statement_designa(tokens):
|
||||
return ast_nodes.Designa(tokens[1], tokens[3])
|
||||
|
||||
@self.pg.production('statement : KEYWORD_DESIGNA id SYMBOL_LBRACKET expression SYMBOL_RBRACKET KEYWORD_VT expression')
|
||||
def statement_designa_index(tokens):
|
||||
return ast_nodes.DesignaIndex(tokens[1], tokens[3], tokens[6])
|
||||
|
||||
@self.pg.production('statement : expression')
|
||||
def statement_expression(tokens):
|
||||
return ast_nodes.ExpressionStatement(tokens[0])
|
||||
|
||||
Reference in New Issue
Block a user