Преглед изворни кода

Added feature type and parameter type scoping to GenModel
Added some duplicate validation detection

Andreas Mülder пре 13 година
родитељ
комит
34b0cb1c6c
13 измењених фајлова са 543 додато и 430 уклоњено
  1. 11 7
      plugins/org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/SGen.xmi
  2. 28 38
      plugins/org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g
  3. 6 8
      plugins/org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.tokens
  4. 132 166
      plugins/org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGenLexer.java
  5. 124 144
      plugins/org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGenParser.java
  6. 3 3
      plugins/org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/serializer/AbstractSGenSemanticSequencer.java
  7. 39 47
      plugins/org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/services/SGenGrammarAccess.java
  8. 3 3
      plugins/org.yakindu.sct.generator.genmodel/src/org/yakindu/sct/generator/genmodel/SGen.xtext
  9. 81 0
      plugins/org.yakindu.sct.generator.genmodel/src/org/yakindu/sct/generator/genmodel/resource/FeatureResourceDescription.java
  10. 2 7
      plugins/org.yakindu.sct.generator.genmodel/src/org/yakindu/sct/generator/genmodel/scoping/SGenGlobalScopeProvider.java
  11. 53 0
      plugins/org.yakindu.sct.generator.genmodel/src/org/yakindu/sct/generator/genmodel/scoping/SGenScopeProvider.java
  12. 49 7
      plugins/org.yakindu.sct.generator.genmodel/src/org/yakindu/sct/generator/genmodel/validation/SGenJavaValidator.java
  13. 12 0
      plugins/org.yakindu.sct.generator.genmodel/xtend-gen/org/yakindu/sct/generator/genmodel/generator/SGenGenerator.java

+ 11 - 7
plugins/org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/SGen.xmi

@@ -50,6 +50,11 @@
         <classifier xsi:type="ecore:EClass" href="http://www.yakindu.org/sct/statechart/SGen#//FeatureConfiguration"/>
       </type>
       <alternatives xsi:type="xtext:Group">
+        <elements xsi:type="xtext:Action">
+          <type metamodel="/0/@metamodelDeclarations.1">
+            <classifier xsi:type="ecore:EClass" href="http://www.yakindu.org/sct/statechart/SGen#//FeatureConfiguration"/>
+          </type>
+        </elements>
         <elements xsi:type="xtext:Assignment" feature="type" operator="=">
           <terminal xsi:type="xtext:CrossReference">
             <type metamodel="/0/@metamodelDeclarations.1">
@@ -59,15 +64,9 @@
           </terminal>
         </elements>
         <elements xsi:type="xtext:Keyword" value="{"/>
-        <elements xsi:type="xtext:Assignment" feature="parameterValues" operator="+=">
+        <elements xsi:type="xtext:Assignment" cardinality="+" feature="parameterValues" operator="+=">
           <terminal xsi:type="xtext:RuleCall" rule="/0/@rules.3"/>
         </elements>
-        <elements xsi:type="xtext:Group" cardinality="*">
-          <elements xsi:type="xtext:Keyword" value=","/>
-          <elements xsi:type="xtext:Assignment" feature="parameterValues" operator="+=">
-            <terminal xsi:type="xtext:RuleCall" rule="/0/@rules.3"/>
-          </elements>
-        </elements>
         <elements xsi:type="xtext:Keyword" value="}"/>
       </alternatives>
     </rules>
@@ -76,6 +75,11 @@
         <classifier xsi:type="ecore:EClass" href="http://www.yakindu.org/sct/statechart/SGen#//FeatureParameterValue"/>
       </type>
       <alternatives xsi:type="xtext:Group">
+        <elements xsi:type="xtext:Action">
+          <type metamodel="/0/@metamodelDeclarations.1">
+            <classifier xsi:type="ecore:EClass" href="http://www.yakindu.org/sct/statechart/SGen#//FeatureParameterValue"/>
+          </type>
+        </elements>
         <elements xsi:type="xtext:Assignment" feature="parameter" operator="=">
           <terminal xsi:type="xtext:CrossReference">
             <type metamodel="/0/@metamodelDeclarations.1">

+ 28 - 38
plugins/org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g

@@ -215,65 +215,49 @@ ruleFeatureConfiguration returns [EObject current=null]
     }
     @after { leaveRule(); }:
 ((
+    {
+        $current = forceCreateModelElement(
+            grammarAccess.getFeatureConfigurationAccess().getFeatureConfigurationAction_0(),
+            $current);
+    }
+)(
 (
 		{
 			if ($current==null) {
 	            $current = createModelElement(grammarAccess.getFeatureConfigurationRule());
 	        }
         }
-	otherlv_0=RULE_ID
+	otherlv_1=RULE_ID
 	{
-		newLeafNode(otherlv_0, grammarAccess.getFeatureConfigurationAccess().getTypeFeatureTypeCrossReference_0_0()); 
+		newLeafNode(otherlv_1, grammarAccess.getFeatureConfigurationAccess().getTypeFeatureTypeCrossReference_1_0()); 
 	}
 
 )
-)	otherlv_1='{' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getFeatureConfigurationAccess().getLeftCurlyBracketKeyword_1());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getFeatureConfigurationAccess().getParameterValuesFeatureParameterValueParserRuleCall_2_0()); 
-	    }
-		lv_parameterValues_2_0=ruleFeatureParameterValue		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getFeatureConfigurationRule());
-	        }
-       		add(
-       			$current, 
-       			"parameterValues",
-        		lv_parameterValues_2_0, 
-        		"FeatureParameterValue");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_3=',' 
+)	otherlv_2='{' 
     {
-    	newLeafNode(otherlv_3, grammarAccess.getFeatureConfigurationAccess().getCommaKeyword_3_0());
+    	newLeafNode(otherlv_2, grammarAccess.getFeatureConfigurationAccess().getLeftCurlyBracketKeyword_2());
     }
 (
 (
 		{ 
-	        newCompositeNode(grammarAccess.getFeatureConfigurationAccess().getParameterValuesFeatureParameterValueParserRuleCall_3_1_0()); 
+	        newCompositeNode(grammarAccess.getFeatureConfigurationAccess().getParameterValuesFeatureParameterValueParserRuleCall_3_0()); 
 	    }
-		lv_parameterValues_4_0=ruleFeatureParameterValue		{
+		lv_parameterValues_3_0=ruleFeatureParameterValue		{
 	        if ($current==null) {
 	            $current = createModelElementForParent(grammarAccess.getFeatureConfigurationRule());
 	        }
        		add(
        			$current, 
        			"parameterValues",
-        		lv_parameterValues_4_0, 
+        		lv_parameterValues_3_0, 
         		"FeatureParameterValue");
 	        afterParserOrEnumRuleCall();
 	    }
 
 )
-))*	otherlv_5='}' 
+)+	otherlv_4='}' 
     {
-    	newLeafNode(otherlv_5, grammarAccess.getFeatureConfigurationAccess().getRightCurlyBracketKeyword_4());
+    	newLeafNode(otherlv_4, grammarAccess.getFeatureConfigurationAccess().getRightCurlyBracketKeyword_4());
     }
 )
 ;
