diff --git a/src/parsers/BaseExpressionParser.py b/src/parsers/BaseExpressionParser.py index 54027da..be61fe1 100644 --- a/src/parsers/BaseExpressionParser.py +++ b/src/parsers/BaseExpressionParser.py @@ -401,8 +401,8 @@ class BaseExpressionParser(BaseParser): def parse_tokens(self, context, parser_input, error_sink): def stop(): return token.type == TokenKind.EOF or \ - paren_count == 0 and token.type == TokenKind.RPAR or \ - self.parse_tokens_stop_condition(token, parser_input) + paren_count == 0 and (token.type == TokenKind.RPAR or + self.parse_tokens_stop_condition(token, parser_input)) token = parser_input.token if token.type == TokenKind.EOF: diff --git a/src/parsers/ExpressionParser.py b/src/parsers/ExpressionParser.py index aeea408..f7815ff 100644 --- a/src/parsers/ExpressionParser.py +++ b/src/parsers/ExpressionParser.py @@ -39,7 +39,7 @@ class VariableOrNamesParser(BaseExpressionParser): pos = parser_input.pos for i, token in enumerate(parser_input.as_tokens()): if token.type == TokenKind.DOT: - dots_found.append(i) + dots_found.append(i + pos) continue if not (token.type == TokenKind.WHITESPACE or diff --git a/tests/parsers/test_ExpressionParser.py b/tests/parsers/test_ExpressionParser.py index ccc4b0d..a36bac4 100644 --- a/tests/parsers/test_ExpressionParser.py +++ b/tests/parsers/test_ExpressionParser.py @@ -51,6 +51,10 @@ class TestExpressionParser(TestUsingMemoryBasedSheerka): ("func1(one, 1 + 2, func2(3))", FN("func1(", (")", 1), [(VAR("one"), ", "), (EXPR("1 + 2"), ", "), FN("func2(", ")", [EXPR("3")])])), + ("func(var.attr)", FN("func(", ")", [VAR("var.attr")])), + ("func(var1.attr1 and var2.attr2)", FN("func(", ")", [AND(VAR("var1.attr1"), VAR("var2.attr2"))])), + ("func(var1.attr1 > var2.attr2)", FN("func(", ")", [GT(VAR("var1.attr1"), VAR("var2.attr2"))])), + ("func1(var1) and func2(var2)", AND(FN("func1(", ")", [VAR("var1")]), FN("func2(", (")", 1), [VAR("var2")]))) ]) def test_i_can_parse_input(self, expression, expected): sheerka, context, parser, parser_input, error_sink = self.init_parser_with_source(expression) diff --git a/tests/parsers/test_LogicalOperatorParser.py b/tests/parsers/test_LogicalOperatorParser.py index 8fe1570..5449235 100644 --- a/tests/parsers/test_LogicalOperatorParser.py +++ b/tests/parsers/test_LogicalOperatorParser.py @@ -95,7 +95,7 @@ class TestLogicalOperatorParser(TestUsingMemoryBasedSheerka): (")", BuiltinConcepts.NOT_FOR_ME, TokenKind.RPAR, 0), ("one and two(", BuiltinConcepts.ERROR, TokenKind.LPAR, 11), ("one (", BuiltinConcepts.NOT_FOR_ME, TokenKind.LPAR, 4), - ("one (and", BuiltinConcepts.ERROR, TokenKind.LPAR, 4), + ("one (and", BuiltinConcepts.NOT_FOR_ME, TokenKind.LPAR, 4), ("one and two)", BuiltinConcepts.ERROR, TokenKind.RPAR, 11), ("one )", BuiltinConcepts.ERROR, TokenKind.RPAR, 4), ("one ) and", BuiltinConcepts.ERROR, TokenKind.RPAR, 4),