From 7565ac5a077dfde0a57a116d560e6cdd4a0abe46 Mon Sep 17 00:00:00 2001 From: Justus R Date: Wed, 6 May 2026 00:33:13 +0200 Subject: [PATCH 1/4] demonstration: ASTSysMLFunctionOperatorExpression is wrapped within a CallExpr, corresponding args are only present within that CallExpr --- .../de/monticore/lang/SysMLExpressions.mc4 | 2 +- .../test/java/parser/ExpressionParserTest.java | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/language/src/main/grammars/de/monticore/lang/SysMLExpressions.mc4 b/language/src/main/grammars/de/monticore/lang/SysMLExpressions.mc4 index 91cedf60..6af998ea 100644 --- a/language/src/main/grammars/de/monticore/lang/SysMLExpressions.mc4 +++ b/language/src/main/grammars/de/monticore/lang/SysMLExpressions.mc4 @@ -111,7 +111,7 @@ component grammar SysMLExpressions * name of the function to be invoked and an argument list for any remaining arguments (see 7.4.9.4). This is * useful for chaining invocations in an effective data flow */ - SysMLFunctionOperationExpression implements Expression = + SysMLFunctionOperationExpression implements Expression <291> = Expression "->" Name ("(" (SysMLParameter || ",")* ")")? ("{" SysMLElement* inner:Expression "}")? ; // Eigentlich ist "^" der Name einer CalcDef aus den Domain Libraries diff --git a/language/src/test/java/parser/ExpressionParserTest.java b/language/src/test/java/parser/ExpressionParserTest.java index 393d8334..74d2198d 100644 --- a/language/src/test/java/parser/ExpressionParserTest.java +++ b/language/src/test/java/parser/ExpressionParserTest.java @@ -2,6 +2,7 @@ import de.monticore.expressions.commonexpressions._ast.ASTCallExpression; import de.monticore.lang.sysmlexpressions._ast.ASTElementOfExpression; +import de.monticore.lang.sysmlexpressions._ast.ASTSysMLFunctionOperationExpression; import de.monticore.lang.sysmlexpressions._ast.ASTSysMLInstantiation; import de.monticore.lang.sysmlv2.SysMLv2Mill; import de.monticore.lang.sysmlv2._parser.SysMLv2Parser; @@ -82,4 +83,20 @@ public void testElementOf() throws IOException { assertThat(ast.get()).isInstanceOf(ASTElementOfExpression.class); } + /** + * Checks if SysMLFunctionOperatorExpressions are parsed without being + * wrapped within a Call Expression + */ + @Test + public void testCallFunExpr() throws IOException { + var ast = parser.parse_StringExpression("x->excludes(y)"); + + assertThat(ast).isPresent(); + assertThat(Log.getFindings()).isEmpty(); + // We do expect: SysMLFunctionOperatorExpression with an inner + // expression, name and parameters + // currently the parameters are separated in an outer CallExpr + assertThat(ast.get()).isInstanceOf(ASTSysMLFunctionOperationExpression.class); + } + } From fa52a68ebc2ea9686ea88f252c2edf7383cb356d Mon Sep 17 00:00:00 2001 From: Justus R Date: Wed, 6 May 2026 01:04:31 +0200 Subject: [PATCH 2/4] demonstration: ASTSysMLFunctionOperatorExpression is wrapped within a CallExpr, corresponding args are only present within that CallExpr --- .../test/java/parser/ExpressionParserTest.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/language/src/test/java/parser/ExpressionParserTest.java b/language/src/test/java/parser/ExpressionParserTest.java index 74d2198d..5d1123c3 100644 --- a/language/src/test/java/parser/ExpressionParserTest.java +++ b/language/src/test/java/parser/ExpressionParserTest.java @@ -88,7 +88,7 @@ public void testElementOf() throws IOException { * wrapped within a Call Expression */ @Test - public void testCallFunExpr() throws IOException { + public void testSysMLFunctionOperatorExpr() throws IOException { var ast = parser.parse_StringExpression("x->excludes(y)"); assertThat(ast).isPresent(); @@ -99,4 +99,18 @@ public void testCallFunExpr() throws IOException { assertThat(ast.get()).isInstanceOf(ASTSysMLFunctionOperationExpression.class); } + @Test + public void testSysMLFunctionOperatorExpr2() throws IOException { + var ast = parser.parse_StringExpression("x->excludes(y.z)"); + + assertThat(ast).isPresent(); + assertThat(Log.getFindings()).isEmpty(); + // We do expect: SysMLFunctionOperatorExpression with an inner + // expression, name and parameters + // currently the parameters are separated in an outer CallExpr + assertThat(ast.get()).isInstanceOf(ASTSysMLFunctionOperationExpression.class); + } + + // ReachableStates(c.behavior, input2.values())->excludes(SecurityGate_LLR.behavior.Bob_Alice_Eve) + } From e0a204965ff977db0aa189a494fb152515a29634 Mon Sep 17 00:00:00 2001 From: Justus R Date: Wed, 6 May 2026 11:29:15 +0200 Subject: [PATCH 3/4] added minimal test --- .../test/java/parser/ExpressionParserTest.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/language/src/test/java/parser/ExpressionParserTest.java b/language/src/test/java/parser/ExpressionParserTest.java index 5d1123c3..367fad26 100644 --- a/language/src/test/java/parser/ExpressionParserTest.java +++ b/language/src/test/java/parser/ExpressionParserTest.java @@ -83,6 +83,22 @@ public void testElementOf() throws IOException { assertThat(ast.get()).isInstanceOf(ASTElementOfExpression.class); } + /** + * Checks if SysMLFunctionOperatorExpressions are parsed without being + * wrapped within a Call Expression + */ + @Test + public void testSysMLFunctionOperatorExprMinimal() throws IOException { + var ast = parser.parse_StringExpression("x->b()"); + + assertThat(ast).isPresent(); + assertThat(Log.getFindings()).isEmpty(); + // We do expect: SysMLFunctionOperatorExpression with an inner + // expression, name and parameters + // currently the parameters are separated in an outer CallExpr + assertThat(ast.get()).isInstanceOf(ASTSysMLFunctionOperationExpression.class); + } + /** * Checks if SysMLFunctionOperatorExpressions are parsed without being * wrapped within a Call Expression From 087efae6a5234e108361410f5966dc3dc7208451 Mon Sep 17 00:00:00 2001 From: Justus R Date: Wed, 6 May 2026 11:30:28 +0200 Subject: [PATCH 4/4] cleanup docs --- language/src/test/java/parser/ExpressionParserTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/language/src/test/java/parser/ExpressionParserTest.java b/language/src/test/java/parser/ExpressionParserTest.java index 367fad26..0e64d65f 100644 --- a/language/src/test/java/parser/ExpressionParserTest.java +++ b/language/src/test/java/parser/ExpressionParserTest.java @@ -95,7 +95,6 @@ public void testSysMLFunctionOperatorExprMinimal() throws IOException { assertThat(Log.getFindings()).isEmpty(); // We do expect: SysMLFunctionOperatorExpression with an inner // expression, name and parameters - // currently the parameters are separated in an outer CallExpr assertThat(ast.get()).isInstanceOf(ASTSysMLFunctionOperationExpression.class); } @@ -111,7 +110,6 @@ public void testSysMLFunctionOperatorExpr() throws IOException { assertThat(Log.getFindings()).isEmpty(); // We do expect: SysMLFunctionOperatorExpression with an inner // expression, name and parameters - // currently the parameters are separated in an outer CallExpr assertThat(ast.get()).isInstanceOf(ASTSysMLFunctionOperationExpression.class); }