From 0050ae170b3fb244b8eb3a19682ffae46b3673f4 Mon Sep 17 00:00:00 2001
From: Andrea Enrici <andrea.enrici@nokia.com>
Date: Fri, 9 Jan 2015 13:11:09 +0000
Subject: [PATCH] managed to parse activity11

---
 src/compiler/tmlCPparser/CPparserDEF.jjt | 104 +++++++++++++++++++----
 1 file changed, 86 insertions(+), 18 deletions(-)

diff --git a/src/compiler/tmlCPparser/CPparserDEF.jjt b/src/compiler/tmlCPparser/CPparserDEF.jjt
index 8c8e01b990..f8267f0e6c 100644
--- a/src/compiler/tmlCPparser/CPparserDEF.jjt
+++ b/src/compiler/tmlCPparser/CPparserDEF.jjt
@@ -43,6 +43,9 @@ 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 int counter = 0;
 
   /* Main entry point. */
   public static void main(String args[]) throws ParseException	{
@@ -181,7 +184,6 @@ ASTStartSymbol StartSymbol():	/* The left hand side of this production is called
 
 	( seqDiag = SequenceDiagram( attributeList ) { mainCP.addCPSequenceDiagram( seqDiag ); } )+
 
-	//<MAIN> ActivityDiagram()	//First parse the main AD
 	( actDiag = ActivityDiagram( mainCP ) { mainCP.addCPActivityDiagram( actDiag ); } )*
 
 	<EOF>		/* Force the parser to reach EOF */
@@ -203,6 +205,9 @@ ASTStartSymbol StartSymbol():	/* The left hand side of this production is called
 			TraceManager.addDev( diag.toString() );
 			TraceManager.addDev( "++++++++++++++" );
 		}
+		TraceManager.addDev( "################" );
+		TMLCPTextSpecification pippo = new TMLCPTextSpecification( "EMPTY" );
+		TraceManager.addDev( "Printing from the parsed DS:\n" + pippo.toTextFormat( mainCP ) );
 		return jjtThis;
 	}
 }
@@ -453,30 +458,51 @@ String ID():
 TMLCPActivityDiagram ActivityDiagram( TMLCP mainCP ):
 {
 	String name;
-	TMLCPActivityDiagram ad;
-	TMLCPElement elem;
+	TMLCPActivityDiagram ad = null;
+	TMLCPElement elem = null;
+	TMLCPElement prev = null;
 }
 {
-	<ACTIVITY_DIAGRAM> name = ID()	{ ad = new TMLCPActivityDiagram( name, null ); }
+	<ACTIVITY_DIAGRAM> name = ID()
+	{ ad = new TMLCPActivityDiagram( name, null ); }
 	
-	"MAIN" "<>;" { TMLCPStart start = new TMLCPStart( "start", null ); ad.addTMLCPElement(start); }
-	elem = parseSequence( mainCP ) 
+	"MAIN" "<>;"
 	{
-		ad.addElement( elem );
+		TMLCPStart start = new TMLCPStart( "start", null );
+		ad.addTMLCPElement(start);
+		prev = start;
+	}
+	( elem = parseReferenceToDiagram( mainCP )
+	{
+		if( elem != null )	{
+			prev.addNextElement( elem );
+			ad.addElement( elem );
+			prev = elem;
+		}
+	}
+	<SEQUENCING_OP> )*
+	
+	ad = parseForkJoin( ad, mainCP ) "><"	"END" "END" ID()
+	{
+		prev.addNextElement( fork1 );	// prev references the last elem parsed above by parseReferenceToDiagram()
+		fork1 = new TMLCPFork( "fork1" + counter, null );
+		TMLCPStop stop = new TMLCPStop( "stop" + counter, null );
+		//ad.addElement( fork1 );
+		join1.addNextElement( stop );	// (last element returned from the last parsing).addNextElement( stop );
+		ad.addElement( stop );
+		TraceManager.addDev( "Printing the Activity Diagram:\n" + ad.toString() );
 		return ad;
 	}
-	"END" "END" ID()
-
 }
 
-TMLCPElement parseSequence( TMLCP mainCP ):
+TMLCPElement parseReferenceToDiagram( TMLCP mainCP ):
 {
 	String name;
 	TMLCPElement elem;
 	boolean isSD = false;
 }
 {
-	name = ID()
+	name = ID()	//( ( name = ID() ) | "><" ) )*
 	{ 
 		for( TMLCPSequenceDiagram sd: mainCP.getCPSequenceDiagrams() )	{
 			if( sd.getName().equals( name ) )	{
@@ -485,24 +511,66 @@ TMLCPElement parseSequence( TMLCP mainCP ):
 		}
 		if( isSD )	{
 			elem = new TMLCPRefSD( name, null );
-			//nexts.add( elem );
+			return elem;
 		}
 		else	{
 			elem = new TMLCPRefAD( name, null );
 			//nexts.add( elem );
+			return elem;
 		}
 	}
-	<SEQUENCING_OP>	//( ( name = ID() ) | "><" ) )*
-	{ return elem; }
 }
 
-/*void parseJoinFork():
-{}
+//Modify the data structure of the activity diagram as TMLCPElement is an abstract class, so it is not possible to instantiate an
+//ArrayList<TMLCPElement> to be returned after parsing the fork-join
+TMLCPActivityDiagram parseForkJoin( TMLCPActivityDiagram ad, TMLCP mainCP ):
 {
-	ID()
+	String name;
+	TMLCPElement elem;
+	TMLCPElement prev;
+	boolean isSD = false;
+	//TMLCPFork fork = new TMLCPFork( "fork" + counter , null );
+	fork1 = new TMLCPFork( "fork1" + counter , null );
+	join1 = new TMLCPJoin( "join1" + counter , null );
+	counter++;
+}
+{
+	"{" "{" elem = parseReferenceToDiagram( mainCP )
+	{
+		fork1.addNextElement( elem );	//the next element of Fork is only the first element of the sequence
+		ad.addElement( elem );
+		prev = elem;
+	}
+	// 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> elem = parseReferenceToDiagram( mainCP )
+	{
+		if( elem != null )	{
+			prev.addNextElement( elem );
+			ad.addElement( elem );
+			prev = elem;
+		}
+	}
+	)*
+	"}"	// end of the first branch
+	{ prev.addNextElement( join1 ); }
+	( "*" "{" elem = parseReferenceToDiagram( mainCP )
+	{
+		fork1.addNextElement( elem );
+		ad.addElement( elem );
+		prev = elem;
+	}
+	"}"
+	{ prev.addNextElement( join1 ); }
+	)+	"};"
+	{
+		ad.addElement( fork1 );
+		ad.addElement( join1 );
+		return ad;
+	}
 }
 
-void parseJunctionChoice():
+/*void parseJunctionChoice():
 {}
 {
 	ID()
-- 
GitLab