From 53ce6c8179293dd2026b646941ad4a5960eba373 Mon Sep 17 00:00:00 2001 From: OdysseasKr Date: Wed, 13 Nov 2024 00:01:29 +0100 Subject: [PATCH 1/5] Allow expression in array definition --- rapidchecker/parser/grammar.py | 2 +- tests/test_grammar.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/rapidchecker/parser/grammar.py b/rapidchecker/parser/grammar.py index 71edda3..58796d3 100644 --- a/rapidchecker/parser/grammar.py +++ b/rapidchecker/parser/grammar.py @@ -60,7 +60,7 @@ (T.PERS | T.VAR | T.CONST) + datatype + identifier - + pp.Optional("{" + pp.pyparsing_common.integer + "}") + + pp.Optional("{" + expression + "}") + pp.Optional(":=" + expression) + ";" ) diff --git a/tests/test_grammar.py b/tests/test_grammar.py index 6779026..6f3b717 100644 --- a/tests/test_grammar.py +++ b/tests/test_grammar.py @@ -140,6 +140,7 @@ def test_record_def(input_str: str) -> None: [ "PERS string varName;", "VAR robtarget targets{1000};", + "VAR robtarget targets{var1 + var2};", "CONST num number := 1 + 1;", ], ) From 97ba6ce474c0d1541f638db02801acd0249e1740 Mon Sep 17 00:00:00 2001 From: OdysseasKr Date: Wed, 13 Nov 2024 00:28:56 +0100 Subject: [PATCH 2/5] Allow named arguments without commas in calls --- rapidchecker/parser/grammar.py | 8 +++++--- tests/test_grammar.py | 2 ++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/rapidchecker/parser/grammar.py b/rapidchecker/parser/grammar.py index 58796d3..69b9b9b 100644 --- a/rapidchecker/parser/grammar.py +++ b/rapidchecker/parser/grammar.py @@ -22,10 +22,12 @@ stmt_block = pp.Forward() stmt = pp.Forward() -# Function call +# Arguments for proc and functon calls named_arg = pp.Combine("\\" + identifier) + pp.Optional(":=" + expression) -# TODO: Allow missing commas before named args -argument_list = pp.Optional(pp.delimitedList(named_arg | expression)) +unnamed_arg = pp.Optional(identifier + ":=") + expression +argument = ("," + (named_arg | unnamed_arg)) | named_arg +argument_list = pp.Optional(named_arg | unnamed_arg) + pp.ZeroOrMore(argument) + function_call = identifier + "(" - argument_list - ")" array = "[" + pp.delimitedList(expression) + "]" diff --git a/tests/test_grammar.py b/tests/test_grammar.py index 6f3b717..5453055 100644 --- a/tests/test_grammar.py +++ b/tests/test_grammar.py @@ -236,6 +236,7 @@ def test_for_stmt(input_str: str) -> None: "callProc arg1, arg2, A AND B;", "callProc arg1, arg2, \\switch;", "callProc arg1, arg2, \\opt:=(1+1), \\switch;", + "callProc arg1, name:=arg2 \\opt:=(1+1) \\switch;", ], ) def test_proc_call_stmt(input_str: str) -> None: @@ -249,6 +250,7 @@ def test_proc_call_stmt(input_str: str) -> None: "callFunc(arg1, arg2, A AND B);", "callFunc(arg1, arg2, \\switch);", "callFunc(arg1, arg2, \\opt:=(1+1), \\switch);", + "callFunc(arg1, name:=arg2 \\opt:=(1+1) \\switch);", ], ) def test_func_call_stmt(input_str: str) -> None: From e1b62215395e1f5898db2f14dc3d497f6be0c58b Mon Sep 17 00:00:00 2001 From: OdysseasKr Date: Wed, 13 Nov 2024 00:41:37 +0100 Subject: [PATCH 3/5] Update README --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 6f9f9e4..dd46a2a 100644 --- a/README.md +++ b/README.md @@ -29,3 +29,8 @@ If any grammar or format errors are found, they are printed to stdout and the co - Add package to pip. - Checks for procedure, variable, function and signal names (enforce camel_case or snakeCase). + +## References + +- ABB RAPID [docs](https://library.e.abb.com/public/f23f1c3e506a4383b635cff165cc6993/3HAC050946+TRM+RAPID+Kernel+RW+6-en.pdf?x-sign=oUq9VZeSx%2Fve4%2BCCAYZVeAQoLxtMdzw6S2BkJobVIFhUVtPrZ8dmV1VIHdk%2B6Yfg) +- [PyParsing](https://pyparsing-docs.readthedocs.io/en/latest/) From a923494aa90f664b4157998b787b8624ce24515e Mon Sep 17 00:00:00 2001 From: OdysseasKr Date: Wed, 13 Nov 2024 00:47:06 +0100 Subject: [PATCH 4/5] Align var names with docs --- rapidchecker/parser/grammar.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/rapidchecker/parser/grammar.py b/rapidchecker/parser/grammar.py index 69b9b9b..a7ff6e3 100644 --- a/rapidchecker/parser/grammar.py +++ b/rapidchecker/parser/grammar.py @@ -23,10 +23,11 @@ stmt = pp.Forward() # Arguments for proc and functon calls -named_arg = pp.Combine("\\" + identifier) + pp.Optional(":=" + expression) -unnamed_arg = pp.Optional(identifier + ":=") + expression -argument = ("," + (named_arg | unnamed_arg)) | named_arg -argument_list = pp.Optional(named_arg | unnamed_arg) + pp.ZeroOrMore(argument) +optional_arg = pp.Combine("\\" + identifier) + pp.Optional(":=" + expression) +required_arg = pp.Optional(identifier + ":=") + expression +first_argument = optional_arg | required_arg +argument = ("," + (optional_arg | required_arg)) | optional_arg +argument_list = pp.Optional(first_argument + pp.ZeroOrMore(argument)) function_call = identifier + "(" - argument_list - ")" From 814758e947b7402e9d0325ffa1c89092f35afbda Mon Sep 17 00:00:00 2001 From: OdysseasKr Date: Wed, 13 Nov 2024 00:47:57 +0100 Subject: [PATCH 5/5] Fix tests --- tests/test_grammar.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_grammar.py b/tests/test_grammar.py index 5453055..69e0a5c 100644 --- a/tests/test_grammar.py +++ b/tests/test_grammar.py @@ -17,7 +17,7 @@ function_call, if_stmt, module, - named_arg, + optional_arg, proc_call_stmt, proc_def, record_def, @@ -76,8 +76,8 @@ def test_stmt_block(valid_block: str) -> None: @pytest.mark.parametrize("input_str", ["\\a", "\\a:=c"]) -def test_named_arg(input_str: str) -> None: - assert named_arg.parseString(input_str, parseAll=True).as_list() +def test_optional_arg(input_str: str) -> None: + assert optional_arg.parseString(input_str, parseAll=True).as_list() @pytest.mark.parametrize("input_str", ["\\a", "\\a, \\b:=c", "\\a, c+1", "a, \\b:=c"])