Skip to content

Commit 4811da4

Browse files
committed
feat: add array index expressions to MOML parser
1 parent 125d8c6 commit 4811da4

File tree

2 files changed

+23
-2
lines changed

2 files changed

+23
-2
lines changed

momba/moml/parser.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,16 @@ def _parse_primary(stream: TokenStream, environment: Environment) -> model.Expre
406406
raise stream.make_error("expected primary expression or property")
407407

408408

409+
def _parse_postfix(stream: TokenStream, environment: Environment) -> model.Expression:
410+
expr = _parse_primary(stream, environment=environment)
411+
while stream.accept(lexer.TokenType.LEFT_BRACKET):
412+
idx = parse_expression(stream, environment=environment)
413+
expr = model.expressions.ArrayAccess(expr, idx)
414+
if not stream.accept(lexer.TokenType.RIGHT_BRACKET):
415+
stream.make_error("expected closing bracket")
416+
return expr
417+
418+
409419
def _parse_unary(stream: TokenStream, environment: Environment) -> model.Expression:
410420
if stream.accept(lexer.TokenType.LOGIC_NOT):
411421
operand = _parse_unary(stream, environment=environment)
@@ -417,7 +427,7 @@ def _parse_unary(stream: TokenStream, environment: Environment) -> model.Express
417427
# FIXME: proper error reporting
418428
assert isinstance(operand, model.Expression)
419429
return expressions.sub(expressions.ensure_expr(0), operand)
420-
return _parse_primary(stream, environment=environment)
430+
return _parse_postfix(stream, environment)
421431

422432

423433
DEFAULT_ENVIRONMENT = Environment()
@@ -616,7 +626,7 @@ def parse_automaton(stream: TokenStream, ctx: model.Context) -> model.Automaton:
616626
)
617627
else:
618628
raise stream.make_error("unexpected token")
619-
assert destinations, "missign destinations"
629+
assert destinations, "missing destinations"
620630
automaton.create_edge(
621631
location_map[location_name],
622632
tuple(destinations),

tests/test_expr.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from momba import model
2+
from momba.moml import expr
3+
4+
5+
def test_expr_array_idx():
6+
assert expr("x[3][4]") == model.expressions.ArrayAccess(
7+
model.expressions.ArrayAccess(
8+
model.expressions.Name("x"), model.expressions.IntegerConstant(3)
9+
),
10+
model.expressions.IntegerConstant(4),
11+
)

0 commit comments

Comments
 (0)