From 4811da4dc05caac86a0f048b91552601278b87ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maximilian=20K=C3=B6hl?= Date: Mon, 29 Jul 2024 11:25:46 +0200 Subject: [PATCH] feat: add array index expressions to MOML parser --- momba/moml/parser.py | 14 ++++++++++++-- tests/test_expr.py | 11 +++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 tests/test_expr.py diff --git a/momba/moml/parser.py b/momba/moml/parser.py index c908a528..5c13967f 100644 --- a/momba/moml/parser.py +++ b/momba/moml/parser.py @@ -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) @@ -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() @@ -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), diff --git a/tests/test_expr.py b/tests/test_expr.py new file mode 100644 index 00000000..a5c48525 --- /dev/null +++ b/tests/test_expr.py @@ -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), + )