🐐 Index assignment

This commit is contained in:
2026-04-22 16:10:11 +02:00
parent 5418dfa577
commit 27c5f7bf56
5 changed files with 239 additions and 42 deletions

119
tests.py
View File

@@ -1774,7 +1774,7 @@ array_index_assign_tests = [
("DESIGNA a VT [I, II, III]\nDESIGNA a[II] VT X\na[II]",
Program([], [
Designa(ID("a"), DataArray([Numeral("I"), Numeral("II"), Numeral("III")])),
DesignaIndex(ID("a"), Numeral("II"), Numeral("X")),
DesignaIndex(ID("a"), [Numeral("II")], Numeral("X")),
ExpressionStatement(ArrayIndex(ID("a"), Numeral("II"))),
]),
ValInt(10)),
@@ -1782,7 +1782,7 @@ array_index_assign_tests = [
("DESIGNA a VT [I, II, III]\nDESIGNA a[I] VT V\na[I]",
Program([], [
Designa(ID("a"), DataArray([Numeral("I"), Numeral("II"), Numeral("III")])),
DesignaIndex(ID("a"), Numeral("I"), Numeral("V")),
DesignaIndex(ID("a"), [Numeral("I")], Numeral("V")),
ExpressionStatement(ArrayIndex(ID("a"), Numeral("I"))),
]),
ValInt(5)),
@@ -1790,7 +1790,7 @@ array_index_assign_tests = [
("DESIGNA a VT [I, II, III]\nDESIGNA a[III] VT L\na[III]",
Program([], [
Designa(ID("a"), DataArray([Numeral("I"), Numeral("II"), Numeral("III")])),
DesignaIndex(ID("a"), Numeral("III"), Numeral("L")),
DesignaIndex(ID("a"), [Numeral("III")], Numeral("L")),
ExpressionStatement(ArrayIndex(ID("a"), Numeral("III"))),
]),
ValInt(50)),
@@ -1798,7 +1798,7 @@ array_index_assign_tests = [
("DESIGNA a VT [I, II, III]\nDESIGNA a[II] VT X\na[I]",
Program([], [
Designa(ID("a"), DataArray([Numeral("I"), Numeral("II"), Numeral("III")])),
DesignaIndex(ID("a"), Numeral("II"), Numeral("X")),
DesignaIndex(ID("a"), [Numeral("II")], Numeral("X")),
ExpressionStatement(ArrayIndex(ID("a"), Numeral("I"))),
]),
ValInt(1)),
@@ -1807,7 +1807,7 @@ array_index_assign_tests = [
Program([], [
Designa(ID("a"), DataArray([Numeral("I"), Numeral("II"), Numeral("III")])),
Designa(ID("i"), Numeral("II")),
DesignaIndex(ID("a"), ID("i"), Numeral("X")),
DesignaIndex(ID("a"), [ID("i")], Numeral("X")),
ExpressionStatement(ArrayIndex(ID("a"), Numeral("II"))),
]),
ValInt(10)),
@@ -1819,6 +1819,109 @@ class TestArrayIndexAssign(unittest.TestCase):
run_test(self, source, nodes, value)
# --- Multi-dimensional array index assignment ---
multidim_assign_tests = [
# 2D array assignment
("DESIGNA a VT [[I, II], [III, IV]]\nDESIGNA a[I][II] VT X\na[I][II]",
Program([], [
Designa(ID("a"), DataArray([DataArray([Numeral("I"), Numeral("II")]), DataArray([Numeral("III"), Numeral("IV")])])),
DesignaIndex(ID("a"), [Numeral("I"), Numeral("II")], Numeral("X")),
ExpressionStatement(ArrayIndex(ArrayIndex(ID("a"), Numeral("I")), Numeral("II"))),
]),
ValInt(10)),
# other elements unaffected
("DESIGNA a VT [[I, II], [III, IV]]\nDESIGNA a[I][II] VT X\na[II][I]",
Program([], [
Designa(ID("a"), DataArray([DataArray([Numeral("I"), Numeral("II")]), DataArray([Numeral("III"), Numeral("IV")])])),
DesignaIndex(ID("a"), [Numeral("I"), Numeral("II")], Numeral("X")),
ExpressionStatement(ArrayIndex(ArrayIndex(ID("a"), Numeral("II")), Numeral("I"))),
]),
ValInt(3)),
# dict inside array
('DESIGNA a VT [TABVLA {"x" VT I}]\nDESIGNA a[I]["x"] VT X\na[I]["x"]',
Program([], [
Designa(ID("a"), DataArray([DataDict([(String("x"), Numeral("I"))])])),
DesignaIndex(ID("a"), [Numeral("I"), String("x")], Numeral("X")),
ExpressionStatement(ArrayIndex(ArrayIndex(ID("a"), Numeral("I")), String("x"))),
]),
ValInt(10)),
# array inside dict
('DESIGNA d VT TABVLA {"a" VT [I, II]}\nDESIGNA d["a"][I] VT X\nd["a"][I]',
Program([], [
Designa(ID("d"), DataDict([(String("a"), DataArray([Numeral("I"), Numeral("II")]))])),
DesignaIndex(ID("d"), [String("a"), Numeral("I")], Numeral("X")),
ExpressionStatement(ArrayIndex(ArrayIndex(ID("d"), String("a")), Numeral("I"))),
]),
ValInt(10)),
# 3 levels deep
("DESIGNA a VT [[[I]]]\nDESIGNA a[I][I][I] VT X\na[I][I][I]",
Program([], [
Designa(ID("a"), DataArray([DataArray([DataArray([Numeral("I")])])])),
DesignaIndex(ID("a"), [Numeral("I"), Numeral("I"), Numeral("I")], Numeral("X")),
ExpressionStatement(ArrayIndex(ArrayIndex(ArrayIndex(ID("a"), Numeral("I")), Numeral("I")), Numeral("I"))),
]),
ValInt(10)),
]
class TestMultidimAssign(unittest.TestCase):
@parameterized.expand(multidim_assign_tests)
def test_multidim_assign(self, source, nodes, value):
run_test(self, source, nodes, value)
# --- String index assignment ---
string_index_assign_tests = [
# assign to middle character
('DESIGNA s VT "ABCDE"\nDESIGNA s[III] VT "X"\ns',
Program([], [
Designa(ID("s"), String("ABCDE")),
DesignaIndex(ID("s"), [Numeral("III")], String("X")),
ExpressionStatement(ID("s")),
]),
ValStr("ABXDE")),
# assign to first character
('DESIGNA s VT "ABCDE"\nDESIGNA s[I] VT "Z"\ns',
Program([], [
Designa(ID("s"), String("ABCDE")),
DesignaIndex(ID("s"), [Numeral("I")], String("Z")),
ExpressionStatement(ID("s")),
]),
ValStr("ZBCDE")),
# assign to last character
('DESIGNA s VT "ABCDE"\nDESIGNA s[V] VT "Z"\ns',
Program([], [
Designa(ID("s"), String("ABCDE")),
DesignaIndex(ID("s"), [Numeral("V")], String("Z")),
ExpressionStatement(ID("s")),
]),
ValStr("ABCDZ")),
# variable as index
('DESIGNA s VT "ABCDE"\nDESIGNA i VT II\nDESIGNA s[i] VT "X"\ns',
Program([], [
Designa(ID("s"), String("ABCDE")),
Designa(ID("i"), Numeral("II")),
DesignaIndex(ID("s"), [ID("i")], String("X")),
ExpressionStatement(ID("s")),
]),
ValStr("AXCDE")),
# string inside array
('DESIGNA a VT ["ABC", "DEF"]\nDESIGNA a[I][II] VT "X"\na[I]',
Program([], [
Designa(ID("a"), DataArray([String("ABC"), String("DEF")])),
DesignaIndex(ID("a"), [Numeral("I"), Numeral("II")], String("X")),
ExpressionStatement(ArrayIndex(ID("a"), Numeral("I"))),
]),
ValStr("AXC")),
]
class TestStringIndexAssign(unittest.TestCase):
@parameterized.expand(string_index_assign_tests)
def test_string_index_assign(self, source, nodes, value):
run_test(self, source, nodes, value)
# --- Array slicing ---
array_slice_tests = [
@@ -2495,7 +2598,7 @@ dict_assign_tests = [
('DESIGNA d VT TABVLA {"a" VT I}\nDESIGNA d["a"] VT X\nd["a"]',
Program([], [
Designa(ID("d"), DataDict([(String("a"), Numeral("I"))])),
DesignaIndex(ID("d"), String("a"), Numeral("X")),
DesignaIndex(ID("d"), [String("a")], Numeral("X")),
ExpressionStatement(ArrayIndex(ID("d"), String("a"))),
]),
ValInt(10)),
@@ -2503,7 +2606,7 @@ dict_assign_tests = [
('DESIGNA d VT TABVLA {"a" VT I}\nDESIGNA d["b"] VT II\nd["b"]',
Program([], [
Designa(ID("d"), DataDict([(String("a"), Numeral("I"))])),
DesignaIndex(ID("d"), String("b"), Numeral("II")),
DesignaIndex(ID("d"), [String("b")], Numeral("II")),
ExpressionStatement(ArrayIndex(ID("d"), String("b"))),
]),
ValInt(2)),
@@ -2511,7 +2614,7 @@ dict_assign_tests = [
('DESIGNA d VT TABVLA {"a" VT I}\nDESIGNA d["b"] VT II\nd["a"]',
Program([], [
Designa(ID("d"), DataDict([(String("a"), Numeral("I"))])),
DesignaIndex(ID("d"), String("b"), Numeral("II")),
DesignaIndex(ID("d"), [String("b")], Numeral("II")),
ExpressionStatement(ArrayIndex(ID("d"), String("a"))),
]),
ValInt(1)),