@@ -297,27 +281,33 @@ ruleFeatureParameterValue returns [EObject current=null]
     }
     @after { leaveRule(); }:
 ((
+    {
+        $current = forceCreateModelElement(
+            grammarAccess.getFeatureParameterValueAccess().getFeatureParameterValueAction_0(),
+            $current);
+    }
+)(
 (
 		{
 			if ($current==null) {
 	            $current = createModelElement(grammarAccess.getFeatureParameterValueRule());
 	        }
         }
-	otherlv_0=RULE_ID
+	otherlv_1=RULE_ID
 	{
-		newLeafNode(otherlv_0, grammarAccess.getFeatureParameterValueAccess().getParameterFeatureParameterCrossReference_0_0()); 
+		newLeafNode(otherlv_1, grammarAccess.getFeatureParameterValueAccess().getParameterFeatureParameterCrossReference_1_0()); 
 	}
 
 )
-)	otherlv_1='=' 
+)	otherlv_2='=' 
     {
-    	newLeafNode(otherlv_1, grammarAccess.getFeatureParameterValueAccess().getEqualsSignKeyword_1());
+    	newLeafNode(otherlv_2, grammarAccess.getFeatureParameterValueAccess().getEqualsSignKeyword_2());
     }
 (
 (
-		lv_value_2_0=RULE_STRING
+		lv_value_3_0=RULE_STRING
 		{
-			newLeafNode(lv_value_2_0, grammarAccess.getFeatureParameterValueAccess().getValueSTRINGTerminalRuleCall_2_0()); 
+			newLeafNode(lv_value_3_0, grammarAccess.getFeatureParameterValueAccess().getValueSTRINGTerminalRuleCall_3_0()); 
 		}
 		{
 	        if ($current==null) {
@@ -326,7 +316,7 @@ ruleFeatureParameterValue returns [EObject current=null]
        		setWithLastConsumed(
        			$current, 
        			"value",
-        		lv_value_2_0, 
+        		lv_value_3_0, 
         		"STRING");
 	    }
 

+ 6 - 8
plugins/org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.tokens

@@ -1,8 +1,4 @@
 RULE_ID=4
-RULE_ANY_OTHER=10
-RULE_SL_COMMENT=8
-RULE_ML_COMMENT=7
-T__19=19
 RULE_STRING=5
 T__16=16
 T__15=15
@@ -12,14 +8,16 @@ T__12=12
 T__11=11
 T__14=14
 T__13=13
+RULE_ANY_OTHER=10
 RULE_INT=6
 RULE_WS=9
+RULE_SL_COMMENT=8
+RULE_ML_COMMENT=7
 '}'=14
-'='=17
+'='=16
 'for'=12
 'GeneratorModel'=11
-'::'=18
+'::'=17
 'statechart'=15
-','=16
-'.'=19
+'.'=18
 '{'=13

+ 132 - 166
plugins/org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGenLexer.java

@@ -13,11 +13,6 @@ import java.util.ArrayList;
 @SuppressWarnings("all")
 public class InternalSGenLexer extends Lexer {
     public static final int RULE_ID=4;
-    public static final int RULE_ANY_OTHER=10;
-    public static final int RULE_SL_COMMENT=8;
-    public static final int EOF=-1;
-    public static final int RULE_ML_COMMENT=7;
-    public static final int T__19=19;
     public static final int RULE_STRING=5;
     public static final int T__16=16;
     public static final int T__15=15;
@@ -27,8 +22,12 @@ public class InternalSGenLexer extends Lexer {
     public static final int T__11=11;
     public static final int T__14=14;
     public static final int T__13=13;
+    public static final int RULE_ANY_OTHER=10;
     public static final int RULE_INT=6;
     public static final int RULE_WS=9;
+    public static final int RULE_SL_COMMENT=8;
+    public static final int EOF=-1;
+    public static final int RULE_ML_COMMENT=7;
 
     // delegates
     // delegators
@@ -151,10 +150,10 @@ public class InternalSGenLexer extends Lexer {
         try {
             int _type = T__16;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:16:7: ( ',' )
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:16:9: ','
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:16:7: ( '=' )
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:16:9: '='
             {
-            match(','); 
+            match('='); 
 
             }
 
@@ -171,10 +170,11 @@ public class InternalSGenLexer extends Lexer {
         try {
             int _type = T__17;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:17:7: ( '=' )
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:17:9: '='
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:17:7: ( '::' )
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:17:9: '::'
             {
-            match('='); 
+            match("::"); 
+
 
             }
 
@@ -191,29 +191,8 @@ public class InternalSGenLexer extends Lexer {
         try {
             int _type = T__18;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:18:7: ( '::' )
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:18:9: '::'
-            {
-            match("::"); 
-
-
-            }
-
-            state.type = _type;
-            state.channel = _channel;
-        }
-        finally {
-        }
-    }
-    // $ANTLR end "T__18"
-
-    // $ANTLR start "T__19"
-    public final void mT__19() throws RecognitionException {
-        try {
-            int _type = T__19;
-            int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:19:7: ( '.' )
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:19:9: '.'
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:18:7: ( '.' )
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:18:9: '.'
             {
             match('.'); 
 
@@ -225,17 +204,17 @@ public class InternalSGenLexer extends Lexer {
         finally {
         }
     }
-    // $ANTLR end "T__19"
+    // $ANTLR end "T__18"
 
     // $ANTLR start "RULE_ID"
     public final void mRULE_ID() throws RecognitionException {
         try {
             int _type = RULE_ID;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:389:9: ( ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' )* )
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:389:11: ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' )*
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:379:9: ( ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' )* )
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:379:11: ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' )*
             {
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:389:11: ( '^' )?
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:379:11: ( '^' )?
             int alt1=2;
             int LA1_0 = input.LA(1);
 
@@ -244,7 +223,7 @@ public class InternalSGenLexer extends Lexer {
             }
             switch (alt1) {
                 case 1 :
-                    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:389:11: '^'
+                    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:379:11: '^'
                     {
                     match('^'); 
 
@@ -262,7 +241,7 @@ public class InternalSGenLexer extends Lexer {
                 recover(mse);
                 throw mse;}
 
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:389:40: ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' )*
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:379:40: ( 'a' .. 'z' | 'A' .. 'Z' | '_' | '0' .. '9' )*
             loop2:
             do {
                 int alt2=2;
@@ -311,10 +290,10 @@ public class InternalSGenLexer extends Lexer {
         try {
             int _type = RULE_INT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:391:10: ( ( '0' .. '9' )+ )
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:391:12: ( '0' .. '9' )+
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:381:10: ( ( '0' .. '9' )+ )
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:381:12: ( '0' .. '9' )+
             {
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:391:12: ( '0' .. '9' )+
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:381:12: ( '0' .. '9' )+
             int cnt3=0;
             loop3:
             do {
@@ -328,7 +307,7 @@ public class InternalSGenLexer extends Lexer {
 
                 switch (alt3) {
             	case 1 :
-            	    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:391:13: '0' .. '9'
+            	    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:381:13: '0' .. '9'
             	    {
             	    matchRange('0','9'); 
 
@@ -360,10 +339,10 @@ public class InternalSGenLexer extends Lexer {
         try {
             int _type = RULE_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:393:13: ( ( '\"' ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) | ~ ( ( '\\\\' | '\"' ) ) )* '\"' | '\\'' ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' ) )
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:393:15: ( '\"' ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) | ~ ( ( '\\\\' | '\"' ) ) )* '\"' | '\\'' ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:383:13: ( ( '\"' ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) | ~ ( ( '\\\\' | '\"' ) ) )* '\"' | '\\'' ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' ) )
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:383:15: ( '\"' ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) | ~ ( ( '\\\\' | '\"' ) ) )* '\"' | '\\'' ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
             {
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:393:15: ( '\"' ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) | ~ ( ( '\\\\' | '\"' ) ) )* '\"' | '\\'' ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:383:15: ( '\"' ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) | ~ ( ( '\\\\' | '\"' ) ) )* '\"' | '\\'' ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) | ~ ( ( '\\\\' | '\\'' ) ) )* '\\'' )
             int alt6=2;
             int LA6_0 = input.LA(1);
 
@@ -381,10 +360,10 @@ public class InternalSGenLexer extends Lexer {
             }
             switch (alt6) {
                 case 1 :
-                    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:393:16: '\"' ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) | ~ ( ( '\\\\' | '\"' ) ) )* '\"'
+                    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:383:16: '\"' ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) | ~ ( ( '\\\\' | '\"' ) ) )* '\"'
                     {
                     match('\"'); 
-                    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:393:20: ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) | ~ ( ( '\\\\' | '\"' ) ) )*
+                    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:383:20: ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) | ~ ( ( '\\\\' | '\"' ) ) )*
                     loop4:
                     do {
                         int alt4=3;
@@ -400,7 +379,7 @@ public class InternalSGenLexer extends Lexer {
 
                         switch (alt4) {
                     	case 1 :
-                    	    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:393:21: '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' )
+                    	    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:383:21: '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' )
                     	    {
                     	    match('\\'); 
                     	    if ( input.LA(1)=='\"'||input.LA(1)=='\''||input.LA(1)=='\\'||input.LA(1)=='b'||input.LA(1)=='f'||input.LA(1)=='n'||input.LA(1)=='r'||(input.LA(1)>='t' && input.LA(1)<='u') ) {
@@ -416,7 +395,7 @@ public class InternalSGenLexer extends Lexer {
                     	    }
                     	    break;
                     	case 2 :
-                    	    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:393:66: ~ ( ( '\\\\' | '\"' ) )
+                    	    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:383:66: ~ ( ( '\\\\' | '\"' ) )
                     	    {
                     	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
                     	        input.consume();
@@ -441,10 +420,10 @@ public class InternalSGenLexer extends Lexer {
                     }
                     break;
                 case 2 :
-                    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:393:86: '\\'' ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) | ~ ( ( '\\\\' | '\\'' ) ) )* '\\''
+                    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:383:86: '\\'' ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) | ~ ( ( '\\\\' | '\\'' ) ) )* '\\''
                     {
                     match('\''); 
-                    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:393:91: ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) | ~ ( ( '\\\\' | '\\'' ) ) )*
+                    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:383:91: ( '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' ) | ~ ( ( '\\\\' | '\\'' ) ) )*
                     loop5:
                     do {
                         int alt5=3;
@@ -460,7 +439,7 @@ public class InternalSGenLexer extends Lexer {
 
                         switch (alt5) {
                     	case 1 :
-                    	    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:393:92: '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' )
+                    	    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:383:92: '\\\\' ( 'b' | 't' | 'n' | 'f' | 'r' | 'u' | '\"' | '\\'' | '\\\\' )
                     	    {
                     	    match('\\'); 
                     	    if ( input.LA(1)=='\"'||input.LA(1)=='\''||input.LA(1)=='\\'||input.LA(1)=='b'||input.LA(1)=='f'||input.LA(1)=='n'||input.LA(1)=='r'||(input.LA(1)>='t' && input.LA(1)<='u') ) {
@@ -476,7 +455,7 @@ public class InternalSGenLexer extends Lexer {
                     	    }
                     	    break;
                     	case 2 :
-                    	    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:393:137: ~ ( ( '\\\\' | '\\'' ) )
+                    	    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:383:137: ~ ( ( '\\\\' | '\\'' ) )
                     	    {
                     	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
                     	        input.consume();
@@ -519,12 +498,12 @@ public class InternalSGenLexer extends Lexer {
         try {
             int _type = RULE_ML_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:395:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:395:19: '/*' ( options {greedy=false; } : . )* '*/'
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:385:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:385:19: '/*' ( options {greedy=false; } : . )* '*/'
             {
             match("/*"); 
 
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:395:24: ( options {greedy=false; } : . )*
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:385:24: ( options {greedy=false; } : . )*
             loop7:
             do {
                 int alt7=2;
@@ -549,7 +528,7 @@ public class InternalSGenLexer extends Lexer {
 
                 switch (alt7) {
             	case 1 :
-            	    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:395:52: .
+            	    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:385:52: .
             	    {
             	    matchAny(); 
 
@@ -579,12 +558,12 @@ public class InternalSGenLexer extends Lexer {
         try {
             int _type = RULE_SL_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:397:17: ( '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:397:19: '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:387:17: ( '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:387:19: '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
             {
             match("//"); 
 
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:397:24: (~ ( ( '\\n' | '\\r' ) ) )*
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:387:24: (~ ( ( '\\n' | '\\r' ) ) )*
             loop8:
             do {
                 int alt8=2;
@@ -597,7 +576,7 @@ public class InternalSGenLexer extends Lexer {
 
                 switch (alt8) {
             	case 1 :
-            	    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:397:24: ~ ( ( '\\n' | '\\r' ) )
+            	    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:387:24: ~ ( ( '\\n' | '\\r' ) )
             	    {
             	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='\t')||(input.LA(1)>='\u000B' && input.LA(1)<='\f')||(input.LA(1)>='\u000E' && input.LA(1)<='\uFFFF') ) {
             	        input.consume();
@@ -617,7 +596,7 @@ public class InternalSGenLexer extends Lexer {
                 }
             } while (true);
 
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:397:40: ( ( '\\r' )? '\\n' )?
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:387:40: ( ( '\\r' )? '\\n' )?
             int alt10=2;
             int LA10_0 = input.LA(1);
 
@@ -626,9 +605,9 @@ public class InternalSGenLexer extends Lexer {
             }
             switch (alt10) {
                 case 1 :
-                    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:397:41: ( '\\r' )? '\\n'
+                    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:387:41: ( '\\r' )? '\\n'
                     {
-                    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:397:41: ( '\\r' )?
+                    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:387:41: ( '\\r' )?
                     int alt9=2;
                     int LA9_0 = input.LA(1);
 
@@ -637,7 +616,7 @@ public class InternalSGenLexer extends Lexer {
                     }
                     switch (alt9) {
                         case 1 :
-                            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:397:41: '\\r'
+                            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:387:41: '\\r'
                             {
                             match('\r'); 
 
@@ -669,10 +648,10 @@ public class InternalSGenLexer extends Lexer {
         try {
             int _type = RULE_WS;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:399:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:399:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:389:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:389:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             {
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:399:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:389:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             int cnt11=0;
             loop11:
             do {
@@ -726,8 +705,8 @@ public class InternalSGenLexer extends Lexer {
         try {
             int _type = RULE_ANY_OTHER;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:401:16: ( . )
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:401:18: .
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:391:16: ( . )
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:391:18: .
             {
             matchAny(); 
 
@@ -742,8 +721,8 @@ public class InternalSGenLexer extends Lexer {
     // $ANTLR end "RULE_ANY_OTHER"
 
     public void mTokens() throws RecognitionException {
-        // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:1:8: ( T__11 | T__12 | T__13 | T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | RULE_ID | RULE_INT | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER )
-        int alt12=16;
+        // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:1:8: ( T__11 | T__12 | T__13 | T__14 | T__15 | T__16 | T__17 | T__18 | RULE_ID | RULE_INT | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER )
+        int alt12=15;
         alt12 = dfa12.predict(input);
         switch (alt12) {
             case 1 :
@@ -803,56 +782,49 @@ public class InternalSGenLexer extends Lexer {
                 }
                 break;
             case 9 :
-                // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:1:58: T__19
-                {
-                mT__19(); 
-
-                }
-                break;
-            case 10 :
-                // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:1:64: RULE_ID
+                // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:1:58: RULE_ID
                 {
                 mRULE_ID(); 
 
                 }
                 break;
-            case 11 :
-                // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:1:72: RULE_INT
+            case 10 :
+                // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:1:66: RULE_INT
                 {
                 mRULE_INT(); 
 
                 }
                 break;
-            case 12 :
-                // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:1:81: RULE_STRING
+            case 11 :
+                // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:1:75: RULE_STRING
                 {
                 mRULE_STRING(); 
 
                 }
                 break;
-            case 13 :
-                // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:1:93: RULE_ML_COMMENT
+            case 12 :
+                // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:1:87: RULE_ML_COMMENT
                 {
                 mRULE_ML_COMMENT(); 
 
                 }
                 break;
-            case 14 :
-                // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:1:109: RULE_SL_COMMENT
+            case 13 :
+                // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:1:103: RULE_SL_COMMENT
                 {
                 mRULE_SL_COMMENT(); 
 
                 }
                 break;
-            case 15 :
-                // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:1:125: RULE_WS
+            case 14 :
+                // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:1:119: RULE_WS
                 {
                 mRULE_WS(); 
 
                 }
                 break;
-            case 16 :
-                // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:1:133: RULE_ANY_OTHER
+            case 15 :
+                // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:1:127: RULE_ANY_OTHER
                 {
                 mRULE_ANY_OTHER(); 
 
@@ -866,59 +838,55 @@ public class InternalSGenLexer extends Lexer {
 
     protected DFA12 dfa12 = new DFA12(this);
     static final String DFA12_eotS =
-        "\1\uffff\2\23\2\uffff\1\23\2\uffff\1\21\1\uffff\1\21\2\uffff\3"+
-        "\21\2\uffff\1\23\1\uffff\1\23\2\uffff\1\23\11\uffff\1\23\1\45\2"+
-        "\23\1\uffff\14\23\1\64\1\23\1\uffff\2\23\1\70\1\uffff";
+        "\1\uffff\2\22\2\uffff\1\22\1\uffff\1\20\1\uffff\1\20\2\uffff\3"+
+        "\20\2\uffff\1\22\1\uffff\1\22\2\uffff\1\22\10\uffff\1\22\1\43\2"+
+        "\22\1\uffff\14\22\1\62\1\22\1\uffff\2\22\1\66\1\uffff";
     static final String DFA12_eofS =
-        "\71\uffff";
+        "\67\uffff";
     static final String DFA12_minS =
-        "\1\0\1\145\1\157\2\uffff\1\164\2\uffff\1\72\1\uffff\1\101\2\uffff"+
-        "\2\0\1\52\2\uffff\1\156\1\uffff\1\162\2\uffff\1\141\11\uffff\1\145"+
+        "\1\0\1\145\1\157\2\uffff\1\164\1\uffff\1\72\1\uffff\1\101\2\uffff"+
+        "\2\0\1\52\2\uffff\1\156\1\uffff\1\162\2\uffff\1\141\10\uffff\1\145"+
         "\1\60\1\164\1\162\1\uffff\1\145\1\141\1\143\1\164\1\150\1\157\1"+
         "\141\2\162\1\115\1\164\1\157\1\60\1\144\1\uffff\1\145\1\154\1\60"+
         "\1\uffff";
     static final String DFA12_maxS =
-        "\1\uffff\1\145\1\157\2\uffff\1\164\2\uffff\1\72\1\uffff\1\172\2"+
-        "\uffff\2\uffff\1\57\2\uffff\1\156\1\uffff\1\162\2\uffff\1\141\11"+
+        "\1\uffff\1\145\1\157\2\uffff\1\164\1\uffff\1\72\1\uffff\1\172\2"+
+        "\uffff\2\uffff\1\57\2\uffff\1\156\1\uffff\1\162\2\uffff\1\141\10"+
         "\uffff\1\145\1\172\1\164\1\162\1\uffff\1\145\1\141\1\143\1\164\1"+
         "\150\1\157\1\141\2\162\1\115\1\164\1\157\1\172\1\144\1\uffff\1\145"+
         "\1\154\1\172\1\uffff";
     static final String DFA12_acceptS =
-        "\3\uffff\1\3\1\4\1\uffff\1\6\1\7\1\uffff\1\11\1\uffff\1\12\1\13"+
-        "\3\uffff\1\17\1\20\1\uffff\1\12\1\uffff\1\3\1\4\1\uffff\1\6\1\7"+
-        "\1\10\1\11\1\13\1\14\1\15\1\16\1\17\4\uffff\1\2\16\uffff\1\5\3\uffff"+
-        "\1\1";
+        "\3\uffff\1\3\1\4\1\uffff\1\6\1\uffff\1\10\1\uffff\1\11\1\12\3\uffff"+
+        "\1\16\1\17\1\uffff\1\11\1\uffff\1\3\1\4\1\uffff\1\6\1\7\1\10\1\12"+
+        "\1\13\1\14\1\15\1\16\4\uffff\1\2\16\uffff\1\5\3\uffff\1\1";
     static final String DFA12_specialS =
-        "\1\0\14\uffff\1\2\1\1\52\uffff}>";
+        "\1\2\13\uffff\1\1\1\0\51\uffff}>";
     static final String[] DFA12_transitionS = {
-            "\11\21\2\20\2\21\1\20\22\21\1\20\1\21\1\15\4\21\1\16\4\21\1"+
-            "\6\1\21\1\11\1\17\12\14\1\10\2\21\1\7\3\21\6\13\1\1\23\13\3"+
-            "\21\1\12\1\13\1\21\5\13\1\2\14\13\1\5\7\13\1\3\1\21\1\4\uff82"+
-            "\21",
-            "\1\22",
-            "\1\24",
-            "",
+            "\11\20\2\17\2\20\1\17\22\20\1\17\1\20\1\14\4\20\1\15\6\20\1"+
+            "\10\1\16\12\13\1\7\2\20\1\6\3\20\6\12\1\1\23\12\3\20\1\11\1"+
+            "\12\1\20\5\12\1\2\14\12\1\5\7\12\1\3\1\20\1\4\uff82\20",
+            "\1\21",
+            "\1\23",
             "",
-            "\1\27",
             "",
+            "\1\26",
             "",
-            "\1\32",
+            "\1\30",
             "",
-            "\32\23\4\uffff\1\23\1\uffff\32\23",
+            "\32\22\4\uffff\1\22\1\uffff\32\22",
             "",
             "",
-            "\0\35",
-            "\0\35",
-            "\1\36\4\uffff\1\37",
+            "\0\33",
+            "\0\33",
+            "\1\34\4\uffff\1\35",
             "",
             "",
-            "\1\41",
-            "",
-            "\1\42",
+            "\1\37",
             "",
+            "\1\40",
             "",
-            "\1\43",
             "",
+            "\1\41",
             "",
             "",
             "",
@@ -927,11 +895,13 @@ public class InternalSGenLexer extends Lexer {
             "",
             "",
             "",
+            "\1\42",
+            "\12\22\7\uffff\32\22\4\uffff\1\22\1\uffff\32\22",
             "\1\44",
-            "\12\23\7\uffff\32\23\4\uffff\1\23\1\uffff\32\23",
+            "\1\45",
+            "",
             "\1\46",
             "\1\47",
-            "",
             "\1\50",
             "\1\51",
             "\1\52",
@@ -942,14 +912,12 @@ public class InternalSGenLexer extends Lexer {
             "\1\57",
             "\1\60",
             "\1\61",
-            "\1\62",
+            "\12\22\7\uffff\32\22\4\uffff\1\22\1\uffff\32\22",
             "\1\63",
-            "\12\23\7\uffff\32\23\4\uffff\1\23\1\uffff\32\23",
-            "\1\65",
             "",
-            "\1\66",
-            "\1\67",
-            "\12\23\7\uffff\32\23\4\uffff\1\23\1\uffff\32\23",
+            "\1\64",
+            "\1\65",
+            "\12\22\7\uffff\32\22\4\uffff\1\22\1\uffff\32\22",
             ""
     };
 
@@ -983,69 +951,67 @@ public class InternalSGenLexer extends Lexer {
             this.transition = DFA12_transition;
         }
         public String getDescription() {
-            return "1:1: Tokens : ( T__11 | T__12 | T__13 | T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | RULE_ID | RULE_INT | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER );";
+            return "1:1: Tokens : ( T__11 | T__12 | T__13 | T__14 | T__15 | T__16 | T__17 | T__18 | RULE_ID | RULE_INT | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER );";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             IntStream input = _input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA12_0 = input.LA(1);
+                        int LA12_13 = input.LA(1);
 
                         s = -1;
-                        if ( (LA12_0=='G') ) {s = 1;}
+                        if ( ((LA12_13>='\u0000' && LA12_13<='\uFFFF')) ) {s = 27;}
 
-                        else if ( (LA12_0=='f') ) {s = 2;}
+                        else s = 16;
 
-                        else if ( (LA12_0=='{') ) {s = 3;}
-
-                        else if ( (LA12_0=='}') ) {s = 4;}
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA12_12 = input.LA(1);
 
-                        else if ( (LA12_0=='s') ) {s = 5;}
+                        s = -1;
+                        if ( ((LA12_12>='\u0000' && LA12_12<='\uFFFF')) ) {s = 27;}
 
-                        else if ( (LA12_0==',') ) {s = 6;}
+                        else s = 16;
 
-                        else if ( (LA12_0=='=') ) {s = 7;}
+                        if ( s>=0 ) return s;
+                        break;
+                    case 2 : 
+                        int LA12_0 = input.LA(1);
 
-                        else if ( (LA12_0==':') ) {s = 8;}
+                        s = -1;
+                        if ( (LA12_0=='G') ) {s = 1;}
 
-                        else if ( (LA12_0=='.') ) {s = 9;}
+                        else if ( (LA12_0=='f') ) {s = 2;}
 
-                        else if ( (LA12_0=='^') ) {s = 10;}
+                        else if ( (LA12_0=='{') ) {s = 3;}
 
-                        else if ( ((LA12_0>='A' && LA12_0<='F')||(LA12_0>='H' && LA12_0<='Z')||LA12_0=='_'||(LA12_0>='a' && LA12_0<='e')||(LA12_0>='g' && LA12_0<='r')||(LA12_0>='t' && LA12_0<='z')) ) {s = 11;}
+                        else if ( (LA12_0=='}') ) {s = 4;}
 
-                        else if ( ((LA12_0>='0' && LA12_0<='9')) ) {s = 12;}
+                        else if ( (LA12_0=='s') ) {s = 5;}
 
-                        else if ( (LA12_0=='\"') ) {s = 13;}
+                        else if ( (LA12_0=='=') ) {s = 6;}
 
-                        else if ( (LA12_0=='\'') ) {s = 14;}
+                        else if ( (LA12_0==':') ) {s = 7;}
 
-                        else if ( (LA12_0=='/') ) {s = 15;}
+                        else if ( (LA12_0=='.') ) {s = 8;}
 
-                        else if ( ((LA12_0>='\t' && LA12_0<='\n')||LA12_0=='\r'||LA12_0==' ') ) {s = 16;}
+                        else if ( (LA12_0=='^') ) {s = 9;}
 
-                        else if ( ((LA12_0>='\u0000' && LA12_0<='\b')||(LA12_0>='\u000B' && LA12_0<='\f')||(LA12_0>='\u000E' && LA12_0<='\u001F')||LA12_0=='!'||(LA12_0>='#' && LA12_0<='&')||(LA12_0>='(' && LA12_0<='+')||LA12_0=='-'||(LA12_0>=';' && LA12_0<='<')||(LA12_0>='>' && LA12_0<='@')||(LA12_0>='[' && LA12_0<=']')||LA12_0=='`'||LA12_0=='|'||(LA12_0>='~' && LA12_0<='\uFFFF')) ) {s = 17;}
+                        else if ( ((LA12_0>='A' && LA12_0<='F')||(LA12_0>='H' && LA12_0<='Z')||LA12_0=='_'||(LA12_0>='a' && LA12_0<='e')||(LA12_0>='g' && LA12_0<='r')||(LA12_0>='t' && LA12_0<='z')) ) {s = 10;}
 
-                        if ( s>=0 ) return s;
-                        break;
-                    case 1 : 
-                        int LA12_14 = input.LA(1);
+                        else if ( ((LA12_0>='0' && LA12_0<='9')) ) {s = 11;}
 
-                        s = -1;
-                        if ( ((LA12_14>='\u0000' && LA12_14<='\uFFFF')) ) {s = 29;}
+                        else if ( (LA12_0=='\"') ) {s = 12;}
 
-                        else s = 17;
+                        else if ( (LA12_0=='\'') ) {s = 13;}
 
-                        if ( s>=0 ) return s;
-                        break;
-                    case 2 : 
-                        int LA12_13 = input.LA(1);
+                        else if ( (LA12_0=='/') ) {s = 14;}
 
-                        s = -1;
-                        if ( ((LA12_13>='\u0000' && LA12_13<='\uFFFF')) ) {s = 29;}
+                        else if ( ((LA12_0>='\t' && LA12_0<='\n')||LA12_0=='\r'||LA12_0==' ') ) {s = 15;}
 
-                        else s = 17;
+                        else if ( ((LA12_0>='\u0000' && LA12_0<='\b')||(LA12_0>='\u000B' && LA12_0<='\f')||(LA12_0>='\u000E' && LA12_0<='\u001F')||LA12_0=='!'||(LA12_0>='#' && LA12_0<='&')||(LA12_0>='(' && LA12_0<='-')||(LA12_0>=';' && LA12_0<='<')||(LA12_0>='>' && LA12_0<='@')||(LA12_0>='[' && LA12_0<=']')||LA12_0=='`'||LA12_0=='|'||(LA12_0>='~' && LA12_0<='\uFFFF')) ) {s = 16;}
 
                         if ( s>=0 ) return s;
                         break;

+ 124 - 144
plugins/org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGenParser.java

@@ -21,14 +21,9 @@ import java.util.ArrayList;
 @SuppressWarnings("all")
 public class InternalSGenParser extends AbstractInternalAntlrParser {
     public static final String[] tokenNames = new String[] {
-        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_ID", "RULE_STRING", "RULE_INT", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'GeneratorModel'", "'for'", "'{'", "'}'", "'statechart'", "','", "'='", "'::'", "'.'"
+        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_ID", "RULE_STRING", "RULE_INT", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'GeneratorModel'", "'for'", "'{'", "'}'", "'statechart'", "'='", "'::'", "'.'"
     };
     public static final int RULE_ID=4;
-    public static final int RULE_ANY_OTHER=10;
-    public static final int EOF=-1;
-    public static final int RULE_SL_COMMENT=8;
-    public static final int RULE_ML_COMMENT=7;
-    public static final int T__19=19;
     public static final int RULE_STRING=5;
     public static final int T__16=16;
     public static final int T__15=15;
@@ -38,8 +33,12 @@ public class InternalSGenParser extends AbstractInternalAntlrParser {
     public static final int T__11=11;
     public static final int T__14=14;
     public static final int T__13=13;
+    public static final int RULE_ANY_OTHER=10;
     public static final int RULE_INT=6;
     public static final int RULE_WS=9;
+    public static final int RULE_SL_COMMENT=8;
+    public static final int EOF=-1;
+    public static final int RULE_ML_COMMENT=7;
 
     // delegates
     // delegators
@@ -455,42 +454,50 @@ public class InternalSGenParser extends AbstractInternalAntlrParser {
 
 
     // $ANTLR start "ruleFeatureConfiguration"
-    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:213:1: ruleFeatureConfiguration returns [EObject current=null] : ( ( (otherlv_0= RULE_ID ) ) otherlv_1= '{' ( (lv_parameterValues_2_0= ruleFeatureParameterValue ) ) (otherlv_3= ',' ( (lv_parameterValues_4_0= ruleFeatureParameterValue ) ) )* otherlv_5= '}' ) ;
+    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:213:1: ruleFeatureConfiguration returns [EObject current=null] : ( () ( (otherlv_1= RULE_ID ) ) otherlv_2= '{' ( (lv_parameterValues_3_0= ruleFeatureParameterValue ) )+ otherlv_4= '}' ) ;
     public final EObject ruleFeatureConfiguration() throws RecognitionException {
         EObject current = null;
 
-        Token otherlv_0=null;
         Token otherlv_1=null;
-        Token otherlv_3=null;
-        Token otherlv_5=null;
-        EObject lv_parameterValues_2_0 = null;
-
-        EObject lv_parameterValues_4_0 = null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        EObject lv_parameterValues_3_0 = null;
 
 
          enterRule(); 
             
         try {
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:216:28: ( ( ( (otherlv_0= RULE_ID ) ) otherlv_1= '{' ( (lv_parameterValues_2_0= ruleFeatureParameterValue ) ) (otherlv_3= ',' ( (lv_parameterValues_4_0= ruleFeatureParameterValue ) ) )* otherlv_5= '}' ) )
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:217:1: ( ( (otherlv_0= RULE_ID ) ) otherlv_1= '{' ( (lv_parameterValues_2_0= ruleFeatureParameterValue ) ) (otherlv_3= ',' ( (lv_parameterValues_4_0= ruleFeatureParameterValue ) ) )* otherlv_5= '}' )
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:216:28: ( ( () ( (otherlv_1= RULE_ID ) ) otherlv_2= '{' ( (lv_parameterValues_3_0= ruleFeatureParameterValue ) )+ otherlv_4= '}' ) )
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:217:1: ( () ( (otherlv_1= RULE_ID ) ) otherlv_2= '{' ( (lv_parameterValues_3_0= ruleFeatureParameterValue ) )+ otherlv_4= '}' )
             {
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:217:1: ( ( (otherlv_0= RULE_ID ) ) otherlv_1= '{' ( (lv_parameterValues_2_0= ruleFeatureParameterValue ) ) (otherlv_3= ',' ( (lv_parameterValues_4_0= ruleFeatureParameterValue ) ) )* otherlv_5= '}' )
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:217:2: ( (otherlv_0= RULE_ID ) ) otherlv_1= '{' ( (lv_parameterValues_2_0= ruleFeatureParameterValue ) ) (otherlv_3= ',' ( (lv_parameterValues_4_0= ruleFeatureParameterValue ) ) )* otherlv_5= '}'
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:217:1: ( () ( (otherlv_1= RULE_ID ) ) otherlv_2= '{' ( (lv_parameterValues_3_0= ruleFeatureParameterValue ) )+ otherlv_4= '}' )
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:217:2: () ( (otherlv_1= RULE_ID ) ) otherlv_2= '{' ( (lv_parameterValues_3_0= ruleFeatureParameterValue ) )+ otherlv_4= '}'
             {
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:217:2: ( (otherlv_0= RULE_ID ) )
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:218:1: (otherlv_0= RULE_ID )
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:217:2: ()
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:218:5: 
             {
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:218:1: (otherlv_0= RULE_ID )
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:219:3: otherlv_0= RULE_ID
+
+                    current = forceCreateModelElement(
+                        grammarAccess.getFeatureConfigurationAccess().getFeatureConfigurationAction_0(),
+                        current);
+                
+
+            }
+
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:223:2: ( (otherlv_1= RULE_ID ) )
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:224:1: (otherlv_1= RULE_ID )
+            {
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:224:1: (otherlv_1= RULE_ID )
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:225:3: otherlv_1= RULE_ID
             {
 
             			if (current==null) {
             	            current = createModelElement(grammarAccess.getFeatureConfigurationRule());
             	        }
                     
-            otherlv_0=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleFeatureConfiguration441); 
+            otherlv_1=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleFeatureConfiguration450); 
 
-            		newLeafNode(otherlv_0, grammarAccess.getFeatureConfigurationAccess().getTypeFeatureTypeCrossReference_0_0()); 
+            		newLeafNode(otherlv_1, grammarAccess.getFeatureConfigurationAccess().getTypeFeatureTypeCrossReference_1_0()); 
             	
 
             }
@@ -498,71 +505,34 @@ public class InternalSGenParser extends AbstractInternalAntlrParser {
 
             }
 
-            otherlv_1=(Token)match(input,13,FOLLOW_13_in_ruleFeatureConfiguration453); 
+            otherlv_2=(Token)match(input,13,FOLLOW_13_in_ruleFeatureConfiguration462); 
 
-                	newLeafNode(otherlv_1, grammarAccess.getFeatureConfigurationAccess().getLeftCurlyBracketKeyword_1());
+                	newLeafNode(otherlv_2, grammarAccess.getFeatureConfigurationAccess().getLeftCurlyBracketKeyword_2());
                 
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:234:1: ( (lv_parameterValues_2_0= ruleFeatureParameterValue ) )
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:235:1: (lv_parameterValues_2_0= ruleFeatureParameterValue )
-            {
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:235:1: (lv_parameterValues_2_0= ruleFeatureParameterValue )
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:236:3: lv_parameterValues_2_0= ruleFeatureParameterValue
-            {
-             
-            	        newCompositeNode(grammarAccess.getFeatureConfigurationAccess().getParameterValuesFeatureParameterValueParserRuleCall_2_0()); 
-            	    
-            pushFollow(FOLLOW_ruleFeatureParameterValue_in_ruleFeatureConfiguration474);
-            lv_parameterValues_2_0=ruleFeatureParameterValue();
-
-            state._fsp--;
-
-
-            	        if (current==null) {
-            	            current = createModelElementForParent(grammarAccess.getFeatureConfigurationRule());
-            	        }
-                   		add(
-                   			current, 
-                   			"parameterValues",
-                    		lv_parameterValues_2_0, 
-                    		"FeatureParameterValue");
-            	        afterParserOrEnumRuleCall();
-            	    
-
-            }
-
-
-            }
-
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:252:2: (otherlv_3= ',' ( (lv_parameterValues_4_0= ruleFeatureParameterValue ) ) )*
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:240:1: ( (lv_parameterValues_3_0= ruleFeatureParameterValue ) )+
+            int cnt3=0;
             loop3:
             do {
                 int alt3=2;
                 int LA3_0 = input.LA(1);
 
-                if ( (LA3_0==16) ) {
+                if ( (LA3_0==RULE_ID) ) {
                     alt3=1;
                 }
 
 
                 switch (alt3) {
             	case 1 :
-            	    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:252:4: otherlv_3= ',' ( (lv_parameterValues_4_0= ruleFeatureParameterValue ) )
-            	    {
-            	    otherlv_3=(Token)match(input,16,FOLLOW_16_in_ruleFeatureConfiguration487); 
-
-            	        	newLeafNode(otherlv_3, grammarAccess.getFeatureConfigurationAccess().getCommaKeyword_3_0());
-            	        
-            	    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:256:1: ( (lv_parameterValues_4_0= ruleFeatureParameterValue ) )
-            	    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:257:1: (lv_parameterValues_4_0= ruleFeatureParameterValue )
+            	    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:241:1: (lv_parameterValues_3_0= ruleFeatureParameterValue )
             	    {
-            	    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:257:1: (lv_parameterValues_4_0= ruleFeatureParameterValue )
-            	    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:258:3: lv_parameterValues_4_0= ruleFeatureParameterValue
+            	    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:241:1: (lv_parameterValues_3_0= ruleFeatureParameterValue )
+            	    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:242:3: lv_parameterValues_3_0= ruleFeatureParameterValue
             	    {
             	     
-            	    	        newCompositeNode(grammarAccess.getFeatureConfigurationAccess().getParameterValuesFeatureParameterValueParserRuleCall_3_1_0()); 
+            	    	        newCompositeNode(grammarAccess.getFeatureConfigurationAccess().getParameterValuesFeatureParameterValueParserRuleCall_3_0()); 
             	    	    
-            	    pushFollow(FOLLOW_ruleFeatureParameterValue_in_ruleFeatureConfiguration508);
-            	    lv_parameterValues_4_0=ruleFeatureParameterValue();
+            	    pushFollow(FOLLOW_ruleFeatureParameterValue_in_ruleFeatureConfiguration483);
+            	    lv_parameterValues_3_0=ruleFeatureParameterValue();
 
             	    state._fsp--;
 
@@ -573,7 +543,7 @@ public class InternalSGenParser extends AbstractInternalAntlrParser {
             	           		add(
             	           			current, 
             	           			"parameterValues",
-            	            		lv_parameterValues_4_0, 
+            	            		lv_parameterValues_3_0, 
             	            		"FeatureParameterValue");
             	    	        afterParserOrEnumRuleCall();
             	    	    
@@ -581,20 +551,21 @@ public class InternalSGenParser extends AbstractInternalAntlrParser {
             	    }
 
 
-            	    }
-
-
             	    }
             	    break;
 
             	default :
-            	    break loop3;
+            	    if ( cnt3 >= 1 ) break loop3;
+                        EarlyExitException eee =
+                            new EarlyExitException(3, input);
+                        throw eee;
                 }
+                cnt3++;
             } while (true);
 
-            otherlv_5=(Token)match(input,14,FOLLOW_14_in_ruleFeatureConfiguration522); 
+            otherlv_4=(Token)match(input,14,FOLLOW_14_in_ruleFeatureConfiguration496); 
 
-                	newLeafNode(otherlv_5, grammarAccess.getFeatureConfigurationAccess().getRightCurlyBracketKeyword_4());
+                	newLeafNode(otherlv_4, grammarAccess.getFeatureConfigurationAccess().getRightCurlyBracketKeyword_4());
                 
 
             }
@@ -617,7 +588,7 @@ public class InternalSGenParser extends AbstractInternalAntlrParser {
 
 
     // $ANTLR start "entryRuleFeatureParameterValue"
-    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:286:1: entryRuleFeatureParameterValue returns [EObject current=null] : iv_ruleFeatureParameterValue= ruleFeatureParameterValue EOF ;
+    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:270:1: entryRuleFeatureParameterValue returns [EObject current=null] : iv_ruleFeatureParameterValue= ruleFeatureParameterValue EOF ;
     public final EObject entryRuleFeatureParameterValue() throws RecognitionException {
         EObject current = null;
 
@@ -625,17 +596,17 @@ public class InternalSGenParser extends AbstractInternalAntlrParser {
 
 
         try {
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:287:2: (iv_ruleFeatureParameterValue= ruleFeatureParameterValue EOF )
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:288:2: iv_ruleFeatureParameterValue= ruleFeatureParameterValue EOF
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:271:2: (iv_ruleFeatureParameterValue= ruleFeatureParameterValue EOF )
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:272:2: iv_ruleFeatureParameterValue= ruleFeatureParameterValue EOF
             {
              newCompositeNode(grammarAccess.getFeatureParameterValueRule()); 
-            pushFollow(FOLLOW_ruleFeatureParameterValue_in_entryRuleFeatureParameterValue558);
+            pushFollow(FOLLOW_ruleFeatureParameterValue_in_entryRuleFeatureParameterValue532);
             iv_ruleFeatureParameterValue=ruleFeatureParameterValue();
 
             state._fsp--;
 
              current =iv_ruleFeatureParameterValue; 
-            match(input,EOF,FOLLOW_EOF_in_entryRuleFeatureParameterValue568); 
+            match(input,EOF,FOLLOW_EOF_in_entryRuleFeatureParameterValue542); 
 
             }
 
@@ -653,37 +624,48 @@ public class InternalSGenParser extends AbstractInternalAntlrParser {
 
 
     // $ANTLR start "ruleFeatureParameterValue"
-    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:295:1: ruleFeatureParameterValue returns [EObject current=null] : ( ( (otherlv_0= RULE_ID ) ) otherlv_1= '=' ( (lv_value_2_0= RULE_STRING ) ) ) ;
+    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:279:1: ruleFeatureParameterValue returns [EObject current=null] : ( () ( (otherlv_1= RULE_ID ) ) otherlv_2= '=' ( (lv_value_3_0= RULE_STRING ) ) ) ;
     public final EObject ruleFeatureParameterValue() throws RecognitionException {
         EObject current = null;
 
-        Token otherlv_0=null;
         Token otherlv_1=null;
-        Token lv_value_2_0=null;
+        Token otherlv_2=null;
+        Token lv_value_3_0=null;
 
          enterRule(); 
             
         try {
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:298:28: ( ( ( (otherlv_0= RULE_ID ) ) otherlv_1= '=' ( (lv_value_2_0= RULE_STRING ) ) ) )
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:299:1: ( ( (otherlv_0= RULE_ID ) ) otherlv_1= '=' ( (lv_value_2_0= RULE_STRING ) ) )
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:282:28: ( ( () ( (otherlv_1= RULE_ID ) ) otherlv_2= '=' ( (lv_value_3_0= RULE_STRING ) ) ) )
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:283:1: ( () ( (otherlv_1= RULE_ID ) ) otherlv_2= '=' ( (lv_value_3_0= RULE_STRING ) ) )
             {
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:299:1: ( ( (otherlv_0= RULE_ID ) ) otherlv_1= '=' ( (lv_value_2_0= RULE_STRING ) ) )
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:299:2: ( (otherlv_0= RULE_ID ) ) otherlv_1= '=' ( (lv_value_2_0= RULE_STRING ) )
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:283:1: ( () ( (otherlv_1= RULE_ID ) ) otherlv_2= '=' ( (lv_value_3_0= RULE_STRING ) ) )
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:283:2: () ( (otherlv_1= RULE_ID ) ) otherlv_2= '=' ( (lv_value_3_0= RULE_STRING ) )
             {
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:299:2: ( (otherlv_0= RULE_ID ) )
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:300:1: (otherlv_0= RULE_ID )
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:283:2: ()
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:284:5: 
+            {
+
+                    current = forceCreateModelElement(
+                        grammarAccess.getFeatureParameterValueAccess().getFeatureParameterValueAction_0(),
+                        current);
+                
+
+            }
+
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:289:2: ( (otherlv_1= RULE_ID ) )
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:290:1: (otherlv_1= RULE_ID )
             {
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:300:1: (otherlv_0= RULE_ID )
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:301:3: otherlv_0= RULE_ID
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:290:1: (otherlv_1= RULE_ID )
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:291:3: otherlv_1= RULE_ID
             {
 
             			if (current==null) {
             	            current = createModelElement(grammarAccess.getFeatureParameterValueRule());
             	        }
                     
-            otherlv_0=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleFeatureParameterValue613); 
+            otherlv_1=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleFeatureParameterValue596); 
 
-            		newLeafNode(otherlv_0, grammarAccess.getFeatureParameterValueAccess().getParameterFeatureParameterCrossReference_0_0()); 
+            		newLeafNode(otherlv_1, grammarAccess.getFeatureParameterValueAccess().getParameterFeatureParameterCrossReference_1_0()); 
             	
 
             }
@@ -691,19 +673,19 @@ public class InternalSGenParser extends AbstractInternalAntlrParser {
 
             }
 
-            otherlv_1=(Token)match(input,17,FOLLOW_17_in_ruleFeatureParameterValue625); 
+            otherlv_2=(Token)match(input,16,FOLLOW_16_in_ruleFeatureParameterValue608); 
 
-                	newLeafNode(otherlv_1, grammarAccess.getFeatureParameterValueAccess().getEqualsSignKeyword_1());
+                	newLeafNode(otherlv_2, grammarAccess.getFeatureParameterValueAccess().getEqualsSignKeyword_2());
                 
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:316:1: ( (lv_value_2_0= RULE_STRING ) )
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:317:1: (lv_value_2_0= RULE_STRING )
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:306:1: ( (lv_value_3_0= RULE_STRING ) )
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:307:1: (lv_value_3_0= RULE_STRING )
             {
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:317:1: (lv_value_2_0= RULE_STRING )
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:318:3: lv_value_2_0= RULE_STRING
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:307:1: (lv_value_3_0= RULE_STRING )
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:308:3: lv_value_3_0= RULE_STRING
             {
-            lv_value_2_0=(Token)match(input,RULE_STRING,FOLLOW_RULE_STRING_in_ruleFeatureParameterValue642); 
+            lv_value_3_0=(Token)match(input,RULE_STRING,FOLLOW_RULE_STRING_in_ruleFeatureParameterValue625); 
 
-            			newLeafNode(lv_value_2_0, grammarAccess.getFeatureParameterValueAccess().getValueSTRINGTerminalRuleCall_2_0()); 
+            			newLeafNode(lv_value_3_0, grammarAccess.getFeatureParameterValueAccess().getValueSTRINGTerminalRuleCall_3_0()); 
             		
 
             	        if (current==null) {
@@ -712,7 +694,7 @@ public class InternalSGenParser extends AbstractInternalAntlrParser {
                    		setWithLastConsumed(
                    			current, 
                    			"value",
-                    		lv_value_2_0, 
+                    		lv_value_3_0, 
                     		"STRING");
             	    
 
@@ -742,7 +724,7 @@ public class InternalSGenParser extends AbstractInternalAntlrParser {
 
 
     // $ANTLR start "entryRuleQID"
-    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:342:1: entryRuleQID returns [String current=null] : iv_ruleQID= ruleQID EOF ;
+    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:332:1: entryRuleQID returns [String current=null] : iv_ruleQID= ruleQID EOF ;
     public final String entryRuleQID() throws RecognitionException {
         String current = null;
 
@@ -750,17 +732,17 @@ public class InternalSGenParser extends AbstractInternalAntlrParser {
 
 
         try {
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:343:2: (iv_ruleQID= ruleQID EOF )
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:344:2: iv_ruleQID= ruleQID EOF
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:333:2: (iv_ruleQID= ruleQID EOF )
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:334:2: iv_ruleQID= ruleQID EOF
             {
              newCompositeNode(grammarAccess.getQIDRule()); 
-            pushFollow(FOLLOW_ruleQID_in_entryRuleQID684);
+            pushFollow(FOLLOW_ruleQID_in_entryRuleQID667);
             iv_ruleQID=ruleQID();
 
             state._fsp--;
 
              current =iv_ruleQID.getText(); 
-            match(input,EOF,FOLLOW_EOF_in_entryRuleQID695); 
+            match(input,EOF,FOLLOW_EOF_in_entryRuleQID678); 
 
             }
 
@@ -778,7 +760,7 @@ public class InternalSGenParser extends AbstractInternalAntlrParser {
 
 
     // $ANTLR start "ruleQID"
-    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:351:1: ruleQID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_ID_0= RULE_ID ( (kw= '::' | kw= '.' ) this_ID_3= RULE_ID )* ) ;
+    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:341:1: ruleQID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_ID_0= RULE_ID ( (kw= '::' | kw= '.' ) this_ID_3= RULE_ID )* ) ;
     public final AntlrDatatypeRuleToken ruleQID() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -789,42 +771,42 @@ public class InternalSGenParser extends AbstractInternalAntlrParser {
          enterRule(); 
             
         try {
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:354:28: ( (this_ID_0= RULE_ID ( (kw= '::' | kw= '.' ) this_ID_3= RULE_ID )* ) )
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:355:1: (this_ID_0= RULE_ID ( (kw= '::' | kw= '.' ) this_ID_3= RULE_ID )* )
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:344:28: ( (this_ID_0= RULE_ID ( (kw= '::' | kw= '.' ) this_ID_3= RULE_ID )* ) )
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:345:1: (this_ID_0= RULE_ID ( (kw= '::' | kw= '.' ) this_ID_3= RULE_ID )* )
             {
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:355:1: (this_ID_0= RULE_ID ( (kw= '::' | kw= '.' ) this_ID_3= RULE_ID )* )
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:355:6: this_ID_0= RULE_ID ( (kw= '::' | kw= '.' ) this_ID_3= RULE_ID )*
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:345:1: (this_ID_0= RULE_ID ( (kw= '::' | kw= '.' ) this_ID_3= RULE_ID )* )
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:345:6: this_ID_0= RULE_ID ( (kw= '::' | kw= '.' ) this_ID_3= RULE_ID )*
             {
-            this_ID_0=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleQID735); 
+            this_ID_0=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleQID718); 
 
             		current.merge(this_ID_0);
                 
              
                 newLeafNode(this_ID_0, grammarAccess.getQIDAccess().getIDTerminalRuleCall_0()); 
                 
-            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:362:1: ( (kw= '::' | kw= '.' ) this_ID_3= RULE_ID )*
+            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:352:1: ( (kw= '::' | kw= '.' ) this_ID_3= RULE_ID )*
             loop5:
             do {
                 int alt5=2;
                 int LA5_0 = input.LA(1);
 
-                if ( ((LA5_0>=18 && LA5_0<=19)) ) {
+                if ( ((LA5_0>=17 && LA5_0<=18)) ) {
                     alt5=1;
                 }
 
 
                 switch (alt5) {
             	case 1 :
-            	    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:362:2: (kw= '::' | kw= '.' ) this_ID_3= RULE_ID
+            	    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:352:2: (kw= '::' | kw= '.' ) this_ID_3= RULE_ID
             	    {
-            	    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:362:2: (kw= '::' | kw= '.' )
+            	    // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:352:2: (kw= '::' | kw= '.' )
             	    int alt4=2;
             	    int LA4_0 = input.LA(1);
 
-            	    if ( (LA4_0==18) ) {
+            	    if ( (LA4_0==17) ) {
             	        alt4=1;
             	    }
-            	    else if ( (LA4_0==19) ) {
+            	    else if ( (LA4_0==18) ) {
             	        alt4=2;
             	    }
             	    else {
@@ -835,9 +817,9 @@ public class InternalSGenParser extends AbstractInternalAntlrParser {
             	    }
             	    switch (alt4) {
             	        case 1 :
-            	            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:363:2: kw= '::'
+            	            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:353:2: kw= '::'
             	            {
-            	            kw=(Token)match(input,18,FOLLOW_18_in_ruleQID755); 
+            	            kw=(Token)match(input,17,FOLLOW_17_in_ruleQID738); 
 
             	                    current.merge(kw);
             	                    newLeafNode(kw, grammarAccess.getQIDAccess().getColonColonKeyword_1_0_0()); 
@@ -846,9 +828,9 @@ public class InternalSGenParser extends AbstractInternalAntlrParser {
             	            }
             	            break;
             	        case 2 :
-            	            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:370:2: kw= '.'
+            	            // ../org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/parser/antlr/internal/InternalSGen.g:360:2: kw= '.'
             	            {
-            	            kw=(Token)match(input,19,FOLLOW_19_in_ruleQID774); 
+            	            kw=(Token)match(input,18,FOLLOW_18_in_ruleQID757); 
 
             	                    current.merge(kw);
             	                    newLeafNode(kw, grammarAccess.getQIDAccess().getFullStopKeyword_1_0_1()); 
@@ -859,7 +841,7 @@ public class InternalSGenParser extends AbstractInternalAntlrParser {
 
             	    }
 
-            	    this_ID_3=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleQID790); 
+            	    this_ID_3=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleQID773); 
 
             	    		current.merge(this_ID_3);
             	        
@@ -916,22 +898,20 @@ public class InternalSGenParser extends AbstractInternalAntlrParser {
     public static final BitSet FOLLOW_14_in_ruleGeneratorEntry350 = new BitSet(new long[]{0x0000000000000002L});
     public static final BitSet FOLLOW_ruleFeatureConfiguration_in_entryRuleFeatureConfiguration386 = new BitSet(new long[]{0x0000000000000000L});
     public static final BitSet FOLLOW_EOF_in_entryRuleFeatureConfiguration396 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_RULE_ID_in_ruleFeatureConfiguration441 = new BitSet(new long[]{0x0000000000002000L});
-    public static final BitSet FOLLOW_13_in_ruleFeatureConfiguration453 = new BitSet(new long[]{0x0000000000000010L});
-    public static final BitSet FOLLOW_ruleFeatureParameterValue_in_ruleFeatureConfiguration474 = new BitSet(new long[]{0x0000000000014000L});
-    public static final BitSet FOLLOW_16_in_ruleFeatureConfiguration487 = new BitSet(new long[]{0x0000000000000010L});
-    public static final BitSet FOLLOW_ruleFeatureParameterValue_in_ruleFeatureConfiguration508 = new BitSet(new long[]{0x0000000000014000L});
-    public static final BitSet FOLLOW_14_in_ruleFeatureConfiguration522 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ruleFeatureParameterValue_in_entryRuleFeatureParameterValue558 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRuleFeatureParameterValue568 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_RULE_ID_in_ruleFeatureParameterValue613 = new BitSet(new long[]{0x0000000000020000L});
-    public static final BitSet FOLLOW_17_in_ruleFeatureParameterValue625 = new BitSet(new long[]{0x0000000000000020L});
-    public static final BitSet FOLLOW_RULE_STRING_in_ruleFeatureParameterValue642 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ruleQID_in_entryRuleQID684 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRuleQID695 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_RULE_ID_in_ruleQID735 = new BitSet(new long[]{0x00000000000C0002L});
-    public static final BitSet FOLLOW_18_in_ruleQID755 = new BitSet(new long[]{0x0000000000000010L});
-    public static final BitSet FOLLOW_19_in_ruleQID774 = new BitSet(new long[]{0x0000000000000010L});
-    public static final BitSet FOLLOW_RULE_ID_in_ruleQID790 = new BitSet(new long[]{0x00000000000C0002L});
+    public static final BitSet FOLLOW_RULE_ID_in_ruleFeatureConfiguration450 = new BitSet(new long[]{0x0000000000002000L});
+    public static final BitSet FOLLOW_13_in_ruleFeatureConfiguration462 = new BitSet(new long[]{0x0000000000000010L});
+    public static final BitSet FOLLOW_ruleFeatureParameterValue_in_ruleFeatureConfiguration483 = new BitSet(new long[]{0x0000000000004010L});
+    public static final BitSet FOLLOW_14_in_ruleFeatureConfiguration496 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleFeatureParameterValue_in_entryRuleFeatureParameterValue532 = new BitSet(new long[]{0x0000000000000000L});
+    public static final BitSet FOLLOW_EOF_in_entryRuleFeatureParameterValue542 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_RULE_ID_in_ruleFeatureParameterValue596 = new BitSet(new long[]{0x0000000000010000L});
+    public static final BitSet FOLLOW_16_in_ruleFeatureParameterValue608 = new BitSet(new long[]{0x0000000000000020L});
+    public static final BitSet FOLLOW_RULE_STRING_in_ruleFeatureParameterValue625 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_ruleQID_in_entryRuleQID667 = new BitSet(new long[]{0x0000000000000000L});
+    public static final BitSet FOLLOW_EOF_in_entryRuleQID678 = new BitSet(new long[]{0x0000000000000002L});
+    public static final BitSet FOLLOW_RULE_ID_in_ruleQID718 = new BitSet(new long[]{0x0000000000060002L});
+    public static final BitSet FOLLOW_17_in_ruleQID738 = new BitSet(new long[]{0x0000000000000010L});
+    public static final BitSet FOLLOW_18_in_ruleQID757 = new BitSet(new long[]{0x0000000000000010L});
+    public static final BitSet FOLLOW_RULE_ID_in_ruleQID773 = new BitSet(new long[]{0x0000000000060002L});
 
 }

+ 3 - 3
plugins/org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/serializer/AbstractSGenSemanticSequencer.java

@@ -78,7 +78,7 @@ public class AbstractSGenSemanticSequencer extends AbstractSemanticSequencer {
 	
 	/**
 	 * Constraint:
-	 *     (type=[FeatureType|ID] parameterValues+=FeatureParameterValue parameterValues+=FeatureParameterValue*)
+	 *     (type=[FeatureType|ID] parameterValues+=FeatureParameterValue+)
 	 *
 	 * Features:
 	 *    type[1, 1]
@@ -106,8 +106,8 @@ public class AbstractSGenSemanticSequencer extends AbstractSemanticSequencer {
 		}
 		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
 		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
-		feeder.accept(grammarAccess.getFeatureParameterValueAccess().getParameterFeatureParameterIDTerminalRuleCall_0_0_1(), semanticObject.getParameter());
-		feeder.accept(grammarAccess.getFeatureParameterValueAccess().getValueSTRINGTerminalRuleCall_2_0(), semanticObject.getValue());
+		feeder.accept(grammarAccess.getFeatureParameterValueAccess().getParameterFeatureParameterIDTerminalRuleCall_1_0_1(), semanticObject.getParameter());
+		feeder.accept(grammarAccess.getFeatureParameterValueAccess().getValueSTRINGTerminalRuleCall_3_0(), semanticObject.getValue());
 		feeder.finish();
 	}
 	

+ 39 - 47
plugins/org.yakindu.sct.generator.genmodel/src-gen/org/yakindu/sct/generator/genmodel/services/SGenGrammarAccess.java

@@ -110,54 +110,42 @@ public class SGenGrammarAccess extends AbstractGrammarElementFinder {
 	public class FeatureConfigurationElements extends AbstractParserRuleElementFinder {
 		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "FeatureConfiguration");
 		private final Group cGroup = (Group)rule.eContents().get(1);
-		private final Assignment cTypeAssignment_0 = (Assignment)cGroup.eContents().get(0);
-		private final CrossReference cTypeFeatureTypeCrossReference_0_0 = (CrossReference)cTypeAssignment_0.eContents().get(0);
-		private final RuleCall cTypeFeatureTypeIDTerminalRuleCall_0_0_1 = (RuleCall)cTypeFeatureTypeCrossReference_0_0.eContents().get(1);
-		private final Keyword cLeftCurlyBracketKeyword_1 = (Keyword)cGroup.eContents().get(1);
-		private final Assignment cParameterValuesAssignment_2 = (Assignment)cGroup.eContents().get(2);
-		private final RuleCall cParameterValuesFeatureParameterValueParserRuleCall_2_0 = (RuleCall)cParameterValuesAssignment_2.eContents().get(0);
-		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
-		private final Keyword cCommaKeyword_3_0 = (Keyword)cGroup_3.eContents().get(0);
-		private final Assignment cParameterValuesAssignment_3_1 = (Assignment)cGroup_3.eContents().get(1);
-		private final RuleCall cParameterValuesFeatureParameterValueParserRuleCall_3_1_0 = (RuleCall)cParameterValuesAssignment_3_1.eContents().get(0);
+		private final Action cFeatureConfigurationAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cTypeAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final CrossReference cTypeFeatureTypeCrossReference_1_0 = (CrossReference)cTypeAssignment_1.eContents().get(0);
+		private final RuleCall cTypeFeatureTypeIDTerminalRuleCall_1_0_1 = (RuleCall)cTypeFeatureTypeCrossReference_1_0.eContents().get(1);
+		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cParameterValuesAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cParameterValuesFeatureParameterValueParserRuleCall_3_0 = (RuleCall)cParameterValuesAssignment_3.eContents().get(0);
 		private final Keyword cRightCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
 		
 		//FeatureConfiguration returns gen::FeatureConfiguration:
-		//	type=[gen::FeatureType] "{" parameterValues+=FeatureParameterValue ("," parameterValues+=FeatureParameterValue)* "}";
+		//	{gen::FeatureConfiguration} type=[gen::FeatureType] "{" parameterValues+=FeatureParameterValue+ "}";
 		public ParserRule getRule() { return rule; }
 
-		//type=[gen::FeatureType] "{" parameterValues+=FeatureParameterValue ("," parameterValues+=FeatureParameterValue)* "}"
+		//{gen::FeatureConfiguration} type=[gen::FeatureType] "{" parameterValues+=FeatureParameterValue+ "}"
 		public Group getGroup() { return cGroup; }
 
+		//{gen::FeatureConfiguration}
+		public Action getFeatureConfigurationAction_0() { return cFeatureConfigurationAction_0; }
+
 		//type=[gen::FeatureType]
-		public Assignment getTypeAssignment_0() { return cTypeAssignment_0; }
+		public Assignment getTypeAssignment_1() { return cTypeAssignment_1; }
 
 		//[gen::FeatureType]
-		public CrossReference getTypeFeatureTypeCrossReference_0_0() { return cTypeFeatureTypeCrossReference_0_0; }
+		public CrossReference getTypeFeatureTypeCrossReference_1_0() { return cTypeFeatureTypeCrossReference_1_0; }
 
 		//ID
-		public RuleCall getTypeFeatureTypeIDTerminalRuleCall_0_0_1() { return cTypeFeatureTypeIDTerminalRuleCall_0_0_1; }
+		public RuleCall getTypeFeatureTypeIDTerminalRuleCall_1_0_1() { return cTypeFeatureTypeIDTerminalRuleCall_1_0_1; }
 
 		//"{"
-		public Keyword getLeftCurlyBracketKeyword_1() { return cLeftCurlyBracketKeyword_1; }
-
-		//parameterValues+=FeatureParameterValue
-		public Assignment getParameterValuesAssignment_2() { return cParameterValuesAssignment_2; }
-
-		//FeatureParameterValue
-		public RuleCall getParameterValuesFeatureParameterValueParserRuleCall_2_0() { return cParameterValuesFeatureParameterValueParserRuleCall_2_0; }
-
-		//("," parameterValues+=FeatureParameterValue)*
-		public Group getGroup_3() { return cGroup_3; }
-
-		//","
-		public Keyword getCommaKeyword_3_0() { return cCommaKeyword_3_0; }
+		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
 
-		//parameterValues+=FeatureParameterValue
-		public Assignment getParameterValuesAssignment_3_1() { return cParameterValuesAssignment_3_1; }
+		//parameterValues+=FeatureParameterValue+
+		public Assignment getParameterValuesAssignment_3() { return cParameterValuesAssignment_3; }
 
 		//FeatureParameterValue
-		public RuleCall getParameterValuesFeatureParameterValueParserRuleCall_3_1_0() { return cParameterValuesFeatureParameterValueParserRuleCall_3_1_0; }
+		public RuleCall getParameterValuesFeatureParameterValueParserRuleCall_3_0() { return cParameterValuesFeatureParameterValueParserRuleCall_3_0; }
 
 		//"}"
 		public Keyword getRightCurlyBracketKeyword_4() { return cRightCurlyBracketKeyword_4; }
@@ -166,37 +154,41 @@ public class SGenGrammarAccess extends AbstractGrammarElementFinder {
 	public class FeatureParameterValueElements extends AbstractParserRuleElementFinder {
 		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "FeatureParameterValue");
 		private final Group cGroup = (Group)rule.eContents().get(1);
-		private final Assignment cParameterAssignment_0 = (Assignment)cGroup.eContents().get(0);
-		private final CrossReference cParameterFeatureParameterCrossReference_0_0 = (CrossReference)cParameterAssignment_0.eContents().get(0);
-		private final RuleCall cParameterFeatureParameterIDTerminalRuleCall_0_0_1 = (RuleCall)cParameterFeatureParameterCrossReference_0_0.eContents().get(1);
-		private final Keyword cEqualsSignKeyword_1 = (Keyword)cGroup.eContents().get(1);
-		private final Assignment cValueAssignment_2 = (Assignment)cGroup.eContents().get(2);
-		private final RuleCall cValueSTRINGTerminalRuleCall_2_0 = (RuleCall)cValueAssignment_2.eContents().get(0);
+		private final Action cFeatureParameterValueAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cParameterAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final CrossReference cParameterFeatureParameterCrossReference_1_0 = (CrossReference)cParameterAssignment_1.eContents().get(0);
+		private final RuleCall cParameterFeatureParameterIDTerminalRuleCall_1_0_1 = (RuleCall)cParameterFeatureParameterCrossReference_1_0.eContents().get(1);
+		private final Keyword cEqualsSignKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cValueAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cValueSTRINGTerminalRuleCall_3_0 = (RuleCall)cValueAssignment_3.eContents().get(0);
 		
 		//FeatureParameterValue returns gen::FeatureParameterValue:
-		//	parameter=[gen::FeatureParameter] "=" value=STRING;
+		//	{gen::FeatureParameterValue} parameter=[gen::FeatureParameter] "=" value=STRING;
 		public ParserRule getRule() { return rule; }
 
-		//parameter=[gen::FeatureParameter] "=" value=STRING
+		//{gen::FeatureParameterValue} parameter=[gen::FeatureParameter] "=" value=STRING
 		public Group getGroup() { return cGroup; }
 
+		//{gen::FeatureParameterValue}
+		public Action getFeatureParameterValueAction_0() { return cFeatureParameterValueAction_0; }
+
 		//parameter=[gen::FeatureParameter]
-		public Assignment getParameterAssignment_0() { return cParameterAssignment_0; }
+		public Assignment getParameterAssignment_1() { return cParameterAssignment_1; }
 
 		//[gen::FeatureParameter]
-		public CrossReference getParameterFeatureParameterCrossReference_0_0() { return cParameterFeatureParameterCrossReference_0_0; }
+		public CrossReference getParameterFeatureParameterCrossReference_1_0() { return cParameterFeatureParameterCrossReference_1_0; }
 
 		//ID
-		public RuleCall getParameterFeatureParameterIDTerminalRuleCall_0_0_1() { return cParameterFeatureParameterIDTerminalRuleCall_0_0_1; }
+		public RuleCall getParameterFeatureParameterIDTerminalRuleCall_1_0_1() { return cParameterFeatureParameterIDTerminalRuleCall_1_0_1; }
 
 		//"="
-		public Keyword getEqualsSignKeyword_1() { return cEqualsSignKeyword_1; }
+		public Keyword getEqualsSignKeyword_2() { return cEqualsSignKeyword_2; }
 
 		//value=STRING
-		public Assignment getValueAssignment_2() { return cValueAssignment_2; }
+		public Assignment getValueAssignment_3() { return cValueAssignment_3; }
 
 		//STRING
-		public RuleCall getValueSTRINGTerminalRuleCall_2_0() { return cValueSTRINGTerminalRuleCall_2_0; }
+		public RuleCall getValueSTRINGTerminalRuleCall_3_0() { return cValueSTRINGTerminalRuleCall_3_0; }
 	}
 
 	public class QIDElements extends AbstractParserRuleElementFinder {
@@ -286,7 +278,7 @@ public class SGenGrammarAccess extends AbstractGrammarElementFinder {
 	}
 
 	//FeatureConfiguration returns gen::FeatureConfiguration:
-	//	type=[gen::FeatureType] "{" parameterValues+=FeatureParameterValue ("," parameterValues+=FeatureParameterValue)* "}";
+	//	{gen::FeatureConfiguration} type=[gen::FeatureType] "{" parameterValues+=FeatureParameterValue+ "}";
 	public FeatureConfigurationElements getFeatureConfigurationAccess() {
 		return (pFeatureConfiguration != null) ? pFeatureConfiguration : (pFeatureConfiguration = new FeatureConfigurationElements());
 	}
@@ -296,7 +288,7 @@ public class SGenGrammarAccess extends AbstractGrammarElementFinder {
 	}
 
 	//FeatureParameterValue returns gen::FeatureParameterValue:
-	//	parameter=[gen::FeatureParameter] "=" value=STRING;
+	//	{gen::FeatureParameterValue} parameter=[gen::FeatureParameter] "=" value=STRING;
 	public FeatureParameterValueElements getFeatureParameterValueAccess() {
 		return (pFeatureParameterValue != null) ? pFeatureParameterValue : (pFeatureParameterValue = new FeatureParameterValueElements());
 	}

+ 3 - 3
plugins/org.yakindu.sct.generator.genmodel/src/org/yakindu/sct/generator/genmodel/SGen.xtext

@@ -16,12 +16,12 @@ GeneratorEntry returns gen::GeneratorEntry:
 	'}';
 
 FeatureConfiguration returns gen::FeatureConfiguration:
-	type=[gen::FeatureType] '{'
-	parameterValues+=FeatureParameterValue (',' parameterValues+=FeatureParameterValue)*
+	{gen::FeatureConfiguration} type=[gen::FeatureType] '{'
+	(parameterValues+=FeatureParameterValue)+
 	'}';
 
 FeatureParameterValue returns gen::FeatureParameterValue:
-	parameter=[gen::FeatureParameter] '=' value=STRING;
+	{gen::FeatureParameterValue} parameter=[gen::FeatureParameter] '=' value=STRING;
 
 QID:
 	ID (('::' | '.') ID)*; 

+ 81 - 0
plugins/org.yakindu.sct.generator.genmodel/src/org/yakindu/sct/generator/genmodel/resource/FeatureResourceDescription.java

@@ -0,0 +1,81 @@
+package org.yakindu.sct.generator.genmodel.resource;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.xtext.naming.IQualifiedNameProvider;
+import org.eclipse.xtext.naming.QualifiedName;
+import org.eclipse.xtext.resource.EObjectDescription;
+import org.eclipse.xtext.resource.IEObjectDescription;
+import org.eclipse.xtext.resource.IReferenceDescription;
+import org.eclipse.xtext.resource.IResourceDescription;
+import org.eclipse.xtext.resource.impl.AbstractResourceDescription;
+import org.yakindu.sct.model.sgen.FeatureParameter;
+
+import com.google.common.collect.Lists;
+import com.google.inject.Inject;
+
+/**
+ * 
+ * @author andreas muelder - Initial contribution and API
+ * 
+ */
+public class FeatureResourceDescription extends AbstractResourceDescription
+		implements IResourceDescription {
+
+	public static final String FEATURE_CONTAINER = "featureContainer";
+
+	private final Resource resource;
+
+	private final URI uri;
+
+	@Inject
+	IQualifiedNameProvider qualifiedNameProvider;
+
+	public FeatureResourceDescription(Resource resource) {
+		this.resource = resource;
+		this.uri = getNormalizedURI(resource);
+	}
+
+	@Override
+	protected List<IEObjectDescription> computeExportedObjects() {
+		Iterator<EObject> contents = resource.getAllContents();
+		List<IEObjectDescription> result = Lists.newArrayList();
+		while (contents.hasNext()) {
+			EObject eObject = contents.next();
+			QualifiedName qualifiedName = qualifiedNameProvider.apply(eObject);
+			if (qualifiedName != null) {
+				Map<String, String> userData = new HashMap<String, String>();
+				if (eObject instanceof FeatureParameter) {
+					userData.put(FEATURE_CONTAINER, getFqName(eObject));
+				}
+				result.add(new EObjectDescription(qualifiedName, eObject,
+						userData));
+			}
+		}
+		return result;
+	}
+
+	private String getFqName(EObject eObject) {
+		return qualifiedNameProvider.getFullyQualifiedName(
+				((FeatureParameter) eObject).getFeatureType()).toString();
+	}
+
+	public URI getURI() {
+		return uri;
+	}
+
+	public Iterable<QualifiedName> getImportedNames() {
+		return Lists.newArrayList();
+	}
+
+	public Iterable<IReferenceDescription> getReferenceDescriptions() {
+		return Lists.newArrayList();
+	}
+
+}

+ 2 - 7
plugins/org.yakindu.sct.generator.genmodel/src/org/yakindu/sct/generator/genmodel/scoping/SGenGlobalScopeProvider.java

@@ -3,14 +3,13 @@ package org.yakindu.sct.generator.genmodel.scoping;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.xtext.resource.IDefaultResourceDescriptionStrategy;
 import org.eclipse.xtext.resource.IEObjectDescription;
-import org.eclipse.xtext.resource.impl.DefaultResourceDescription;
 import org.eclipse.xtext.scoping.IScope;
 import org.eclipse.xtext.scoping.impl.DefaultGlobalScopeProvider;
 import org.eclipse.xtext.scoping.impl.SimpleScope;
 import org.yakindu.sct.generator.genmodel.extensions.LibraryExtensions;
 import org.yakindu.sct.generator.genmodel.extensions.LibraryExtensions.LibraryDescriptor;
+import org.yakindu.sct.generator.genmodel.resource.FeatureResourceDescription;
 
 import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
@@ -30,9 +29,6 @@ public class SGenGlobalScopeProvider extends DefaultGlobalScopeProvider {
 	@Inject
 	private Injector injector;
 
-	@Inject
-	private IDefaultResourceDescriptionStrategy resourceDescriptionStrategy;
-
 	@Override
 	protected IScope getScope(Resource resource, boolean ignoreCase,
 			final EClass type, Predicate<IEObjectDescription> filter) {
@@ -44,8 +40,7 @@ public class SGenGlobalScopeProvider extends DefaultGlobalScopeProvider {
 				.getLibraryDescriptor();
 		for (LibraryDescriptor desc : libraryDescriptor) {
 			Resource library = resourceSet.getResource(desc.getURI(), true);
-			DefaultResourceDescription description = new DefaultResourceDescription(
-					library, resourceDescriptionStrategy);
+			FeatureResourceDescription description = new FeatureResourceDescription(library);
 			injector.injectMembers(description);
 			allElements = Iterables.concat(allElements,
 					description.getExportedObjectsByType(type));

+ 53 - 0
plugins/org.yakindu.sct.generator.genmodel/src/org/yakindu/sct/generator/genmodel/scoping/SGenScopeProvider.java

@@ -1,6 +1,59 @@
 package org.yakindu.sct.generator.genmodel.scoping;
 
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.xtext.resource.IEObjectDescription;
+import org.eclipse.xtext.scoping.IScope;
 import org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider;
+import org.eclipse.xtext.scoping.impl.FilteringScope;
+import org.yakindu.sct.generator.genmodel.resource.FeatureResourceDescription;
+import org.yakindu.sct.model.sgen.FeatureConfiguration;
+import org.yakindu.sct.model.sgen.FeatureParameterValue;
 
+import com.google.common.base.Predicate;
+/**
+ * 
+ * @author andreas muelder - Initial contribution and API
+ * 
+ */
 public class SGenScopeProvider extends AbstractDeclarativeScopeProvider {
+
+
+	/**
+	 * Only allow references to FeatureParameters defined by enclosing Feature
+	 */
+	public IScope scope_FeatureParameterValue_parameter(
+			final FeatureParameterValue context, EReference reference) {
+		FilteringScope filteringScope = new FilteringScope(getDelegate()
+				.getScope(context, reference),
+				new Predicate<IEObjectDescription>() {
+					@Override
+					public boolean apply(IEObjectDescription input) {
+						FeatureConfiguration featureConfig = (FeatureConfiguration) context
+								.eContainer();
+						String featureName = featureConfig.getType().getName();
+						return featureName.equals(input
+								.getUserData(FeatureResourceDescription.FEATURE_CONTAINER));
+					}
+				});
+		return filteringScope;
+	}
+
+	/**
+	 * Only allow references to FeatureParameters defined by enclosing Feature
+	 */
+	public IScope scope_FeatureParameterValue_parameter(
+			final FeatureConfiguration context, EReference reference) {
+		FilteringScope filteringScope = new FilteringScope(getDelegate()
+				.getScope(context, reference),
+				new Predicate<IEObjectDescription>() {
+					@Override
+					public boolean apply(IEObjectDescription input) {
+						String featureName = context.getType().getName();
+						return featureName.equals(input
+								.getUserData(FeatureResourceDescription.FEATURE_CONTAINER));
+					}
+				});
+		return filteringScope;
+	}
 }

+ 49 - 7
plugins/org.yakindu.sct.generator.genmodel/src/org/yakindu/sct/generator/genmodel/validation/SGenJavaValidator.java

@@ -1,13 +1,55 @@
 package org.yakindu.sct.generator.genmodel.validation;
- 
 
+import org.eclipse.xtext.validation.Check;
+import org.yakindu.sct.model.sgen.FeatureConfiguration;
+import org.yakindu.sct.model.sgen.FeatureParameterValue;
+import org.yakindu.sct.model.sgen.GeneratorEntry;
+import org.yakindu.sct.model.sgen.SGenPackage;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+
+/**
+ * 
+ * @author andreas muelder - Initial contribution and API
+ * 
+ */
 public class SGenJavaValidator extends AbstractSGenJavaValidator {
 
-//	@Check
-//	public void checkGreetingStartsWithCapital(Greeting greeting) {
-//		if (!Character.isUpperCase(greeting.getName().charAt(0))) {
-//			warning("Name should start with a capital", MyDslPackage.Literals.GREETING__NAME);
-//		}
-//	}
+	@Check
+	public void checkDuplicateGeneratorEntryFeature(
+			final FeatureConfiguration config) {
+		GeneratorEntry entry = (GeneratorEntry) config.eContainer();
+		Iterable<FeatureConfiguration> filter = Iterables.filter(
+				entry.getFeatures(), new Predicate<FeatureConfiguration>() {
+					@Override
+					public boolean apply(FeatureConfiguration input) {
+						return (input.getType().getName().equals(config
+								.getType().getName()));
+					}
+				});
+		if (Iterables.size(filter) > 1) {
+			error("Duplicate feature!",
+					SGenPackage.Literals.FEATURE_CONFIGURATION__TYPE);
+		}
+
+	}
 
+	@Check
+	public void checkDuplicateFeatureParameter(final FeatureParameterValue value) {
+		FeatureConfiguration entry = (FeatureConfiguration) value.eContainer();
+		Iterable<FeatureParameterValue> filter = Iterables.filter(
+				entry.getParameterValues(),
+				new Predicate<FeatureParameterValue>() {
+					@Override
+					public boolean apply(FeatureParameterValue input) {
+						return (input.getParameter().getName().equals(value
+								.getParameter().getName()));
+					}
+				});
+		if (Iterables.size(filter) > 1) {
+			error("Duplicate parameter!",
+					SGenPackage.Literals.FEATURE_PARAMETER_VALUE__PARAMETER);
+		}
+	}
 }

+ 12 - 0
plugins/org.yakindu.sct.generator.genmodel/xtend-gen/org/yakindu/sct/generator/genmodel/generator/SGenGenerator.java

@@ -0,0 +1,12 @@
+package org.yakindu.sct.generator.genmodel.generator;
+
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.xtext.generator.IFileSystemAccess;
+import org.eclipse.xtext.generator.IGenerator;
+
+@SuppressWarnings("all")
+public class SGenGenerator implements IGenerator {
+  
+  public void doGenerate(final Resource resource, final IFileSystemAccess fsa) {
+  }
+}