From 05c10eff6fd396584c43e8ba6d04e9817963b45c Mon Sep 17 00:00:00 2001 From: Andrea Enrici <andrea.enrici@nokia.com> Date: Thu, 27 Aug 2015 16:06:44 +0000 Subject: [PATCH] added code to parse ForLoop --- src/compiler/tmlCPparser/CPparser.jjt | 99 ++++++++++++++++++++++----- 1 file changed, 82 insertions(+), 17 deletions(-) diff --git a/src/compiler/tmlCPparser/CPparser.jjt b/src/compiler/tmlCPparser/CPparser.jjt index cee0c59888..51979450b6 100644 --- a/src/compiler/tmlCPparser/CPparser.jjt +++ b/src/compiler/tmlCPparser/CPparser.jjt @@ -162,6 +162,9 @@ TOKEN: | < #LETTER: ["a"-"z","A"-"Z"] > | < #DIGIT: ["0"-"9"] > | < UNDERSCORE: "_" > +| < FORLOOP_STRING: <LETTER> (<UNDERSCORE> | <ASSIGNMENT> | <LETTER> | <DIGIT> | "#" | ";" | <MATH_SMALLER> | <MATH_GREATER> | +<MATH_MINUS> | <MATH_PLUS> )+ ( +<LETTER> | <DIGIT> ) > //| < INCLUDE_SYMBOL: "$" > } @@ -352,7 +355,8 @@ TMLSDAction Action( String instanceName ): Token t; } { - <ACTION_KW> s = ID() <ASSIGNMENT> ( s1 = BAExpression() | s1 = MAExpression() ) + //<ACTION_KW> s = ID() <ASSIGNMENT> ( s1 = BAExpression() | s1 = MAExpression() ) + <ACTION_KW> s = ID() <ASSIGNMENT> s1 = MAExpression() //trying to use one single expression to parse both math and boolean { TMLSDAction action = new TMLSDAction( s + " = " + s1, instanceName ); return action; @@ -376,6 +380,7 @@ String MAExpression(): //MA stands for Mathematical Action String MATerm(): { String s, s1; + Token t; } { s = MAFactor() @@ -383,9 +388,24 @@ String MATerm(): | <MATH_DIV> s1 = MATerm() { return s + s1; } | + <LOGICALOR> ( s1 = ID() | s1 = BooleanConstant() ) { return s + " || " + s1; } + | + <LOGICALAND> ( s1 = ID() | s1 = BooleanConstant() ) { return s +" && " + s1; } + | + <EQUALITY> ( s1 = ID() | s1 = BooleanConstant() ) { return s + " == " + s1; } + | {} { return s; } ) } +String BooleanConstant(): +{ +} +{ + <FALSECONST> { return "false"; } + | + <TRUECONST> { return "true"; } +} + String MAFactor(): { String s; @@ -397,18 +417,33 @@ String MAFactor(): s = ID() {return s; } | t = <INTEGER_LITERAL> { return t.image; } + | + <TRUECONST> { return "true"; } + | + <FALSECONST> { return "false"; } } /* Right-recursive grammar for parsing boolean expressions in actions. No priority is given to boolean operators */ -String BAExpression(): //BA stands for Boolean Action -{ +//String BAExpression(): //BA stands for Boolean Action +/*{ String s, s1; } { s = BATerm() s1 = BAExpressionPrime() { return s + s1; } } +{ + String s, s1; +} +{ + s = ID() <LOGICALOR> s1 = ID() { return s + " || " + s1; } +| s = ID() <LOGICALAND> s1 = ID() { return s +" && " + s1; } +| s = ID() <EQUALITY> s1 = ID() { return s +" == " + s1; } +| <TRUECONST> { return "true"; } +| <FALSECONST> { return "false"; } +//| {} { return ""; } +} -String BAExpressionPrime(): +/*String BAExpressionPrime(): { String s, s1; } @@ -449,7 +484,7 @@ String BAFactor(): t = <FALSECONST> { return t.image; } | t = <TRUECONST> { return t.image; } -} +}*/ String ID(): { @@ -478,6 +513,24 @@ void ActivityDiagram( TMLCP topCP ): previousElement = currentElement; } + parseElements( topCP ) + + "END" "END" ID() + { + if( thereIsAChoice ) { //Correcting the additional stop node added when parsing a choice + ArrayList<TMLCPElement> elements = globalAD.getElements(); + elements.remove( elements.size()-1 ); + globalAD.addElements( elements ); + globalAD.addTMLCPElement( choice ); + thereIsAChoice = false; + } + } +} + +void parseElements( TMLCP topCP ): +{ +} +{ ( parseReferenceToDiagram( topCP ) <SEQUENCING_OP> { @@ -488,20 +541,10 @@ void ActivityDiagram( TMLCP topCP ): } } | - parseForkJoin( topCP ) + "{" ( parseForLoop( topCP ) | parseParallelism( topCP ) ) | parseChoiceLine( topCP ) )+ - "END" "END" ID() - { - if( thereIsAChoice ) { //Correcting the additional stop node added when parsing a choice - ArrayList<TMLCPElement> elements = globalAD.getElements(); - elements.remove( elements.size()-1 ); - globalAD.addElements( elements ); - globalAD.addTMLCPElement( choice ); - thereIsAChoice = false; - } - } } void parseReferenceToDiagram( TMLCP topCP ): @@ -526,7 +569,29 @@ void parseReferenceToDiagram( TMLCP topCP ): } } -void parseForkJoin( TMLCP topCP ): +//only a sequence of SDs is allowed in the for-loop body +void parseForLoop( TMLCP topCP ): +{ + String s; + Token t, t1; +} +{ + "(" t = <FORLOOP_STRING> ")" + //parse the for-loop body: sequence of SDs terminated by >< and by }; + ( parseReferenceToDiagram( topCP ) <SEQUENCING_OP> )+ "><" "};" + //continue parsing the rest of the CP + parseElements( topCP ) +} + +void LogicalExpression(): +{ + String s; +} +{ + s = ID() ( <MATH_SMALLER> | <MATH_GREATER> ) <INTEGER_LITERAL> +} + +void parseParallelism( TMLCP topCP ): { String name; boolean isSD = false; -- GitLab