Skip to content

Commit

Permalink
feat: add array index expressions to MOML parser
Browse files Browse the repository at this point in the history
  • Loading branch information
koehlma committed Jul 29, 2024
1 parent 125d8c6 commit 4811da4
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 2 deletions.
14 changes: 12 additions & 2 deletions momba/moml/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -406,6 +406,16 @@ def _parse_primary(stream: TokenStream, environment: Environment) -> model.Expre
raise stream.make_error("expected primary expression or property")


def _parse_postfix(stream: TokenStream, environment: Environment) -> model.Expression:
expr = _parse_primary(stream, environment=environment)
while stream.accept(lexer.TokenType.LEFT_BRACKET):
idx = parse_expression(stream, environment=environment)
expr = model.expressions.ArrayAccess(expr, idx)
if not stream.accept(lexer.TokenType.RIGHT_BRACKET):
stream.make_error("expected closing bracket")
return expr


def _parse_unary(stream: TokenStream, environment: Environment) -> model.Expression:
if stream.accept(lexer.TokenType.LOGIC_NOT):
operand = _parse_unary(stream, environment=environment)
Expand All @@ -417,7 +427,7 @@ def _parse_unary(stream: TokenStream, environment: Environment) -> model.Express
# FIXME: proper error reporting
assert isinstance(operand, model.Expression)
return expressions.sub(expressions.ensure_expr(0), operand)
return _parse_primary(stream, environment=environment)
return _parse_postfix(stream, environment)


DEFAULT_ENVIRONMENT = Environment()
Expand Down Expand Up @@ -616,7 +626,7 @@ def parse_automaton(stream: TokenStream, ctx: model.Context) -> model.Automaton:
)
else:
raise stream.make_error("unexpected token")
assert destinations, "missign destinations"
assert destinations, "missing destinations"
automaton.create_edge(
location_map[location_name],
tuple(destinations),
Expand Down
11 changes: 11 additions & 0 deletions tests/test_expr.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from momba import model
from momba.moml import expr


def test_expr_array_idx():
assert expr("x[3][4]") == model.expressions.ArrayAccess(
model.expressions.ArrayAccess(
model.expressions.Name("x"), model.expressions.IntegerConstant(3)
),
model.expressions.IntegerConstant(4),
)

0 comments on commit 4811da4

Please sign in to comment.