🐐 Array indexing

This commit is contained in:
2026-03-31 22:10:55 +02:00
parent cdad648f58
commit 58149b5f65
4 changed files with 41 additions and 7 deletions

View File

@@ -342,6 +342,24 @@ class UnaryMinus(Node):
return vtable, ValInt(-val.value())
class ArrayIndex(Node):
def __init__(self, array, index) -> None:
self.array = array
self.index = index
def __repr__(self) -> str:
return f"ArrayIndex({self.array!r}, {self.index!r})"
def _eval(self, vtable):
vtable, array = self.array.eval(vtable)
vtable, index = self.index.eval(vtable)
i = index.value()
lst = array.value()
if i < 1 or i > len(lst):
raise IndexError(f"Index {i} out of range for array of length {len(lst)}")
return vtable, lst[i - 1]
class SiStatement(Node):
def __init__(self, test, statements, else_part) -> None:
self.test = test

View File

@@ -16,6 +16,7 @@ class Parser():
('left', ["SYMBOL_PLUS", "SYMBOL_MINUS"]),
('left', ["SYMBOL_TIMES", "SYMBOL_DIVIDE"]),
('right', ["UMINUS"]),
('left', ["INDEX"]),
]
)
@@ -194,6 +195,10 @@ class Parser():
def range_array(tokens):
return ast_nodes.DataRangeArray(tokens[1], tokens[3])
@self.pg.production('expression : expression SYMBOL_LBRACKET expression SYMBOL_RBRACKET', precedence='INDEX')
def array_index(tokens):
return ast_nodes.ArrayIndex(tokens[0], tokens[2])
# ids
@self.pg.production('ids : SYMBOL_LPARENS id_list')
def ids(tokens):