From 6c3aa7c19630aca0c6ec4a3aa5bffae83bfb7475 Mon Sep 17 00:00:00 2001 From: Andrea Enrici <andrea.enrici@nokia.com> Date: Thu, 22 Jan 2015 16:25:59 +0000 Subject: [PATCH] --- src/compiler/tmlCPparser/CPparserDEF.jjt | 721 ----------------------- 1 file changed, 721 deletions(-) delete mode 100644 src/compiler/tmlCPparser/CPparserDEF.jjt diff --git a/src/compiler/tmlCPparser/CPparserDEF.jjt b/src/compiler/tmlCPparser/CPparserDEF.jjt deleted file mode 100644 index c1ebecdaeb..0000000000 --- a/src/compiler/tmlCPparser/CPparserDEF.jjt +++ /dev/null @@ -1,721 +0,0 @@ -/********************************************************************************************************************** -Author: Andrea ENRICI -Description: Parser for the communication Patterns -***********************************************************************************************************************/ - -options { - /* These are all the options offered by Javacc set with their default values */ -// LOOKAHEAD = 2; -// CHOICE_AMBIGUITY_CHECK = 2; -// OTHER_AMBIGUITY_CHECK = 1; -// STATIC = true; -// DEBUG_PARSER = false; -// DEBUG_LOOKAHEAD = true; -// DEBUG_TOKEN_MANAGER = true; -// ERROR_REPORTING = true; -// JAVA_UNICODE_ESCAPE = false; -// UNICODE_INPUT = false; -// IGNORE_CASE = false; -// USER_TOKEN_MANAGER = false; -// USER_CHAR_STREAM = false; -// BUILD_PARSER = true; -// BUILD_TOKEN_MANAGER = true; -// SANITY_CHECK = true; - /*When LOOKAHEAD is more than 1, lookahead adequacy checking is not performed. Option FORCE_LA_CHECK must be set to true to - * force checking */ -// FORCE_LA_CHECK = true; -// TRACK_TOKENS = true; -// TOKEN_EXTENDS ="BaseToken"; - MULTI=true; /* Generate a multimode parse tree */ - KEEP_LINE_COLUMN = false; -// NODE_PREFIX="AST"; -} - -PARSER_BEGIN(CPparserDEF) /* The parser class */ - -//package compiler.tmlCPparserDEF; -import tmltranslator.*; -import tmltranslator.tmlcp.*; -import java.util.*; -import myutil.*; -import java.util.ArrayList; - -public class CPparserDEF { - - public static TMLCP topCP = new TMLCP( "noName", new Object() ); - public static TMLCPFork fork1; - public static TMLCPJoin join1; - public static TMLCPJunction junction; - public static int joinCounter = 0; - public static int forkCounter = 0; - public static int choiceCounter = 0; - public static int stopCounter = 0; - public static TMLCPChoice choice = new TMLCPChoice( "choice" + choiceCounter, null, null ); // empty guardList (second argument) - public static TMLCPActivityDiagram globalAD; - public static TMLCPElement previousElement; - public static TMLCPElement currentElement; - public static String SP = " "; - public static Boolean thereIsAChoice = false; - - /* Main entry point. */ - public static void main(String args[]) throws ParseException { - CPparserDEF parser = new CPparserDEF(System.in); - try { - ASTStartSymbol n = parser.StartSymbol(); - //print AST - //n.dump(""); - //System.out.println("Thank you."); - topCP.printDataStructure(); - } - catch ( Exception e ) { -// System.out.println("Ooops"); - System.out.println(e.getMessage()); -// e.printStackTrace(); - } - } -} - -PARSER_END(CPparserDEF) - -SKIP: -{ - " " -| "\t" -| "\n" -| "\r" -| < "#" (~["\n","\r"])* ("\n" | "\r" | "\r\n") > /* One-line comment */ -| < "//" (~["\n","\r"])* ("\n" | "\r" | "\r\n") > /* One-line comment */ -} - -/* The order in which TOKENs are declared matters! Moving the token declaration for the reserved keywords after the one for the - * identifiers makes parsing to go bananas as any reserved keyword is instead matched as an identifier! */ -/* Reserved keywords */ -TOKEN: -{ - < BOOL_TYPE: "bool" > -| < INT_TYPE: "int" > -| < START_KW: "START" > -| < ENDBLOCK: "END" > -| < GOTO_KW: "GOTO" > -| < MAINBLOCK: "MAIN" > -| < CP: "COMMUNICATION_PATTERN" > -| < ACTIVITY_DIAGRAM: "ACTIVITY" > -| < SEQUENCE_DIAGRAM: "SEQUENCE" > -| < INCLUDE: "INCLUDE" > -| < TRUECONST: "TRUE" | "true" > -| < FALSECONST: "FALSE" | "false" > -| < STORAGE_KW: "STORAGE" > -| < CONTROLLER_KW: "CONTROLLER" > -| < TRANSFER_KW: "TRANSFER" > -| < ACTION_KW: "ACT:" > -| < RCV_MSG_KW: "RCV:" > -| < SND_MSG_KW: "SND:" > -| < LABEL_KW: "LABEL" > -| < #TRANSFER_ACT: "Transfer" > -| < #TRANSFER_REQ: "TransferRequest" > -| < #TRANSFER_DONE: "TransferDone" > -| < #READ_ACT: "Read" > -| < #WRITE_ACT: "Write" > -| < EXTENSION: <CP_LIB> > -| < #CP_LIB: ".cplib" > -} - -/* Operators */ -TOKEN: -{ - < BLOCKSTART: "{" > -| < BLOCKEND: "}" > -| < MATH_SMALLER: "<" > -| < MATH_GREATER: ">" > -| < SEQUENCING_OP: ";" > -| < STAR_OP: "*" > -| < MATH_PLUS: "+" > -| < MATH_MINUS: "-" > -| < DOT: "." > -| < GUARDSTART: "[" > -| < GUARDEND: "]" > -| < LEFT_PARENTHESIS: "(" > -| < RIGHT_PARENTHESIS: ")" > -| < SEPARATOR: "," > -| < ASSIGNMENT: "=" > -| < EQUALITY: "==" > -| < BITWISEOR: "|" > -| < LOGICALOR: "||" > -| < BITWISEAND: "&" > -| < LOGICALAND: "&&" > -| < BITWISEEXOR: "^" > -| < INCREMENT: "++" > -| < DECREMENT: "--" > -| < START_AD: "<>;" > -| < END_AD: "><" > -//| < ORDEROPERATOR: <SEQUENCING_OP> | <PARALLELISM_OP> > -| < EOL: ("\n" | "\r" | "\r\n") > -| < RIGHT_SLASH: "/" > -| < QUOTATION_MARK: "\"" > -} - -/* Identifiers */ -TOKEN: -{ - < IDENTIFIER: <LETTER> (<UNDERSCORE> | <LETTER> | <DIGIT> | "#" )* (<LETTER> | <DIGIT>) /*| ( <UNDERSCORE> "#" <DIGIT> <UNDERSCORE> - <DIGIT> ) */ > -| < #LETTER: ["a"-"z","A"-"Z"] > -| < #DIGIT: ["0"-"9"] > -| < UNDERSCORE: "_" > -//| < INCLUDE_SYMBOL: "$" > -} - -/* Literals */ -TOKEN: -{ - < INTEGER_LITERAL: <DECIMAL_LITERAL> (["l","L"])? > -| < #DECIMAL_LITERAL: ["0"-"9"] (["0"-"9"])* > -} - - -/* List of productions defining the non-terminals. They are implemented as methods of the above parser class*/ -/* Root production. */ -ASTStartSymbol StartSymbol(): /* The left hand side of this production is called Input and must be followed by colon */ -{ - int i; - String space = " "; - String undefinedDiagStringList = ""; - TMLCP topCP = new TMLCP(); - TMLCPSequenceDiagram seqDiag; - TMLCPActivityDiagram actDiag; - ArrayList<TMLAttribute> attributeList; -} -{ - attributeList = SequenceDiagramAttributesDeclaration() - - { TraceManager.addDev( "#################" ); - for( TMLAttribute attr: attributeList ) { - TraceManager.addDev( attr.toString() ); - TraceManager.addDev( "#################" ); - } - } - - ( seqDiag = SequenceDiagram( attributeList ) { topCP.addCPSequenceDiagram( seqDiag ); } )+ - - ActivityDiagram( topCP ) // dedicated to set the first CP as the topCP - { - topCP.setMainCP( globalAD ); - choice = new TMLCPChoice( "choice" + choiceCounter, null, null ); // empty guardList (second argument) - } - - ( ActivityDiagram( topCP ) - { - topCP.addCPActivityDiagram( globalAD ); - choice = new TMLCPChoice( "choice" + choiceCounter, null, null ); // empty guardList (second argument) - } - )* - - <EOF> /* Force the parser to reach EOF */ - - { - //topCP.correctReferences(); - /*ArrayList<TMLCPSequenceDiagram> sdList = topCP.getCPSequenceDiagrams(); - ArrayList<TMLCPActivityDiagram> adList = topCP.getCPActivityDiagrams(); - TraceManager.addDev( "***************" ); - for( TMLCPSequenceDiagram diag: sdList ) { - TraceManager.addDev( diag.toString() ); - TraceManager.addDev( "***************" ); - } - - TraceManager.addDev( "++++++++++++++++" ); - for( TMLCPActivityDiagram diag: adList ) { - TraceManager.addDev( diag.toString() ); - TraceManager.addDev( "++++++++++++++" ); - }*/ - - TMLCPTextSpecification toto = new TMLCPTextSpecification( "From parser" ); - String s = toto.toTextFormat( topCP ); - TraceManager.addDev( s ); - return jjtThis; - } -} - -/******************************************************************************************************************************** -Include Files Section: the grammar for parsing the inclusion of library files -********************************************************************************************************************************/ -/*void IncludeFiles(): -{} -{ - <INCLUDE> <QUOTATION_MARK> (<DOT>)? (<PATH_SEPARATOR>)? ID() (<PATH_SEPARATOR> ID() )* <EXTENSION> <QUOTATION_MARK> -} - -void MappingList(): -{} -{ - ID() <ITERATIONSTART> ID() ( <SEPARATOR> ID() )+ <ITERATIONEND> -}*/ - -/******************************************************************************************************************************** -Sequence Diagram Section -********************************************************************************************************************************/ - -ArrayList<TMLAttribute> SequenceDiagramAttributesDeclaration(): -{ - String instanceName, attributeName, attributeType; - Token t, t1; - ArrayList<TMLAttribute> attributeList = new ArrayList<TMLAttribute>(); -} -{ - ( instanceName = ID() "." attributeName = ID() ":" ( t = <BOOL_TYPE> | t = <INT_TYPE> ) - <ASSIGNMENT> ( t1 = <IDENTIFIER> | t1 = <INTEGER_LITERAL> | t1 = <FALSECONST> | t1 = <TRUECONST> ) - { - if( t.image.equals("int") ) { - attributeList.add( new TMLAttribute( attributeName, instanceName, new TMLType ( TMLType.NATURAL ), t1.image ) ); - } - else if( t.image.equals("bool") ) { - attributeList.add ( new TMLAttribute( attributeName, instanceName, new TMLType( TMLType.BOOLEAN ), t1.image ) ); - } - } - )* - { return attributeList; } -} - -// A SD is a list of instances. Each Instance is composed of messages or actions. -TMLCPSequenceDiagram SequenceDiagram( ArrayList<TMLAttribute> attributeList ): -{ - String diagramName; - TMLSDInstance instance; -} -{ - <SEQUENCE_DIAGRAM> diagramName = ID() - { - TMLCPSequenceDiagram seqDiag = new TMLCPSequenceDiagram( diagramName ); - } - ( - instance = SequenceDiagramInstance( attributeList ) - { seqDiag.addInstance( instance ); } - )+ - <ENDBLOCK> - - { return seqDiag; } -} - -TMLSDInstance SequenceDiagramInstance( ArrayList<TMLAttribute> attributeList ): -{ - String instanceName, type, senderName, receiverName, messageName; - Token t; - TMLSDAction action; - TMLSDMessage message; - ArrayList<String> params = new ArrayList<String>(); -} -{ - ( t = <TRANSFER_KW> | t = <STORAGE_KW> | t = <CONTROLLER_KW> ) instanceName = ID() - { - TMLSDInstance instance = new TMLSDInstance( instanceName, t.image ); - for( TMLAttribute attr: attributeList ) { - if( instanceName.equals( attr.getInstanceName() ) ) { - //TraceManager.addDev( "Adding attribute " + attr.toString() + " to instance " + instanceName ); - instance.addAttribute( attr ); - } - } - } - - ( <RCV_MSG_KW> senderName = ID() ":" messageName = ID() params = MessageParameters() - { message = new TMLSDMessage( messageName, senderName, instanceName, params ); - instance.addMessageFromParser( message, TMLSDEvent.RECEIVE_MESSAGE_EVENT ); } - | - <SND_MSG_KW> receiverName = ID() ":" messageName = ID() params = MessageParameters() - { message = new TMLSDMessage( messageName, instanceName, receiverName, params ); - instance.addMessageFromParser( message, TMLSDEvent.SEND_MESSAGE_EVENT ); } - | - action = Action( instanceName ) - { instance.addActionFromParser( action ); } - )+ - - { return instance; } -} - -ArrayList<String> MessageParameters(): -{ - String s; - ArrayList<String> params = new ArrayList<String>(); -} -{ - ( "()" | "(" s = ID() { params.add(s); } ( "," s = ID() { params.add(s); } )* ")" ) - { - return params; - } -} - -TMLSDAction Action( String instanceName ): -{ - String s, s1 = ""; - Token t; -} -{ - <ACTION_KW> s = ID() <ASSIGNMENT> ( s1 = BAExpression() | s1 = MAExpression() ) - { - TMLSDAction action = new TMLSDAction( s + " = " + s1, instanceName ); - return action; - } -} - -/* Right-recursive grammar for parsing mathematical expressions in actions. No priority is given to operators */ -String MAExpression(): //MA stands for Mathematical Action -{ - String s, s1; -} -{ - s = MATerm() s1 = MAExpressionPrime() { return s + s1; } -} - -String MAExpressionPrime(): -{ - String s, s1; -} -{ - <MATH_PLUS> s = MATerm() s1 = MAExpressionPrime() { return " + " + s + " " + s1; } -| <MATH_MINUS> s = MATerm() s1 = MAExpressionPrime() { return " - " + s + " " + s1; } -| <RIGHT_SLASH> s = MATerm() s1 = MAExpressionPrime() { return " / " + s + " " + s1; } -| <STAR_OP> s = MATerm() s1 = MAExpressionPrime() { return " * " + s + " " + s1; } -| {} { return ""; } -} - -String MATerm(): -{ - String s, s1; -} -{ - //MAFactor() MATermPrime() - s = MAFactor() s1 = MATermPrime() { return s + s1; } -} - -String MATermPrime(): -{ - String s, s1; -} -{ - s = MAFactor() s1 = MATermPrime() { return s + s1; } -| {} { return ""; } -} - -String MAFactor(): -{ - String s; - Token t; -} -{ - <LEFT_PARENTHESIS> s = MAExpression() <RIGHT_PARENTHESIS> { return "( " + s + " )"; } - | - s = ID() {return s; } - | - t = <INTEGER_LITERAL> { return t.image; } -} - -/* Right-recursive grammar for parsing boolean expressions in actions. No priority is given to boolean operators */ -String BAExpression(): //BA stands for Boolean Action -{ - String s, s1; -} -{ - s = BATerm() s1 = BAExpressionPrime() { return s + s1; } -} - -String BAExpressionPrime(): -{ - String s, s1; -} -{ - <LOGICALOR> s = BATerm() s1 = BAExpressionPrime() { return " || " + s + s1; } -| <LOGICALAND> s = BATerm() s1 = BAExpressionPrime() { return " && " + s + s1; } -| <EQUALITY> s = BATerm() s1 = BAExpressionPrime() { return " == " + s + s1; } -| {} { return ""; } -} - -String BATerm(): -{ - String s, s1; -} -{ - s = BAFactor() s1 = BATermPrime() { return s + s1; } -} - -String BATermPrime(): -{ - String s, s1; -} -{ - s = BAFactor() s1 = BATermPrime() { return s + s1; } -| {} { return ""; } -} - -String BAFactor(): -{ - String s; - Token t; -} -{ - <LEFT_PARENTHESIS> s = BAExpression() <RIGHT_PARENTHESIS> { return "( " + s + " )"; } - | - s = ID() { return s; } - | - t = <FALSECONST> { return t.image; } - | - t = <TRUECONST> { return t.image; } -} - -String ID(): -{ - Token t; -} -{ - t = <IDENTIFIER> { jjtThis.setName(t.image); return t.image; } -} - -/*###################################################################################"*/ - -void ActivityDiagram( TMLCP topCP ): -{ - String name; -} -{ - <ACTIVITY_DIAGRAM> name = ID() - { - globalAD = new TMLCPActivityDiagram( name, null ); - } - - "MAIN" "<>;" - { - currentElement = new TMLCPStart( "start", null ); - globalAD.addTMLCPElement( currentElement ); - previousElement = currentElement; - } - - ( - parseReferenceToDiagram( topCP ) <SEQUENCING_OP> - { - if( currentElement != null ) { - previousElement.addNextElement( currentElement ); - globalAD.addTMLCPElement( currentElement ); - previousElement = currentElement; - } - } - | - parseForkJoin( 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 ): -{ - String name; - boolean isSD = false; -} -{ - name = ID() - { - for( TMLCPSequenceDiagram sd: topCP.getCPSequenceDiagrams() ) { - if( sd.getName().equals( name ) ) { - isSD = true; - } - } - if( isSD ) { - currentElement = new TMLCPRefSD( name, null ); - } - else { - currentElement = new TMLCPRefAD( name, null ); - } - } -} - -void parseForkJoin( TMLCP topCP ): -{ - String name; - boolean isSD = false; - fork1 = new TMLCPFork( "fork1" + forkCounter , null ); - join1 = new TMLCPJoin( "join1" + joinCounter , null ); - forkCounter++; - joinCounter++; -} -{ - "{" "{" parseReferenceToDiagram( topCP ) - { - previousElement.addNextElement( fork1 ); - fork1.addNextElement( currentElement ); //the next element of Fork is only the first element of the sequence - globalAD.addTMLCPElement( currentElement ); - previousElement = currentElement; - } - // from now on is like parsing a normal sequence, in the sense that I ignore the fact of being inside a fork-join - ( - <SEQUENCING_OP> parseReferenceToDiagram( topCP ) - { - if( currentElement != null ) { - previousElement.addNextElement( currentElement ); - globalAD.addTMLCPElement( currentElement ); - previousElement = currentElement; - } - } - )* - "}" // end of the first branch - { previousElement.addNextElement( join1 ); } - // then one or more branches - ( "*" "{" parseReferenceToDiagram( topCP ) - { - fork1.addNextElement( currentElement ); - globalAD.addTMLCPElement( currentElement ); - previousElement = currentElement; - } - // from now on is like parsing a normal sequence, in the sense that I ignore the fact of being inside a fork-join - ( - <SEQUENCING_OP> parseReferenceToDiagram( topCP ) - { - if( currentElement != null ) { - previousElement.addNextElement( currentElement ); - globalAD.addTMLCPElement( currentElement ); - previousElement = currentElement; - } - } - )* - "}" // end of a branch - { previousElement.addNextElement( join1 ); } - )+ "};" // end of a whole fork-join - { - globalAD.addTMLCPElement( fork1 ); - globalAD.addTMLCPElement( join1 ); - previousElement = join1; - } -} - -void parseChoiceLine( TMLCP topCP ): // parse the choice guard line -{ - String s; - ArrayList<String> guardList = new ArrayList<String>(); -} -{ - s = parseGuard() - { - thereIsAChoice = true; - choice.addGuard(s); - if( !(currentElement instanceof TMLCPChoice) ) { - currentElement.addNextElement( choice ); - } - } - parseReferenceToDiagram( topCP ) <SEQUENCING_OP> //the nextElement of a TMLCPChoice is the first element of the sequence - { - if( currentElement != null ) { - /*if( !(previousElement instanceof TMLCPStop) ) { // avoid the spurious case when returning from the end of a branch - previousElement.addNextElement( currentElement ); - }*/ - globalAD.addTMLCPElement( currentElement ); - previousElement = currentElement; - choice.addNextElement( currentElement ); - } - } - - | // the branch may end here directly, because there is just a reference to one diagram - - "><" // end of the branch - { - currentElement = new TMLCPStop( "stop" + stopCounter, null ); - if( !(currentElement instanceof TMLCPStop && previousElement instanceof TMLCPStop) ) { - previousElement.addNextElement( currentElement ); - } - - globalAD.addTMLCPElement( currentElement ); - stopCounter++; - previousElement = currentElement; - currentElement = choice; // end of a branch, the previous element is reset to the choice node - } - - /*| // or it is followed by a longer sequence of diagrams - - ( parseReferenceToDiagram( topCP ) <SEQUENCING_OP> - { - TraceManager.addDev( "Passing by here" ); - if( currentElement != null ) { - previousElement.addNextElement( currentElement ); - globalAD.addTMLCPElement( currentElement ); - previousElement = currentElement; - } - } - )+ - "><" // end of the branch - { - currentElement = new TMLCPStop( "stop" + stopCounter, null ); - previousElement.addNextElement( currentElement ); - globalAD.addTMLCPElement( currentElement ); - stopCounter++; - previousElement = currentElement; - currentElement = choice; // end of a branch, the previous element is reset to the choice node - }*/ -} - -String parseGuard(): -{ - String s; -} -{ - "[" s = GExpression() "]" - { return "[" + SP + s + SP + "]"; } -} - -String GExpression(): -{ - String s, s1; -} -{ - s = GTerm() s1 = GExpressionPrime() - { return s + s1; } -} - -String GExpressionPrime(): -{ - String s, s1; -} -{ - <LOGICALOR> s = GTerm() s1 = GExpressionPrime() { return "||" + s + s1; } -| <LOGICALAND> s = GTerm() s1 = GExpressionPrime() { return "&&" + s + s1; } -| <EQUALITY> s = GTerm() s1 = GExpressionPrime() { return "==" + s + s1; } -| <MATH_GREATER> s = GTerm() s1 = GExpressionPrime() { return ">" + s + s1; } -| <MATH_SMALLER> s = GTerm() s1 = GExpressionPrime() { return "<" + s + s1; } -| {} { return ""; } -} - -String GTerm(): -{ - String s, s1; -} -{ - s = GFactor() s1 = GTermPrime() - { return s + s1; } -} - -String GTermPrime(): -{ - String s, s1; -} -{ - s = GFactor() s1 = GTermPrime() { return s + s1; } -| {} { return ""; } -} - -String GFactor(): -{ - String name, s; - Token t; -} -{ - <GUARDSTART> s = GExpression() <GUARDEND> { return "[" + SP + s + SP + "]"; } - | - name = ID() { return name; } - | - t = <INTEGER_LITERAL> { return t.image; } -} - - -- GitLab