🐐 Array indexing
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user