/*****************************************************************************
* Copyright (c) 2018 CEA LIST.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
*  Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
*  - Initial API and implementation
*
******************************************************************************
* Generated by Xtext 2.25.0
*****************************************************************************/
package org.eclipse.efm.formalml.xtext.services;

import com.google.inject.Inject;
import com.google.inject.Singleton;
import java.util.List;
import org.eclipse.xtext.Action;
import org.eclipse.xtext.Alternatives;
import org.eclipse.xtext.Assignment;
import org.eclipse.xtext.CrossReference;
import org.eclipse.xtext.EnumLiteralDeclaration;
import org.eclipse.xtext.EnumRule;
import org.eclipse.xtext.Grammar;
import org.eclipse.xtext.GrammarUtil;
import org.eclipse.xtext.Group;
import org.eclipse.xtext.Keyword;
import org.eclipse.xtext.ParserRule;
import org.eclipse.xtext.RuleCall;
import org.eclipse.xtext.TerminalRule;
import org.eclipse.xtext.UnorderedGroup;
import org.eclipse.xtext.common.services.TerminalsGrammarAccess;
import org.eclipse.xtext.service.AbstractElementFinder;
import org.eclipse.xtext.service.GrammarProvider;

@Singleton
public class FormalMLGrammarAccess extends AbstractElementFinder.AbstractGrammarElementFinder {
	
	public class XliaElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.Xlia");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cPrologAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cPrologXliaPrologObjectParserRuleCall_0_0 = (RuleCall)cPrologAssignment_0.eContents().get(0);
		private final Assignment cSystemAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cSystemXliaSystemParserRuleCall_1_0 = (RuleCall)cSystemAssignment_1.eContents().get(0);
		
		//////////////////////////////////////////////////////////////////////////////////
		//// Main Rules
		//////////////////////////////////////////////////////////////////////////////////
		//Xlia returns fmlSpec::XliaModel
		//    : prolog = XliaPrologObject
		//          system = XliaSystem
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//prolog = XliaPrologObject
		//         system = XliaSystem
		public Group getGroup() { return cGroup; }
		
		//prolog = XliaPrologObject
		public Assignment getPrologAssignment_0() { return cPrologAssignment_0; }
		
		//XliaPrologObject
		public RuleCall getPrologXliaPrologObjectParserRuleCall_0_0() { return cPrologXliaPrologObjectParserRuleCall_0_0; }
		
		//system = XliaSystem
		public Assignment getSystemAssignment_1() { return cSystemAssignment_1; }
		
		//XliaSystem
		public RuleCall getSystemXliaSystemParserRuleCall_1_0() { return cSystemXliaSystemParserRuleCall_1_0; }
	}
	public class XliaPrologObjectElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.XliaPrologObject");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cNameAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final Alternatives cNameAlternatives_0_0 = (Alternatives)cNameAssignment_0.eContents().get(0);
		private final Keyword cNameFormalMLKeyword_0_0_0 = (Keyword)cNameAlternatives_0_0.eContents().get(0);
		private final Keyword cNameXfmlKeyword_0_0_1 = (Keyword)cNameAlternatives_0_0.eContents().get(1);
		private final Keyword cNameFmlKeyword_0_0_2 = (Keyword)cNameAlternatives_0_0.eContents().get(2);
		private final Keyword cNameXliaKeyword_0_0_3 = (Keyword)cNameAlternatives_0_0.eContents().get(3);
		private final Keyword cNameXfspKeyword_0_0_4 = (Keyword)cNameAlternatives_0_0.eContents().get(4);
		private final Keyword cNameDiversityKeyword_0_0_5 = (Keyword)cNameAlternatives_0_0.eContents().get(5);
		private final Keyword cLessThanSignKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cElementsAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cElementsXliaPrologAttributeParserRuleCall_2_0 = (RuleCall)cElementsAssignment_2.eContents().get(0);
		private final Keyword cGreaterThanSignColonKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Assignment cElementsAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cElementsXliaOptionObjectParserRuleCall_4_0 = (RuleCall)cElementsAssignment_4.eContents().get(0);
		
		//XliaPrologObject returns fmlSpec::XliaObject
		//    : name=( '@FormalML' | '@xfml' | '@fml' | '@xlia' | '@xfsp' | '@diversity' )
		//        '<'
		//        ( elements+=XliaPrologAttribute )
		////        ( ',' elements+=XliaPrologAttribute )+
		//        '>:'
		//        ( elements += XliaOptionObject )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		// name=( '@FormalML' | '@xfml' | '@fml' | '@xlia' | '@xfsp' | '@diversity' )
		//        '<'
		//        ( elements+=XliaPrologAttribute )
		////        ( ',' elements+=XliaPrologAttribute )+
		//        '>:'
		//        ( elements += XliaOptionObject )?
		public Group getGroup() { return cGroup; }
		
		//name=( '@FormalML' | '@xfml' | '@fml' | '@xlia' | '@xfsp' | '@diversity' )
		public Assignment getNameAssignment_0() { return cNameAssignment_0; }
		
		//( '@FormalML' | '@xfml' | '@fml' | '@xlia' | '@xfsp' | '@diversity' )
		public Alternatives getNameAlternatives_0_0() { return cNameAlternatives_0_0; }
		
		//'@FormalML'
		public Keyword getNameFormalMLKeyword_0_0_0() { return cNameFormalMLKeyword_0_0_0; }
		
		//'@xfml'
		public Keyword getNameXfmlKeyword_0_0_1() { return cNameXfmlKeyword_0_0_1; }
		
		//'@fml'
		public Keyword getNameFmlKeyword_0_0_2() { return cNameFmlKeyword_0_0_2; }
		
		//'@xlia'
		public Keyword getNameXliaKeyword_0_0_3() { return cNameXliaKeyword_0_0_3; }
		
		//'@xfsp'
		public Keyword getNameXfspKeyword_0_0_4() { return cNameXfspKeyword_0_0_4; }
		
		//'@diversity'
		public Keyword getNameDiversityKeyword_0_0_5() { return cNameDiversityKeyword_0_0_5; }
		
		//'<'
		public Keyword getLessThanSignKeyword_1() { return cLessThanSignKeyword_1; }
		
		//( elements+=XliaPrologAttribute )
		public Assignment getElementsAssignment_2() { return cElementsAssignment_2; }
		
		//XliaPrologAttribute
		public RuleCall getElementsXliaPrologAttributeParserRuleCall_2_0() { return cElementsXliaPrologAttributeParserRuleCall_2_0; }
		
		////        ( ',' elements+=XliaPrologAttribute )+
		//        '>:'
		public Keyword getGreaterThanSignColonKeyword_3() { return cGreaterThanSignColonKeyword_3; }
		
		//( elements += XliaOptionObject )?
		public Assignment getElementsAssignment_4() { return cElementsAssignment_4; }
		
		//XliaOptionObject
		public RuleCall getElementsXliaOptionObjectParserRuleCall_4_0() { return cElementsXliaOptionObjectParserRuleCall_4_0; }
	}
	public class XliaPrologAttributeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.XliaPrologAttribute");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cNameAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final Alternatives cNameAlternatives_0_0 = (Alternatives)cNameAssignment_0.eContents().get(0);
		private final Keyword cNameSystemKeyword_0_0_0 = (Keyword)cNameAlternatives_0_0.eContents().get(0);
		private final Keyword cNamePackageKeyword_0_0_1 = (Keyword)cNameAlternatives_0_0.eContents().get(1);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Keyword cCommaKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final Keyword cVersionKeyword_1_1 = (Keyword)cGroup_1.eContents().get(1);
		private final Assignment cValueAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
		private final Alternatives cValueAlternatives_1_2_0 = (Alternatives)cValueAssignment_1_2.eContents().get(0);
		private final RuleCall cValueLiteralFloatExpressionParserRuleCall_1_2_0_0 = (RuleCall)cValueAlternatives_1_2_0.eContents().get(0);
		private final RuleCall cValueLiteralStringExpressionParserRuleCall_1_2_0_1 = (RuleCall)cValueAlternatives_1_2_0.eContents().get(1);
		
		//XliaPrologAttribute returns fmlSpec::XliaAttribute
		//    : name=( 'system' | 'package' )
		//        ( ',' ( 'version:' )?
		//            value=( LiteralFloatExpression | LiteralStringExpression )
		//        )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//name=( 'system' | 'package' )
		//       ( ',' ( 'version:' )?
		//           value=( LiteralFloatExpression | LiteralStringExpression )
		//       )?
		public Group getGroup() { return cGroup; }
		
		//name=( 'system' | 'package' )
		public Assignment getNameAssignment_0() { return cNameAssignment_0; }
		
		//( 'system' | 'package' )
		public Alternatives getNameAlternatives_0_0() { return cNameAlternatives_0_0; }
		
		//'system'
		public Keyword getNameSystemKeyword_0_0_0() { return cNameSystemKeyword_0_0_0; }
		
		//'package'
		public Keyword getNamePackageKeyword_0_0_1() { return cNamePackageKeyword_0_0_1; }
		
		//( ',' ( 'version:' )?
		//    value=( LiteralFloatExpression | LiteralStringExpression )
		//)?
		public Group getGroup_1() { return cGroup_1; }
		
		//','
		public Keyword getCommaKeyword_1_0() { return cCommaKeyword_1_0; }
		
		//( 'version:' )?
		public Keyword getVersionKeyword_1_1() { return cVersionKeyword_1_1; }
		
		//value=( LiteralFloatExpression | LiteralStringExpression )
		public Assignment getValueAssignment_1_2() { return cValueAssignment_1_2; }
		
		//( LiteralFloatExpression | LiteralStringExpression )
		public Alternatives getValueAlternatives_1_2_0() { return cValueAlternatives_1_2_0; }
		
		//LiteralFloatExpression
		public RuleCall getValueLiteralFloatExpressionParserRuleCall_1_2_0_0() { return cValueLiteralFloatExpressionParserRuleCall_1_2_0_0; }
		
		//LiteralStringExpression
		public RuleCall getValueLiteralStringExpressionParserRuleCall_1_2_0_1() { return cValueLiteralStringExpressionParserRuleCall_1_2_0_1; }
	}
	public class XliaOptionObjectElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.XliaOptionObject");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cNameAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final Keyword cNameOptionKeyword_0_0 = (Keyword)cNameAssignment_0.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cElementsAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cElementsXliaNamedElementParserRuleCall_2_0 = (RuleCall)cElementsAssignment_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_3 = (Keyword)cGroup.eContents().get(3);
		
		////XliaPrologAttribute returns XliaAttribute
		////    : (name = 'model')?    value=XliaModelKind
		////    | (name = 'version')?
		////        value=( LiteralFloatExpression | LiteralStringExpression )
		////    ;
		////
		////XliaModelKind returns fmlExpr::LiteralStringExpression
		////    : value=( 'system' | 'package' )
		////    ;
		//XliaOptionObject returns fmlSpec::XliaObject
		//    : name='@option'  '{'
		//        ( elements+=XliaNamedElement )*
		//      '}'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//name='@option'  '{'
		//       ( elements+=XliaNamedElement )*
		//     '}'
		public Group getGroup() { return cGroup; }
		
		//name='@option'
		public Assignment getNameAssignment_0() { return cNameAssignment_0; }
		
		//'@option'
		public Keyword getNameOptionKeyword_0_0() { return cNameOptionKeyword_0_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_1() { return cLeftCurlyBracketKeyword_1; }
		
		//( elements+=XliaNamedElement )*
		public Assignment getElementsAssignment_2() { return cElementsAssignment_2; }
		
		//XliaNamedElement
		public RuleCall getElementsXliaNamedElementParserRuleCall_2_0() { return cElementsXliaNamedElementParserRuleCall_2_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_3() { return cRightCurlyBracketKeyword_3; }
	}
	public class XliaNamedElementElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.XliaNamedElement");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cXliaObjectParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cXliaSectionParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cXliaAttributeParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		
		//XliaNamedElement returns fmlSpec::XliaNamedElement
		//    : XliaObject
		//    | XliaSection
		//    | XliaAttribute
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//XliaObject
		//   | XliaSection
		//   | XliaAttribute
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//XliaObject
		public RuleCall getXliaObjectParserRuleCall_0() { return cXliaObjectParserRuleCall_0; }
		
		//XliaSection
		public RuleCall getXliaSectionParserRuleCall_1() { return cXliaSectionParserRuleCall_1; }
		
		//XliaAttribute
		public RuleCall getXliaAttributeParserRuleCall_2() { return cXliaAttributeParserRuleCall_2; }
	}
	public class XliaObjectElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.XliaObject");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cNameAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cNameXLIA_IDTerminalRuleCall_0_0 = (RuleCall)cNameAssignment_0.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cElementsAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cElementsXliaNamedElementParserRuleCall_2_0 = (RuleCall)cElementsAssignment_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_3 = (Keyword)cGroup.eContents().get(3);
		
		//XliaObject returns fmlSpec::XliaObject
		//    : name=XLIA_ID '{'
		//        ( elements+=XliaNamedElement )*
		//      '}'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//name=XLIA_ID '{'
		//       ( elements+=XliaNamedElement )*
		//     '}'
		public Group getGroup() { return cGroup; }
		
		//name=XLIA_ID
		public Assignment getNameAssignment_0() { return cNameAssignment_0; }
		
		//XLIA_ID
		public RuleCall getNameXLIA_IDTerminalRuleCall_0_0() { return cNameXLIA_IDTerminalRuleCall_0_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_1() { return cLeftCurlyBracketKeyword_1; }
		
		//( elements+=XliaNamedElement )*
		public Assignment getElementsAssignment_2() { return cElementsAssignment_2; }
		
		//XliaNamedElement
		public RuleCall getElementsXliaNamedElementParserRuleCall_2_0() { return cElementsXliaNamedElementParserRuleCall_2_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_3() { return cRightCurlyBracketKeyword_3; }
	}
	public class XliaSectionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.XliaSection");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cNameAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cNameXLIA_IDTerminalRuleCall_0_0 = (RuleCall)cNameAssignment_0.eContents().get(0);
		private final Keyword cLeftSquareBracketKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cElementsAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cElementsXliaAttributeParserRuleCall_2_0 = (RuleCall)cElementsAssignment_2.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_3 = (Keyword)cGroup.eContents().get(3);
		
		//XliaSection returns fmlSpec::XliaSection
		//    : name=XLIA_ID '['
		//        ( elements+=XliaAttribute )*
		//      ']'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//name=XLIA_ID '['
		//       ( elements+=XliaAttribute )*
		//     ']'
		public Group getGroup() { return cGroup; }
		
		//name=XLIA_ID
		public Assignment getNameAssignment_0() { return cNameAssignment_0; }
		
		//XLIA_ID
		public RuleCall getNameXLIA_IDTerminalRuleCall_0_0() { return cNameXLIA_IDTerminalRuleCall_0_0; }
		
		//'['
		public Keyword getLeftSquareBracketKeyword_1() { return cLeftSquareBracketKeyword_1; }
		
		//( elements+=XliaAttribute )*
		public Assignment getElementsAssignment_2() { return cElementsAssignment_2; }
		
		//XliaAttribute
		public RuleCall getElementsXliaAttributeParserRuleCall_2_0() { return cElementsXliaAttributeParserRuleCall_2_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_3() { return cRightSquareBracketKeyword_3; }
	}
	public class XliaAttributeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.XliaAttribute");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cNameAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cNameXLIA_IDTerminalRuleCall_0_0 = (RuleCall)cNameAssignment_0.eContents().get(0);
		private final Keyword cEqualsSignKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cValueAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cValueExpressionParserRuleCall_2_0 = (RuleCall)cValueAssignment_2.eContents().get(0);
		private final Keyword cSemicolonKeyword_3 = (Keyword)cGroup.eContents().get(3);
		
		//XliaAttribute returns fmlSpec::XliaAttribute
		//    : name=XLIA_ID '=' value=Expression ';'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//name=XLIA_ID '=' value=Expression ';'
		public Group getGroup() { return cGroup; }
		
		//name=XLIA_ID
		public Assignment getNameAssignment_0() { return cNameAssignment_0; }
		
		//XLIA_ID
		public RuleCall getNameXLIA_IDTerminalRuleCall_0_0() { return cNameXLIA_IDTerminalRuleCall_0_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_1() { return cEqualsSignKeyword_1; }
		
		//value=Expression
		public Assignment getValueAssignment_2() { return cValueAssignment_2; }
		
		//Expression
		public RuleCall getValueExpressionParserRuleCall_2_0() { return cValueExpressionParserRuleCall_2_0; }
		
		//';'
		public Keyword getSemicolonKeyword_3() { return cSemicolonKeyword_3; }
	}
	public class EBooleanElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.EBoolean");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final Keyword cTrueKeyword_0 = (Keyword)cAlternatives.eContents().get(0);
		private final Keyword cFalseKeyword_1 = (Keyword)cAlternatives.eContents().get(1);
		
		//////////////////////////////////////////////////////////////////////////////////
		//// Primitive Value
		//////////////////////////////////////////////////////////////////////////////////
		//EBoolean returns ecore::EBoolean
		//    : 'true' | 'false'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//'true' | 'false'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//'true'
		public Keyword getTrueKeyword_0() { return cTrueKeyword_0; }
		
		//'false'
		public Keyword getFalseKeyword_1() { return cFalseKeyword_1; }
	}
	public class EIntElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.EInt");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cHyphenMinusKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final RuleCall cINTTerminalRuleCall_1 = (RuleCall)cGroup.eContents().get(1);
		
		//EInt returns ecore::EInt
		//    : '-'? INT
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//'-'? INT
		public Group getGroup() { return cGroup; }
		
		//'-'?
		public Keyword getHyphenMinusKeyword_0() { return cHyphenMinusKeyword_0; }
		
		//INT
		public RuleCall getINTTerminalRuleCall_1() { return cINTTerminalRuleCall_1; }
	}
	public class EIntegerElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.EInteger");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cHyphenMinusKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final RuleCall cINTTerminalRuleCall_1 = (RuleCall)cGroup.eContents().get(1);
		
		//EInteger returns ecore::ELong
		//    : '-'? INT
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//'-'? INT
		public Group getGroup() { return cGroup; }
		
		//'-'?
		public Keyword getHyphenMinusKeyword_0() { return cHyphenMinusKeyword_0; }
		
		//INT
		public RuleCall getINTTerminalRuleCall_1() { return cINTTerminalRuleCall_1; }
	}
	public class EFloatElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.EFloat");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cHyphenMinusKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final RuleCall cINTTerminalRuleCall_1 = (RuleCall)cGroup.eContents().get(1);
		private final Keyword cFullStopKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final RuleCall cINTTerminalRuleCall_3 = (RuleCall)cGroup.eContents().get(3);
		
		//EFloat returns ecore::EFloat
		//    : '-'? INT? '.' INT //(('E'|'e') '-'? INT)?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//'-'? INT? '.' INT
		public Group getGroup() { return cGroup; }
		
		//'-'?
		public Keyword getHyphenMinusKeyword_0() { return cHyphenMinusKeyword_0; }
		
		//INT?
		public RuleCall getINTTerminalRuleCall_1() { return cINTTerminalRuleCall_1; }
		
		//'.'
		public Keyword getFullStopKeyword_2() { return cFullStopKeyword_2; }
		
		//INT
		public RuleCall getINTTerminalRuleCall_3() { return cINTTerminalRuleCall_3; }
	}
	public class EDoubleElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.EDouble");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cHyphenMinusKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final RuleCall cINTTerminalRuleCall_1 = (RuleCall)cGroup.eContents().get(1);
		private final Keyword cFullStopKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final RuleCall cINTTerminalRuleCall_3 = (RuleCall)cGroup.eContents().get(3);
		
		//EDouble returns ecore::EDouble
		//    : '-'? INT? '.' INT //(('E'|'e') '-'? INT)?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//'-'? INT? '.' INT
		public Group getGroup() { return cGroup; }
		
		//'-'?
		public Keyword getHyphenMinusKeyword_0() { return cHyphenMinusKeyword_0; }
		
		//INT?
		public RuleCall getINTTerminalRuleCall_1() { return cINTTerminalRuleCall_1; }
		
		//'.'
		public Keyword getFullStopKeyword_2() { return cFullStopKeyword_2; }
		
		//INT
		public RuleCall getINTTerminalRuleCall_3() { return cINTTerminalRuleCall_3; }
	}
	public class ECharacterElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ECharacter");
		private final RuleCall cCHARACTERTerminalRuleCall = (RuleCall)rule.eContents().get(1);
		
		//ECharacter returns ecore::EChar
		//    : CHARACTER
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//CHARACTER
		public RuleCall getCHARACTERTerminalRuleCall() { return cCHARACTERTerminalRuleCall; }
	}
	public class EStringElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.EString");
		private final RuleCall cSTRINGTerminalRuleCall = (RuleCall)rule.eContents().get(1);
		
		//EString returns ecore::EString
		//    : STRING
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//STRING
		public RuleCall getSTRINGTerminalRuleCall() { return cSTRINGTerminalRuleCall; }
	}
	public class EOffsetElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.EOffset");
		private final RuleCall cOFFSETTerminalRuleCall = (RuleCall)rule.eContents().get(1);
		
		//EOffset returns ecore::EString
		//    : OFFSET ;
		@Override public ParserRule getRule() { return rule; }
		
		//OFFSET
		public RuleCall getOFFSETTerminalRuleCall() { return cOFFSETTerminalRuleCall; }
	}
	public class ReservedKeyWordElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ReservedKeyWord");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final Keyword cPackageKeyword_0 = (Keyword)cAlternatives.eContents().get(0);
		private final Keyword cSystemKeyword_1 = (Keyword)cAlternatives.eContents().get(1);
		private final Keyword cMachineKeyword_2 = (Keyword)cAlternatives.eContents().get(2);
		private final Keyword cExecutableKeyword_3 = (Keyword)cAlternatives.eContents().get(3);
		private final Keyword cVertexKeyword_4 = (Keyword)cAlternatives.eContents().get(4);
		private final Keyword cPseudostateKeyword_5 = (Keyword)cAlternatives.eContents().get(5);
		private final Keyword cStateKeyword_6 = (Keyword)cAlternatives.eContents().get(6);
		private final Keyword cStatemachineKeyword_7 = (Keyword)cAlternatives.eContents().get(7);
		private final Keyword cMacroKeyword_8 = (Keyword)cAlternatives.eContents().get(8);
		private final Keyword cRoutineKeyword_9 = (Keyword)cAlternatives.eContents().get(9);
		private final Keyword cProcedureKeyword_10 = (Keyword)cAlternatives.eContents().get(10);
		private final Keyword cTransitionKeyword_11 = (Keyword)cAlternatives.eContents().get(11);
		private final Keyword cPublicKeyword_12 = (Keyword)cAlternatives.eContents().get(12);
		private final Keyword cPrivateKeyword_13 = (Keyword)cAlternatives.eContents().get(13);
		private final Keyword cProtectedKeyword_14 = (Keyword)cAlternatives.eContents().get(14);
		private final Keyword cStaticKeyword_15 = (Keyword)cAlternatives.eContents().get(15);
		private final Keyword cFinalKeyword_16 = (Keyword)cAlternatives.eContents().get(16);
		private final Keyword cVolatileKeyword_17 = (Keyword)cAlternatives.eContents().get(17);
		private final Keyword cTransientKeyword_18 = (Keyword)cAlternatives.eContents().get(18);
		private final Keyword cModelKeyword_19 = (Keyword)cAlternatives.eContents().get(19);
		private final Keyword cPrototypeKeyword_20 = (Keyword)cAlternatives.eContents().get(20);
		private final Keyword cInstanceKeyword_21 = (Keyword)cAlternatives.eContents().get(21);
		private final Keyword cTimedKeyword_22 = (Keyword)cAlternatives.eContents().get(22);
		private final Keyword cTimedDenseKeyword_23 = (Keyword)cAlternatives.eContents().get(23);
		private final Keyword cTimedDiscreteKeyword_24 = (Keyword)cAlternatives.eContents().get(24);
		private final Keyword cUnsafeKeyword_25 = (Keyword)cAlternatives.eContents().get(25);
		private final Keyword cInput_enabledKeyword_26 = (Keyword)cAlternatives.eContents().get(26);
		private final Keyword cPortKeyword_27 = (Keyword)cAlternatives.eContents().get(27);
		private final Keyword cSignalKeyword_28 = (Keyword)cAlternatives.eContents().get(28);
		private final Keyword cMessageKeyword_29 = (Keyword)cAlternatives.eContents().get(29);
		private final Keyword cBufferKeyword_30 = (Keyword)cAlternatives.eContents().get(30);
		private final Keyword cChannelKeyword_31 = (Keyword)cAlternatives.eContents().get(31);
		private final Keyword cViaKeyword_32 = (Keyword)cAlternatives.eContents().get(32);
		private final Keyword cVarKeyword_33 = (Keyword)cAlternatives.eContents().get(33);
		private final Keyword cValKeyword_34 = (Keyword)cAlternatives.eContents().get(34);
		private final Keyword cConstKeyword_35 = (Keyword)cAlternatives.eContents().get(35);
		private final Keyword cInputKeyword_36 = (Keyword)cAlternatives.eContents().get(36);
		private final Keyword cInKeyword_37 = (Keyword)cAlternatives.eContents().get(37);
		private final Keyword cInoutKeyword_38 = (Keyword)cAlternatives.eContents().get(38);
		private final Keyword cOutputKeyword_39 = (Keyword)cAlternatives.eContents().get(39);
		private final Keyword cOutKeyword_40 = (Keyword)cAlternatives.eContents().get(40);
		private final Keyword cReturnKeyword_41 = (Keyword)cAlternatives.eContents().get(41);
		private final Keyword cSimpleKeyword_42 = (Keyword)cAlternatives.eContents().get(42);
		private final Keyword cStartKeyword_43 = (Keyword)cAlternatives.eContents().get(43);
		private final Keyword cFinalKeyword_44 = (Keyword)cAlternatives.eContents().get(44);
		private final Keyword cInitialKeyword_45 = (Keyword)cAlternatives.eContents().get(45);
		private final Keyword cTerminalKeyword_46 = (Keyword)cAlternatives.eContents().get(46);
		private final Keyword cJunctionKeyword_47 = (Keyword)cAlternatives.eContents().get(47);
		private final Keyword cChoiceKeyword_48 = (Keyword)cAlternatives.eContents().get(48);
		private final Keyword cForkKeyword_49 = (Keyword)cAlternatives.eContents().get(49);
		private final Keyword cJoinKeyword_50 = (Keyword)cAlternatives.eContents().get(50);
		private final Keyword cDhistoryKeyword_51 = (Keyword)cAlternatives.eContents().get(51);
		private final Keyword cShistoryKeyword_52 = (Keyword)cAlternatives.eContents().get(52);
		private final Keyword cRouteKeyword_53 = (Keyword)cAlternatives.eContents().get(53);
		private final Keyword cConnectorKeyword_54 = (Keyword)cAlternatives.eContents().get(54);
		private final Keyword cConnectKeyword_55 = (Keyword)cAlternatives.eContents().get(55);
		private final Keyword cEnvKeyword_56 = (Keyword)cAlternatives.eContents().get(56);
		private final Keyword cRdvKeyword_57 = (Keyword)cAlternatives.eContents().get(57);
		private final Keyword cMultirdvKeyword_58 = (Keyword)cAlternatives.eContents().get(58);
		private final Keyword cBufferKeyword_59 = (Keyword)cAlternatives.eContents().get(59);
		private final Keyword cUnicastKeyword_60 = (Keyword)cAlternatives.eContents().get(60);
		private final Keyword cAnycastKeyword_61 = (Keyword)cAlternatives.eContents().get(61);
		private final Keyword cMulticastKeyword_62 = (Keyword)cAlternatives.eContents().get(62);
		private final Keyword cBroadcastKeyword_63 = (Keyword)cAlternatives.eContents().get(63);
		private final Keyword cBooleanKeyword_64 = (Keyword)cAlternatives.eContents().get(64);
		private final Keyword cBoolKeyword_65 = (Keyword)cAlternatives.eContents().get(65);
		private final Keyword cCharKeyword_66 = (Keyword)cAlternatives.eContents().get(66);
		private final Keyword cStringKeyword_67 = (Keyword)cAlternatives.eContents().get(67);
		private final Keyword cIntegerKeyword_68 = (Keyword)cAlternatives.eContents().get(68);
		private final Keyword cIntKeyword_69 = (Keyword)cAlternatives.eContents().get(69);
		private final Keyword cUintegerKeyword_70 = (Keyword)cAlternatives.eContents().get(70);
		private final Keyword cUintKeyword_71 = (Keyword)cAlternatives.eContents().get(71);
		private final Keyword cRationalKeyword_72 = (Keyword)cAlternatives.eContents().get(72);
		private final Keyword cRatKeyword_73 = (Keyword)cAlternatives.eContents().get(73);
		private final Keyword cUrationalKeyword_74 = (Keyword)cAlternatives.eContents().get(74);
		private final Keyword cUratKeyword_75 = (Keyword)cAlternatives.eContents().get(75);
		private final Keyword cTimeKeyword_76 = (Keyword)cAlternatives.eContents().get(76);
		private final Keyword cClockKeyword_77 = (Keyword)cAlternatives.eContents().get(77);
		private final Keyword cFloatKeyword_78 = (Keyword)cAlternatives.eContents().get(78);
		private final Keyword cDoubleKeyword_79 = (Keyword)cAlternatives.eContents().get(79);
		private final Keyword cRealKeyword_80 = (Keyword)cAlternatives.eContents().get(80);
		private final Keyword cUfloatKeyword_81 = (Keyword)cAlternatives.eContents().get(81);
		private final Keyword cUdoubleKeyword_82 = (Keyword)cAlternatives.eContents().get(82);
		private final Keyword cUrealKeyword_83 = (Keyword)cAlternatives.eContents().get(83);
		private final Keyword cIntervalKeyword_84 = (Keyword)cAlternatives.eContents().get(84);
		private final Keyword cEnumKeyword_85 = (Keyword)cAlternatives.eContents().get(85);
		private final Keyword cStructKeyword_86 = (Keyword)cAlternatives.eContents().get(86);
		private final Keyword cUnionKeyword_87 = (Keyword)cAlternatives.eContents().get(87);
		private final Keyword cVectorKeyword_88 = (Keyword)cAlternatives.eContents().get(88);
		private final Keyword cRvectorKeyword_89 = (Keyword)cAlternatives.eContents().get(89);
		private final Keyword cListKeyword_90 = (Keyword)cAlternatives.eContents().get(90);
		private final Keyword cSetKeyword_91 = (Keyword)cAlternatives.eContents().get(91);
		private final Keyword cBagKeyword_92 = (Keyword)cAlternatives.eContents().get(92);
		private final Keyword cMultisetKeyword_93 = (Keyword)cAlternatives.eContents().get(93);
		private final Keyword cFifoKeyword_94 = (Keyword)cAlternatives.eContents().get(94);
		private final Keyword cLifoKeyword_95 = (Keyword)cAlternatives.eContents().get(95);
		private final Keyword cGuardKeyword_96 = (Keyword)cAlternatives.eContents().get(96);
		private final Keyword cTguardKeyword_97 = (Keyword)cAlternatives.eContents().get(97);
		private final Keyword cEventKeyword_98 = (Keyword)cAlternatives.eContents().get(98);
		private final Keyword cChecksatKeyword_99 = (Keyword)cAlternatives.eContents().get(99);
		private final Keyword cBreakKeyword_100 = (Keyword)cAlternatives.eContents().get(100);
		private final Keyword cContinueKeyword_101 = (Keyword)cAlternatives.eContents().get(101);
		private final Keyword cExitKeyword_102 = (Keyword)cAlternatives.eContents().get(102);
		private final Keyword cInitKeyword_103 = (Keyword)cAlternatives.eContents().get(103);
		private final Keyword cDestroyKeyword_104 = (Keyword)cAlternatives.eContents().get(104);
		private final Keyword cStopKeyword_105 = (Keyword)cAlternatives.eContents().get(105);
		private final Keyword cAbortKeyword_106 = (Keyword)cAlternatives.eContents().get(106);
		private final Keyword cRestartKeyword_107 = (Keyword)cAlternatives.eContents().get(107);
		private final Keyword cSuspendKeyword_108 = (Keyword)cAlternatives.eContents().get(108);
		private final Keyword cResumeKeyword_109 = (Keyword)cAlternatives.eContents().get(109);
		private final Keyword cWaitKeyword_110 = (Keyword)cAlternatives.eContents().get(110);
		private final Keyword cDisableKeyword_111 = (Keyword)cAlternatives.eContents().get(111);
		private final Keyword cEnableKeyword_112 = (Keyword)cAlternatives.eContents().get(112);
		private final Keyword cScheduleKeyword_113 = (Keyword)cAlternatives.eContents().get(113);
		private final Keyword cIrunKeyword_114 = (Keyword)cAlternatives.eContents().get(114);
		private final Keyword cRunKeyword_115 = (Keyword)cAlternatives.eContents().get(115);
		private final Keyword cRtcKeyword_116 = (Keyword)cAlternatives.eContents().get(116);
		private final Keyword cCallKeyword_117 = (Keyword)cAlternatives.eContents().get(117);
		private final Keyword cNewKeyword_118 = (Keyword)cAlternatives.eContents().get(118);
		private final Keyword cCtorKeyword_119 = (Keyword)cAlternatives.eContents().get(119);
		private final Keyword cNewfreshKeyword_120 = (Keyword)cAlternatives.eContents().get(120);
		private final Keyword cThisKeyword_121 = (Keyword)cAlternatives.eContents().get(121);
		private final Keyword cSelfKeyword_122 = (Keyword)cAlternatives.eContents().get(122);
		private final Keyword cParentKeyword_123 = (Keyword)cAlternatives.eContents().get(123);
		private final Keyword cSuperKeyword_124 = (Keyword)cAlternatives.eContents().get(124);
		private final Keyword cNullKeyword_125 = (Keyword)cAlternatives.eContents().get(125);
		private final Keyword cModelKeyword_126 = (Keyword)cAlternatives.eContents().get(126);
		private final Keyword cInstanceKeyword_127 = (Keyword)cAlternatives.eContents().get(127);
		private final Keyword cStaticKeyword_128 = (Keyword)cAlternatives.eContents().get(128);
		private final Keyword cDynamicKeyword_129 = (Keyword)cAlternatives.eContents().get(129);
		private final Keyword cRuntimeKeyword_130 = (Keyword)cAlternatives.eContents().get(130);
		private final Keyword cStaticInstanceKeyword_131 = (Keyword)cAlternatives.eContents().get(131);
		private final Keyword cDynamicInstanceKeyword_132 = (Keyword)cAlternatives.eContents().get(132);
		private final Keyword cPrototypeKeyword_133 = (Keyword)cAlternatives.eContents().get(133);
		private final Keyword cDynamicPrototypeKeyword_134 = (Keyword)cAlternatives.eContents().get(134);
		
		////QualifiedName returns ecore::EString
		////    : ID ( '[' ID ']' )? '.' ID ( '[' ID ']' )? | ID
		////    ;
		//ReservedKeyWord
		//    : 'package'   | 'system'      | 'machine'  | 'executable'
		//    | 'vertex'    | 'pseudostate'
		//    | 'state'     | 'statemachine'
		//    | 'macro'     | 'routine'
		//    | 'procedure' | 'transition'
		//    | 'public'    | 'private'     | 'protected'
		//    | 'static'    | 'final'
		//    | 'volatile'  | 'transient'
		//    | 'model'     | 'prototype'   | 'instance'
		//    | 'timed'     | 'timed#dense' | 'timed#discrete'
		//    | 'unsafe'    | 'input_enabled'
		//    | 'port'      | 'signal'      | 'message'
		//    | 'buffer'    | 'channel'     | 'via'
		//    | 'var'       | 'val'         | 'const'
		//    | 'input'     | 'in'          | 'inout'
		//    | 'output'    | 'out'         | 'return'
		//    | 'simple'    | 'start'       | 'final'
		//    | 'initial'   | 'terminal'    | 'junction'
		//    | 'choice'    | 'fork'        | 'join'
		//    | 'dhistory'  | 'shistory'
		//    | 'route'     | 'connector'   | 'connect'
		//    | 'env'       | 'rdv'         | 'multirdv'
		//    | 'buffer'    | 'unicast'     | 'anycast'
		//    | 'multicast' | 'broadcast'
		//    | 'boolean'   | 'bool'
		//    | 'char'      | 'string'
		//    | 'integer'   | 'int'
		//    | 'uinteger'  | 'uint'
		//    | 'rational'  | 'rat'
		//    | 'urational' | 'urat'
		//    | 'time'      | 'clock'
		//    | 'float'     | 'double'      | 'real'
		//    | 'ufloat'    | 'udouble'     | 'ureal'
		//    | 'interval'  | 'enum'        | 'struct' | 'union'
		//    | 'vector'    | 'rvector'     | 'list'
		//    | 'set'       | 'bag'         | 'multiset'
		//    | 'fifo'      | 'lifo'
		//    | 'guard'     | 'tguard'
		//    | 'event'     | 'checksat'
		//    | 'break'     | 'continue'    | 'exit'   | 'init'
		//    | 'destroy'   | 'stop'        | 'abort'  | 'restart'
		//    | 'suspend'   | 'resume'      | 'wait'
		//    | 'disable'   | 'enable'
		//    | 'schedule'  | 'irun'        | 'run'    | 'rtc'
		//    | 'call'      | 'new'         | 'ctor'   | 'newfresh'
		//    | 'this'      | 'self'        | 'parent' | 'super'
		//    | 'null'
		//    | '#model'    | '#instance'        | '#static'   |  '#dynamic'
		//    | '#runtime'  | '#static#instance' | '#dynamic#instance'
		//    | '#prototype'| '#dynamic#prototype'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//'package'   | 'system'      | 'machine'  | 'executable'
		//   | 'vertex'    | 'pseudostate'
		//   | 'state'     | 'statemachine'
		//   | 'macro'     | 'routine'
		//   | 'procedure' | 'transition'
		//   | 'public'    | 'private'     | 'protected'
		//   | 'static'    | 'final'
		//   | 'volatile'  | 'transient'
		//   | 'model'     | 'prototype'   | 'instance'
		//   | 'timed'     | 'timed#dense' | 'timed#discrete'
		//   | 'unsafe'    | 'input_enabled'
		//   | 'port'      | 'signal'      | 'message'
		//   | 'buffer'    | 'channel'     | 'via'
		//   | 'var'       | 'val'         | 'const'
		//   | 'input'     | 'in'          | 'inout'
		//   | 'output'    | 'out'         | 'return'
		//   | 'simple'    | 'start'       | 'final'
		//   | 'initial'   | 'terminal'    | 'junction'
		//   | 'choice'    | 'fork'        | 'join'
		//   | 'dhistory'  | 'shistory'
		//   | 'route'     | 'connector'   | 'connect'
		//   | 'env'       | 'rdv'         | 'multirdv'
		//   | 'buffer'    | 'unicast'     | 'anycast'
		//   | 'multicast' | 'broadcast'
		//   | 'boolean'   | 'bool'
		//   | 'char'      | 'string'
		//   | 'integer'   | 'int'
		//   | 'uinteger'  | 'uint'
		//   | 'rational'  | 'rat'
		//   | 'urational' | 'urat'
		//   | 'time'      | 'clock'
		//   | 'float'     | 'double'      | 'real'
		//   | 'ufloat'    | 'udouble'     | 'ureal'
		//   | 'interval'  | 'enum'        | 'struct' | 'union'
		//   | 'vector'    | 'rvector'     | 'list'
		//   | 'set'       | 'bag'         | 'multiset'
		//   | 'fifo'      | 'lifo'
		//   | 'guard'     | 'tguard'
		//   | 'event'     | 'checksat'
		//   | 'break'     | 'continue'    | 'exit'   | 'init'
		//   | 'destroy'   | 'stop'        | 'abort'  | 'restart'
		//   | 'suspend'   | 'resume'      | 'wait'
		//   | 'disable'   | 'enable'
		//   | 'schedule'  | 'irun'        | 'run'    | 'rtc'
		//   | 'call'      | 'new'         | 'ctor'   | 'newfresh'
		//   | 'this'      | 'self'        | 'parent' | 'super'
		//   | 'null'
		//   | '#model'    | '#instance'        | '#static'   |  '#dynamic'
		//   | '#runtime'  | '#static#instance' | '#dynamic#instance'
		//   | '#prototype'| '#dynamic#prototype'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//'package'
		public Keyword getPackageKeyword_0() { return cPackageKeyword_0; }
		
		//'system'
		public Keyword getSystemKeyword_1() { return cSystemKeyword_1; }
		
		//'machine'
		public Keyword getMachineKeyword_2() { return cMachineKeyword_2; }
		
		//'executable'
		public Keyword getExecutableKeyword_3() { return cExecutableKeyword_3; }
		
		//'vertex'
		public Keyword getVertexKeyword_4() { return cVertexKeyword_4; }
		
		//'pseudostate'
		public Keyword getPseudostateKeyword_5() { return cPseudostateKeyword_5; }
		
		//'state'
		public Keyword getStateKeyword_6() { return cStateKeyword_6; }
		
		//'statemachine'
		public Keyword getStatemachineKeyword_7() { return cStatemachineKeyword_7; }
		
		//'macro'
		public Keyword getMacroKeyword_8() { return cMacroKeyword_8; }
		
		//'routine'
		public Keyword getRoutineKeyword_9() { return cRoutineKeyword_9; }
		
		//'procedure'
		public Keyword getProcedureKeyword_10() { return cProcedureKeyword_10; }
		
		//'transition'
		public Keyword getTransitionKeyword_11() { return cTransitionKeyword_11; }
		
		//'public'
		public Keyword getPublicKeyword_12() { return cPublicKeyword_12; }
		
		//'private'
		public Keyword getPrivateKeyword_13() { return cPrivateKeyword_13; }
		
		//'protected'
		public Keyword getProtectedKeyword_14() { return cProtectedKeyword_14; }
		
		//'static'
		public Keyword getStaticKeyword_15() { return cStaticKeyword_15; }
		
		//'final'
		public Keyword getFinalKeyword_16() { return cFinalKeyword_16; }
		
		//'volatile'
		public Keyword getVolatileKeyword_17() { return cVolatileKeyword_17; }
		
		//'transient'
		public Keyword getTransientKeyword_18() { return cTransientKeyword_18; }
		
		//'model'
		public Keyword getModelKeyword_19() { return cModelKeyword_19; }
		
		//'prototype'
		public Keyword getPrototypeKeyword_20() { return cPrototypeKeyword_20; }
		
		//'instance'
		public Keyword getInstanceKeyword_21() { return cInstanceKeyword_21; }
		
		//'timed'
		public Keyword getTimedKeyword_22() { return cTimedKeyword_22; }
		
		//'timed#dense'
		public Keyword getTimedDenseKeyword_23() { return cTimedDenseKeyword_23; }
		
		//'timed#discrete'
		public Keyword getTimedDiscreteKeyword_24() { return cTimedDiscreteKeyword_24; }
		
		//'unsafe'
		public Keyword getUnsafeKeyword_25() { return cUnsafeKeyword_25; }
		
		//'input_enabled'
		public Keyword getInput_enabledKeyword_26() { return cInput_enabledKeyword_26; }
		
		//'port'
		public Keyword getPortKeyword_27() { return cPortKeyword_27; }
		
		//'signal'
		public Keyword getSignalKeyword_28() { return cSignalKeyword_28; }
		
		//'message'
		public Keyword getMessageKeyword_29() { return cMessageKeyword_29; }
		
		//'buffer'
		public Keyword getBufferKeyword_30() { return cBufferKeyword_30; }
		
		//'channel'
		public Keyword getChannelKeyword_31() { return cChannelKeyword_31; }
		
		//'via'
		public Keyword getViaKeyword_32() { return cViaKeyword_32; }
		
		//'var'
		public Keyword getVarKeyword_33() { return cVarKeyword_33; }
		
		//'val'
		public Keyword getValKeyword_34() { return cValKeyword_34; }
		
		//'const'
		public Keyword getConstKeyword_35() { return cConstKeyword_35; }
		
		//'input'
		public Keyword getInputKeyword_36() { return cInputKeyword_36; }
		
		//'in'
		public Keyword getInKeyword_37() { return cInKeyword_37; }
		
		//'inout'
		public Keyword getInoutKeyword_38() { return cInoutKeyword_38; }
		
		//'output'
		public Keyword getOutputKeyword_39() { return cOutputKeyword_39; }
		
		//'out'
		public Keyword getOutKeyword_40() { return cOutKeyword_40; }
		
		//'return'
		public Keyword getReturnKeyword_41() { return cReturnKeyword_41; }
		
		//'simple'
		public Keyword getSimpleKeyword_42() { return cSimpleKeyword_42; }
		
		//'start'
		public Keyword getStartKeyword_43() { return cStartKeyword_43; }
		
		//'final'
		public Keyword getFinalKeyword_44() { return cFinalKeyword_44; }
		
		//'initial'
		public Keyword getInitialKeyword_45() { return cInitialKeyword_45; }
		
		//'terminal'
		public Keyword getTerminalKeyword_46() { return cTerminalKeyword_46; }
		
		//'junction'
		public Keyword getJunctionKeyword_47() { return cJunctionKeyword_47; }
		
		//'choice'
		public Keyword getChoiceKeyword_48() { return cChoiceKeyword_48; }
		
		//'fork'
		public Keyword getForkKeyword_49() { return cForkKeyword_49; }
		
		//'join'
		public Keyword getJoinKeyword_50() { return cJoinKeyword_50; }
		
		//'dhistory'
		public Keyword getDhistoryKeyword_51() { return cDhistoryKeyword_51; }
		
		//'shistory'
		public Keyword getShistoryKeyword_52() { return cShistoryKeyword_52; }
		
		//'route'
		public Keyword getRouteKeyword_53() { return cRouteKeyword_53; }
		
		//'connector'
		public Keyword getConnectorKeyword_54() { return cConnectorKeyword_54; }
		
		//'connect'
		public Keyword getConnectKeyword_55() { return cConnectKeyword_55; }
		
		//'env'
		public Keyword getEnvKeyword_56() { return cEnvKeyword_56; }
		
		//'rdv'
		public Keyword getRdvKeyword_57() { return cRdvKeyword_57; }
		
		//'multirdv'
		public Keyword getMultirdvKeyword_58() { return cMultirdvKeyword_58; }
		
		//'buffer'
		public Keyword getBufferKeyword_59() { return cBufferKeyword_59; }
		
		//'unicast'
		public Keyword getUnicastKeyword_60() { return cUnicastKeyword_60; }
		
		//'anycast'
		public Keyword getAnycastKeyword_61() { return cAnycastKeyword_61; }
		
		//'multicast'
		public Keyword getMulticastKeyword_62() { return cMulticastKeyword_62; }
		
		//'broadcast'
		public Keyword getBroadcastKeyword_63() { return cBroadcastKeyword_63; }
		
		//'boolean'
		public Keyword getBooleanKeyword_64() { return cBooleanKeyword_64; }
		
		//'bool'
		public Keyword getBoolKeyword_65() { return cBoolKeyword_65; }
		
		//'char'
		public Keyword getCharKeyword_66() { return cCharKeyword_66; }
		
		//'string'
		public Keyword getStringKeyword_67() { return cStringKeyword_67; }
		
		//'integer'
		public Keyword getIntegerKeyword_68() { return cIntegerKeyword_68; }
		
		//'int'
		public Keyword getIntKeyword_69() { return cIntKeyword_69; }
		
		//'uinteger'
		public Keyword getUintegerKeyword_70() { return cUintegerKeyword_70; }
		
		//'uint'
		public Keyword getUintKeyword_71() { return cUintKeyword_71; }
		
		//'rational'
		public Keyword getRationalKeyword_72() { return cRationalKeyword_72; }
		
		//'rat'
		public Keyword getRatKeyword_73() { return cRatKeyword_73; }
		
		//'urational'
		public Keyword getUrationalKeyword_74() { return cUrationalKeyword_74; }
		
		//'urat'
		public Keyword getUratKeyword_75() { return cUratKeyword_75; }
		
		//'time'
		public Keyword getTimeKeyword_76() { return cTimeKeyword_76; }
		
		//'clock'
		public Keyword getClockKeyword_77() { return cClockKeyword_77; }
		
		//'float'
		public Keyword getFloatKeyword_78() { return cFloatKeyword_78; }
		
		//'double'
		public Keyword getDoubleKeyword_79() { return cDoubleKeyword_79; }
		
		//'real'
		public Keyword getRealKeyword_80() { return cRealKeyword_80; }
		
		//'ufloat'
		public Keyword getUfloatKeyword_81() { return cUfloatKeyword_81; }
		
		//'udouble'
		public Keyword getUdoubleKeyword_82() { return cUdoubleKeyword_82; }
		
		//'ureal'
		public Keyword getUrealKeyword_83() { return cUrealKeyword_83; }
		
		//'interval'
		public Keyword getIntervalKeyword_84() { return cIntervalKeyword_84; }
		
		//'enum'
		public Keyword getEnumKeyword_85() { return cEnumKeyword_85; }
		
		//'struct'
		public Keyword getStructKeyword_86() { return cStructKeyword_86; }
		
		//'union'
		public Keyword getUnionKeyword_87() { return cUnionKeyword_87; }
		
		//'vector'
		public Keyword getVectorKeyword_88() { return cVectorKeyword_88; }
		
		//'rvector'
		public Keyword getRvectorKeyword_89() { return cRvectorKeyword_89; }
		
		//'list'
		public Keyword getListKeyword_90() { return cListKeyword_90; }
		
		//'set'
		public Keyword getSetKeyword_91() { return cSetKeyword_91; }
		
		//'bag'
		public Keyword getBagKeyword_92() { return cBagKeyword_92; }
		
		//'multiset'
		public Keyword getMultisetKeyword_93() { return cMultisetKeyword_93; }
		
		//'fifo'
		public Keyword getFifoKeyword_94() { return cFifoKeyword_94; }
		
		//'lifo'
		public Keyword getLifoKeyword_95() { return cLifoKeyword_95; }
		
		//'guard'
		public Keyword getGuardKeyword_96() { return cGuardKeyword_96; }
		
		//'tguard'
		public Keyword getTguardKeyword_97() { return cTguardKeyword_97; }
		
		//'event'
		public Keyword getEventKeyword_98() { return cEventKeyword_98; }
		
		//'checksat'
		public Keyword getChecksatKeyword_99() { return cChecksatKeyword_99; }
		
		//'break'
		public Keyword getBreakKeyword_100() { return cBreakKeyword_100; }
		
		//'continue'
		public Keyword getContinueKeyword_101() { return cContinueKeyword_101; }
		
		//'exit'
		public Keyword getExitKeyword_102() { return cExitKeyword_102; }
		
		//'init'
		public Keyword getInitKeyword_103() { return cInitKeyword_103; }
		
		//'destroy'
		public Keyword getDestroyKeyword_104() { return cDestroyKeyword_104; }
		
		//'stop'
		public Keyword getStopKeyword_105() { return cStopKeyword_105; }
		
		//'abort'
		public Keyword getAbortKeyword_106() { return cAbortKeyword_106; }
		
		//'restart'
		public Keyword getRestartKeyword_107() { return cRestartKeyword_107; }
		
		//'suspend'
		public Keyword getSuspendKeyword_108() { return cSuspendKeyword_108; }
		
		//'resume'
		public Keyword getResumeKeyword_109() { return cResumeKeyword_109; }
		
		//'wait'
		public Keyword getWaitKeyword_110() { return cWaitKeyword_110; }
		
		//'disable'
		public Keyword getDisableKeyword_111() { return cDisableKeyword_111; }
		
		//'enable'
		public Keyword getEnableKeyword_112() { return cEnableKeyword_112; }
		
		//'schedule'
		public Keyword getScheduleKeyword_113() { return cScheduleKeyword_113; }
		
		//'irun'
		public Keyword getIrunKeyword_114() { return cIrunKeyword_114; }
		
		//'run'
		public Keyword getRunKeyword_115() { return cRunKeyword_115; }
		
		//'rtc'
		public Keyword getRtcKeyword_116() { return cRtcKeyword_116; }
		
		//'call'
		public Keyword getCallKeyword_117() { return cCallKeyword_117; }
		
		//'new'
		public Keyword getNewKeyword_118() { return cNewKeyword_118; }
		
		//'ctor'
		public Keyword getCtorKeyword_119() { return cCtorKeyword_119; }
		
		//'newfresh'
		public Keyword getNewfreshKeyword_120() { return cNewfreshKeyword_120; }
		
		//'this'
		public Keyword getThisKeyword_121() { return cThisKeyword_121; }
		
		//'self'
		public Keyword getSelfKeyword_122() { return cSelfKeyword_122; }
		
		//'parent'
		public Keyword getParentKeyword_123() { return cParentKeyword_123; }
		
		//'super'
		public Keyword getSuperKeyword_124() { return cSuperKeyword_124; }
		
		//'null'
		public Keyword getNullKeyword_125() { return cNullKeyword_125; }
		
		//'#model'
		public Keyword getModelKeyword_126() { return cModelKeyword_126; }
		
		//'#instance'
		public Keyword getInstanceKeyword_127() { return cInstanceKeyword_127; }
		
		//'#static'
		public Keyword getStaticKeyword_128() { return cStaticKeyword_128; }
		
		//'#dynamic'
		public Keyword getDynamicKeyword_129() { return cDynamicKeyword_129; }
		
		//'#runtime'
		public Keyword getRuntimeKeyword_130() { return cRuntimeKeyword_130; }
		
		//'#static#instance'
		public Keyword getStaticInstanceKeyword_131() { return cStaticInstanceKeyword_131; }
		
		//'#dynamic#instance'
		public Keyword getDynamicInstanceKeyword_132() { return cDynamicInstanceKeyword_132; }
		
		//'#prototype'
		public Keyword getPrototypeKeyword_133() { return cPrototypeKeyword_133; }
		
		//'#dynamic#prototype'
		public Keyword getDynamicPrototypeKeyword_134() { return cDynamicPrototypeKeyword_134; }
	}
	public class ESIdentifierElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ESIdentifier");
		private final RuleCall cXLIA_IDTerminalRuleCall = (RuleCall)rule.eContents().get(1);
		
		//ESIdentifier returns ecore::EString
		//    : XLIA_ID
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//XLIA_ID
		public RuleCall getXLIA_IDTerminalRuleCall() { return cXLIA_IDTerminalRuleCall; }
	}
	public class ESUfidElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ESUfid");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Alternatives cAlternatives_0 = (Alternatives)cGroup.eContents().get(0);
		private final Keyword cSpecKeyword_0_0 = (Keyword)cAlternatives_0.eContents().get(0);
		private final Keyword cColonColonKeyword_0_1 = (Keyword)cAlternatives_0.eContents().get(1);
		private final RuleCall cXLIA_IDTerminalRuleCall_1 = (RuleCall)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Alternatives cAlternatives_2_0 = (Alternatives)cGroup_2.eContents().get(0);
		private final Keyword cFullStopKeyword_2_0_0 = (Keyword)cAlternatives_2_0.eContents().get(0);
		private final Keyword cColonKeyword_2_0_1 = (Keyword)cAlternatives_2_0.eContents().get(1);
		private final RuleCall cXLIA_IDTerminalRuleCall_2_1 = (RuleCall)cGroup_2.eContents().get(1);
		
		//ESUfid returns ecore::EString
		//    : ( 'spec::' | '::' )?  XLIA_ID  ( ( '.' | ':' ) XLIA_ID )*
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//( 'spec::' | '::' )?  XLIA_ID  ( ( '.' | ':' ) XLIA_ID )*
		public Group getGroup() { return cGroup; }
		
		//( 'spec::' | '::' )?
		public Alternatives getAlternatives_0() { return cAlternatives_0; }
		
		//'spec::'
		public Keyword getSpecKeyword_0_0() { return cSpecKeyword_0_0; }
		
		//'::'
		public Keyword getColonColonKeyword_0_1() { return cColonColonKeyword_0_1; }
		
		//XLIA_ID
		public RuleCall getXLIA_IDTerminalRuleCall_1() { return cXLIA_IDTerminalRuleCall_1; }
		
		//( ( '.' | ':' ) XLIA_ID )*
		public Group getGroup_2() { return cGroup_2; }
		
		//( '.' | ':' )
		public Alternatives getAlternatives_2_0() { return cAlternatives_2_0; }
		
		//'.'
		public Keyword getFullStopKeyword_2_0_0() { return cFullStopKeyword_2_0_0; }
		
		//':'
		public Keyword getColonKeyword_2_0_1() { return cColonKeyword_2_0_1; }
		
		//XLIA_ID
		public RuleCall getXLIA_IDTerminalRuleCall_2_1() { return cXLIA_IDTerminalRuleCall_2_1; }
	}
	public class UnrestrictedNameElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.UnrestrictedName");
		private final RuleCall cSTRINGTerminalRuleCall = (RuleCall)rule.eContents().get(1);
		
		//UnrestrictedName returns ecore::EString
		//    : STRING
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//STRING
		public RuleCall getSTRINGTerminalRuleCall() { return cSTRINGTerminalRuleCall; }
	}
	public class QualifiedNameElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.QualifiedName");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final RuleCall cUnqualifiedNameParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Keyword cColonColonKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final Assignment cNameBindingAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final RuleCall cNameBindingNameBindingParserRuleCall_1_1_0 = (RuleCall)cNameBindingAssignment_1_1.eContents().get(0);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cFullStopKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final Assignment cNameBindingAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
		private final RuleCall cNameBindingNameBindingParserRuleCall_2_1_0 = (RuleCall)cNameBindingAssignment_2_1.eContents().get(0);
		
		//QualifiedName returns fmlCommon::QualifiedName
		//    : UnqualifiedName
		//        ( '::' nameBinding += NameBinding )*
		//        ( '.' nameBinding += NameBinding )*
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//UnqualifiedName
		//       ( '::' nameBinding += NameBinding )*
		//       ( '.' nameBinding += NameBinding )*
		public Group getGroup() { return cGroup; }
		
		//UnqualifiedName
		public RuleCall getUnqualifiedNameParserRuleCall_0() { return cUnqualifiedNameParserRuleCall_0; }
		
		//( '::' nameBinding += NameBinding )*
		public Group getGroup_1() { return cGroup_1; }
		
		//'::'
		public Keyword getColonColonKeyword_1_0() { return cColonColonKeyword_1_0; }
		
		//nameBinding += NameBinding
		public Assignment getNameBindingAssignment_1_1() { return cNameBindingAssignment_1_1; }
		
		//NameBinding
		public RuleCall getNameBindingNameBindingParserRuleCall_1_1_0() { return cNameBindingNameBindingParserRuleCall_1_1_0; }
		
		//( '.' nameBinding += NameBinding )*
		public Group getGroup_2() { return cGroup_2; }
		
		//'.'
		public Keyword getFullStopKeyword_2_0() { return cFullStopKeyword_2_0; }
		
		//nameBinding += NameBinding
		public Assignment getNameBindingAssignment_2_1() { return cNameBindingAssignment_2_1; }
		
		//NameBinding
		public RuleCall getNameBindingNameBindingParserRuleCall_2_1_0() { return cNameBindingNameBindingParserRuleCall_2_1_0; }
	}
	public class PotentiallyAmbiguousQualifiedNameElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PotentiallyAmbiguousQualifiedName");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final RuleCall cUnqualifiedNameParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Keyword cColonColonKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final Assignment cNameBindingAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final RuleCall cNameBindingNameBindingParserRuleCall_1_1_0 = (RuleCall)cNameBindingAssignment_1_1.eContents().get(0);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Assignment cIsAmbiguousAssignment_2_0 = (Assignment)cGroup_2.eContents().get(0);
		private final Keyword cIsAmbiguousFullStopKeyword_2_0_0 = (Keyword)cIsAmbiguousAssignment_2_0.eContents().get(0);
		private final Assignment cNameBindingAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
		private final RuleCall cNameBindingNameBindingParserRuleCall_2_1_0 = (RuleCall)cNameBindingAssignment_2_1.eContents().get(0);
		private final Group cGroup_2_2 = (Group)cGroup_2.eContents().get(2);
		private final Keyword cFullStopKeyword_2_2_0 = (Keyword)cGroup_2_2.eContents().get(0);
		private final Assignment cNameBindingAssignment_2_2_1 = (Assignment)cGroup_2_2.eContents().get(1);
		private final RuleCall cNameBindingNameBindingParserRuleCall_2_2_1_0 = (RuleCall)cNameBindingAssignment_2_2_1.eContents().get(0);
		
		//PotentiallyAmbiguousQualifiedName returns fmlCommon::QualifiedName
		//    : UnqualifiedName
		//        ( '::' nameBinding += NameBinding )*
		//        ( isAmbiguous ?= '.' nameBinding += NameBinding
		//            ( '.' nameBinding += NameBinding )*
		//        )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//UnqualifiedName
		//       ( '::' nameBinding += NameBinding )*
		//       ( isAmbiguous ?= '.' nameBinding += NameBinding
		//           ( '.' nameBinding += NameBinding )*
		//       )?
		public Group getGroup() { return cGroup; }
		
		//UnqualifiedName
		public RuleCall getUnqualifiedNameParserRuleCall_0() { return cUnqualifiedNameParserRuleCall_0; }
		
		//( '::' nameBinding += NameBinding )*
		public Group getGroup_1() { return cGroup_1; }
		
		//'::'
		public Keyword getColonColonKeyword_1_0() { return cColonColonKeyword_1_0; }
		
		//nameBinding += NameBinding
		public Assignment getNameBindingAssignment_1_1() { return cNameBindingAssignment_1_1; }
		
		//NameBinding
		public RuleCall getNameBindingNameBindingParserRuleCall_1_1_0() { return cNameBindingNameBindingParserRuleCall_1_1_0; }
		
		//( isAmbiguous ?= '.' nameBinding += NameBinding
		//    ( '.' nameBinding += NameBinding )*
		//)?
		public Group getGroup_2() { return cGroup_2; }
		
		//isAmbiguous ?= '.'
		public Assignment getIsAmbiguousAssignment_2_0() { return cIsAmbiguousAssignment_2_0; }
		
		//'.'
		public Keyword getIsAmbiguousFullStopKeyword_2_0_0() { return cIsAmbiguousFullStopKeyword_2_0_0; }
		
		//nameBinding += NameBinding
		public Assignment getNameBindingAssignment_2_1() { return cNameBindingAssignment_2_1; }
		
		//NameBinding
		public RuleCall getNameBindingNameBindingParserRuleCall_2_1_0() { return cNameBindingNameBindingParserRuleCall_2_1_0; }
		
		//( '.' nameBinding += NameBinding )*
		public Group getGroup_2_2() { return cGroup_2_2; }
		
		//'.'
		public Keyword getFullStopKeyword_2_2_0() { return cFullStopKeyword_2_2_0; }
		
		//nameBinding += NameBinding
		public Assignment getNameBindingAssignment_2_2_1() { return cNameBindingAssignment_2_2_1; }
		
		//NameBinding
		public RuleCall getNameBindingNameBindingParserRuleCall_2_2_1_0() { return cNameBindingNameBindingParserRuleCall_2_2_1_0; }
	}
	public class ColonQualifiedNameElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ColonQualifiedName");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final RuleCall cUnqualifiedNameParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Keyword cColonColonKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final Assignment cNameBindingAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final RuleCall cNameBindingNameBindingParserRuleCall_1_1_0 = (RuleCall)cNameBindingAssignment_1_1.eContents().get(0);
		
		//ColonQualifiedName returns fmlCommon::QualifiedName
		//    : UnqualifiedName ( '::' nameBinding += NameBinding )+
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//UnqualifiedName ( '::' nameBinding += NameBinding )+
		public Group getGroup() { return cGroup; }
		
		//UnqualifiedName
		public RuleCall getUnqualifiedNameParserRuleCall_0() { return cUnqualifiedNameParserRuleCall_0; }
		
		//( '::' nameBinding += NameBinding )+
		public Group getGroup_1() { return cGroup_1; }
		
		//'::'
		public Keyword getColonColonKeyword_1_0() { return cColonColonKeyword_1_0; }
		
		//nameBinding += NameBinding
		public Assignment getNameBindingAssignment_1_1() { return cNameBindingAssignment_1_1; }
		
		//NameBinding
		public RuleCall getNameBindingNameBindingParserRuleCall_1_1_0() { return cNameBindingNameBindingParserRuleCall_1_1_0; }
	}
	public class DotQualifiedNameElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.DotQualifiedName");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final RuleCall cUnqualifiedNameParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Keyword cFullStopKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final Assignment cNameBindingAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final RuleCall cNameBindingNameBindingParserRuleCall_1_1_0 = (RuleCall)cNameBindingAssignment_1_1.eContents().get(0);
		
		//DotQualifiedName returns fmlCommon::QualifiedName
		//    : UnqualifiedName ( '.' nameBinding += NameBinding )+
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//UnqualifiedName ( '.' nameBinding += NameBinding )+
		public Group getGroup() { return cGroup; }
		
		//UnqualifiedName
		public RuleCall getUnqualifiedNameParserRuleCall_0() { return cUnqualifiedNameParserRuleCall_0; }
		
		//( '.' nameBinding += NameBinding )+
		public Group getGroup_1() { return cGroup_1; }
		
		//'.'
		public Keyword getFullStopKeyword_1_0() { return cFullStopKeyword_1_0; }
		
		//nameBinding += NameBinding
		public Assignment getNameBindingAssignment_1_1() { return cNameBindingAssignment_1_1; }
		
		//NameBinding
		public RuleCall getNameBindingNameBindingParserRuleCall_1_1_0() { return cNameBindingNameBindingParserRuleCall_1_1_0; }
	}
	public class UnqualifiedNameElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.UnqualifiedName");
		private final Assignment cNameBindingAssignment = (Assignment)rule.eContents().get(1);
		private final RuleCall cNameBindingNameBindingParserRuleCall_0 = (RuleCall)cNameBindingAssignment.eContents().get(0);
		
		//UnqualifiedName returns fmlCommon::QualifiedName
		//    : nameBinding += NameBinding
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//nameBinding += NameBinding
		public Assignment getNameBindingAssignment() { return cNameBindingAssignment; }
		
		//NameBinding
		public RuleCall getNameBindingNameBindingParserRuleCall_0() { return cNameBindingNameBindingParserRuleCall_0; }
	}
	public class NameBindingElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.NameBinding");
		private final RuleCall cXLIA_IDTerminalRuleCall = (RuleCall)rule.eContents().get(1);
		
		//NameBinding
		//    : XLIA_ID
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//XLIA_ID
		public RuleCall getXLIA_IDTerminalRuleCall() { return cXLIA_IDTerminalRuleCall; }
	}
	public class ModelOfComputationKingElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ModelOfComputationKing");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final Keyword cAndKeyword_0 = (Keyword)cAlternatives.eContents().get(0);
		private final Keyword cOrKeyword_1 = (Keyword)cAlternatives.eContents().get(1);
		private final Keyword cStartKeyword_2 = (Keyword)cAlternatives.eContents().get(2);
		private final Keyword cSTFKeyword_3 = (Keyword)cAlternatives.eContents().get(3);
		private final Keyword cSTSKeyword_4 = (Keyword)cAlternatives.eContents().get(4);
		private final Keyword cDFKeyword_5 = (Keyword)cAlternatives.eContents().get(5);
		private final Keyword cAltKeyword_6 = (Keyword)cAlternatives.eContents().get(6);
		private final Keyword cOptKeyword_7 = (Keyword)cAlternatives.eContents().get(7);
		private final Keyword cLoopKeyword_8 = (Keyword)cAlternatives.eContents().get(8);
		private final Keyword cBreakKeyword_9 = (Keyword)cAlternatives.eContents().get(9);
		private final Keyword cParKeyword_10 = (Keyword)cAlternatives.eContents().get(10);
		private final Keyword cStrictKeyword_11 = (Keyword)cAlternatives.eContents().get(11);
		private final Keyword cWeakKeyword_12 = (Keyword)cAlternatives.eContents().get(12);
		private final Keyword cSeqKeyword_13 = (Keyword)cAlternatives.eContents().get(13);
		private final Keyword cCriticalKeyword_14 = (Keyword)cAlternatives.eContents().get(14);
		private final Keyword cIgnoreKeyword_15 = (Keyword)cAlternatives.eContents().get(15);
		private final Keyword cConsiderKeyword_16 = (Keyword)cAlternatives.eContents().get(16);
		private final Keyword cAssertKeyword_17 = (Keyword)cAlternatives.eContents().get(17);
		private final Keyword cNegKeyword_18 = (Keyword)cAlternatives.eContents().get(18);
		
		//ModelOfComputationKing
		//    : 'and'
		//    | 'or'
		//    | 'start'
		//    | '#STF'
		//    | '#STS'
		//    | '#DF'
		//    | '#alt'
		//    | '#opt'
		//    | '#loop'
		//    | '#break'
		//    | '#par'
		//    | '#strict'
		//    | '#weak'
		//    | '#seq'
		//    | '#critical'
		//    | '#ignore'
		//    | '#consider'
		//    | '#assert'
		//    | '#neg'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//'and'
		//   | 'or'
		//   | 'start'
		//   | '#STF'
		//   | '#STS'
		//   | '#DF'
		//   | '#alt'
		//   | '#opt'
		//   | '#loop'
		//   | '#break'
		//   | '#par'
		//   | '#strict'
		//   | '#weak'
		//   | '#seq'
		//   | '#critical'
		//   | '#ignore'
		//   | '#consider'
		//   | '#assert'
		//   | '#neg'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//'and'
		public Keyword getAndKeyword_0() { return cAndKeyword_0; }
		
		//'or'
		public Keyword getOrKeyword_1() { return cOrKeyword_1; }
		
		//'start'
		public Keyword getStartKeyword_2() { return cStartKeyword_2; }
		
		//'#STF'
		public Keyword getSTFKeyword_3() { return cSTFKeyword_3; }
		
		//'#STS'
		public Keyword getSTSKeyword_4() { return cSTSKeyword_4; }
		
		//'#DF'
		public Keyword getDFKeyword_5() { return cDFKeyword_5; }
		
		//'#alt'
		public Keyword getAltKeyword_6() { return cAltKeyword_6; }
		
		//'#opt'
		public Keyword getOptKeyword_7() { return cOptKeyword_7; }
		
		//'#loop'
		public Keyword getLoopKeyword_8() { return cLoopKeyword_8; }
		
		//'#break'
		public Keyword getBreakKeyword_9() { return cBreakKeyword_9; }
		
		//'#par'
		public Keyword getParKeyword_10() { return cParKeyword_10; }
		
		//'#strict'
		public Keyword getStrictKeyword_11() { return cStrictKeyword_11; }
		
		//'#weak'
		public Keyword getWeakKeyword_12() { return cWeakKeyword_12; }
		
		//'#seq'
		public Keyword getSeqKeyword_13() { return cSeqKeyword_13; }
		
		//'#critical'
		public Keyword getCriticalKeyword_14() { return cCriticalKeyword_14; }
		
		//'#ignore'
		public Keyword getIgnoreKeyword_15() { return cIgnoreKeyword_15; }
		
		//'#consider'
		public Keyword getConsiderKeyword_16() { return cConsiderKeyword_16; }
		
		//'#assert'
		public Keyword getAssertKeyword_17() { return cAssertKeyword_17; }
		
		//'#neg'
		public Keyword getNegKeyword_18() { return cNegKeyword_18; }
	}
	public class DesignDebugTraceElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.DesignDebugTrace");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final Keyword cModelKeyword_0 = (Keyword)cAlternatives.eContents().get(0);
		private final Keyword cInstanceKeyword_1 = (Keyword)cAlternatives.eContents().get(1);
		private final Keyword cStaticKeyword_2 = (Keyword)cAlternatives.eContents().get(2);
		private final Keyword cDynamicKeyword_3 = (Keyword)cAlternatives.eContents().get(3);
		private final Keyword cRuntimeKeyword_4 = (Keyword)cAlternatives.eContents().get(4);
		private final Keyword cStaticInstanceKeyword_5 = (Keyword)cAlternatives.eContents().get(5);
		private final Keyword cDynamicInstanceKeyword_6 = (Keyword)cAlternatives.eContents().get(6);
		private final Keyword cPrototypeKeyword_7 = (Keyword)cAlternatives.eContents().get(7);
		private final Keyword cDynamicPrototypeKeyword_8 = (Keyword)cAlternatives.eContents().get(8);
		
		//DesignDebugTrace
		//    : '#model'
		//    | '#instance'
		//    | '#static'
		//    | '#dynamic'
		//    | '#runtime'
		//    | '#static#instance'
		//    | '#dynamic#instance'
		//    | '#prototype'
		//    | '#dynamic#prototype'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//'#model'
		//   | '#instance'
		//   | '#static'
		//   | '#dynamic'
		//   | '#runtime'
		//   | '#static#instance'
		//   | '#dynamic#instance'
		//   | '#prototype'
		//   | '#dynamic#prototype'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//'#model'
		public Keyword getModelKeyword_0() { return cModelKeyword_0; }
		
		//'#instance'
		public Keyword getInstanceKeyword_1() { return cInstanceKeyword_1; }
		
		//'#static'
		public Keyword getStaticKeyword_2() { return cStaticKeyword_2; }
		
		//'#dynamic'
		public Keyword getDynamicKeyword_3() { return cDynamicKeyword_3; }
		
		//'#runtime'
		public Keyword getRuntimeKeyword_4() { return cRuntimeKeyword_4; }
		
		//'#static#instance'
		public Keyword getStaticInstanceKeyword_5() { return cStaticInstanceKeyword_5; }
		
		//'#dynamic#instance'
		public Keyword getDynamicInstanceKeyword_6() { return cDynamicInstanceKeyword_6; }
		
		//'#prototype'
		public Keyword getPrototypeKeyword_7() { return cPrototypeKeyword_7; }
		
		//'#dynamic#prototype'
		public Keyword getDynamicPrototypeKeyword_8() { return cDynamicPrototypeKeyword_8; }
	}
	public class XliaSystemElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.XliaSystem");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final UnorderedGroup cUnorderedGroup_0 = (UnorderedGroup)cGroup.eContents().get(0);
		private final Assignment cVisibilityAssignment_0_0 = (Assignment)cUnorderedGroup_0.eContents().get(0);
		private final RuleCall cVisibilityVisibilityKindEnumRuleCall_0_0_0 = (RuleCall)cVisibilityAssignment_0_0.eContents().get(0);
		private final Assignment cTimedAssignment_0_1 = (Assignment)cUnorderedGroup_0.eContents().get(1);
		private final Keyword cTimedTimedKeyword_0_1_0 = (Keyword)cTimedAssignment_0_1.eContents().get(0);
		private final Assignment cDense_timedAssignment_0_2 = (Assignment)cUnorderedGroup_0.eContents().get(2);
		private final Keyword cDense_timedTimedDenseKeyword_0_2_0 = (Keyword)cDense_timedAssignment_0_2.eContents().get(0);
		private final Assignment cDiscrete_timedAssignment_0_3 = (Assignment)cUnorderedGroup_0.eContents().get(3);
		private final Keyword cDiscrete_timedTimedDiscreteKeyword_0_3_0 = (Keyword)cDiscrete_timedAssignment_0_3.eContents().get(0);
		private final Assignment cInput_enabledAssignment_0_4 = (Assignment)cUnorderedGroup_0.eContents().get(4);
		private final Keyword cInput_enabledInput_enabledKeyword_0_4_0 = (Keyword)cInput_enabledAssignment_0_4.eContents().get(0);
		private final Assignment cUnsafeAssignment_0_5 = (Assignment)cUnorderedGroup_0.eContents().get(5);
		private final Keyword cUnsafeUnsafeKeyword_0_5_0 = (Keyword)cUnsafeAssignment_0_5.eContents().get(0);
		private final Keyword cSystemKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLessThanSignKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final Keyword cMocKeyword_2_1 = (Keyword)cGroup_2.eContents().get(1);
		private final Alternatives cAlternatives_2_2 = (Alternatives)cGroup_2.eContents().get(2);
		private final Keyword cAndKeyword_2_2_0 = (Keyword)cAlternatives_2_2.eContents().get(0);
		private final Keyword cOrKeyword_2_2_1 = (Keyword)cAlternatives_2_2.eContents().get(1);
		private final Keyword cGreaterThanSignKeyword_2_3 = (Keyword)cGroup_2.eContents().get(3);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_5 = (Keyword)cGroup.eContents().get(5);
		private final Alternatives cAlternatives_6 = (Alternatives)cGroup.eContents().get(6);
		private final Assignment cPortAssignment_6_0 = (Assignment)cAlternatives_6.eContents().get(0);
		private final RuleCall cPortPortParserRuleCall_6_0_0 = (RuleCall)cPortAssignment_6_0.eContents().get(0);
		private final Assignment cSignalAssignment_6_1 = (Assignment)cAlternatives_6.eContents().get(1);
		private final RuleCall cSignalSignalParserRuleCall_6_1_0 = (RuleCall)cSignalAssignment_6_1.eContents().get(0);
		private final Assignment cBufferAssignment_6_2 = (Assignment)cAlternatives_6.eContents().get(2);
		private final RuleCall cBufferBufferParserRuleCall_6_2_0 = (RuleCall)cBufferAssignment_6_2.eContents().get(0);
		private final Assignment cChannelAssignment_6_3 = (Assignment)cAlternatives_6.eContents().get(3);
		private final RuleCall cChannelChannelParserRuleCall_6_3_0 = (RuleCall)cChannelAssignment_6_3.eContents().get(0);
		private final Assignment cTypedefAssignment_6_4 = (Assignment)cAlternatives_6.eContents().get(4);
		private final RuleCall cTypedefTypeDefinitionParserRuleCall_6_4_0 = (RuleCall)cTypedefAssignment_6_4.eContents().get(0);
		private final Assignment cFunctionAssignment_6_5 = (Assignment)cAlternatives_6.eContents().get(5);
		private final RuleCall cFunctionFunctionParserRuleCall_6_5_0 = (RuleCall)cFunctionAssignment_6_5.eContents().get(0);
		private final Assignment cVariableAssignment_6_6 = (Assignment)cAlternatives_6.eContents().get(6);
		private final RuleCall cVariableVariableParserRuleCall_6_6_0 = (RuleCall)cVariableAssignment_6_6.eContents().get(0);
		private final Alternatives cAlternatives_7 = (Alternatives)cGroup.eContents().get(7);
		private final Group cGroup_7_0 = (Group)cAlternatives_7.eContents().get(0);
		private final Keyword cPropertyKeyword_7_0_0 = (Keyword)cGroup_7_0.eContents().get(0);
		private final Alternatives cAlternatives_7_0_1 = (Alternatives)cGroup_7_0.eContents().get(1);
		private final Assignment cPortAssignment_7_0_1_0 = (Assignment)cAlternatives_7_0_1.eContents().get(0);
		private final RuleCall cPortPortParserRuleCall_7_0_1_0_0 = (RuleCall)cPortAssignment_7_0_1_0.eContents().get(0);
		private final Assignment cSignalAssignment_7_0_1_1 = (Assignment)cAlternatives_7_0_1.eContents().get(1);
		private final RuleCall cSignalSignalParserRuleCall_7_0_1_1_0 = (RuleCall)cSignalAssignment_7_0_1_1.eContents().get(0);
		private final Assignment cBufferAssignment_7_0_1_2 = (Assignment)cAlternatives_7_0_1.eContents().get(2);
		private final RuleCall cBufferBufferParserRuleCall_7_0_1_2_0 = (RuleCall)cBufferAssignment_7_0_1_2.eContents().get(0);
		private final Assignment cChannelAssignment_7_0_1_3 = (Assignment)cAlternatives_7_0_1.eContents().get(3);
		private final RuleCall cChannelChannelParserRuleCall_7_0_1_3_0 = (RuleCall)cChannelAssignment_7_0_1_3.eContents().get(0);
		private final Assignment cTypedefAssignment_7_0_1_4 = (Assignment)cAlternatives_7_0_1.eContents().get(4);
		private final RuleCall cTypedefTypeDefinitionParserRuleCall_7_0_1_4_0 = (RuleCall)cTypedefAssignment_7_0_1_4.eContents().get(0);
		private final Assignment cFunctionAssignment_7_0_1_5 = (Assignment)cAlternatives_7_0_1.eContents().get(5);
		private final RuleCall cFunctionFunctionParserRuleCall_7_0_1_5_0 = (RuleCall)cFunctionAssignment_7_0_1_5.eContents().get(0);
		private final Assignment cVariableAssignment_7_0_1_6 = (Assignment)cAlternatives_7_0_1.eContents().get(6);
		private final RuleCall cVariableVariableParserRuleCall_7_0_1_6_0 = (RuleCall)cVariableAssignment_7_0_1_6.eContents().get(0);
		private final Group cGroup_7_1 = (Group)cAlternatives_7.eContents().get(1);
		private final Keyword cPublicKeyword_7_1_0 = (Keyword)cGroup_7_1.eContents().get(0);
		private final Alternatives cAlternatives_7_1_1 = (Alternatives)cGroup_7_1.eContents().get(1);
		private final Assignment cPortAssignment_7_1_1_0 = (Assignment)cAlternatives_7_1_1.eContents().get(0);
		private final RuleCall cPortPortPublicParserRuleCall_7_1_1_0_0 = (RuleCall)cPortAssignment_7_1_1_0.eContents().get(0);
		private final Assignment cSignalAssignment_7_1_1_1 = (Assignment)cAlternatives_7_1_1.eContents().get(1);
		private final RuleCall cSignalSignalPublicParserRuleCall_7_1_1_1_0 = (RuleCall)cSignalAssignment_7_1_1_1.eContents().get(0);
		private final Assignment cBufferAssignment_7_1_1_2 = (Assignment)cAlternatives_7_1_1.eContents().get(2);
		private final RuleCall cBufferBufferPublicParserRuleCall_7_1_1_2_0 = (RuleCall)cBufferAssignment_7_1_1_2.eContents().get(0);
		private final Assignment cChannelAssignment_7_1_1_3 = (Assignment)cAlternatives_7_1_1.eContents().get(3);
		private final RuleCall cChannelChannelPublicParserRuleCall_7_1_1_3_0 = (RuleCall)cChannelAssignment_7_1_1_3.eContents().get(0);
		private final Assignment cTypedefAssignment_7_1_1_4 = (Assignment)cAlternatives_7_1_1.eContents().get(4);
		private final RuleCall cTypedefTypeDefinitionParserRuleCall_7_1_1_4_0 = (RuleCall)cTypedefAssignment_7_1_1_4.eContents().get(0);
		private final Assignment cFunctionAssignment_7_1_1_5 = (Assignment)cAlternatives_7_1_1.eContents().get(5);
		private final RuleCall cFunctionFunctionPublicParserRuleCall_7_1_1_5_0 = (RuleCall)cFunctionAssignment_7_1_1_5.eContents().get(0);
		private final Assignment cVariableAssignment_7_1_1_6 = (Assignment)cAlternatives_7_1_1.eContents().get(6);
		private final RuleCall cVariableVariablePublicParserRuleCall_7_1_1_6_0 = (RuleCall)cVariableAssignment_7_1_1_6.eContents().get(0);
		private final Group cGroup_7_2 = (Group)cAlternatives_7.eContents().get(2);
		private final Keyword cProtectedKeyword_7_2_0 = (Keyword)cGroup_7_2.eContents().get(0);
		private final Alternatives cAlternatives_7_2_1 = (Alternatives)cGroup_7_2.eContents().get(1);
		private final Assignment cPortAssignment_7_2_1_0 = (Assignment)cAlternatives_7_2_1.eContents().get(0);
		private final RuleCall cPortPortProtectedParserRuleCall_7_2_1_0_0 = (RuleCall)cPortAssignment_7_2_1_0.eContents().get(0);
		private final Assignment cSignalAssignment_7_2_1_1 = (Assignment)cAlternatives_7_2_1.eContents().get(1);
		private final RuleCall cSignalSignalProtectedParserRuleCall_7_2_1_1_0 = (RuleCall)cSignalAssignment_7_2_1_1.eContents().get(0);
		private final Assignment cBufferAssignment_7_2_1_2 = (Assignment)cAlternatives_7_2_1.eContents().get(2);
		private final RuleCall cBufferBufferProtectedParserRuleCall_7_2_1_2_0 = (RuleCall)cBufferAssignment_7_2_1_2.eContents().get(0);
		private final Assignment cChannelAssignment_7_2_1_3 = (Assignment)cAlternatives_7_2_1.eContents().get(3);
		private final RuleCall cChannelChannelProtectedParserRuleCall_7_2_1_3_0 = (RuleCall)cChannelAssignment_7_2_1_3.eContents().get(0);
		private final Assignment cTypedefAssignment_7_2_1_4 = (Assignment)cAlternatives_7_2_1.eContents().get(4);
		private final RuleCall cTypedefTypeDefinitionParserRuleCall_7_2_1_4_0 = (RuleCall)cTypedefAssignment_7_2_1_4.eContents().get(0);
		private final Assignment cFunctionAssignment_7_2_1_5 = (Assignment)cAlternatives_7_2_1.eContents().get(5);
		private final RuleCall cFunctionFunctionProtectedParserRuleCall_7_2_1_5_0 = (RuleCall)cFunctionAssignment_7_2_1_5.eContents().get(0);
		private final Assignment cVariableAssignment_7_2_1_6 = (Assignment)cAlternatives_7_2_1.eContents().get(6);
		private final RuleCall cVariableVariableProtectedParserRuleCall_7_2_1_6_0 = (RuleCall)cVariableAssignment_7_2_1_6.eContents().get(0);
		private final Group cGroup_7_3 = (Group)cAlternatives_7.eContents().get(3);
		private final Keyword cPrivateKeyword_7_3_0 = (Keyword)cGroup_7_3.eContents().get(0);
		private final Alternatives cAlternatives_7_3_1 = (Alternatives)cGroup_7_3.eContents().get(1);
		private final Assignment cPortAssignment_7_3_1_0 = (Assignment)cAlternatives_7_3_1.eContents().get(0);
		private final RuleCall cPortPortPrivateParserRuleCall_7_3_1_0_0 = (RuleCall)cPortAssignment_7_3_1_0.eContents().get(0);
		private final Assignment cSignalAssignment_7_3_1_1 = (Assignment)cAlternatives_7_3_1.eContents().get(1);
		private final RuleCall cSignalSignalPrivateParserRuleCall_7_3_1_1_0 = (RuleCall)cSignalAssignment_7_3_1_1.eContents().get(0);
		private final Assignment cBufferAssignment_7_3_1_2 = (Assignment)cAlternatives_7_3_1.eContents().get(2);
		private final RuleCall cBufferBufferPrivateParserRuleCall_7_3_1_2_0 = (RuleCall)cBufferAssignment_7_3_1_2.eContents().get(0);
		private final Assignment cChannelAssignment_7_3_1_3 = (Assignment)cAlternatives_7_3_1.eContents().get(3);
		private final RuleCall cChannelChannelPrivateParserRuleCall_7_3_1_3_0 = (RuleCall)cChannelAssignment_7_3_1_3.eContents().get(0);
		private final Assignment cTypedefAssignment_7_3_1_4 = (Assignment)cAlternatives_7_3_1.eContents().get(4);
		private final RuleCall cTypedefTypeDefinitionParserRuleCall_7_3_1_4_0 = (RuleCall)cTypedefAssignment_7_3_1_4.eContents().get(0);
		private final Assignment cFunctionAssignment_7_3_1_5 = (Assignment)cAlternatives_7_3_1.eContents().get(5);
		private final RuleCall cFunctionFunctionPrivateParserRuleCall_7_3_1_5_0 = (RuleCall)cFunctionAssignment_7_3_1_5.eContents().get(0);
		private final Assignment cVariableAssignment_7_3_1_6 = (Assignment)cAlternatives_7_3_1.eContents().get(6);
		private final RuleCall cVariableVariablePrivateParserRuleCall_7_3_1_6_0 = (RuleCall)cVariableAssignment_7_3_1_6.eContents().get(0);
		private final Alternatives cAlternatives_8 = (Alternatives)cGroup.eContents().get(8);
		private final Alternatives cAlternatives_8_0 = (Alternatives)cAlternatives_8.eContents().get(0);
		private final Group cGroup_8_0_0 = (Group)cAlternatives_8_0.eContents().get(0);
		private final Alternatives cAlternatives_8_0_0_0 = (Alternatives)cGroup_8_0_0.eContents().get(0);
		private final Keyword cRoutineKeyword_8_0_0_0_0 = (Keyword)cAlternatives_8_0_0_0.eContents().get(0);
		private final Keyword cMacroKeyword_8_0_0_0_1 = (Keyword)cAlternatives_8_0_0_0.eContents().get(1);
		private final Assignment cRoutineAssignment_8_0_0_1 = (Assignment)cGroup_8_0_0.eContents().get(1);
		private final RuleCall cRoutineRoutineParserRuleCall_8_0_0_1_0 = (RuleCall)cRoutineAssignment_8_0_0_1.eContents().get(0);
		private final Group cGroup_8_0_1 = (Group)cAlternatives_8_0.eContents().get(1);
		private final Keyword cProcedureKeyword_8_0_1_0 = (Keyword)cGroup_8_0_1.eContents().get(0);
		private final Assignment cProcedureAssignment_8_0_1_1 = (Assignment)cGroup_8_0_1.eContents().get(1);
		private final RuleCall cProcedureProcedureParserRuleCall_8_0_1_1_0 = (RuleCall)cProcedureAssignment_8_0_1_1.eContents().get(0);
		private final Alternatives cAlternatives_8_1 = (Alternatives)cAlternatives_8.eContents().get(1);
		private final Assignment cRoutineAssignment_8_1_0 = (Assignment)cAlternatives_8_1.eContents().get(0);
		private final RuleCall cRoutineRoutineParserRuleCall_8_1_0_0 = (RuleCall)cRoutineAssignment_8_1_0.eContents().get(0);
		private final Assignment cProcedureAssignment_8_1_1 = (Assignment)cAlternatives_8_1.eContents().get(1);
		private final RuleCall cProcedureProcedureParserRuleCall_8_1_1_0 = (RuleCall)cProcedureAssignment_8_1_1.eContents().get(0);
		private final Alternatives cAlternatives_9 = (Alternatives)cGroup.eContents().get(9);
		private final Group cGroup_9_0 = (Group)cAlternatives_9.eContents().get(0);
		private final Alternatives cAlternatives_9_0_0 = (Alternatives)cGroup_9_0.eContents().get(0);
		private final Keyword cCompositeKeyword_9_0_0_0 = (Keyword)cAlternatives_9_0_0.eContents().get(0);
		private final Keyword cMachineKeyword_9_0_0_1 = (Keyword)cAlternatives_9_0_0.eContents().get(1);
		private final Alternatives cAlternatives_9_0_1 = (Alternatives)cGroup_9_0.eContents().get(1);
		private final Assignment cMachineAssignment_9_0_1_0 = (Assignment)cAlternatives_9_0_1.eContents().get(0);
		private final RuleCall cMachineAnyMachineBlockParserRuleCall_9_0_1_0_0 = (RuleCall)cMachineAssignment_9_0_1_0.eContents().get(0);
		private final Assignment cInstanceAssignment_9_0_1_1 = (Assignment)cAlternatives_9_0_1.eContents().get(1);
		private final RuleCall cInstanceInstanceMachineParserRuleCall_9_0_1_1_0 = (RuleCall)cInstanceAssignment_9_0_1_1.eContents().get(0);
		private final Group cGroup_9_1 = (Group)cAlternatives_9.eContents().get(1);
		private final Keyword cModelKeyword_9_1_0 = (Keyword)cGroup_9_1.eContents().get(0);
		private final Assignment cMachineAssignment_9_1_1 = (Assignment)cGroup_9_1.eContents().get(1);
		private final RuleCall cMachineAnyMachineBlockParserRuleCall_9_1_1_0 = (RuleCall)cMachineAssignment_9_1_1.eContents().get(0);
		private final Group cGroup_9_2 = (Group)cAlternatives_9.eContents().get(2);
		private final Keyword cPrototypeKeyword_9_2_0 = (Keyword)cGroup_9_2.eContents().get(0);
		private final Assignment cMachineAssignment_9_2_1 = (Assignment)cGroup_9_2.eContents().get(1);
		private final RuleCall cMachineAnyMachineBlockParserRuleCall_9_2_1_0 = (RuleCall)cMachineAssignment_9_2_1.eContents().get(0);
		private final Group cGroup_9_3 = (Group)cAlternatives_9.eContents().get(3);
		private final Keyword cInstanceKeyword_9_3_0 = (Keyword)cGroup_9_3.eContents().get(0);
		private final Assignment cInstanceAssignment_9_3_1 = (Assignment)cGroup_9_3.eContents().get(1);
		private final RuleCall cInstanceInstanceMachineParserRuleCall_9_3_1_0 = (RuleCall)cInstanceAssignment_9_3_1.eContents().get(0);
		private final Alternatives cAlternatives_10 = (Alternatives)cGroup.eContents().get(10);
		private final Group cGroup_10_0 = (Group)cAlternatives_10.eContents().get(0);
		private final Keyword cBehaviorKeyword_10_0_0 = (Keyword)cGroup_10_0.eContents().get(0);
		private final Assignment cBehaviorAssignment_10_0_1 = (Assignment)cGroup_10_0.eContents().get(1);
		private final RuleCall cBehaviorBehaviorParserRuleCall_10_0_1_0 = (RuleCall)cBehaviorAssignment_10_0_1.eContents().get(0);
		private final Group cGroup_10_1 = (Group)cAlternatives_10.eContents().get(1);
		private final Keyword cStatemachineKeyword_10_1_0 = (Keyword)cGroup_10_1.eContents().get(0);
		private final Assignment cBehaviorAssignment_10_1_1 = (Assignment)cGroup_10_1.eContents().get(1);
		private final RuleCall cBehaviorStatemachineParserRuleCall_10_1_1_0 = (RuleCall)cBehaviorAssignment_10_1_1.eContents().get(0);
		private final Assignment cMainAssignment_11 = (Assignment)cGroup.eContents().get(11);
		private final RuleCall cMainMoeBehaviorParserRuleCall_11_0 = (RuleCall)cMainAssignment_11.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_12 = (Keyword)cGroup.eContents().get(12);
		
		//XliaSystem returns fmlInfra::XliaSystem
		//    : ( ( visibility=VisibilityKind )?
		//        & ( timed?='timed' )?
		//        & ( dense_timed?='timed#dense' )?
		//        & ( discrete_timed?='timed#discrete' )?
		//        & ( input_enabled ?= 'input_enabled' )?
		//        & ( unsafe ?= 'unsafe' )?
		//        )
		//        'system' ('<' ( 'moc:' )? ( 'and' | 'or' ) '>')?
		//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//        '{'
		//        ( // optional unnamed section for property full declaration / definition
		////            ( 'port'
		////                ( port+=PortImpl
		////                | '{' ( port+=PortImpl )+ '}'
		////                )
		////            | 'signal'
		////                ( signal+=SignalImpl
		////                | '{' ( signal+=SignalImpl )+ '}'
		////                )
		////            | 'buffer'
		////                ( buffer+=BufferImpl
		////                | '{' ( buffer+=BufferImpl )+ '}'
		////                )
		////            | channel+=Channel
		////            | 'type'
		////                ( typedef+=TypeDefinitionImpl
		////                | '{' ( typedef+=TypeDefinitionImpl )+ '}'
		////                )
		////            | 'var'
		////                ( property+=VariableImpl
		////                | '{' ( variable+=VariableImpl )+ '}'
		////                )
		////            | ( 'val' | 'const' )
		////                ( variable+=VariableImpl
		////                | '{' ( variable+=VariableImpl )+ '}'
		////                )
		////            | variable+=Variable
		////            )*
		//            ( port+=Port
		//            | signal+=Signal
		//            | buffer+=Buffer
		//            | channel+=Channel
		//            | typedef+=TypeDefinition
		//            | function+=Function
		//            | variable+=Variable
		//            )*
		//        )
		//        ( '@property:'
		//            ( port+=Port
		//            | signal+=Signal
		//            | buffer+=Buffer
		//            | channel+=Channel
		//            | typedef+=TypeDefinition
		//            | function+=Function
		//            | variable+=Variable
		//            )*
		//        | '@public:'
		//            ( port+=PortPublic
		//            | signal+=SignalPublic
		//            | buffer+=BufferPublic
		//            | channel+=ChannelPublic
		//            | typedef+=TypeDefinition
		//            | function+=FunctionPublic
		//            | variable+=VariablePublic
		//            )*
		//        | '@protected:'
		//            ( port+=PortProtected
		//            | signal+=SignalProtected
		//            | buffer+=BufferProtected
		//            | channel+=ChannelProtected
		//            | typedef+=TypeDefinition
		//            | function+=FunctionProtected
		//            | variable+=VariableProtected
		//            )*
		//        | '@private:'
		//            ( port+=PortPrivate
		//            | signal+=SignalPrivate
		//            | buffer+=BufferPrivate
		//            | channel+=ChannelPrivate
		//            | typedef+=TypeDefinition
		//            | function+=FunctionPrivate
		//            | variable+=VariablePrivate
		//            )*
		//        )*
		//        ( ( ( '@routine:' | '@macro:' ) ( routine+=Routine )+
		//          | '@procedure:' ( procedure+=Procedure )+
		//          )*
		//        | ( routine+=Routine | procedure+=Procedure )+
		//        )
		//        ( ( '@composite:' | '@machine:' )
		//            ( machine +=AnyMachineBlock
		//            | instance+=InstanceMachine
		//            )+
		//        | '@model:'     ( machine +=AnyMachineBlock )*
		//        | '@prototype:' ( machine +=AnyMachineBlock )*
		//        | '@instance:'  ( instance+=InstanceMachine )*
		//        )*
		//        ( '@behavior:'     ( behavior+=Behavior )+
		//        | '@statemachine:' ( behavior+=Statemachine )+
		//        )*
		//        main=MoeBehavior
		////        // optional unnamed section for property full declaration / definition
		////        propertyPart=PropertyPart
		////
		////        compositePart=CompositePart
		////
		////        behaviorPart=BehaviorPart
		//        '}'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		// ( ( visibility=VisibilityKind )?
		//        & ( timed?='timed' )?
		//        & ( dense_timed?='timed#dense' )?
		//        & ( discrete_timed?='timed#discrete' )?
		//        & ( input_enabled ?= 'input_enabled' )?
		//        & ( unsafe ?= 'unsafe' )?
		//        )
		//        'system' ('<' ( 'moc:' )? ( 'and' | 'or' ) '>')?
		//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//        '{'
		//        ( // optional unnamed section for property full declaration / definition
		////            ( 'port'
		////                ( port+=PortImpl
		////                | '{' ( port+=PortImpl )+ '}'
		////                )
		////            | 'signal'
		////                ( signal+=SignalImpl
		////                | '{' ( signal+=SignalImpl )+ '}'
		////                )
		////            | 'buffer'
		////                ( buffer+=BufferImpl
		////                | '{' ( buffer+=BufferImpl )+ '}'
		////                )
		////            | channel+=Channel
		////            | 'type'
		////                ( typedef+=TypeDefinitionImpl
		////                | '{' ( typedef+=TypeDefinitionImpl )+ '}'
		////                )
		////            | 'var'
		////                ( property+=VariableImpl
		////                | '{' ( variable+=VariableImpl )+ '}'
		////                )
		////            | ( 'val' | 'const' )
		////                ( variable+=VariableImpl
		////                | '{' ( variable+=VariableImpl )+ '}'
		////                )
		////            | variable+=Variable
		////            )*
		//            ( port+=Port
		//            | signal+=Signal
		//            | buffer+=Buffer
		//            | channel+=Channel
		//            | typedef+=TypeDefinition
		//            | function+=Function
		//            | variable+=Variable
		//            )*
		//        )
		//        ( '@property:'
		//            ( port+=Port
		//            | signal+=Signal
		//            | buffer+=Buffer
		//            | channel+=Channel
		//            | typedef+=TypeDefinition
		//            | function+=Function
		//            | variable+=Variable
		//            )*
		//        | '@public:'
		//            ( port+=PortPublic
		//            | signal+=SignalPublic
		//            | buffer+=BufferPublic
		//            | channel+=ChannelPublic
		//            | typedef+=TypeDefinition
		//            | function+=FunctionPublic
		//            | variable+=VariablePublic
		//            )*
		//        | '@protected:'
		//            ( port+=PortProtected
		//            | signal+=SignalProtected
		//            | buffer+=BufferProtected
		//            | channel+=ChannelProtected
		//            | typedef+=TypeDefinition
		//            | function+=FunctionProtected
		//            | variable+=VariableProtected
		//            )*
		//        | '@private:'
		//            ( port+=PortPrivate
		//            | signal+=SignalPrivate
		//            | buffer+=BufferPrivate
		//            | channel+=ChannelPrivate
		//            | typedef+=TypeDefinition
		//            | function+=FunctionPrivate
		//            | variable+=VariablePrivate
		//            )*
		//        )*
		//        ( ( ( '@routine:' | '@macro:' ) ( routine+=Routine )+
		//          | '@procedure:' ( procedure+=Procedure )+
		//          )*
		//        | ( routine+=Routine | procedure+=Procedure )+
		//        )
		//        ( ( '@composite:' | '@machine:' )
		//            ( machine +=AnyMachineBlock
		//            | instance+=InstanceMachine
		//            )+
		//        | '@model:'     ( machine +=AnyMachineBlock )*
		//        | '@prototype:' ( machine +=AnyMachineBlock )*
		//        | '@instance:'  ( instance+=InstanceMachine )*
		//        )*
		//        ( '@behavior:'     ( behavior+=Behavior )+
		//        | '@statemachine:' ( behavior+=Statemachine )+
		//        )*
		//        main=MoeBehavior
		////        // optional unnamed section for property full declaration / definition
		////        propertyPart=PropertyPart
		////
		////        compositePart=CompositePart
		////
		////        behaviorPart=BehaviorPart
		//        '}'
		public Group getGroup() { return cGroup; }
		
		//( ( visibility=VisibilityKind )?
		//       & ( timed?='timed' )?
		//       & ( dense_timed?='timed#dense' )?
		//       & ( discrete_timed?='timed#discrete' )?
		//       & ( input_enabled ?= 'input_enabled' )?
		//       & ( unsafe ?= 'unsafe' )?
		//       )
		public UnorderedGroup getUnorderedGroup_0() { return cUnorderedGroup_0; }
		
		//( visibility=VisibilityKind )?
		public Assignment getVisibilityAssignment_0_0() { return cVisibilityAssignment_0_0; }
		
		//VisibilityKind
		public RuleCall getVisibilityVisibilityKindEnumRuleCall_0_0_0() { return cVisibilityVisibilityKindEnumRuleCall_0_0_0; }
		
		//( timed?='timed' )?
		public Assignment getTimedAssignment_0_1() { return cTimedAssignment_0_1; }
		
		//'timed'
		public Keyword getTimedTimedKeyword_0_1_0() { return cTimedTimedKeyword_0_1_0; }
		
		//( dense_timed?='timed#dense' )?
		public Assignment getDense_timedAssignment_0_2() { return cDense_timedAssignment_0_2; }
		
		//'timed#dense'
		public Keyword getDense_timedTimedDenseKeyword_0_2_0() { return cDense_timedTimedDenseKeyword_0_2_0; }
		
		//( discrete_timed?='timed#discrete' )?
		public Assignment getDiscrete_timedAssignment_0_3() { return cDiscrete_timedAssignment_0_3; }
		
		//'timed#discrete'
		public Keyword getDiscrete_timedTimedDiscreteKeyword_0_3_0() { return cDiscrete_timedTimedDiscreteKeyword_0_3_0; }
		
		//( input_enabled ?= 'input_enabled' )?
		public Assignment getInput_enabledAssignment_0_4() { return cInput_enabledAssignment_0_4; }
		
		//'input_enabled'
		public Keyword getInput_enabledInput_enabledKeyword_0_4_0() { return cInput_enabledInput_enabledKeyword_0_4_0; }
		
		//( unsafe ?= 'unsafe' )?
		public Assignment getUnsafeAssignment_0_5() { return cUnsafeAssignment_0_5; }
		
		//'unsafe'
		public Keyword getUnsafeUnsafeKeyword_0_5_0() { return cUnsafeUnsafeKeyword_0_5_0; }
		
		//'system'
		public Keyword getSystemKeyword_1() { return cSystemKeyword_1; }
		
		//('<' ( 'moc:' )? ( 'and' | 'or' ) '>')?
		public Group getGroup_2() { return cGroup_2; }
		
		//'<'
		public Keyword getLessThanSignKeyword_2_0() { return cLessThanSignKeyword_2_0; }
		
		//( 'moc:' )?
		public Keyword getMocKeyword_2_1() { return cMocKeyword_2_1; }
		
		//( 'and' | 'or' )
		public Alternatives getAlternatives_2_2() { return cAlternatives_2_2; }
		
		//'and'
		public Keyword getAndKeyword_2_2_0() { return cAndKeyword_2_2_0; }
		
		//'or'
		public Keyword getOrKeyword_2_2_1() { return cOrKeyword_2_2_1; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_2_3() { return cGreaterThanSignKeyword_2_3; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_5() { return cLeftCurlyBracketKeyword_5; }
		
		//        ( // optional unnamed section for property full declaration / definition
		////            ( 'port'
		////                ( port+=PortImpl
		////                | '{' ( port+=PortImpl )+ '}'
		////                )
		////            | 'signal'
		////                ( signal+=SignalImpl
		////                | '{' ( signal+=SignalImpl )+ '}'
		////                )
		////            | 'buffer'
		////                ( buffer+=BufferImpl
		////                | '{' ( buffer+=BufferImpl )+ '}'
		////                )
		////            | channel+=Channel
		////            | 'type'
		////                ( typedef+=TypeDefinitionImpl
		////                | '{' ( typedef+=TypeDefinitionImpl )+ '}'
		////                )
		////            | 'var'
		////                ( property+=VariableImpl
		////                | '{' ( variable+=VariableImpl )+ '}'
		////                )
		////            | ( 'val' | 'const' )
		////                ( variable+=VariableImpl
		////                | '{' ( variable+=VariableImpl )+ '}'
		////                )
		////            | variable+=Variable
		////            )*
		//            ( port+=Port
		//            | signal+=Signal
		//            | buffer+=Buffer
		//            | channel+=Channel
		//            | typedef+=TypeDefinition
		//            | function+=Function
		//            | variable+=Variable
		//            )*
		//        )
		public Alternatives getAlternatives_6() { return cAlternatives_6; }
		
		//port+=Port
		public Assignment getPortAssignment_6_0() { return cPortAssignment_6_0; }
		
		//Port
		public RuleCall getPortPortParserRuleCall_6_0_0() { return cPortPortParserRuleCall_6_0_0; }
		
		//signal+=Signal
		public Assignment getSignalAssignment_6_1() { return cSignalAssignment_6_1; }
		
		//Signal
		public RuleCall getSignalSignalParserRuleCall_6_1_0() { return cSignalSignalParserRuleCall_6_1_0; }
		
		//buffer+=Buffer
		public Assignment getBufferAssignment_6_2() { return cBufferAssignment_6_2; }
		
		//Buffer
		public RuleCall getBufferBufferParserRuleCall_6_2_0() { return cBufferBufferParserRuleCall_6_2_0; }
		
		//channel+=Channel
		public Assignment getChannelAssignment_6_3() { return cChannelAssignment_6_3; }
		
		//Channel
		public RuleCall getChannelChannelParserRuleCall_6_3_0() { return cChannelChannelParserRuleCall_6_3_0; }
		
		//typedef+=TypeDefinition
		public Assignment getTypedefAssignment_6_4() { return cTypedefAssignment_6_4; }
		
		//TypeDefinition
		public RuleCall getTypedefTypeDefinitionParserRuleCall_6_4_0() { return cTypedefTypeDefinitionParserRuleCall_6_4_0; }
		
		//function+=Function
		public Assignment getFunctionAssignment_6_5() { return cFunctionAssignment_6_5; }
		
		//Function
		public RuleCall getFunctionFunctionParserRuleCall_6_5_0() { return cFunctionFunctionParserRuleCall_6_5_0; }
		
		//variable+=Variable
		public Assignment getVariableAssignment_6_6() { return cVariableAssignment_6_6; }
		
		//Variable
		public RuleCall getVariableVariableParserRuleCall_6_6_0() { return cVariableVariableParserRuleCall_6_6_0; }
		
		//( '@property:'
		//    ( port+=Port
		//    | signal+=Signal
		//    | buffer+=Buffer
		//    | channel+=Channel
		//    | typedef+=TypeDefinition
		//    | function+=Function
		//    | variable+=Variable
		//    )*
		//| '@public:'
		//    ( port+=PortPublic
		//    | signal+=SignalPublic
		//    | buffer+=BufferPublic
		//    | channel+=ChannelPublic
		//    | typedef+=TypeDefinition
		//    | function+=FunctionPublic
		//    | variable+=VariablePublic
		//    )*
		//| '@protected:'
		//    ( port+=PortProtected
		//    | signal+=SignalProtected
		//    | buffer+=BufferProtected
		//    | channel+=ChannelProtected
		//    | typedef+=TypeDefinition
		//    | function+=FunctionProtected
		//    | variable+=VariableProtected
		//    )*
		//| '@private:'
		//    ( port+=PortPrivate
		//    | signal+=SignalPrivate
		//    | buffer+=BufferPrivate
		//    | channel+=ChannelPrivate
		//    | typedef+=TypeDefinition
		//    | function+=FunctionPrivate
		//    | variable+=VariablePrivate
		//    )*
		//)*
		public Alternatives getAlternatives_7() { return cAlternatives_7; }
		
		//'@property:'
		//           ( port+=Port
		//           | signal+=Signal
		//           | buffer+=Buffer
		//           | channel+=Channel
		//           | typedef+=TypeDefinition
		//           | function+=Function
		//           | variable+=Variable
		//           )*
		public Group getGroup_7_0() { return cGroup_7_0; }
		
		//'@property:'
		public Keyword getPropertyKeyword_7_0_0() { return cPropertyKeyword_7_0_0; }
		
		//( port+=Port
		//| signal+=Signal
		//| buffer+=Buffer
		//| channel+=Channel
		//| typedef+=TypeDefinition
		//| function+=Function
		//| variable+=Variable
		//)*
		public Alternatives getAlternatives_7_0_1() { return cAlternatives_7_0_1; }
		
		//port+=Port
		public Assignment getPortAssignment_7_0_1_0() { return cPortAssignment_7_0_1_0; }
		
		//Port
		public RuleCall getPortPortParserRuleCall_7_0_1_0_0() { return cPortPortParserRuleCall_7_0_1_0_0; }
		
		//signal+=Signal
		public Assignment getSignalAssignment_7_0_1_1() { return cSignalAssignment_7_0_1_1; }
		
		//Signal
		public RuleCall getSignalSignalParserRuleCall_7_0_1_1_0() { return cSignalSignalParserRuleCall_7_0_1_1_0; }
		
		//buffer+=Buffer
		public Assignment getBufferAssignment_7_0_1_2() { return cBufferAssignment_7_0_1_2; }
		
		//Buffer
		public RuleCall getBufferBufferParserRuleCall_7_0_1_2_0() { return cBufferBufferParserRuleCall_7_0_1_2_0; }
		
		//channel+=Channel
		public Assignment getChannelAssignment_7_0_1_3() { return cChannelAssignment_7_0_1_3; }
		
		//Channel
		public RuleCall getChannelChannelParserRuleCall_7_0_1_3_0() { return cChannelChannelParserRuleCall_7_0_1_3_0; }
		
		//typedef+=TypeDefinition
		public Assignment getTypedefAssignment_7_0_1_4() { return cTypedefAssignment_7_0_1_4; }
		
		//TypeDefinition
		public RuleCall getTypedefTypeDefinitionParserRuleCall_7_0_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_7_0_1_4_0; }
		
		//function+=Function
		public Assignment getFunctionAssignment_7_0_1_5() { return cFunctionAssignment_7_0_1_5; }
		
		//Function
		public RuleCall getFunctionFunctionParserRuleCall_7_0_1_5_0() { return cFunctionFunctionParserRuleCall_7_0_1_5_0; }
		
		//variable+=Variable
		public Assignment getVariableAssignment_7_0_1_6() { return cVariableAssignment_7_0_1_6; }
		
		//Variable
		public RuleCall getVariableVariableParserRuleCall_7_0_1_6_0() { return cVariableVariableParserRuleCall_7_0_1_6_0; }
		
		//'@public:'
		//           ( port+=PortPublic
		//           | signal+=SignalPublic
		//           | buffer+=BufferPublic
		//           | channel+=ChannelPublic
		//           | typedef+=TypeDefinition
		//           | function+=FunctionPublic
		//           | variable+=VariablePublic
		//           )*
		public Group getGroup_7_1() { return cGroup_7_1; }
		
		//'@public:'
		public Keyword getPublicKeyword_7_1_0() { return cPublicKeyword_7_1_0; }
		
		//( port+=PortPublic
		//| signal+=SignalPublic
		//| buffer+=BufferPublic
		//| channel+=ChannelPublic
		//| typedef+=TypeDefinition
		//| function+=FunctionPublic
		//| variable+=VariablePublic
		//)*
		public Alternatives getAlternatives_7_1_1() { return cAlternatives_7_1_1; }
		
		//port+=PortPublic
		public Assignment getPortAssignment_7_1_1_0() { return cPortAssignment_7_1_1_0; }
		
		//PortPublic
		public RuleCall getPortPortPublicParserRuleCall_7_1_1_0_0() { return cPortPortPublicParserRuleCall_7_1_1_0_0; }
		
		//signal+=SignalPublic
		public Assignment getSignalAssignment_7_1_1_1() { return cSignalAssignment_7_1_1_1; }
		
		//SignalPublic
		public RuleCall getSignalSignalPublicParserRuleCall_7_1_1_1_0() { return cSignalSignalPublicParserRuleCall_7_1_1_1_0; }
		
		//buffer+=BufferPublic
		public Assignment getBufferAssignment_7_1_1_2() { return cBufferAssignment_7_1_1_2; }
		
		//BufferPublic
		public RuleCall getBufferBufferPublicParserRuleCall_7_1_1_2_0() { return cBufferBufferPublicParserRuleCall_7_1_1_2_0; }
		
		//channel+=ChannelPublic
		public Assignment getChannelAssignment_7_1_1_3() { return cChannelAssignment_7_1_1_3; }
		
		//ChannelPublic
		public RuleCall getChannelChannelPublicParserRuleCall_7_1_1_3_0() { return cChannelChannelPublicParserRuleCall_7_1_1_3_0; }
		
		//typedef+=TypeDefinition
		public Assignment getTypedefAssignment_7_1_1_4() { return cTypedefAssignment_7_1_1_4; }
		
		//TypeDefinition
		public RuleCall getTypedefTypeDefinitionParserRuleCall_7_1_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_7_1_1_4_0; }
		
		//function+=FunctionPublic
		public Assignment getFunctionAssignment_7_1_1_5() { return cFunctionAssignment_7_1_1_5; }
		
		//FunctionPublic
		public RuleCall getFunctionFunctionPublicParserRuleCall_7_1_1_5_0() { return cFunctionFunctionPublicParserRuleCall_7_1_1_5_0; }
		
		//variable+=VariablePublic
		public Assignment getVariableAssignment_7_1_1_6() { return cVariableAssignment_7_1_1_6; }
		
		//VariablePublic
		public RuleCall getVariableVariablePublicParserRuleCall_7_1_1_6_0() { return cVariableVariablePublicParserRuleCall_7_1_1_6_0; }
		
		//'@protected:'
		//           ( port+=PortProtected
		//           | signal+=SignalProtected
		//           | buffer+=BufferProtected
		//           | channel+=ChannelProtected
		//           | typedef+=TypeDefinition
		//           | function+=FunctionProtected
		//           | variable+=VariableProtected
		//           )*
		public Group getGroup_7_2() { return cGroup_7_2; }
		
		//'@protected:'
		public Keyword getProtectedKeyword_7_2_0() { return cProtectedKeyword_7_2_0; }
		
		//( port+=PortProtected
		//| signal+=SignalProtected
		//| buffer+=BufferProtected
		//| channel+=ChannelProtected
		//| typedef+=TypeDefinition
		//| function+=FunctionProtected
		//| variable+=VariableProtected
		//)*
		public Alternatives getAlternatives_7_2_1() { return cAlternatives_7_2_1; }
		
		//port+=PortProtected
		public Assignment getPortAssignment_7_2_1_0() { return cPortAssignment_7_2_1_0; }
		
		//PortProtected
		public RuleCall getPortPortProtectedParserRuleCall_7_2_1_0_0() { return cPortPortProtectedParserRuleCall_7_2_1_0_0; }
		
		//signal+=SignalProtected
		public Assignment getSignalAssignment_7_2_1_1() { return cSignalAssignment_7_2_1_1; }
		
		//SignalProtected
		public RuleCall getSignalSignalProtectedParserRuleCall_7_2_1_1_0() { return cSignalSignalProtectedParserRuleCall_7_2_1_1_0; }
		
		//buffer+=BufferProtected
		public Assignment getBufferAssignment_7_2_1_2() { return cBufferAssignment_7_2_1_2; }
		
		//BufferProtected
		public RuleCall getBufferBufferProtectedParserRuleCall_7_2_1_2_0() { return cBufferBufferProtectedParserRuleCall_7_2_1_2_0; }
		
		//channel+=ChannelProtected
		public Assignment getChannelAssignment_7_2_1_3() { return cChannelAssignment_7_2_1_3; }
		
		//ChannelProtected
		public RuleCall getChannelChannelProtectedParserRuleCall_7_2_1_3_0() { return cChannelChannelProtectedParserRuleCall_7_2_1_3_0; }
		
		//typedef+=TypeDefinition
		public Assignment getTypedefAssignment_7_2_1_4() { return cTypedefAssignment_7_2_1_4; }
		
		//TypeDefinition
		public RuleCall getTypedefTypeDefinitionParserRuleCall_7_2_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_7_2_1_4_0; }
		
		//function+=FunctionProtected
		public Assignment getFunctionAssignment_7_2_1_5() { return cFunctionAssignment_7_2_1_5; }
		
		//FunctionProtected
		public RuleCall getFunctionFunctionProtectedParserRuleCall_7_2_1_5_0() { return cFunctionFunctionProtectedParserRuleCall_7_2_1_5_0; }
		
		//variable+=VariableProtected
		public Assignment getVariableAssignment_7_2_1_6() { return cVariableAssignment_7_2_1_6; }
		
		//VariableProtected
		public RuleCall getVariableVariableProtectedParserRuleCall_7_2_1_6_0() { return cVariableVariableProtectedParserRuleCall_7_2_1_6_0; }
		
		//'@private:'
		//           ( port+=PortPrivate
		//           | signal+=SignalPrivate
		//           | buffer+=BufferPrivate
		//           | channel+=ChannelPrivate
		//           | typedef+=TypeDefinition
		//           | function+=FunctionPrivate
		//           | variable+=VariablePrivate
		//           )*
		public Group getGroup_7_3() { return cGroup_7_3; }
		
		//'@private:'
		public Keyword getPrivateKeyword_7_3_0() { return cPrivateKeyword_7_3_0; }
		
		//( port+=PortPrivate
		//| signal+=SignalPrivate
		//| buffer+=BufferPrivate
		//| channel+=ChannelPrivate
		//| typedef+=TypeDefinition
		//| function+=FunctionPrivate
		//| variable+=VariablePrivate
		//)*
		public Alternatives getAlternatives_7_3_1() { return cAlternatives_7_3_1; }
		
		//port+=PortPrivate
		public Assignment getPortAssignment_7_3_1_0() { return cPortAssignment_7_3_1_0; }
		
		//PortPrivate
		public RuleCall getPortPortPrivateParserRuleCall_7_3_1_0_0() { return cPortPortPrivateParserRuleCall_7_3_1_0_0; }
		
		//signal+=SignalPrivate
		public Assignment getSignalAssignment_7_3_1_1() { return cSignalAssignment_7_3_1_1; }
		
		//SignalPrivate
		public RuleCall getSignalSignalPrivateParserRuleCall_7_3_1_1_0() { return cSignalSignalPrivateParserRuleCall_7_3_1_1_0; }
		
		//buffer+=BufferPrivate
		public Assignment getBufferAssignment_7_3_1_2() { return cBufferAssignment_7_3_1_2; }
		
		//BufferPrivate
		public RuleCall getBufferBufferPrivateParserRuleCall_7_3_1_2_0() { return cBufferBufferPrivateParserRuleCall_7_3_1_2_0; }
		
		//channel+=ChannelPrivate
		public Assignment getChannelAssignment_7_3_1_3() { return cChannelAssignment_7_3_1_3; }
		
		//ChannelPrivate
		public RuleCall getChannelChannelPrivateParserRuleCall_7_3_1_3_0() { return cChannelChannelPrivateParserRuleCall_7_3_1_3_0; }
		
		//typedef+=TypeDefinition
		public Assignment getTypedefAssignment_7_3_1_4() { return cTypedefAssignment_7_3_1_4; }
		
		//TypeDefinition
		public RuleCall getTypedefTypeDefinitionParserRuleCall_7_3_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_7_3_1_4_0; }
		
		//function+=FunctionPrivate
		public Assignment getFunctionAssignment_7_3_1_5() { return cFunctionAssignment_7_3_1_5; }
		
		//FunctionPrivate
		public RuleCall getFunctionFunctionPrivateParserRuleCall_7_3_1_5_0() { return cFunctionFunctionPrivateParserRuleCall_7_3_1_5_0; }
		
		//variable+=VariablePrivate
		public Assignment getVariableAssignment_7_3_1_6() { return cVariableAssignment_7_3_1_6; }
		
		//VariablePrivate
		public RuleCall getVariableVariablePrivateParserRuleCall_7_3_1_6_0() { return cVariableVariablePrivateParserRuleCall_7_3_1_6_0; }
		
		//( ( ( '@routine:' | '@macro:' ) ( routine+=Routine )+
		//  | '@procedure:' ( procedure+=Procedure )+
		//  )*
		//| ( routine+=Routine | procedure+=Procedure )+
		//)
		public Alternatives getAlternatives_8() { return cAlternatives_8; }
		
		//( ( '@routine:' | '@macro:' ) ( routine+=Routine )+
		//         | '@procedure:' ( procedure+=Procedure )+
		//         )*
		public Alternatives getAlternatives_8_0() { return cAlternatives_8_0; }
		
		//( '@routine:' | '@macro:' ) ( routine+=Routine )+
		public Group getGroup_8_0_0() { return cGroup_8_0_0; }
		
		//( '@routine:' | '@macro:' )
		public Alternatives getAlternatives_8_0_0_0() { return cAlternatives_8_0_0_0; }
		
		//'@routine:'
		public Keyword getRoutineKeyword_8_0_0_0_0() { return cRoutineKeyword_8_0_0_0_0; }
		
		//'@macro:'
		public Keyword getMacroKeyword_8_0_0_0_1() { return cMacroKeyword_8_0_0_0_1; }
		
		//( routine+=Routine )+
		public Assignment getRoutineAssignment_8_0_0_1() { return cRoutineAssignment_8_0_0_1; }
		
		//Routine
		public RuleCall getRoutineRoutineParserRuleCall_8_0_0_1_0() { return cRoutineRoutineParserRuleCall_8_0_0_1_0; }
		
		//'@procedure:' ( procedure+=Procedure )+
		public Group getGroup_8_0_1() { return cGroup_8_0_1; }
		
		//'@procedure:'
		public Keyword getProcedureKeyword_8_0_1_0() { return cProcedureKeyword_8_0_1_0; }
		
		//( procedure+=Procedure )+
		public Assignment getProcedureAssignment_8_0_1_1() { return cProcedureAssignment_8_0_1_1; }
		
		//Procedure
		public RuleCall getProcedureProcedureParserRuleCall_8_0_1_1_0() { return cProcedureProcedureParserRuleCall_8_0_1_1_0; }
		
		//( routine+=Routine | procedure+=Procedure )+
		public Alternatives getAlternatives_8_1() { return cAlternatives_8_1; }
		
		//routine+=Routine
		public Assignment getRoutineAssignment_8_1_0() { return cRoutineAssignment_8_1_0; }
		
		//Routine
		public RuleCall getRoutineRoutineParserRuleCall_8_1_0_0() { return cRoutineRoutineParserRuleCall_8_1_0_0; }
		
		//procedure+=Procedure
		public Assignment getProcedureAssignment_8_1_1() { return cProcedureAssignment_8_1_1; }
		
		//Procedure
		public RuleCall getProcedureProcedureParserRuleCall_8_1_1_0() { return cProcedureProcedureParserRuleCall_8_1_1_0; }
		
		//( ( '@composite:' | '@machine:' )
		//    ( machine +=AnyMachineBlock
		//    | instance+=InstanceMachine
		//    )+
		//| '@model:'     ( machine +=AnyMachineBlock )*
		//| '@prototype:' ( machine +=AnyMachineBlock )*
		//| '@instance:'  ( instance+=InstanceMachine )*
		//)*
		public Alternatives getAlternatives_9() { return cAlternatives_9; }
		
		//( '@composite:' | '@machine:' )
		//           ( machine +=AnyMachineBlock
		//           | instance+=InstanceMachine
		//           )+
		public Group getGroup_9_0() { return cGroup_9_0; }
		
		//( '@composite:' | '@machine:' )
		public Alternatives getAlternatives_9_0_0() { return cAlternatives_9_0_0; }
		
		//'@composite:'
		public Keyword getCompositeKeyword_9_0_0_0() { return cCompositeKeyword_9_0_0_0; }
		
		//'@machine:'
		public Keyword getMachineKeyword_9_0_0_1() { return cMachineKeyword_9_0_0_1; }
		
		//( machine +=AnyMachineBlock
		//| instance+=InstanceMachine
		//)+
		public Alternatives getAlternatives_9_0_1() { return cAlternatives_9_0_1; }
		
		//machine +=AnyMachineBlock
		public Assignment getMachineAssignment_9_0_1_0() { return cMachineAssignment_9_0_1_0; }
		
		//AnyMachineBlock
		public RuleCall getMachineAnyMachineBlockParserRuleCall_9_0_1_0_0() { return cMachineAnyMachineBlockParserRuleCall_9_0_1_0_0; }
		
		//instance+=InstanceMachine
		public Assignment getInstanceAssignment_9_0_1_1() { return cInstanceAssignment_9_0_1_1; }
		
		//InstanceMachine
		public RuleCall getInstanceInstanceMachineParserRuleCall_9_0_1_1_0() { return cInstanceInstanceMachineParserRuleCall_9_0_1_1_0; }
		
		//'@model:'     ( machine +=AnyMachineBlock )*
		public Group getGroup_9_1() { return cGroup_9_1; }
		
		//'@model:'
		public Keyword getModelKeyword_9_1_0() { return cModelKeyword_9_1_0; }
		
		//( machine +=AnyMachineBlock )*
		public Assignment getMachineAssignment_9_1_1() { return cMachineAssignment_9_1_1; }
		
		//AnyMachineBlock
		public RuleCall getMachineAnyMachineBlockParserRuleCall_9_1_1_0() { return cMachineAnyMachineBlockParserRuleCall_9_1_1_0; }
		
		//'@prototype:' ( machine +=AnyMachineBlock )*
		public Group getGroup_9_2() { return cGroup_9_2; }
		
		//'@prototype:'
		public Keyword getPrototypeKeyword_9_2_0() { return cPrototypeKeyword_9_2_0; }
		
		//( machine +=AnyMachineBlock )*
		public Assignment getMachineAssignment_9_2_1() { return cMachineAssignment_9_2_1; }
		
		//AnyMachineBlock
		public RuleCall getMachineAnyMachineBlockParserRuleCall_9_2_1_0() { return cMachineAnyMachineBlockParserRuleCall_9_2_1_0; }
		
		//'@instance:'  ( instance+=InstanceMachine )*
		public Group getGroup_9_3() { return cGroup_9_3; }
		
		//'@instance:'
		public Keyword getInstanceKeyword_9_3_0() { return cInstanceKeyword_9_3_0; }
		
		//( instance+=InstanceMachine )*
		public Assignment getInstanceAssignment_9_3_1() { return cInstanceAssignment_9_3_1; }
		
		//InstanceMachine
		public RuleCall getInstanceInstanceMachineParserRuleCall_9_3_1_0() { return cInstanceInstanceMachineParserRuleCall_9_3_1_0; }
		
		//( '@behavior:'     ( behavior+=Behavior )+
		//| '@statemachine:' ( behavior+=Statemachine )+
		//)*
		public Alternatives getAlternatives_10() { return cAlternatives_10; }
		
		//'@behavior:'     ( behavior+=Behavior )+
		public Group getGroup_10_0() { return cGroup_10_0; }
		
		//'@behavior:'
		public Keyword getBehaviorKeyword_10_0_0() { return cBehaviorKeyword_10_0_0; }
		
		//( behavior+=Behavior )+
		public Assignment getBehaviorAssignment_10_0_1() { return cBehaviorAssignment_10_0_1; }
		
		//Behavior
		public RuleCall getBehaviorBehaviorParserRuleCall_10_0_1_0() { return cBehaviorBehaviorParserRuleCall_10_0_1_0; }
		
		//'@statemachine:' ( behavior+=Statemachine )+
		public Group getGroup_10_1() { return cGroup_10_1; }
		
		//'@statemachine:'
		public Keyword getStatemachineKeyword_10_1_0() { return cStatemachineKeyword_10_1_0; }
		
		//( behavior+=Statemachine )+
		public Assignment getBehaviorAssignment_10_1_1() { return cBehaviorAssignment_10_1_1; }
		
		//Statemachine
		public RuleCall getBehaviorStatemachineParserRuleCall_10_1_1_0() { return cBehaviorStatemachineParserRuleCall_10_1_1_0; }
		
		//main=MoeBehavior
		public Assignment getMainAssignment_11() { return cMainAssignment_11; }
		
		//MoeBehavior
		public RuleCall getMainMoeBehaviorParserRuleCall_11_0() { return cMainMoeBehaviorParserRuleCall_11_0; }
		
		////        // optional unnamed section for property full declaration / definition
		////        propertyPart=PropertyPart
		////
		////        compositePart=CompositePart
		////
		////        behaviorPart=BehaviorPart
		//        '}'
		public Keyword getRightCurlyBracketKeyword_12() { return cRightCurlyBracketKeyword_12; }
	}
	public class AnyMachineBlockElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.AnyMachineBlock");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cMachineBlockParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cStatemachineParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		
		//AnyMachineBlock returns fmlInfra::Machine
		//    : MachineBlock
		//    | Statemachine
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//MachineBlock
		//   | Statemachine
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//MachineBlock
		public RuleCall getMachineBlockParserRuleCall_0() { return cMachineBlockParserRuleCall_0; }
		
		//Statemachine
		public RuleCall getStatemachineParserRuleCall_1() { return cStatemachineParserRuleCall_1; }
	}
	public class InstanceMachineElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.InstanceMachine");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cInstanceKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
		private final Keyword cMachineKeyword_1_0 = (Keyword)cAlternatives_1.eContents().get(0);
		private final Keyword cStatemachineKeyword_1_1 = (Keyword)cAlternatives_1.eContents().get(1);
		private final Keyword cLessThanSignKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Keyword cModelKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Assignment cModelAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final CrossReference cModelMachineCrossReference_4_0 = (CrossReference)cModelAssignment_4.eContents().get(0);
		private final RuleCall cModelMachineESUfidParserRuleCall_4_0_1 = (RuleCall)cModelMachineCrossReference_4_0.eContents().get(1);
		private final Keyword cGreaterThanSignKeyword_5 = (Keyword)cGroup.eContents().get(5);
		private final Assignment cNameAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cNameESIdentifierParserRuleCall_6_0 = (RuleCall)cNameAssignment_6.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_7_0 = (RuleCall)cUnrestrictedNameAssignment_7.eContents().get(0);
		private final Group cGroup_8 = (Group)cGroup.eContents().get(8);
		private final Keyword cLeftParenthesisKeyword_8_0 = (Keyword)cGroup_8.eContents().get(0);
		private final Group cGroup_8_1 = (Group)cGroup_8.eContents().get(1);
		private final Assignment cSlotAssignment_8_1_0 = (Assignment)cGroup_8_1.eContents().get(0);
		private final RuleCall cSlotSlotParameterParserRuleCall_8_1_0_0 = (RuleCall)cSlotAssignment_8_1_0.eContents().get(0);
		private final Group cGroup_8_1_1 = (Group)cGroup_8_1.eContents().get(1);
		private final Keyword cCommaKeyword_8_1_1_0 = (Keyword)cGroup_8_1_1.eContents().get(0);
		private final Assignment cSlotAssignment_8_1_1_1 = (Assignment)cGroup_8_1_1.eContents().get(1);
		private final RuleCall cSlotSlotParameterParserRuleCall_8_1_1_1_0 = (RuleCall)cSlotAssignment_8_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_8_2 = (Keyword)cGroup_8.eContents().get(2);
		private final Alternatives cAlternatives_9 = (Alternatives)cGroup.eContents().get(9);
		private final Group cGroup_9_0 = (Group)cAlternatives_9.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_9_0_0 = (Keyword)cGroup_9_0.eContents().get(0);
		private final Group cGroup_9_0_1 = (Group)cGroup_9_0.eContents().get(1);
		private final Assignment cSlotAssignment_9_0_1_0 = (Assignment)cGroup_9_0_1.eContents().get(0);
		private final RuleCall cSlotSlotPropertyParserRuleCall_9_0_1_0_0 = (RuleCall)cSlotAssignment_9_0_1_0.eContents().get(0);
		private final Keyword cSemicolonKeyword_9_0_1_1 = (Keyword)cGroup_9_0_1.eContents().get(1);
		private final Keyword cRightCurlyBracketKeyword_9_0_2 = (Keyword)cGroup_9_0.eContents().get(2);
		private final Keyword cSemicolonKeyword_9_1 = (Keyword)cAlternatives_9.eContents().get(1);
		
		//InstanceMachine returns fmlInfra::InstanceMachine
		//    : 'instance' ( 'machine' | 'statemachine' ) ?
		//        '<' ( 'model:' )? model=[fmlInfra::Machine|ESUfid] '>'
		//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//        ( '(' ( slot+=SlotParameter ( ',' slot+=SlotParameter )* )? ')' )?
		//        ( '{'  ( slot+=SlotProperty ';' )*  '}'
		//        | ';'
		//        )
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//'instance' ( 'machine' | 'statemachine' ) ?
		//       '<' ( 'model:' )? model=[fmlInfra::Machine|ESUfid] '>'
		//       name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//       ( '(' ( slot+=SlotParameter ( ',' slot+=SlotParameter )* )? ')' )?
		//       ( '{'  ( slot+=SlotProperty ';' )*  '}'
		//       | ';'
		//       )
		public Group getGroup() { return cGroup; }
		
		//'instance'
		public Keyword getInstanceKeyword_0() { return cInstanceKeyword_0; }
		
		//( 'machine' | 'statemachine' ) ?
		public Alternatives getAlternatives_1() { return cAlternatives_1; }
		
		//'machine'
		public Keyword getMachineKeyword_1_0() { return cMachineKeyword_1_0; }
		
		//'statemachine'
		public Keyword getStatemachineKeyword_1_1() { return cStatemachineKeyword_1_1; }
		
		//'<'
		public Keyword getLessThanSignKeyword_2() { return cLessThanSignKeyword_2; }
		
		//( 'model:' )?
		public Keyword getModelKeyword_3() { return cModelKeyword_3; }
		
		//model=[fmlInfra::Machine|ESUfid]
		public Assignment getModelAssignment_4() { return cModelAssignment_4; }
		
		//[fmlInfra::Machine|ESUfid]
		public CrossReference getModelMachineCrossReference_4_0() { return cModelMachineCrossReference_4_0; }
		
		//ESUfid
		public RuleCall getModelMachineESUfidParserRuleCall_4_0_1() { return cModelMachineESUfidParserRuleCall_4_0_1; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_5() { return cGreaterThanSignKeyword_5; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_6() { return cNameAssignment_6; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_6_0() { return cNameESIdentifierParserRuleCall_6_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_7() { return cUnrestrictedNameAssignment_7; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_7_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_7_0; }
		
		//( '(' ( slot+=SlotParameter ( ',' slot+=SlotParameter )* )? ')' )?
		public Group getGroup_8() { return cGroup_8; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_8_0() { return cLeftParenthesisKeyword_8_0; }
		
		//( slot+=SlotParameter ( ',' slot+=SlotParameter )* )?
		public Group getGroup_8_1() { return cGroup_8_1; }
		
		//slot+=SlotParameter
		public Assignment getSlotAssignment_8_1_0() { return cSlotAssignment_8_1_0; }
		
		//SlotParameter
		public RuleCall getSlotSlotParameterParserRuleCall_8_1_0_0() { return cSlotSlotParameterParserRuleCall_8_1_0_0; }
		
		//( ',' slot+=SlotParameter )*
		public Group getGroup_8_1_1() { return cGroup_8_1_1; }
		
		//','
		public Keyword getCommaKeyword_8_1_1_0() { return cCommaKeyword_8_1_1_0; }
		
		//slot+=SlotParameter
		public Assignment getSlotAssignment_8_1_1_1() { return cSlotAssignment_8_1_1_1; }
		
		//SlotParameter
		public RuleCall getSlotSlotParameterParserRuleCall_8_1_1_1_0() { return cSlotSlotParameterParserRuleCall_8_1_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_8_2() { return cRightParenthesisKeyword_8_2; }
		
		//( '{'  ( slot+=SlotProperty ';' )*  '}'
		//| ';'
		//)
		public Alternatives getAlternatives_9() { return cAlternatives_9; }
		
		//'{'  ( slot+=SlotProperty ';' )*  '}'
		public Group getGroup_9_0() { return cGroup_9_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_9_0_0() { return cLeftCurlyBracketKeyword_9_0_0; }
		
		//( slot+=SlotProperty ';' )*
		public Group getGroup_9_0_1() { return cGroup_9_0_1; }
		
		//slot+=SlotProperty
		public Assignment getSlotAssignment_9_0_1_0() { return cSlotAssignment_9_0_1_0; }
		
		//SlotProperty
		public RuleCall getSlotSlotPropertyParserRuleCall_9_0_1_0_0() { return cSlotSlotPropertyParserRuleCall_9_0_1_0_0; }
		
		//';'
		public Keyword getSemicolonKeyword_9_0_1_1() { return cSemicolonKeyword_9_0_1_1; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_9_0_2() { return cRightCurlyBracketKeyword_9_0_2; }
		
		//';'
		public Keyword getSemicolonKeyword_9_1() { return cSemicolonKeyword_9_1; }
	}
	public class SlotParameterElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.SlotParameter");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cXliaPropertyAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final CrossReference cXliaPropertyPropertyDefinitionCrossReference_0_0 = (CrossReference)cXliaPropertyAssignment_0.eContents().get(0);
		private final RuleCall cXliaPropertyPropertyDefinitionESIdentifierParserRuleCall_0_0_1 = (RuleCall)cXliaPropertyPropertyDefinitionCrossReference_0_0.eContents().get(1);
		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
		private final Keyword cColonKeyword_1_0 = (Keyword)cAlternatives_1.eContents().get(0);
		private final Keyword cEqualsSignKeyword_1_1 = (Keyword)cAlternatives_1.eContents().get(1);
		private final Keyword cColonEqualsSignKeyword_1_2 = (Keyword)cAlternatives_1.eContents().get(2);
		private final Keyword cColonColonEqualsSignKeyword_1_3 = (Keyword)cAlternatives_1.eContents().get(3);
		private final Assignment cValueAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cValueExpressionParserRuleCall_2_0 = (RuleCall)cValueAssignment_2.eContents().get(0);
		
		//SlotParameter returns fmlInfra::SlotProperty
		//    : ( xliaProperty=[fmlInfra::PropertyDefinition|ESIdentifier]
		////      | umlProperty=[uml::Property|ESIdentifier]
		//      )  ( ':' | '='  | ':=' | '::=' )  value=Expression
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		// ( xliaProperty=[fmlInfra::PropertyDefinition|ESIdentifier]
		////      | umlProperty=[uml::Property|ESIdentifier]
		//      )  ( ':' | '='  | ':=' | '::=' )  value=Expression
		public Group getGroup() { return cGroup; }
		
		// ( xliaProperty=[fmlInfra::PropertyDefinition|ESIdentifier]
		////      | umlProperty=[uml::Property|ESIdentifier]
		//      )
		public Assignment getXliaPropertyAssignment_0() { return cXliaPropertyAssignment_0; }
		
		//[fmlInfra::PropertyDefinition|ESIdentifier]
		public CrossReference getXliaPropertyPropertyDefinitionCrossReference_0_0() { return cXliaPropertyPropertyDefinitionCrossReference_0_0; }
		
		//ESIdentifier
		public RuleCall getXliaPropertyPropertyDefinitionESIdentifierParserRuleCall_0_0_1() { return cXliaPropertyPropertyDefinitionESIdentifierParserRuleCall_0_0_1; }
		
		//( ':' | '='  | ':=' | '::=' )
		public Alternatives getAlternatives_1() { return cAlternatives_1; }
		
		//':'
		public Keyword getColonKeyword_1_0() { return cColonKeyword_1_0; }
		
		//'='
		public Keyword getEqualsSignKeyword_1_1() { return cEqualsSignKeyword_1_1; }
		
		//':='
		public Keyword getColonEqualsSignKeyword_1_2() { return cColonEqualsSignKeyword_1_2; }
		
		//'::='
		public Keyword getColonColonEqualsSignKeyword_1_3() { return cColonColonEqualsSignKeyword_1_3; }
		
		//value=Expression
		public Assignment getValueAssignment_2() { return cValueAssignment_2; }
		
		//Expression
		public RuleCall getValueExpressionParserRuleCall_2_0() { return cValueExpressionParserRuleCall_2_0; }
	}
	public class SlotPropertyElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.SlotProperty");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cXliaPropertyAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final CrossReference cXliaPropertyPropertyDefinitionCrossReference_0_0 = (CrossReference)cXliaPropertyAssignment_0.eContents().get(0);
		private final RuleCall cXliaPropertyPropertyDefinitionESIdentifierParserRuleCall_0_0_1 = (RuleCall)cXliaPropertyPropertyDefinitionCrossReference_0_0.eContents().get(1);
		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
		private final Keyword cEqualsSignKeyword_1_0 = (Keyword)cAlternatives_1.eContents().get(0);
		private final Keyword cColonKeyword_1_1 = (Keyword)cAlternatives_1.eContents().get(1);
		private final Keyword cColonEqualsSignKeyword_1_2 = (Keyword)cAlternatives_1.eContents().get(2);
		private final Keyword cColonColonEqualsSignKeyword_1_3 = (Keyword)cAlternatives_1.eContents().get(3);
		private final Assignment cValueAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cValueExpressionParserRuleCall_2_0 = (RuleCall)cValueAssignment_2.eContents().get(0);
		
		//SlotProperty returns fmlInfra::SlotProperty
		//    : ( xliaProperty=[fmlInfra::PropertyDefinition|ESIdentifier]
		////      | umlProperty=[uml::Property|ESIdentifier]
		//      ) ( '='  | ':' | ':=' | '::=' )  value=Expression
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		// ( xliaProperty=[fmlInfra::PropertyDefinition|ESIdentifier]
		////      | umlProperty=[uml::Property|ESIdentifier]
		//      ) ( '='  | ':' | ':=' | '::=' )  value=Expression
		public Group getGroup() { return cGroup; }
		
		// ( xliaProperty=[fmlInfra::PropertyDefinition|ESIdentifier]
		////      | umlProperty=[uml::Property|ESIdentifier]
		//      )
		public Assignment getXliaPropertyAssignment_0() { return cXliaPropertyAssignment_0; }
		
		//[fmlInfra::PropertyDefinition|ESIdentifier]
		public CrossReference getXliaPropertyPropertyDefinitionCrossReference_0_0() { return cXliaPropertyPropertyDefinitionCrossReference_0_0; }
		
		//ESIdentifier
		public RuleCall getXliaPropertyPropertyDefinitionESIdentifierParserRuleCall_0_0_1() { return cXliaPropertyPropertyDefinitionESIdentifierParserRuleCall_0_0_1; }
		
		//( '='  | ':' | ':=' | '::=' )
		public Alternatives getAlternatives_1() { return cAlternatives_1; }
		
		//'='
		public Keyword getEqualsSignKeyword_1_0() { return cEqualsSignKeyword_1_0; }
		
		//':'
		public Keyword getColonKeyword_1_1() { return cColonKeyword_1_1; }
		
		//':='
		public Keyword getColonEqualsSignKeyword_1_2() { return cColonEqualsSignKeyword_1_2; }
		
		//'::='
		public Keyword getColonColonEqualsSignKeyword_1_3() { return cColonColonEqualsSignKeyword_1_3; }
		
		//value=Expression
		public Assignment getValueAssignment_2() { return cValueAssignment_2; }
		
		//Expression
		public RuleCall getValueExpressionParserRuleCall_2_0() { return cValueExpressionParserRuleCall_2_0; }
	}
	public class MachineBlockElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.MachineBlock");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final UnorderedGroup cUnorderedGroup_0 = (UnorderedGroup)cGroup.eContents().get(0);
		private final Assignment cVisibilityAssignment_0_0 = (Assignment)cUnorderedGroup_0.eContents().get(0);
		private final RuleCall cVisibilityVisibilityKindEnumRuleCall_0_0_0 = (RuleCall)cVisibilityAssignment_0_0.eContents().get(0);
		private final Assignment cTimedAssignment_0_1 = (Assignment)cUnorderedGroup_0.eContents().get(1);
		private final Keyword cTimedTimedKeyword_0_1_0 = (Keyword)cTimedAssignment_0_1.eContents().get(0);
		private final Assignment cDense_timedAssignment_0_2 = (Assignment)cUnorderedGroup_0.eContents().get(2);
		private final Keyword cDense_timedTimedDenseKeyword_0_2_0 = (Keyword)cDense_timedAssignment_0_2.eContents().get(0);
		private final Assignment cDiscrete_timedAssignment_0_3 = (Assignment)cUnorderedGroup_0.eContents().get(3);
		private final Keyword cDiscrete_timedTimedDiscreteKeyword_0_3_0 = (Keyword)cDiscrete_timedAssignment_0_3.eContents().get(0);
		private final Assignment cInput_enabledAssignment_0_4 = (Assignment)cUnorderedGroup_0.eContents().get(4);
		private final Keyword cInput_enabledInput_enabledKeyword_0_4_0 = (Keyword)cInput_enabledAssignment_0_4.eContents().get(0);
		private final Assignment cLifelineAssignment_0_5 = (Assignment)cUnorderedGroup_0.eContents().get(5);
		private final Keyword cLifelineLifelineKeyword_0_5_0 = (Keyword)cLifelineAssignment_0_5.eContents().get(0);
		private final Assignment cDesignAssignment_0_6 = (Assignment)cUnorderedGroup_0.eContents().get(6);
		private final RuleCall cDesignDesignKindEnumRuleCall_0_6_0 = (RuleCall)cDesignAssignment_0_6.eContents().get(0);
		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
		private final Keyword cMachineKeyword_1_0 = (Keyword)cAlternatives_1.eContents().get(0);
		private final Keyword cExecutableKeyword_1_1 = (Keyword)cAlternatives_1.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLessThanSignKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final Group cGroup_2_1 = (Group)cGroup_2.eContents().get(1);
		private final Keyword cMocKeyword_2_1_0 = (Keyword)cGroup_2_1.eContents().get(0);
		private final RuleCall cModelOfComputationKingParserRuleCall_2_1_1 = (RuleCall)cGroup_2_1.eContents().get(1);
		private final Group cGroup_2_2 = (Group)cGroup_2.eContents().get(2);
		private final Keyword cInstanceKeyword_2_2_0 = (Keyword)cGroup_2_2.eContents().get(0);
		private final Keyword cLeftSquareBracketKeyword_2_2_1 = (Keyword)cGroup_2_2.eContents().get(1);
		private final Alternatives cAlternatives_2_2_2 = (Alternatives)cGroup_2_2.eContents().get(2);
		private final Keyword cPlusSignKeyword_2_2_2_0 = (Keyword)cAlternatives_2_2_2.eContents().get(0);
		private final Keyword cAsteriskKeyword_2_2_2_1 = (Keyword)cAlternatives_2_2_2.eContents().get(1);
		private final Group cGroup_2_2_2_2 = (Group)cAlternatives_2_2_2.eContents().get(2);
		private final Keyword cInitKeyword_2_2_2_2_0 = (Keyword)cGroup_2_2_2_2.eContents().get(0);
		private final RuleCall cEIntegerParserRuleCall_2_2_2_2_1 = (RuleCall)cGroup_2_2_2_2.eContents().get(1);
		private final Keyword cMaxKeyword_2_2_2_2_2 = (Keyword)cGroup_2_2_2_2.eContents().get(2);
		private final RuleCall cEIntegerParserRuleCall_2_2_2_2_3 = (RuleCall)cGroup_2_2_2_2.eContents().get(3);
		private final Keyword cRightSquareBracketKeyword_2_2_3 = (Keyword)cGroup_2_2.eContents().get(3);
		private final Keyword cGreaterThanSignKeyword_2_3 = (Keyword)cGroup_2.eContents().get(3);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_5 = (Keyword)cGroup.eContents().get(5);
		private final Alternatives cAlternatives_6 = (Alternatives)cGroup.eContents().get(6);
		private final Assignment cPortAssignment_6_0 = (Assignment)cAlternatives_6.eContents().get(0);
		private final RuleCall cPortPortParserRuleCall_6_0_0 = (RuleCall)cPortAssignment_6_0.eContents().get(0);
		private final Assignment cSignalAssignment_6_1 = (Assignment)cAlternatives_6.eContents().get(1);
		private final RuleCall cSignalSignalParserRuleCall_6_1_0 = (RuleCall)cSignalAssignment_6_1.eContents().get(0);
		private final Assignment cBufferAssignment_6_2 = (Assignment)cAlternatives_6.eContents().get(2);
		private final RuleCall cBufferBufferParserRuleCall_6_2_0 = (RuleCall)cBufferAssignment_6_2.eContents().get(0);
		private final Assignment cChannelAssignment_6_3 = (Assignment)cAlternatives_6.eContents().get(3);
		private final RuleCall cChannelChannelParserRuleCall_6_3_0 = (RuleCall)cChannelAssignment_6_3.eContents().get(0);
		private final Assignment cTypedefAssignment_6_4 = (Assignment)cAlternatives_6.eContents().get(4);
		private final RuleCall cTypedefTypeDefinitionParserRuleCall_6_4_0 = (RuleCall)cTypedefAssignment_6_4.eContents().get(0);
		private final Assignment cFunctionAssignment_6_5 = (Assignment)cAlternatives_6.eContents().get(5);
		private final RuleCall cFunctionFunctionParserRuleCall_6_5_0 = (RuleCall)cFunctionAssignment_6_5.eContents().get(0);
		private final Assignment cVariableAssignment_6_6 = (Assignment)cAlternatives_6.eContents().get(6);
		private final RuleCall cVariableVariableParserRuleCall_6_6_0 = (RuleCall)cVariableAssignment_6_6.eContents().get(0);
		private final Alternatives cAlternatives_7 = (Alternatives)cGroup.eContents().get(7);
		private final Group cGroup_7_0 = (Group)cAlternatives_7.eContents().get(0);
		private final Keyword cPropertyKeyword_7_0_0 = (Keyword)cGroup_7_0.eContents().get(0);
		private final Alternatives cAlternatives_7_0_1 = (Alternatives)cGroup_7_0.eContents().get(1);
		private final Assignment cPortAssignment_7_0_1_0 = (Assignment)cAlternatives_7_0_1.eContents().get(0);
		private final RuleCall cPortPortParserRuleCall_7_0_1_0_0 = (RuleCall)cPortAssignment_7_0_1_0.eContents().get(0);
		private final Assignment cSignalAssignment_7_0_1_1 = (Assignment)cAlternatives_7_0_1.eContents().get(1);
		private final RuleCall cSignalSignalParserRuleCall_7_0_1_1_0 = (RuleCall)cSignalAssignment_7_0_1_1.eContents().get(0);
		private final Assignment cBufferAssignment_7_0_1_2 = (Assignment)cAlternatives_7_0_1.eContents().get(2);
		private final RuleCall cBufferBufferParserRuleCall_7_0_1_2_0 = (RuleCall)cBufferAssignment_7_0_1_2.eContents().get(0);
		private final Assignment cChannelAssignment_7_0_1_3 = (Assignment)cAlternatives_7_0_1.eContents().get(3);
		private final RuleCall cChannelChannelParserRuleCall_7_0_1_3_0 = (RuleCall)cChannelAssignment_7_0_1_3.eContents().get(0);
		private final Assignment cTypedefAssignment_7_0_1_4 = (Assignment)cAlternatives_7_0_1.eContents().get(4);
		private final RuleCall cTypedefTypeDefinitionParserRuleCall_7_0_1_4_0 = (RuleCall)cTypedefAssignment_7_0_1_4.eContents().get(0);
		private final Assignment cFunctionAssignment_7_0_1_5 = (Assignment)cAlternatives_7_0_1.eContents().get(5);
		private final RuleCall cFunctionFunctionParserRuleCall_7_0_1_5_0 = (RuleCall)cFunctionAssignment_7_0_1_5.eContents().get(0);
		private final Assignment cVariableAssignment_7_0_1_6 = (Assignment)cAlternatives_7_0_1.eContents().get(6);
		private final RuleCall cVariableVariableParserRuleCall_7_0_1_6_0 = (RuleCall)cVariableAssignment_7_0_1_6.eContents().get(0);
		private final Group cGroup_7_1 = (Group)cAlternatives_7.eContents().get(1);
		private final Keyword cPublicKeyword_7_1_0 = (Keyword)cGroup_7_1.eContents().get(0);
		private final Alternatives cAlternatives_7_1_1 = (Alternatives)cGroup_7_1.eContents().get(1);
		private final Assignment cPortAssignment_7_1_1_0 = (Assignment)cAlternatives_7_1_1.eContents().get(0);
		private final RuleCall cPortPortPublicParserRuleCall_7_1_1_0_0 = (RuleCall)cPortAssignment_7_1_1_0.eContents().get(0);
		private final Assignment cSignalAssignment_7_1_1_1 = (Assignment)cAlternatives_7_1_1.eContents().get(1);
		private final RuleCall cSignalSignalPublicParserRuleCall_7_1_1_1_0 = (RuleCall)cSignalAssignment_7_1_1_1.eContents().get(0);
		private final Assignment cBufferAssignment_7_1_1_2 = (Assignment)cAlternatives_7_1_1.eContents().get(2);
		private final RuleCall cBufferBufferPublicParserRuleCall_7_1_1_2_0 = (RuleCall)cBufferAssignment_7_1_1_2.eContents().get(0);
		private final Assignment cChannelAssignment_7_1_1_3 = (Assignment)cAlternatives_7_1_1.eContents().get(3);
		private final RuleCall cChannelChannelPublicParserRuleCall_7_1_1_3_0 = (RuleCall)cChannelAssignment_7_1_1_3.eContents().get(0);
		private final Assignment cTypedefAssignment_7_1_1_4 = (Assignment)cAlternatives_7_1_1.eContents().get(4);
		private final RuleCall cTypedefTypeDefinitionParserRuleCall_7_1_1_4_0 = (RuleCall)cTypedefAssignment_7_1_1_4.eContents().get(0);
		private final Assignment cFunctionAssignment_7_1_1_5 = (Assignment)cAlternatives_7_1_1.eContents().get(5);
		private final RuleCall cFunctionFunctionPublicParserRuleCall_7_1_1_5_0 = (RuleCall)cFunctionAssignment_7_1_1_5.eContents().get(0);
		private final Assignment cVariableAssignment_7_1_1_6 = (Assignment)cAlternatives_7_1_1.eContents().get(6);
		private final RuleCall cVariableVariablePublicParserRuleCall_7_1_1_6_0 = (RuleCall)cVariableAssignment_7_1_1_6.eContents().get(0);
		private final Group cGroup_7_2 = (Group)cAlternatives_7.eContents().get(2);
		private final Keyword cProtectedKeyword_7_2_0 = (Keyword)cGroup_7_2.eContents().get(0);
		private final Alternatives cAlternatives_7_2_1 = (Alternatives)cGroup_7_2.eContents().get(1);
		private final Assignment cPortAssignment_7_2_1_0 = (Assignment)cAlternatives_7_2_1.eContents().get(0);
		private final RuleCall cPortPortProtectedParserRuleCall_7_2_1_0_0 = (RuleCall)cPortAssignment_7_2_1_0.eContents().get(0);
		private final Assignment cSignalAssignment_7_2_1_1 = (Assignment)cAlternatives_7_2_1.eContents().get(1);
		private final RuleCall cSignalSignalProtectedParserRuleCall_7_2_1_1_0 = (RuleCall)cSignalAssignment_7_2_1_1.eContents().get(0);
		private final Assignment cBufferAssignment_7_2_1_2 = (Assignment)cAlternatives_7_2_1.eContents().get(2);
		private final RuleCall cBufferBufferProtectedParserRuleCall_7_2_1_2_0 = (RuleCall)cBufferAssignment_7_2_1_2.eContents().get(0);
		private final Assignment cChannelAssignment_7_2_1_3 = (Assignment)cAlternatives_7_2_1.eContents().get(3);
		private final RuleCall cChannelChannelProtectedParserRuleCall_7_2_1_3_0 = (RuleCall)cChannelAssignment_7_2_1_3.eContents().get(0);
		private final Assignment cTypedefAssignment_7_2_1_4 = (Assignment)cAlternatives_7_2_1.eContents().get(4);
		private final RuleCall cTypedefTypeDefinitionParserRuleCall_7_2_1_4_0 = (RuleCall)cTypedefAssignment_7_2_1_4.eContents().get(0);
		private final Assignment cFunctionAssignment_7_2_1_5 = (Assignment)cAlternatives_7_2_1.eContents().get(5);
		private final RuleCall cFunctionFunctionProtectedParserRuleCall_7_2_1_5_0 = (RuleCall)cFunctionAssignment_7_2_1_5.eContents().get(0);
		private final Assignment cVariableAssignment_7_2_1_6 = (Assignment)cAlternatives_7_2_1.eContents().get(6);
		private final RuleCall cVariableVariableProtectedParserRuleCall_7_2_1_6_0 = (RuleCall)cVariableAssignment_7_2_1_6.eContents().get(0);
		private final Group cGroup_7_3 = (Group)cAlternatives_7.eContents().get(3);
		private final Keyword cPrivateKeyword_7_3_0 = (Keyword)cGroup_7_3.eContents().get(0);
		private final Alternatives cAlternatives_7_3_1 = (Alternatives)cGroup_7_3.eContents().get(1);
		private final Assignment cPortAssignment_7_3_1_0 = (Assignment)cAlternatives_7_3_1.eContents().get(0);
		private final RuleCall cPortPortPrivateParserRuleCall_7_3_1_0_0 = (RuleCall)cPortAssignment_7_3_1_0.eContents().get(0);
		private final Assignment cSignalAssignment_7_3_1_1 = (Assignment)cAlternatives_7_3_1.eContents().get(1);
		private final RuleCall cSignalSignalPrivateParserRuleCall_7_3_1_1_0 = (RuleCall)cSignalAssignment_7_3_1_1.eContents().get(0);
		private final Assignment cBufferAssignment_7_3_1_2 = (Assignment)cAlternatives_7_3_1.eContents().get(2);
		private final RuleCall cBufferBufferPrivateParserRuleCall_7_3_1_2_0 = (RuleCall)cBufferAssignment_7_3_1_2.eContents().get(0);
		private final Assignment cChannelAssignment_7_3_1_3 = (Assignment)cAlternatives_7_3_1.eContents().get(3);
		private final RuleCall cChannelChannelPrivateParserRuleCall_7_3_1_3_0 = (RuleCall)cChannelAssignment_7_3_1_3.eContents().get(0);
		private final Assignment cTypedefAssignment_7_3_1_4 = (Assignment)cAlternatives_7_3_1.eContents().get(4);
		private final RuleCall cTypedefTypeDefinitionParserRuleCall_7_3_1_4_0 = (RuleCall)cTypedefAssignment_7_3_1_4.eContents().get(0);
		private final Assignment cFunctionAssignment_7_3_1_5 = (Assignment)cAlternatives_7_3_1.eContents().get(5);
		private final RuleCall cFunctionFunctionPrivateParserRuleCall_7_3_1_5_0 = (RuleCall)cFunctionAssignment_7_3_1_5.eContents().get(0);
		private final Assignment cVariableAssignment_7_3_1_6 = (Assignment)cAlternatives_7_3_1.eContents().get(6);
		private final RuleCall cVariableVariablePrivateParserRuleCall_7_3_1_6_0 = (RuleCall)cVariableAssignment_7_3_1_6.eContents().get(0);
		private final Alternatives cAlternatives_8 = (Alternatives)cGroup.eContents().get(8);
		private final Alternatives cAlternatives_8_0 = (Alternatives)cAlternatives_8.eContents().get(0);
		private final Group cGroup_8_0_0 = (Group)cAlternatives_8_0.eContents().get(0);
		private final Alternatives cAlternatives_8_0_0_0 = (Alternatives)cGroup_8_0_0.eContents().get(0);
		private final Keyword cRoutineKeyword_8_0_0_0_0 = (Keyword)cAlternatives_8_0_0_0.eContents().get(0);
		private final Keyword cMacroKeyword_8_0_0_0_1 = (Keyword)cAlternatives_8_0_0_0.eContents().get(1);
		private final Assignment cRoutineAssignment_8_0_0_1 = (Assignment)cGroup_8_0_0.eContents().get(1);
		private final RuleCall cRoutineRoutineParserRuleCall_8_0_0_1_0 = (RuleCall)cRoutineAssignment_8_0_0_1.eContents().get(0);
		private final Group cGroup_8_0_1 = (Group)cAlternatives_8_0.eContents().get(1);
		private final Keyword cProcedureKeyword_8_0_1_0 = (Keyword)cGroup_8_0_1.eContents().get(0);
		private final Assignment cProcedureAssignment_8_0_1_1 = (Assignment)cGroup_8_0_1.eContents().get(1);
		private final RuleCall cProcedureProcedureParserRuleCall_8_0_1_1_0 = (RuleCall)cProcedureAssignment_8_0_1_1.eContents().get(0);
		private final Alternatives cAlternatives_8_1 = (Alternatives)cAlternatives_8.eContents().get(1);
		private final Assignment cRoutineAssignment_8_1_0 = (Assignment)cAlternatives_8_1.eContents().get(0);
		private final RuleCall cRoutineRoutineParserRuleCall_8_1_0_0 = (RuleCall)cRoutineAssignment_8_1_0.eContents().get(0);
		private final Assignment cProcedureAssignment_8_1_1 = (Assignment)cAlternatives_8_1.eContents().get(1);
		private final RuleCall cProcedureProcedureParserRuleCall_8_1_1_0 = (RuleCall)cProcedureAssignment_8_1_1.eContents().get(0);
		private final Alternatives cAlternatives_9 = (Alternatives)cGroup.eContents().get(9);
		private final Group cGroup_9_0 = (Group)cAlternatives_9.eContents().get(0);
		private final Alternatives cAlternatives_9_0_0 = (Alternatives)cGroup_9_0.eContents().get(0);
		private final Keyword cCompositeKeyword_9_0_0_0 = (Keyword)cAlternatives_9_0_0.eContents().get(0);
		private final Keyword cMachineKeyword_9_0_0_1 = (Keyword)cAlternatives_9_0_0.eContents().get(1);
		private final Alternatives cAlternatives_9_0_1 = (Alternatives)cGroup_9_0.eContents().get(1);
		private final Assignment cMachineAssignment_9_0_1_0 = (Assignment)cAlternatives_9_0_1.eContents().get(0);
		private final RuleCall cMachineAnyMachineBlockParserRuleCall_9_0_1_0_0 = (RuleCall)cMachineAssignment_9_0_1_0.eContents().get(0);
		private final Assignment cInstanceAssignment_9_0_1_1 = (Assignment)cAlternatives_9_0_1.eContents().get(1);
		private final RuleCall cInstanceInstanceMachineParserRuleCall_9_0_1_1_0 = (RuleCall)cInstanceAssignment_9_0_1_1.eContents().get(0);
		private final Group cGroup_9_1 = (Group)cAlternatives_9.eContents().get(1);
		private final Keyword cModelKeyword_9_1_0 = (Keyword)cGroup_9_1.eContents().get(0);
		private final Assignment cMachineAssignment_9_1_1 = (Assignment)cGroup_9_1.eContents().get(1);
		private final RuleCall cMachineAnyMachineBlockParserRuleCall_9_1_1_0 = (RuleCall)cMachineAssignment_9_1_1.eContents().get(0);
		private final Group cGroup_9_2 = (Group)cAlternatives_9.eContents().get(2);
		private final Keyword cPrototypeKeyword_9_2_0 = (Keyword)cGroup_9_2.eContents().get(0);
		private final Assignment cMachineAssignment_9_2_1 = (Assignment)cGroup_9_2.eContents().get(1);
		private final RuleCall cMachineAnyMachineBlockParserRuleCall_9_2_1_0 = (RuleCall)cMachineAssignment_9_2_1.eContents().get(0);
		private final Group cGroup_9_3 = (Group)cAlternatives_9.eContents().get(3);
		private final Keyword cInstanceKeyword_9_3_0 = (Keyword)cGroup_9_3.eContents().get(0);
		private final Assignment cInstanceAssignment_9_3_1 = (Assignment)cGroup_9_3.eContents().get(1);
		private final RuleCall cInstanceInstanceMachineParserRuleCall_9_3_1_0 = (RuleCall)cInstanceAssignment_9_3_1.eContents().get(0);
		private final Alternatives cAlternatives_10 = (Alternatives)cGroup.eContents().get(10);
		private final Group cGroup_10_0 = (Group)cAlternatives_10.eContents().get(0);
		private final Keyword cBehaviorKeyword_10_0_0 = (Keyword)cGroup_10_0.eContents().get(0);
		private final Assignment cBehaviorAssignment_10_0_1 = (Assignment)cGroup_10_0.eContents().get(1);
		private final RuleCall cBehaviorBehaviorParserRuleCall_10_0_1_0 = (RuleCall)cBehaviorAssignment_10_0_1.eContents().get(0);
		private final Group cGroup_10_1 = (Group)cAlternatives_10.eContents().get(1);
		private final Keyword cStatemachineKeyword_10_1_0 = (Keyword)cGroup_10_1.eContents().get(0);
		private final Assignment cBehaviorAssignment_10_1_1 = (Assignment)cGroup_10_1.eContents().get(1);
		private final RuleCall cBehaviorStatemachineParserRuleCall_10_1_1_0 = (RuleCall)cBehaviorAssignment_10_1_1.eContents().get(0);
		private final Assignment cMainAssignment_11 = (Assignment)cGroup.eContents().get(11);
		private final RuleCall cMainMoeBehaviorParserRuleCall_11_0 = (RuleCall)cMainAssignment_11.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_12 = (Keyword)cGroup.eContents().get(12);
		
		//MachineBlock returns fmlInfra::Machine
		//    : ( ( visibility=VisibilityKind )?
		//        & ( timed?='timed' )?
		//        & ( dense_timed?='timed#dense' )?
		//        & ( discrete_timed?='timed#discrete' )?
		//        & ( input_enabled ?= 'input_enabled' )?
		//        & ( lifeline?='lifeline' )?
		//        & ( design=DesignKind )?
		//        )
		//        ( 'machine' | 'executable' )
		//        ( '<' ( ( 'moc:' )?  ModelOfComputationKing )?
		//            ( 'instance:' '[' ( '+' | '*'
		//                | ( 'init:' EInteger 'max:' EInteger ) ) ']' )? '>'
		//        )?
		//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//        '{'
		//        ( // optional unnamed section for property full declaration / definition
		//            ( port+=Port
		//            | signal+=Signal
		//            | buffer+=Buffer
		//            | channel+=Channel
		//            | typedef+=TypeDefinition
		//            | function+=Function
		//            | variable+=Variable
		//            )*
		//        )
		//        ( '@property:'
		//            ( port+=Port
		//            | signal+=Signal
		//            | buffer+=Buffer
		//            | channel+=Channel
		//            | typedef+=TypeDefinition
		//            | function+=Function
		//            | variable+=Variable
		//            )*
		//        | '@public:'
		//            ( port+=PortPublic
		//            | signal+=SignalPublic
		//            | buffer+=BufferPublic
		//            | channel+=ChannelPublic
		//            | typedef+=TypeDefinition
		//            | function+=FunctionPublic
		//            | variable+=VariablePublic
		//            )*
		//        | '@protected:'
		//            ( port+=PortProtected
		//            | signal+=SignalProtected
		//            | buffer+=BufferProtected
		//            | channel+=ChannelProtected
		//            | typedef+=TypeDefinition
		//            | function+=FunctionProtected
		//            | variable+=VariableProtected
		//            )*
		//        | '@private:'
		//            ( port+=PortPrivate
		//            | signal+=SignalPrivate
		//            | buffer+=BufferPrivate
		//            | channel+=ChannelPrivate
		//            | typedef+=TypeDefinition
		//            | function+=FunctionPrivate
		//            | variable+=VariablePrivate
		//            )*
		//        )*
		//        ( ( ( '@routine:' | '@macro:' ) ( routine+=Routine )+
		//          | '@procedure:' ( procedure+=Procedure )+
		//          )*
		//        | ( routine+=Routine | procedure+=Procedure )+
		//        )
		//        ( ( '@composite:' | '@machine:' )
		//            ( machine +=AnyMachineBlock
		//            | instance+=InstanceMachine
		//            )+
		//        | '@model:'     ( machine +=AnyMachineBlock )*
		//        | '@prototype:' ( machine +=AnyMachineBlock )*
		//        | '@instance:'  ( instance+=InstanceMachine )*
		//        )*
		//        ( '@behavior:'     ( behavior+=Behavior )+
		//        | '@statemachine:' ( behavior+=Statemachine )+
		//        )*
		//        main=MoeBehavior
		////        // optional unnamed section for property full declaration / definition
		////        propertyPart=PropertyPart
		////
		////        compositePart=CompositePart
		////
		////        behaviorPart=BehaviorPart
		//        '}'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		// ( ( visibility=VisibilityKind )?
		//        & ( timed?='timed' )?
		//        & ( dense_timed?='timed#dense' )?
		//        & ( discrete_timed?='timed#discrete' )?
		//        & ( input_enabled ?= 'input_enabled' )?
		//        & ( lifeline?='lifeline' )?
		//        & ( design=DesignKind )?
		//        )
		//        ( 'machine' | 'executable' )
		//        ( '<' ( ( 'moc:' )?  ModelOfComputationKing )?
		//            ( 'instance:' '[' ( '+' | '*'
		//                | ( 'init:' EInteger 'max:' EInteger ) ) ']' )? '>'
		//        )?
		//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//        '{'
		//        ( // optional unnamed section for property full declaration / definition
		//            ( port+=Port
		//            | signal+=Signal
		//            | buffer+=Buffer
		//            | channel+=Channel
		//            | typedef+=TypeDefinition
		//            | function+=Function
		//            | variable+=Variable
		//            )*
		//        )
		//        ( '@property:'
		//            ( port+=Port
		//            | signal+=Signal
		//            | buffer+=Buffer
		//            | channel+=Channel
		//            | typedef+=TypeDefinition
		//            | function+=Function
		//            | variable+=Variable
		//            )*
		//        | '@public:'
		//            ( port+=PortPublic
		//            | signal+=SignalPublic
		//            | buffer+=BufferPublic
		//            | channel+=ChannelPublic
		//            | typedef+=TypeDefinition
		//            | function+=FunctionPublic
		//            | variable+=VariablePublic
		//            )*
		//        | '@protected:'
		//            ( port+=PortProtected
		//            | signal+=SignalProtected
		//            | buffer+=BufferProtected
		//            | channel+=ChannelProtected
		//            | typedef+=TypeDefinition
		//            | function+=FunctionProtected
		//            | variable+=VariableProtected
		//            )*
		//        | '@private:'
		//            ( port+=PortPrivate
		//            | signal+=SignalPrivate
		//            | buffer+=BufferPrivate
		//            | channel+=ChannelPrivate
		//            | typedef+=TypeDefinition
		//            | function+=FunctionPrivate
		//            | variable+=VariablePrivate
		//            )*
		//        )*
		//        ( ( ( '@routine:' | '@macro:' ) ( routine+=Routine )+
		//          | '@procedure:' ( procedure+=Procedure )+
		//          )*
		//        | ( routine+=Routine | procedure+=Procedure )+
		//        )
		//        ( ( '@composite:' | '@machine:' )
		//            ( machine +=AnyMachineBlock
		//            | instance+=InstanceMachine
		//            )+
		//        | '@model:'     ( machine +=AnyMachineBlock )*
		//        | '@prototype:' ( machine +=AnyMachineBlock )*
		//        | '@instance:'  ( instance+=InstanceMachine )*
		//        )*
		//        ( '@behavior:'     ( behavior+=Behavior )+
		//        | '@statemachine:' ( behavior+=Statemachine )+
		//        )*
		//        main=MoeBehavior
		////        // optional unnamed section for property full declaration / definition
		////        propertyPart=PropertyPart
		////
		////        compositePart=CompositePart
		////
		////        behaviorPart=BehaviorPart
		//        '}'
		public Group getGroup() { return cGroup; }
		
		//( ( visibility=VisibilityKind )?
		//       & ( timed?='timed' )?
		//       & ( dense_timed?='timed#dense' )?
		//       & ( discrete_timed?='timed#discrete' )?
		//       & ( input_enabled ?= 'input_enabled' )?
		//       & ( lifeline?='lifeline' )?
		//       & ( design=DesignKind )?
		//       )
		public UnorderedGroup getUnorderedGroup_0() { return cUnorderedGroup_0; }
		
		//( visibility=VisibilityKind )?
		public Assignment getVisibilityAssignment_0_0() { return cVisibilityAssignment_0_0; }
		
		//VisibilityKind
		public RuleCall getVisibilityVisibilityKindEnumRuleCall_0_0_0() { return cVisibilityVisibilityKindEnumRuleCall_0_0_0; }
		
		//( timed?='timed' )?
		public Assignment getTimedAssignment_0_1() { return cTimedAssignment_0_1; }
		
		//'timed'
		public Keyword getTimedTimedKeyword_0_1_0() { return cTimedTimedKeyword_0_1_0; }
		
		//( dense_timed?='timed#dense' )?
		public Assignment getDense_timedAssignment_0_2() { return cDense_timedAssignment_0_2; }
		
		//'timed#dense'
		public Keyword getDense_timedTimedDenseKeyword_0_2_0() { return cDense_timedTimedDenseKeyword_0_2_0; }
		
		//( discrete_timed?='timed#discrete' )?
		public Assignment getDiscrete_timedAssignment_0_3() { return cDiscrete_timedAssignment_0_3; }
		
		//'timed#discrete'
		public Keyword getDiscrete_timedTimedDiscreteKeyword_0_3_0() { return cDiscrete_timedTimedDiscreteKeyword_0_3_0; }
		
		//( input_enabled ?= 'input_enabled' )?
		public Assignment getInput_enabledAssignment_0_4() { return cInput_enabledAssignment_0_4; }
		
		//'input_enabled'
		public Keyword getInput_enabledInput_enabledKeyword_0_4_0() { return cInput_enabledInput_enabledKeyword_0_4_0; }
		
		//( lifeline?='lifeline' )?
		public Assignment getLifelineAssignment_0_5() { return cLifelineAssignment_0_5; }
		
		//'lifeline'
		public Keyword getLifelineLifelineKeyword_0_5_0() { return cLifelineLifelineKeyword_0_5_0; }
		
		//( design=DesignKind )?
		public Assignment getDesignAssignment_0_6() { return cDesignAssignment_0_6; }
		
		//DesignKind
		public RuleCall getDesignDesignKindEnumRuleCall_0_6_0() { return cDesignDesignKindEnumRuleCall_0_6_0; }
		
		//( 'machine' | 'executable' )
		public Alternatives getAlternatives_1() { return cAlternatives_1; }
		
		//'machine'
		public Keyword getMachineKeyword_1_0() { return cMachineKeyword_1_0; }
		
		//'executable'
		public Keyword getExecutableKeyword_1_1() { return cExecutableKeyword_1_1; }
		
		//( '<' ( ( 'moc:' )?  ModelOfComputationKing )?
		//    ( 'instance:' '[' ( '+' | '*'
		//        | ( 'init:' EInteger 'max:' EInteger ) ) ']' )? '>'
		//)?
		public Group getGroup_2() { return cGroup_2; }
		
		//'<'
		public Keyword getLessThanSignKeyword_2_0() { return cLessThanSignKeyword_2_0; }
		
		//( ( 'moc:' )?  ModelOfComputationKing )?
		public Group getGroup_2_1() { return cGroup_2_1; }
		
		//( 'moc:' )?
		public Keyword getMocKeyword_2_1_0() { return cMocKeyword_2_1_0; }
		
		//ModelOfComputationKing
		public RuleCall getModelOfComputationKingParserRuleCall_2_1_1() { return cModelOfComputationKingParserRuleCall_2_1_1; }
		
		//( 'instance:' '[' ( '+' | '*'
		//    | ( 'init:' EInteger 'max:' EInteger ) ) ']' )?
		public Group getGroup_2_2() { return cGroup_2_2; }
		
		//'instance:'
		public Keyword getInstanceKeyword_2_2_0() { return cInstanceKeyword_2_2_0; }
		
		//'['
		public Keyword getLeftSquareBracketKeyword_2_2_1() { return cLeftSquareBracketKeyword_2_2_1; }
		
		//( '+' | '*'
		//               | ( 'init:' EInteger 'max:' EInteger ) )
		public Alternatives getAlternatives_2_2_2() { return cAlternatives_2_2_2; }
		
		//'+'
		public Keyword getPlusSignKeyword_2_2_2_0() { return cPlusSignKeyword_2_2_2_0; }
		
		//'*'
		public Keyword getAsteriskKeyword_2_2_2_1() { return cAsteriskKeyword_2_2_2_1; }
		
		//( 'init:' EInteger 'max:' EInteger )
		public Group getGroup_2_2_2_2() { return cGroup_2_2_2_2; }
		
		//'init:'
		public Keyword getInitKeyword_2_2_2_2_0() { return cInitKeyword_2_2_2_2_0; }
		
		//EInteger
		public RuleCall getEIntegerParserRuleCall_2_2_2_2_1() { return cEIntegerParserRuleCall_2_2_2_2_1; }
		
		//'max:'
		public Keyword getMaxKeyword_2_2_2_2_2() { return cMaxKeyword_2_2_2_2_2; }
		
		//EInteger
		public RuleCall getEIntegerParserRuleCall_2_2_2_2_3() { return cEIntegerParserRuleCall_2_2_2_2_3; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_2_2_3() { return cRightSquareBracketKeyword_2_2_3; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_2_3() { return cGreaterThanSignKeyword_2_3; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_5() { return cLeftCurlyBracketKeyword_5; }
		
		//( // optional unnamed section for property full declaration / definition
		//    ( port+=Port
		//    | signal+=Signal
		//    | buffer+=Buffer
		//    | channel+=Channel
		//    | typedef+=TypeDefinition
		//    | function+=Function
		//    | variable+=Variable
		//    )*
		//)
		public Alternatives getAlternatives_6() { return cAlternatives_6; }
		
		//port+=Port
		public Assignment getPortAssignment_6_0() { return cPortAssignment_6_0; }
		
		//Port
		public RuleCall getPortPortParserRuleCall_6_0_0() { return cPortPortParserRuleCall_6_0_0; }
		
		//signal+=Signal
		public Assignment getSignalAssignment_6_1() { return cSignalAssignment_6_1; }
		
		//Signal
		public RuleCall getSignalSignalParserRuleCall_6_1_0() { return cSignalSignalParserRuleCall_6_1_0; }
		
		//buffer+=Buffer
		public Assignment getBufferAssignment_6_2() { return cBufferAssignment_6_2; }
		
		//Buffer
		public RuleCall getBufferBufferParserRuleCall_6_2_0() { return cBufferBufferParserRuleCall_6_2_0; }
		
		//channel+=Channel
		public Assignment getChannelAssignment_6_3() { return cChannelAssignment_6_3; }
		
		//Channel
		public RuleCall getChannelChannelParserRuleCall_6_3_0() { return cChannelChannelParserRuleCall_6_3_0; }
		
		//typedef+=TypeDefinition
		public Assignment getTypedefAssignment_6_4() { return cTypedefAssignment_6_4; }
		
		//TypeDefinition
		public RuleCall getTypedefTypeDefinitionParserRuleCall_6_4_0() { return cTypedefTypeDefinitionParserRuleCall_6_4_0; }
		
		//function+=Function
		public Assignment getFunctionAssignment_6_5() { return cFunctionAssignment_6_5; }
		
		//Function
		public RuleCall getFunctionFunctionParserRuleCall_6_5_0() { return cFunctionFunctionParserRuleCall_6_5_0; }
		
		//variable+=Variable
		public Assignment getVariableAssignment_6_6() { return cVariableAssignment_6_6; }
		
		//Variable
		public RuleCall getVariableVariableParserRuleCall_6_6_0() { return cVariableVariableParserRuleCall_6_6_0; }
		
		//( '@property:'
		//    ( port+=Port
		//    | signal+=Signal
		//    | buffer+=Buffer
		//    | channel+=Channel
		//    | typedef+=TypeDefinition
		//    | function+=Function
		//    | variable+=Variable
		//    )*
		//| '@public:'
		//    ( port+=PortPublic
		//    | signal+=SignalPublic
		//    | buffer+=BufferPublic
		//    | channel+=ChannelPublic
		//    | typedef+=TypeDefinition
		//    | function+=FunctionPublic
		//    | variable+=VariablePublic
		//    )*
		//| '@protected:'
		//    ( port+=PortProtected
		//    | signal+=SignalProtected
		//    | buffer+=BufferProtected
		//    | channel+=ChannelProtected
		//    | typedef+=TypeDefinition
		//    | function+=FunctionProtected
		//    | variable+=VariableProtected
		//    )*
		//| '@private:'
		//    ( port+=PortPrivate
		//    | signal+=SignalPrivate
		//    | buffer+=BufferPrivate
		//    | channel+=ChannelPrivate
		//    | typedef+=TypeDefinition
		//    | function+=FunctionPrivate
		//    | variable+=VariablePrivate
		//    )*
		//)*
		public Alternatives getAlternatives_7() { return cAlternatives_7; }
		
		//'@property:'
		//           ( port+=Port
		//           | signal+=Signal
		//           | buffer+=Buffer
		//           | channel+=Channel
		//           | typedef+=TypeDefinition
		//           | function+=Function
		//           | variable+=Variable
		//           )*
		public Group getGroup_7_0() { return cGroup_7_0; }
		
		//'@property:'
		public Keyword getPropertyKeyword_7_0_0() { return cPropertyKeyword_7_0_0; }
		
		//( port+=Port
		//| signal+=Signal
		//| buffer+=Buffer
		//| channel+=Channel
		//| typedef+=TypeDefinition
		//| function+=Function
		//| variable+=Variable
		//)*
		public Alternatives getAlternatives_7_0_1() { return cAlternatives_7_0_1; }
		
		//port+=Port
		public Assignment getPortAssignment_7_0_1_0() { return cPortAssignment_7_0_1_0; }
		
		//Port
		public RuleCall getPortPortParserRuleCall_7_0_1_0_0() { return cPortPortParserRuleCall_7_0_1_0_0; }
		
		//signal+=Signal
		public Assignment getSignalAssignment_7_0_1_1() { return cSignalAssignment_7_0_1_1; }
		
		//Signal
		public RuleCall getSignalSignalParserRuleCall_7_0_1_1_0() { return cSignalSignalParserRuleCall_7_0_1_1_0; }
		
		//buffer+=Buffer
		public Assignment getBufferAssignment_7_0_1_2() { return cBufferAssignment_7_0_1_2; }
		
		//Buffer
		public RuleCall getBufferBufferParserRuleCall_7_0_1_2_0() { return cBufferBufferParserRuleCall_7_0_1_2_0; }
		
		//channel+=Channel
		public Assignment getChannelAssignment_7_0_1_3() { return cChannelAssignment_7_0_1_3; }
		
		//Channel
		public RuleCall getChannelChannelParserRuleCall_7_0_1_3_0() { return cChannelChannelParserRuleCall_7_0_1_3_0; }
		
		//typedef+=TypeDefinition
		public Assignment getTypedefAssignment_7_0_1_4() { return cTypedefAssignment_7_0_1_4; }
		
		//TypeDefinition
		public RuleCall getTypedefTypeDefinitionParserRuleCall_7_0_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_7_0_1_4_0; }
		
		//function+=Function
		public Assignment getFunctionAssignment_7_0_1_5() { return cFunctionAssignment_7_0_1_5; }
		
		//Function
		public RuleCall getFunctionFunctionParserRuleCall_7_0_1_5_0() { return cFunctionFunctionParserRuleCall_7_0_1_5_0; }
		
		//variable+=Variable
		public Assignment getVariableAssignment_7_0_1_6() { return cVariableAssignment_7_0_1_6; }
		
		//Variable
		public RuleCall getVariableVariableParserRuleCall_7_0_1_6_0() { return cVariableVariableParserRuleCall_7_0_1_6_0; }
		
		//'@public:'
		//           ( port+=PortPublic
		//           | signal+=SignalPublic
		//           | buffer+=BufferPublic
		//           | channel+=ChannelPublic
		//           | typedef+=TypeDefinition
		//           | function+=FunctionPublic
		//           | variable+=VariablePublic
		//           )*
		public Group getGroup_7_1() { return cGroup_7_1; }
		
		//'@public:'
		public Keyword getPublicKeyword_7_1_0() { return cPublicKeyword_7_1_0; }
		
		//( port+=PortPublic
		//| signal+=SignalPublic
		//| buffer+=BufferPublic
		//| channel+=ChannelPublic
		//| typedef+=TypeDefinition
		//| function+=FunctionPublic
		//| variable+=VariablePublic
		//)*
		public Alternatives getAlternatives_7_1_1() { return cAlternatives_7_1_1; }
		
		//port+=PortPublic
		public Assignment getPortAssignment_7_1_1_0() { return cPortAssignment_7_1_1_0; }
		
		//PortPublic
		public RuleCall getPortPortPublicParserRuleCall_7_1_1_0_0() { return cPortPortPublicParserRuleCall_7_1_1_0_0; }
		
		//signal+=SignalPublic
		public Assignment getSignalAssignment_7_1_1_1() { return cSignalAssignment_7_1_1_1; }
		
		//SignalPublic
		public RuleCall getSignalSignalPublicParserRuleCall_7_1_1_1_0() { return cSignalSignalPublicParserRuleCall_7_1_1_1_0; }
		
		//buffer+=BufferPublic
		public Assignment getBufferAssignment_7_1_1_2() { return cBufferAssignment_7_1_1_2; }
		
		//BufferPublic
		public RuleCall getBufferBufferPublicParserRuleCall_7_1_1_2_0() { return cBufferBufferPublicParserRuleCall_7_1_1_2_0; }
		
		//channel+=ChannelPublic
		public Assignment getChannelAssignment_7_1_1_3() { return cChannelAssignment_7_1_1_3; }
		
		//ChannelPublic
		public RuleCall getChannelChannelPublicParserRuleCall_7_1_1_3_0() { return cChannelChannelPublicParserRuleCall_7_1_1_3_0; }
		
		//typedef+=TypeDefinition
		public Assignment getTypedefAssignment_7_1_1_4() { return cTypedefAssignment_7_1_1_4; }
		
		//TypeDefinition
		public RuleCall getTypedefTypeDefinitionParserRuleCall_7_1_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_7_1_1_4_0; }
		
		//function+=FunctionPublic
		public Assignment getFunctionAssignment_7_1_1_5() { return cFunctionAssignment_7_1_1_5; }
		
		//FunctionPublic
		public RuleCall getFunctionFunctionPublicParserRuleCall_7_1_1_5_0() { return cFunctionFunctionPublicParserRuleCall_7_1_1_5_0; }
		
		//variable+=VariablePublic
		public Assignment getVariableAssignment_7_1_1_6() { return cVariableAssignment_7_1_1_6; }
		
		//VariablePublic
		public RuleCall getVariableVariablePublicParserRuleCall_7_1_1_6_0() { return cVariableVariablePublicParserRuleCall_7_1_1_6_0; }
		
		//'@protected:'
		//           ( port+=PortProtected
		//           | signal+=SignalProtected
		//           | buffer+=BufferProtected
		//           | channel+=ChannelProtected
		//           | typedef+=TypeDefinition
		//           | function+=FunctionProtected
		//           | variable+=VariableProtected
		//           )*
		public Group getGroup_7_2() { return cGroup_7_2; }
		
		//'@protected:'
		public Keyword getProtectedKeyword_7_2_0() { return cProtectedKeyword_7_2_0; }
		
		//( port+=PortProtected
		//| signal+=SignalProtected
		//| buffer+=BufferProtected
		//| channel+=ChannelProtected
		//| typedef+=TypeDefinition
		//| function+=FunctionProtected
		//| variable+=VariableProtected
		//)*
		public Alternatives getAlternatives_7_2_1() { return cAlternatives_7_2_1; }
		
		//port+=PortProtected
		public Assignment getPortAssignment_7_2_1_0() { return cPortAssignment_7_2_1_0; }
		
		//PortProtected
		public RuleCall getPortPortProtectedParserRuleCall_7_2_1_0_0() { return cPortPortProtectedParserRuleCall_7_2_1_0_0; }
		
		//signal+=SignalProtected
		public Assignment getSignalAssignment_7_2_1_1() { return cSignalAssignment_7_2_1_1; }
		
		//SignalProtected
		public RuleCall getSignalSignalProtectedParserRuleCall_7_2_1_1_0() { return cSignalSignalProtectedParserRuleCall_7_2_1_1_0; }
		
		//buffer+=BufferProtected
		public Assignment getBufferAssignment_7_2_1_2() { return cBufferAssignment_7_2_1_2; }
		
		//BufferProtected
		public RuleCall getBufferBufferProtectedParserRuleCall_7_2_1_2_0() { return cBufferBufferProtectedParserRuleCall_7_2_1_2_0; }
		
		//channel+=ChannelProtected
		public Assignment getChannelAssignment_7_2_1_3() { return cChannelAssignment_7_2_1_3; }
		
		//ChannelProtected
		public RuleCall getChannelChannelProtectedParserRuleCall_7_2_1_3_0() { return cChannelChannelProtectedParserRuleCall_7_2_1_3_0; }
		
		//typedef+=TypeDefinition
		public Assignment getTypedefAssignment_7_2_1_4() { return cTypedefAssignment_7_2_1_4; }
		
		//TypeDefinition
		public RuleCall getTypedefTypeDefinitionParserRuleCall_7_2_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_7_2_1_4_0; }
		
		//function+=FunctionProtected
		public Assignment getFunctionAssignment_7_2_1_5() { return cFunctionAssignment_7_2_1_5; }
		
		//FunctionProtected
		public RuleCall getFunctionFunctionProtectedParserRuleCall_7_2_1_5_0() { return cFunctionFunctionProtectedParserRuleCall_7_2_1_5_0; }
		
		//variable+=VariableProtected
		public Assignment getVariableAssignment_7_2_1_6() { return cVariableAssignment_7_2_1_6; }
		
		//VariableProtected
		public RuleCall getVariableVariableProtectedParserRuleCall_7_2_1_6_0() { return cVariableVariableProtectedParserRuleCall_7_2_1_6_0; }
		
		//'@private:'
		//           ( port+=PortPrivate
		//           | signal+=SignalPrivate
		//           | buffer+=BufferPrivate
		//           | channel+=ChannelPrivate
		//           | typedef+=TypeDefinition
		//           | function+=FunctionPrivate
		//           | variable+=VariablePrivate
		//           )*
		public Group getGroup_7_3() { return cGroup_7_3; }
		
		//'@private:'
		public Keyword getPrivateKeyword_7_3_0() { return cPrivateKeyword_7_3_0; }
		
		//( port+=PortPrivate
		//| signal+=SignalPrivate
		//| buffer+=BufferPrivate
		//| channel+=ChannelPrivate
		//| typedef+=TypeDefinition
		//| function+=FunctionPrivate
		//| variable+=VariablePrivate
		//)*
		public Alternatives getAlternatives_7_3_1() { return cAlternatives_7_3_1; }
		
		//port+=PortPrivate
		public Assignment getPortAssignment_7_3_1_0() { return cPortAssignment_7_3_1_0; }
		
		//PortPrivate
		public RuleCall getPortPortPrivateParserRuleCall_7_3_1_0_0() { return cPortPortPrivateParserRuleCall_7_3_1_0_0; }
		
		//signal+=SignalPrivate
		public Assignment getSignalAssignment_7_3_1_1() { return cSignalAssignment_7_3_1_1; }
		
		//SignalPrivate
		public RuleCall getSignalSignalPrivateParserRuleCall_7_3_1_1_0() { return cSignalSignalPrivateParserRuleCall_7_3_1_1_0; }
		
		//buffer+=BufferPrivate
		public Assignment getBufferAssignment_7_3_1_2() { return cBufferAssignment_7_3_1_2; }
		
		//BufferPrivate
		public RuleCall getBufferBufferPrivateParserRuleCall_7_3_1_2_0() { return cBufferBufferPrivateParserRuleCall_7_3_1_2_0; }
		
		//channel+=ChannelPrivate
		public Assignment getChannelAssignment_7_3_1_3() { return cChannelAssignment_7_3_1_3; }
		
		//ChannelPrivate
		public RuleCall getChannelChannelPrivateParserRuleCall_7_3_1_3_0() { return cChannelChannelPrivateParserRuleCall_7_3_1_3_0; }
		
		//typedef+=TypeDefinition
		public Assignment getTypedefAssignment_7_3_1_4() { return cTypedefAssignment_7_3_1_4; }
		
		//TypeDefinition
		public RuleCall getTypedefTypeDefinitionParserRuleCall_7_3_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_7_3_1_4_0; }
		
		//function+=FunctionPrivate
		public Assignment getFunctionAssignment_7_3_1_5() { return cFunctionAssignment_7_3_1_5; }
		
		//FunctionPrivate
		public RuleCall getFunctionFunctionPrivateParserRuleCall_7_3_1_5_0() { return cFunctionFunctionPrivateParserRuleCall_7_3_1_5_0; }
		
		//variable+=VariablePrivate
		public Assignment getVariableAssignment_7_3_1_6() { return cVariableAssignment_7_3_1_6; }
		
		//VariablePrivate
		public RuleCall getVariableVariablePrivateParserRuleCall_7_3_1_6_0() { return cVariableVariablePrivateParserRuleCall_7_3_1_6_0; }
		
		//( ( ( '@routine:' | '@macro:' ) ( routine+=Routine )+
		//  | '@procedure:' ( procedure+=Procedure )+
		//  )*
		//| ( routine+=Routine | procedure+=Procedure )+
		//)
		public Alternatives getAlternatives_8() { return cAlternatives_8; }
		
		//( ( '@routine:' | '@macro:' ) ( routine+=Routine )+
		//         | '@procedure:' ( procedure+=Procedure )+
		//         )*
		public Alternatives getAlternatives_8_0() { return cAlternatives_8_0; }
		
		//( '@routine:' | '@macro:' ) ( routine+=Routine )+
		public Group getGroup_8_0_0() { return cGroup_8_0_0; }
		
		//( '@routine:' | '@macro:' )
		public Alternatives getAlternatives_8_0_0_0() { return cAlternatives_8_0_0_0; }
		
		//'@routine:'
		public Keyword getRoutineKeyword_8_0_0_0_0() { return cRoutineKeyword_8_0_0_0_0; }
		
		//'@macro:'
		public Keyword getMacroKeyword_8_0_0_0_1() { return cMacroKeyword_8_0_0_0_1; }
		
		//( routine+=Routine )+
		public Assignment getRoutineAssignment_8_0_0_1() { return cRoutineAssignment_8_0_0_1; }
		
		//Routine
		public RuleCall getRoutineRoutineParserRuleCall_8_0_0_1_0() { return cRoutineRoutineParserRuleCall_8_0_0_1_0; }
		
		//'@procedure:' ( procedure+=Procedure )+
		public Group getGroup_8_0_1() { return cGroup_8_0_1; }
		
		//'@procedure:'
		public Keyword getProcedureKeyword_8_0_1_0() { return cProcedureKeyword_8_0_1_0; }
		
		//( procedure+=Procedure )+
		public Assignment getProcedureAssignment_8_0_1_1() { return cProcedureAssignment_8_0_1_1; }
		
		//Procedure
		public RuleCall getProcedureProcedureParserRuleCall_8_0_1_1_0() { return cProcedureProcedureParserRuleCall_8_0_1_1_0; }
		
		//( routine+=Routine | procedure+=Procedure )+
		public Alternatives getAlternatives_8_1() { return cAlternatives_8_1; }
		
		//routine+=Routine
		public Assignment getRoutineAssignment_8_1_0() { return cRoutineAssignment_8_1_0; }
		
		//Routine
		public RuleCall getRoutineRoutineParserRuleCall_8_1_0_0() { return cRoutineRoutineParserRuleCall_8_1_0_0; }
		
		//procedure+=Procedure
		public Assignment getProcedureAssignment_8_1_1() { return cProcedureAssignment_8_1_1; }
		
		//Procedure
		public RuleCall getProcedureProcedureParserRuleCall_8_1_1_0() { return cProcedureProcedureParserRuleCall_8_1_1_0; }
		
		//( ( '@composite:' | '@machine:' )
		//    ( machine +=AnyMachineBlock
		//    | instance+=InstanceMachine
		//    )+
		//| '@model:'     ( machine +=AnyMachineBlock )*
		//| '@prototype:' ( machine +=AnyMachineBlock )*
		//| '@instance:'  ( instance+=InstanceMachine )*
		//)*
		public Alternatives getAlternatives_9() { return cAlternatives_9; }
		
		//( '@composite:' | '@machine:' )
		//           ( machine +=AnyMachineBlock
		//           | instance+=InstanceMachine
		//           )+
		public Group getGroup_9_0() { return cGroup_9_0; }
		
		//( '@composite:' | '@machine:' )
		public Alternatives getAlternatives_9_0_0() { return cAlternatives_9_0_0; }
		
		//'@composite:'
		public Keyword getCompositeKeyword_9_0_0_0() { return cCompositeKeyword_9_0_0_0; }
		
		//'@machine:'
		public Keyword getMachineKeyword_9_0_0_1() { return cMachineKeyword_9_0_0_1; }
		
		//( machine +=AnyMachineBlock
		//| instance+=InstanceMachine
		//)+
		public Alternatives getAlternatives_9_0_1() { return cAlternatives_9_0_1; }
		
		//machine +=AnyMachineBlock
		public Assignment getMachineAssignment_9_0_1_0() { return cMachineAssignment_9_0_1_0; }
		
		//AnyMachineBlock
		public RuleCall getMachineAnyMachineBlockParserRuleCall_9_0_1_0_0() { return cMachineAnyMachineBlockParserRuleCall_9_0_1_0_0; }
		
		//instance+=InstanceMachine
		public Assignment getInstanceAssignment_9_0_1_1() { return cInstanceAssignment_9_0_1_1; }
		
		//InstanceMachine
		public RuleCall getInstanceInstanceMachineParserRuleCall_9_0_1_1_0() { return cInstanceInstanceMachineParserRuleCall_9_0_1_1_0; }
		
		//'@model:'     ( machine +=AnyMachineBlock )*
		public Group getGroup_9_1() { return cGroup_9_1; }
		
		//'@model:'
		public Keyword getModelKeyword_9_1_0() { return cModelKeyword_9_1_0; }
		
		//( machine +=AnyMachineBlock )*
		public Assignment getMachineAssignment_9_1_1() { return cMachineAssignment_9_1_1; }
		
		//AnyMachineBlock
		public RuleCall getMachineAnyMachineBlockParserRuleCall_9_1_1_0() { return cMachineAnyMachineBlockParserRuleCall_9_1_1_0; }
		
		//'@prototype:' ( machine +=AnyMachineBlock )*
		public Group getGroup_9_2() { return cGroup_9_2; }
		
		//'@prototype:'
		public Keyword getPrototypeKeyword_9_2_0() { return cPrototypeKeyword_9_2_0; }
		
		//( machine +=AnyMachineBlock )*
		public Assignment getMachineAssignment_9_2_1() { return cMachineAssignment_9_2_1; }
		
		//AnyMachineBlock
		public RuleCall getMachineAnyMachineBlockParserRuleCall_9_2_1_0() { return cMachineAnyMachineBlockParserRuleCall_9_2_1_0; }
		
		//'@instance:'  ( instance+=InstanceMachine )*
		public Group getGroup_9_3() { return cGroup_9_3; }
		
		//'@instance:'
		public Keyword getInstanceKeyword_9_3_0() { return cInstanceKeyword_9_3_0; }
		
		//( instance+=InstanceMachine )*
		public Assignment getInstanceAssignment_9_3_1() { return cInstanceAssignment_9_3_1; }
		
		//InstanceMachine
		public RuleCall getInstanceInstanceMachineParserRuleCall_9_3_1_0() { return cInstanceInstanceMachineParserRuleCall_9_3_1_0; }
		
		//( '@behavior:'     ( behavior+=Behavior )+
		//| '@statemachine:' ( behavior+=Statemachine )+
		//)*
		public Alternatives getAlternatives_10() { return cAlternatives_10; }
		
		//'@behavior:'     ( behavior+=Behavior )+
		public Group getGroup_10_0() { return cGroup_10_0; }
		
		//'@behavior:'
		public Keyword getBehaviorKeyword_10_0_0() { return cBehaviorKeyword_10_0_0; }
		
		//( behavior+=Behavior )+
		public Assignment getBehaviorAssignment_10_0_1() { return cBehaviorAssignment_10_0_1; }
		
		//Behavior
		public RuleCall getBehaviorBehaviorParserRuleCall_10_0_1_0() { return cBehaviorBehaviorParserRuleCall_10_0_1_0; }
		
		//'@statemachine:' ( behavior+=Statemachine )+
		public Group getGroup_10_1() { return cGroup_10_1; }
		
		//'@statemachine:'
		public Keyword getStatemachineKeyword_10_1_0() { return cStatemachineKeyword_10_1_0; }
		
		//( behavior+=Statemachine )+
		public Assignment getBehaviorAssignment_10_1_1() { return cBehaviorAssignment_10_1_1; }
		
		//Statemachine
		public RuleCall getBehaviorStatemachineParserRuleCall_10_1_1_0() { return cBehaviorStatemachineParserRuleCall_10_1_1_0; }
		
		//main=MoeBehavior
		public Assignment getMainAssignment_11() { return cMainAssignment_11; }
		
		//MoeBehavior
		public RuleCall getMainMoeBehaviorParserRuleCall_11_0() { return cMainMoeBehaviorParserRuleCall_11_0; }
		
		////        // optional unnamed section for property full declaration / definition
		////        propertyPart=PropertyPart
		////
		////        compositePart=CompositePart
		////
		////        behaviorPart=BehaviorPart
		//        '}'
		public Keyword getRightCurlyBracketKeyword_12() { return cRightCurlyBracketKeyword_12; }
	}
	public class PropertyPartElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PropertyPart");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cPropertyPartAction_0 = (Action)cGroup.eContents().get(0);
		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
		private final Group cGroup_1_0 = (Group)cAlternatives_1.eContents().get(0);
		private final Keyword cParameterKeyword_1_0_0 = (Keyword)cGroup_1_0.eContents().get(0);
		private final Alternatives cAlternatives_1_0_1 = (Alternatives)cGroup_1_0.eContents().get(1);
		private final Group cGroup_1_0_1_0 = (Group)cAlternatives_1_0_1.eContents().get(0);
		private final Keyword cInputKeyword_1_0_1_0_0 = (Keyword)cGroup_1_0_1_0.eContents().get(0);
		private final Alternatives cAlternatives_1_0_1_0_1 = (Alternatives)cGroup_1_0_1_0.eContents().get(1);
		private final Assignment cParameterAssignment_1_0_1_0_1_0 = (Assignment)cAlternatives_1_0_1_0_1.eContents().get(0);
		private final RuleCall cParameterParameterInputParserRuleCall_1_0_1_0_1_0_0 = (RuleCall)cParameterAssignment_1_0_1_0_1_0.eContents().get(0);
		private final Group cGroup_1_0_1_0_1_1 = (Group)cAlternatives_1_0_1_0_1.eContents().get(1);
		private final Keyword cLeftCurlyBracketKeyword_1_0_1_0_1_1_0 = (Keyword)cGroup_1_0_1_0_1_1.eContents().get(0);
		private final Assignment cParameterAssignment_1_0_1_0_1_1_1 = (Assignment)cGroup_1_0_1_0_1_1.eContents().get(1);
		private final RuleCall cParameterParameterInputParserRuleCall_1_0_1_0_1_1_1_0 = (RuleCall)cParameterAssignment_1_0_1_0_1_1_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_1_0_1_0_1_1_2 = (Keyword)cGroup_1_0_1_0_1_1.eContents().get(2);
		private final Group cGroup_1_0_1_1 = (Group)cAlternatives_1_0_1.eContents().get(1);
		private final Keyword cInoutKeyword_1_0_1_1_0 = (Keyword)cGroup_1_0_1_1.eContents().get(0);
		private final Alternatives cAlternatives_1_0_1_1_1 = (Alternatives)cGroup_1_0_1_1.eContents().get(1);
		private final Assignment cParameterAssignment_1_0_1_1_1_0 = (Assignment)cAlternatives_1_0_1_1_1.eContents().get(0);
		private final RuleCall cParameterParameterInoutParserRuleCall_1_0_1_1_1_0_0 = (RuleCall)cParameterAssignment_1_0_1_1_1_0.eContents().get(0);
		private final Group cGroup_1_0_1_1_1_1 = (Group)cAlternatives_1_0_1_1_1.eContents().get(1);
		private final Keyword cLeftCurlyBracketKeyword_1_0_1_1_1_1_0 = (Keyword)cGroup_1_0_1_1_1_1.eContents().get(0);
		private final Assignment cParameterAssignment_1_0_1_1_1_1_1 = (Assignment)cGroup_1_0_1_1_1_1.eContents().get(1);
		private final RuleCall cParameterParameterInoutParserRuleCall_1_0_1_1_1_1_1_0 = (RuleCall)cParameterAssignment_1_0_1_1_1_1_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_1_0_1_1_1_1_2 = (Keyword)cGroup_1_0_1_1_1_1.eContents().get(2);
		private final Group cGroup_1_0_1_2 = (Group)cAlternatives_1_0_1.eContents().get(2);
		private final Keyword cOutputKeyword_1_0_1_2_0 = (Keyword)cGroup_1_0_1_2.eContents().get(0);
		private final Alternatives cAlternatives_1_0_1_2_1 = (Alternatives)cGroup_1_0_1_2.eContents().get(1);
		private final Assignment cParameterAssignment_1_0_1_2_1_0 = (Assignment)cAlternatives_1_0_1_2_1.eContents().get(0);
		private final RuleCall cParameterParameterOutputParserRuleCall_1_0_1_2_1_0_0 = (RuleCall)cParameterAssignment_1_0_1_2_1_0.eContents().get(0);
		private final Group cGroup_1_0_1_2_1_1 = (Group)cAlternatives_1_0_1_2_1.eContents().get(1);
		private final Keyword cLeftCurlyBracketKeyword_1_0_1_2_1_1_0 = (Keyword)cGroup_1_0_1_2_1_1.eContents().get(0);
		private final Assignment cParameterAssignment_1_0_1_2_1_1_1 = (Assignment)cGroup_1_0_1_2_1_1.eContents().get(1);
		private final RuleCall cParameterParameterOutputParserRuleCall_1_0_1_2_1_1_1_0 = (RuleCall)cParameterAssignment_1_0_1_2_1_1_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_1_0_1_2_1_1_2 = (Keyword)cGroup_1_0_1_2_1_1.eContents().get(2);
		private final Group cGroup_1_0_1_3 = (Group)cAlternatives_1_0_1.eContents().get(3);
		private final Keyword cReturnKeyword_1_0_1_3_0 = (Keyword)cGroup_1_0_1_3.eContents().get(0);
		private final Alternatives cAlternatives_1_0_1_3_1 = (Alternatives)cGroup_1_0_1_3.eContents().get(1);
		private final Assignment cParameterAssignment_1_0_1_3_1_0 = (Assignment)cAlternatives_1_0_1_3_1.eContents().get(0);
		private final RuleCall cParameterParameterReturnParserRuleCall_1_0_1_3_1_0_0 = (RuleCall)cParameterAssignment_1_0_1_3_1_0.eContents().get(0);
		private final Group cGroup_1_0_1_3_1_1 = (Group)cAlternatives_1_0_1_3_1.eContents().get(1);
		private final Keyword cLeftCurlyBracketKeyword_1_0_1_3_1_1_0 = (Keyword)cGroup_1_0_1_3_1_1.eContents().get(0);
		private final Assignment cParameterAssignment_1_0_1_3_1_1_1 = (Assignment)cGroup_1_0_1_3_1_1.eContents().get(1);
		private final RuleCall cParameterParameterReturnParserRuleCall_1_0_1_3_1_1_1_0 = (RuleCall)cParameterAssignment_1_0_1_3_1_1_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_1_0_1_3_1_1_2 = (Keyword)cGroup_1_0_1_3_1_1.eContents().get(2);
		private final Alternatives cAlternatives_1_1 = (Alternatives)cAlternatives_1.eContents().get(1);
		private final Assignment cPortAssignment_1_1_0 = (Assignment)cAlternatives_1_1.eContents().get(0);
		private final RuleCall cPortPortParserRuleCall_1_1_0_0 = (RuleCall)cPortAssignment_1_1_0.eContents().get(0);
		private final Assignment cSignalAssignment_1_1_1 = (Assignment)cAlternatives_1_1.eContents().get(1);
		private final RuleCall cSignalSignalParserRuleCall_1_1_1_0 = (RuleCall)cSignalAssignment_1_1_1.eContents().get(0);
		private final Assignment cBufferAssignment_1_1_2 = (Assignment)cAlternatives_1_1.eContents().get(2);
		private final RuleCall cBufferBufferParserRuleCall_1_1_2_0 = (RuleCall)cBufferAssignment_1_1_2.eContents().get(0);
		private final Assignment cChannelAssignment_1_1_3 = (Assignment)cAlternatives_1_1.eContents().get(3);
		private final RuleCall cChannelChannelParserRuleCall_1_1_3_0 = (RuleCall)cChannelAssignment_1_1_3.eContents().get(0);
		private final Assignment cTypedefAssignment_1_1_4 = (Assignment)cAlternatives_1_1.eContents().get(4);
		private final RuleCall cTypedefTypeDefinitionParserRuleCall_1_1_4_0 = (RuleCall)cTypedefAssignment_1_1_4.eContents().get(0);
		private final Assignment cFunctionAssignment_1_1_5 = (Assignment)cAlternatives_1_1.eContents().get(5);
		private final RuleCall cFunctionFunctionParserRuleCall_1_1_5_0 = (RuleCall)cFunctionAssignment_1_1_5.eContents().get(0);
		private final Assignment cVariableAssignment_1_1_6 = (Assignment)cAlternatives_1_1.eContents().get(6);
		private final RuleCall cVariableVariableParserRuleCall_1_1_6_0 = (RuleCall)cVariableAssignment_1_1_6.eContents().get(0);
		private final Alternatives cAlternatives_2 = (Alternatives)cGroup.eContents().get(2);
		private final Group cGroup_2_0 = (Group)cAlternatives_2.eContents().get(0);
		private final Keyword cInputKeyword_2_0_0 = (Keyword)cGroup_2_0.eContents().get(0);
		private final Assignment cParameterAssignment_2_0_1 = (Assignment)cGroup_2_0.eContents().get(1);
		private final RuleCall cParameterParameterInputParserRuleCall_2_0_1_0 = (RuleCall)cParameterAssignment_2_0_1.eContents().get(0);
		private final Group cGroup_2_1 = (Group)cAlternatives_2.eContents().get(1);
		private final Keyword cInoutKeyword_2_1_0 = (Keyword)cGroup_2_1.eContents().get(0);
		private final Assignment cParameterAssignment_2_1_1 = (Assignment)cGroup_2_1.eContents().get(1);
		private final RuleCall cParameterParameterInoutParserRuleCall_2_1_1_0 = (RuleCall)cParameterAssignment_2_1_1.eContents().get(0);
		private final Group cGroup_2_2 = (Group)cAlternatives_2.eContents().get(2);
		private final Keyword cOutputKeyword_2_2_0 = (Keyword)cGroup_2_2.eContents().get(0);
		private final Assignment cParameterAssignment_2_2_1 = (Assignment)cGroup_2_2.eContents().get(1);
		private final RuleCall cParameterParameterOutputParserRuleCall_2_2_1_0 = (RuleCall)cParameterAssignment_2_2_1.eContents().get(0);
		private final Group cGroup_2_3 = (Group)cAlternatives_2.eContents().get(3);
		private final Keyword cReturnKeyword_2_3_0 = (Keyword)cGroup_2_3.eContents().get(0);
		private final Assignment cParameterAssignment_2_3_1 = (Assignment)cGroup_2_3.eContents().get(1);
		private final RuleCall cParameterParameterReturnParserRuleCall_2_3_1_0 = (RuleCall)cParameterAssignment_2_3_1.eContents().get(0);
		private final Alternatives cAlternatives_3 = (Alternatives)cGroup.eContents().get(3);
		private final Group cGroup_3_0 = (Group)cAlternatives_3.eContents().get(0);
		private final Keyword cPropertyKeyword_3_0_0 = (Keyword)cGroup_3_0.eContents().get(0);
		private final Alternatives cAlternatives_3_0_1 = (Alternatives)cGroup_3_0.eContents().get(1);
		private final Assignment cPortAssignment_3_0_1_0 = (Assignment)cAlternatives_3_0_1.eContents().get(0);
		private final RuleCall cPortPortParserRuleCall_3_0_1_0_0 = (RuleCall)cPortAssignment_3_0_1_0.eContents().get(0);
		private final Assignment cSignalAssignment_3_0_1_1 = (Assignment)cAlternatives_3_0_1.eContents().get(1);
		private final RuleCall cSignalSignalParserRuleCall_3_0_1_1_0 = (RuleCall)cSignalAssignment_3_0_1_1.eContents().get(0);
		private final Assignment cBufferAssignment_3_0_1_2 = (Assignment)cAlternatives_3_0_1.eContents().get(2);
		private final RuleCall cBufferBufferParserRuleCall_3_0_1_2_0 = (RuleCall)cBufferAssignment_3_0_1_2.eContents().get(0);
		private final Assignment cChannelAssignment_3_0_1_3 = (Assignment)cAlternatives_3_0_1.eContents().get(3);
		private final RuleCall cChannelChannelParserRuleCall_3_0_1_3_0 = (RuleCall)cChannelAssignment_3_0_1_3.eContents().get(0);
		private final Assignment cTypedefAssignment_3_0_1_4 = (Assignment)cAlternatives_3_0_1.eContents().get(4);
		private final RuleCall cTypedefTypeDefinitionParserRuleCall_3_0_1_4_0 = (RuleCall)cTypedefAssignment_3_0_1_4.eContents().get(0);
		private final Assignment cFunctionAssignment_3_0_1_5 = (Assignment)cAlternatives_3_0_1.eContents().get(5);
		private final RuleCall cFunctionFunctionParserRuleCall_3_0_1_5_0 = (RuleCall)cFunctionAssignment_3_0_1_5.eContents().get(0);
		private final Assignment cVariableAssignment_3_0_1_6 = (Assignment)cAlternatives_3_0_1.eContents().get(6);
		private final RuleCall cVariableVariableParserRuleCall_3_0_1_6_0 = (RuleCall)cVariableAssignment_3_0_1_6.eContents().get(0);
		private final Group cGroup_3_1 = (Group)cAlternatives_3.eContents().get(1);
		private final Keyword cPublicKeyword_3_1_0 = (Keyword)cGroup_3_1.eContents().get(0);
		private final Alternatives cAlternatives_3_1_1 = (Alternatives)cGroup_3_1.eContents().get(1);
		private final Assignment cPortAssignment_3_1_1_0 = (Assignment)cAlternatives_3_1_1.eContents().get(0);
		private final RuleCall cPortPortPublicParserRuleCall_3_1_1_0_0 = (RuleCall)cPortAssignment_3_1_1_0.eContents().get(0);
		private final Assignment cSignalAssignment_3_1_1_1 = (Assignment)cAlternatives_3_1_1.eContents().get(1);
		private final RuleCall cSignalSignalPublicParserRuleCall_3_1_1_1_0 = (RuleCall)cSignalAssignment_3_1_1_1.eContents().get(0);
		private final Assignment cBufferAssignment_3_1_1_2 = (Assignment)cAlternatives_3_1_1.eContents().get(2);
		private final RuleCall cBufferBufferPublicParserRuleCall_3_1_1_2_0 = (RuleCall)cBufferAssignment_3_1_1_2.eContents().get(0);
		private final Assignment cChannelAssignment_3_1_1_3 = (Assignment)cAlternatives_3_1_1.eContents().get(3);
		private final RuleCall cChannelChannelPublicParserRuleCall_3_1_1_3_0 = (RuleCall)cChannelAssignment_3_1_1_3.eContents().get(0);
		private final Assignment cTypedefAssignment_3_1_1_4 = (Assignment)cAlternatives_3_1_1.eContents().get(4);
		private final RuleCall cTypedefTypeDefinitionParserRuleCall_3_1_1_4_0 = (RuleCall)cTypedefAssignment_3_1_1_4.eContents().get(0);
		private final Assignment cFunctionAssignment_3_1_1_5 = (Assignment)cAlternatives_3_1_1.eContents().get(5);
		private final RuleCall cFunctionFunctionPublicParserRuleCall_3_1_1_5_0 = (RuleCall)cFunctionAssignment_3_1_1_5.eContents().get(0);
		private final Assignment cVariableAssignment_3_1_1_6 = (Assignment)cAlternatives_3_1_1.eContents().get(6);
		private final RuleCall cVariableVariablePublicParserRuleCall_3_1_1_6_0 = (RuleCall)cVariableAssignment_3_1_1_6.eContents().get(0);
		private final Group cGroup_3_2 = (Group)cAlternatives_3.eContents().get(2);
		private final Keyword cProtectedKeyword_3_2_0 = (Keyword)cGroup_3_2.eContents().get(0);
		private final Alternatives cAlternatives_3_2_1 = (Alternatives)cGroup_3_2.eContents().get(1);
		private final Assignment cPortAssignment_3_2_1_0 = (Assignment)cAlternatives_3_2_1.eContents().get(0);
		private final RuleCall cPortPortProtectedParserRuleCall_3_2_1_0_0 = (RuleCall)cPortAssignment_3_2_1_0.eContents().get(0);
		private final Assignment cSignalAssignment_3_2_1_1 = (Assignment)cAlternatives_3_2_1.eContents().get(1);
		private final RuleCall cSignalSignalProtectedParserRuleCall_3_2_1_1_0 = (RuleCall)cSignalAssignment_3_2_1_1.eContents().get(0);
		private final Assignment cBufferAssignment_3_2_1_2 = (Assignment)cAlternatives_3_2_1.eContents().get(2);
		private final RuleCall cBufferBufferProtectedParserRuleCall_3_2_1_2_0 = (RuleCall)cBufferAssignment_3_2_1_2.eContents().get(0);
		private final Assignment cChannelAssignment_3_2_1_3 = (Assignment)cAlternatives_3_2_1.eContents().get(3);
		private final RuleCall cChannelChannelProtectedParserRuleCall_3_2_1_3_0 = (RuleCall)cChannelAssignment_3_2_1_3.eContents().get(0);
		private final Assignment cTypedefAssignment_3_2_1_4 = (Assignment)cAlternatives_3_2_1.eContents().get(4);
		private final RuleCall cTypedefTypeDefinitionParserRuleCall_3_2_1_4_0 = (RuleCall)cTypedefAssignment_3_2_1_4.eContents().get(0);
		private final Assignment cFunctionAssignment_3_2_1_5 = (Assignment)cAlternatives_3_2_1.eContents().get(5);
		private final RuleCall cFunctionFunctionProtectedParserRuleCall_3_2_1_5_0 = (RuleCall)cFunctionAssignment_3_2_1_5.eContents().get(0);
		private final Assignment cVariableAssignment_3_2_1_6 = (Assignment)cAlternatives_3_2_1.eContents().get(6);
		private final RuleCall cVariableVariableProtectedParserRuleCall_3_2_1_6_0 = (RuleCall)cVariableAssignment_3_2_1_6.eContents().get(0);
		private final Group cGroup_3_3 = (Group)cAlternatives_3.eContents().get(3);
		private final Keyword cPrivateKeyword_3_3_0 = (Keyword)cGroup_3_3.eContents().get(0);
		private final Alternatives cAlternatives_3_3_1 = (Alternatives)cGroup_3_3.eContents().get(1);
		private final Assignment cPortAssignment_3_3_1_0 = (Assignment)cAlternatives_3_3_1.eContents().get(0);
		private final RuleCall cPortPortPrivateParserRuleCall_3_3_1_0_0 = (RuleCall)cPortAssignment_3_3_1_0.eContents().get(0);
		private final Assignment cSignalAssignment_3_3_1_1 = (Assignment)cAlternatives_3_3_1.eContents().get(1);
		private final RuleCall cSignalSignalPrivateParserRuleCall_3_3_1_1_0 = (RuleCall)cSignalAssignment_3_3_1_1.eContents().get(0);
		private final Assignment cBufferAssignment_3_3_1_2 = (Assignment)cAlternatives_3_3_1.eContents().get(2);
		private final RuleCall cBufferBufferPrivateParserRuleCall_3_3_1_2_0 = (RuleCall)cBufferAssignment_3_3_1_2.eContents().get(0);
		private final Assignment cChannelAssignment_3_3_1_3 = (Assignment)cAlternatives_3_3_1.eContents().get(3);
		private final RuleCall cChannelChannelPrivateParserRuleCall_3_3_1_3_0 = (RuleCall)cChannelAssignment_3_3_1_3.eContents().get(0);
		private final Assignment cTypedefAssignment_3_3_1_4 = (Assignment)cAlternatives_3_3_1.eContents().get(4);
		private final RuleCall cTypedefTypeDefinitionParserRuleCall_3_3_1_4_0 = (RuleCall)cTypedefAssignment_3_3_1_4.eContents().get(0);
		private final Assignment cFunctionAssignment_3_3_1_5 = (Assignment)cAlternatives_3_3_1.eContents().get(5);
		private final RuleCall cFunctionFunctionPrivateParserRuleCall_3_3_1_5_0 = (RuleCall)cFunctionAssignment_3_3_1_5.eContents().get(0);
		private final Assignment cVariableAssignment_3_3_1_6 = (Assignment)cAlternatives_3_3_1.eContents().get(6);
		private final RuleCall cVariableVariablePrivateParserRuleCall_3_3_1_6_0 = (RuleCall)cVariableAssignment_3_3_1_6.eContents().get(0);
		
		//PropertyPart returns fmlInfra::PropertyPart
		//    : {fmlInfra::PropertyPart}
		//        ( '@parameter:'
		//            ( 'input'
		//                ( parameter+=ParameterInput
		//                | '{' ( parameter+=ParameterInput )+ '}'
		//                )
		//            | 'inout'
		//                ( parameter+=ParameterInout
		//                | '{' ( parameter+=ParameterInout )+ '}'
		//                )
		//            | 'output'
		//                ( parameter+=ParameterOutput
		//                | '{' ( parameter+=ParameterOutput )+ '}'
		//                )
		//            | 'return'
		//                ( parameter+=ParameterReturn
		//                | '{' ( parameter+=ParameterReturn )+ '}'
		//                )
		//            )*
		//        | // optional unnamed section for property full declaration / definition
		//            ( port+=Port
		//            | signal+=Signal
		//            | buffer+=Buffer
		//            | channel+=Channel
		//            | typedef+=TypeDefinition
		//            | function+=Function
		//            | variable+=Variable
		//            )*
		//        )
		//        ( '@input:'
		//            ( parameter+=ParameterInput  )*
		//        | '@inout:'
		//            ( parameter+=ParameterInout  )*
		//        | '@output:'
		//            ( parameter+=ParameterOutput )*
		//        | '@return:'
		//            ( parameter+=ParameterReturn )*
		//        )*
		//        ( '@property:'
		//            ( port+=Port
		//            | signal+=Signal
		//            | buffer+=Buffer
		//            | channel+=Channel
		//            | typedef+=TypeDefinition
		//            | function+=Function
		//            | variable+=Variable
		//            )*
		//        | '@public:'
		//            ( port+=PortPublic
		//            | signal+=SignalPublic
		//            | buffer+=BufferPublic
		//            | channel+=ChannelPublic
		//            | typedef+=TypeDefinition
		//            | function+=FunctionPublic
		//            | variable+=VariablePublic
		//            )*
		//        | '@protected:'
		//            ( port+=PortProtected
		//            | signal+=SignalProtected
		//            | buffer+=BufferProtected
		//            | channel+=ChannelProtected
		//            | typedef+=TypeDefinition
		//            | function+=FunctionProtected
		//            | variable+=VariableProtected
		//            )*
		//        | '@private:'
		//            ( port+=PortPrivate
		//            | signal+=SignalPrivate
		//            | buffer+=BufferPrivate
		//            | channel+=ChannelPrivate
		//            | typedef+=TypeDefinition
		//            | function+=FunctionPrivate
		//            | variable+=VariablePrivate
		//            )*
		//        )*
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlInfra::PropertyPart}
		//       ( '@parameter:'
		//           ( 'input'
		//               ( parameter+=ParameterInput
		//               | '{' ( parameter+=ParameterInput )+ '}'
		//               )
		//           | 'inout'
		//               ( parameter+=ParameterInout
		//               | '{' ( parameter+=ParameterInout )+ '}'
		//               )
		//           | 'output'
		//               ( parameter+=ParameterOutput
		//               | '{' ( parameter+=ParameterOutput )+ '}'
		//               )
		//           | 'return'
		//               ( parameter+=ParameterReturn
		//               | '{' ( parameter+=ParameterReturn )+ '}'
		//               )
		//           )*
		//       | // optional unnamed section for property full declaration / definition
		//           ( port+=Port
		//           | signal+=Signal
		//           | buffer+=Buffer
		//           | channel+=Channel
		//           | typedef+=TypeDefinition
		//           | function+=Function
		//           | variable+=Variable
		//           )*
		//       )
		//       ( '@input:'
		//           ( parameter+=ParameterInput  )*
		//       | '@inout:'
		//           ( parameter+=ParameterInout  )*
		//       | '@output:'
		//           ( parameter+=ParameterOutput )*
		//       | '@return:'
		//           ( parameter+=ParameterReturn )*
		//       )*
		//       ( '@property:'
		//           ( port+=Port
		//           | signal+=Signal
		//           | buffer+=Buffer
		//           | channel+=Channel
		//           | typedef+=TypeDefinition
		//           | function+=Function
		//           | variable+=Variable
		//           )*
		//       | '@public:'
		//           ( port+=PortPublic
		//           | signal+=SignalPublic
		//           | buffer+=BufferPublic
		//           | channel+=ChannelPublic
		//           | typedef+=TypeDefinition
		//           | function+=FunctionPublic
		//           | variable+=VariablePublic
		//           )*
		//       | '@protected:'
		//           ( port+=PortProtected
		//           | signal+=SignalProtected
		//           | buffer+=BufferProtected
		//           | channel+=ChannelProtected
		//           | typedef+=TypeDefinition
		//           | function+=FunctionProtected
		//           | variable+=VariableProtected
		//           )*
		//       | '@private:'
		//           ( port+=PortPrivate
		//           | signal+=SignalPrivate
		//           | buffer+=BufferPrivate
		//           | channel+=ChannelPrivate
		//           | typedef+=TypeDefinition
		//           | function+=FunctionPrivate
		//           | variable+=VariablePrivate
		//           )*
		//       )*
		public Group getGroup() { return cGroup; }
		
		//{fmlInfra::PropertyPart}
		public Action getPropertyPartAction_0() { return cPropertyPartAction_0; }
		
		//( '@parameter:'
		//    ( 'input'
		//        ( parameter+=ParameterInput
		//        | '{' ( parameter+=ParameterInput )+ '}'
		//        )
		//    | 'inout'
		//        ( parameter+=ParameterInout
		//        | '{' ( parameter+=ParameterInout )+ '}'
		//        )
		//    | 'output'
		//        ( parameter+=ParameterOutput
		//        | '{' ( parameter+=ParameterOutput )+ '}'
		//        )
		//    | 'return'
		//        ( parameter+=ParameterReturn
		//        | '{' ( parameter+=ParameterReturn )+ '}'
		//        )
		//    )*
		//| // optional unnamed section for property full declaration / definition
		//    ( port+=Port
		//    | signal+=Signal
		//    | buffer+=Buffer
		//    | channel+=Channel
		//    | typedef+=TypeDefinition
		//    | function+=Function
		//    | variable+=Variable
		//    )*
		//)
		public Alternatives getAlternatives_1() { return cAlternatives_1; }
		
		//'@parameter:'
		//           ( 'input'
		//               ( parameter+=ParameterInput
		//               | '{' ( parameter+=ParameterInput )+ '}'
		//               )
		//           | 'inout'
		//               ( parameter+=ParameterInout
		//               | '{' ( parameter+=ParameterInout )+ '}'
		//               )
		//           | 'output'
		//               ( parameter+=ParameterOutput
		//               | '{' ( parameter+=ParameterOutput )+ '}'
		//               )
		//           | 'return'
		//               ( parameter+=ParameterReturn
		//               | '{' ( parameter+=ParameterReturn )+ '}'
		//               )
		//           )*
		public Group getGroup_1_0() { return cGroup_1_0; }
		
		//'@parameter:'
		public Keyword getParameterKeyword_1_0_0() { return cParameterKeyword_1_0_0; }
		
		//( 'input'
		//    ( parameter+=ParameterInput
		//    | '{' ( parameter+=ParameterInput )+ '}'
		//    )
		//| 'inout'
		//    ( parameter+=ParameterInout
		//    | '{' ( parameter+=ParameterInout )+ '}'
		//    )
		//| 'output'
		//    ( parameter+=ParameterOutput
		//    | '{' ( parameter+=ParameterOutput )+ '}'
		//    )
		//| 'return'
		//    ( parameter+=ParameterReturn
		//    | '{' ( parameter+=ParameterReturn )+ '}'
		//    )
		//)*
		public Alternatives getAlternatives_1_0_1() { return cAlternatives_1_0_1; }
		
		//'input'
		//               ( parameter+=ParameterInput
		//               | '{' ( parameter+=ParameterInput )+ '}'
		//               )
		public Group getGroup_1_0_1_0() { return cGroup_1_0_1_0; }
		
		//'input'
		public Keyword getInputKeyword_1_0_1_0_0() { return cInputKeyword_1_0_1_0_0; }
		
		//( parameter+=ParameterInput
		//| '{' ( parameter+=ParameterInput )+ '}'
		//)
		public Alternatives getAlternatives_1_0_1_0_1() { return cAlternatives_1_0_1_0_1; }
		
		//parameter+=ParameterInput
		public Assignment getParameterAssignment_1_0_1_0_1_0() { return cParameterAssignment_1_0_1_0_1_0; }
		
		//ParameterInput
		public RuleCall getParameterParameterInputParserRuleCall_1_0_1_0_1_0_0() { return cParameterParameterInputParserRuleCall_1_0_1_0_1_0_0; }
		
		//'{' ( parameter+=ParameterInput )+ '}'
		public Group getGroup_1_0_1_0_1_1() { return cGroup_1_0_1_0_1_1; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_1_0_1_0_1_1_0() { return cLeftCurlyBracketKeyword_1_0_1_0_1_1_0; }
		
		//( parameter+=ParameterInput )+
		public Assignment getParameterAssignment_1_0_1_0_1_1_1() { return cParameterAssignment_1_0_1_0_1_1_1; }
		
		//ParameterInput
		public RuleCall getParameterParameterInputParserRuleCall_1_0_1_0_1_1_1_0() { return cParameterParameterInputParserRuleCall_1_0_1_0_1_1_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_1_0_1_0_1_1_2() { return cRightCurlyBracketKeyword_1_0_1_0_1_1_2; }
		
		//'inout'
		//               ( parameter+=ParameterInout
		//               | '{' ( parameter+=ParameterInout )+ '}'
		//               )
		public Group getGroup_1_0_1_1() { return cGroup_1_0_1_1; }
		
		//'inout'
		public Keyword getInoutKeyword_1_0_1_1_0() { return cInoutKeyword_1_0_1_1_0; }
		
		//( parameter+=ParameterInout
		//| '{' ( parameter+=ParameterInout )+ '}'
		//)
		public Alternatives getAlternatives_1_0_1_1_1() { return cAlternatives_1_0_1_1_1; }
		
		//parameter+=ParameterInout
		public Assignment getParameterAssignment_1_0_1_1_1_0() { return cParameterAssignment_1_0_1_1_1_0; }
		
		//ParameterInout
		public RuleCall getParameterParameterInoutParserRuleCall_1_0_1_1_1_0_0() { return cParameterParameterInoutParserRuleCall_1_0_1_1_1_0_0; }
		
		//'{' ( parameter+=ParameterInout )+ '}'
		public Group getGroup_1_0_1_1_1_1() { return cGroup_1_0_1_1_1_1; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_1_0_1_1_1_1_0() { return cLeftCurlyBracketKeyword_1_0_1_1_1_1_0; }
		
		//( parameter+=ParameterInout )+
		public Assignment getParameterAssignment_1_0_1_1_1_1_1() { return cParameterAssignment_1_0_1_1_1_1_1; }
		
		//ParameterInout
		public RuleCall getParameterParameterInoutParserRuleCall_1_0_1_1_1_1_1_0() { return cParameterParameterInoutParserRuleCall_1_0_1_1_1_1_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_1_0_1_1_1_1_2() { return cRightCurlyBracketKeyword_1_0_1_1_1_1_2; }
		
		//'output'
		//               ( parameter+=ParameterOutput
		//               | '{' ( parameter+=ParameterOutput )+ '}'
		//               )
		public Group getGroup_1_0_1_2() { return cGroup_1_0_1_2; }
		
		//'output'
		public Keyword getOutputKeyword_1_0_1_2_0() { return cOutputKeyword_1_0_1_2_0; }
		
		//( parameter+=ParameterOutput
		//| '{' ( parameter+=ParameterOutput )+ '}'
		//)
		public Alternatives getAlternatives_1_0_1_2_1() { return cAlternatives_1_0_1_2_1; }
		
		//parameter+=ParameterOutput
		public Assignment getParameterAssignment_1_0_1_2_1_0() { return cParameterAssignment_1_0_1_2_1_0; }
		
		//ParameterOutput
		public RuleCall getParameterParameterOutputParserRuleCall_1_0_1_2_1_0_0() { return cParameterParameterOutputParserRuleCall_1_0_1_2_1_0_0; }
		
		//'{' ( parameter+=ParameterOutput )+ '}'
		public Group getGroup_1_0_1_2_1_1() { return cGroup_1_0_1_2_1_1; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_1_0_1_2_1_1_0() { return cLeftCurlyBracketKeyword_1_0_1_2_1_1_0; }
		
		//( parameter+=ParameterOutput )+
		public Assignment getParameterAssignment_1_0_1_2_1_1_1() { return cParameterAssignment_1_0_1_2_1_1_1; }
		
		//ParameterOutput
		public RuleCall getParameterParameterOutputParserRuleCall_1_0_1_2_1_1_1_0() { return cParameterParameterOutputParserRuleCall_1_0_1_2_1_1_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_1_0_1_2_1_1_2() { return cRightCurlyBracketKeyword_1_0_1_2_1_1_2; }
		
		//'return'
		//               ( parameter+=ParameterReturn
		//               | '{' ( parameter+=ParameterReturn )+ '}'
		//               )
		public Group getGroup_1_0_1_3() { return cGroup_1_0_1_3; }
		
		//'return'
		public Keyword getReturnKeyword_1_0_1_3_0() { return cReturnKeyword_1_0_1_3_0; }
		
		//( parameter+=ParameterReturn
		//| '{' ( parameter+=ParameterReturn )+ '}'
		//)
		public Alternatives getAlternatives_1_0_1_3_1() { return cAlternatives_1_0_1_3_1; }
		
		//parameter+=ParameterReturn
		public Assignment getParameterAssignment_1_0_1_3_1_0() { return cParameterAssignment_1_0_1_3_1_0; }
		
		//ParameterReturn
		public RuleCall getParameterParameterReturnParserRuleCall_1_0_1_3_1_0_0() { return cParameterParameterReturnParserRuleCall_1_0_1_3_1_0_0; }
		
		//'{' ( parameter+=ParameterReturn )+ '}'
		public Group getGroup_1_0_1_3_1_1() { return cGroup_1_0_1_3_1_1; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_1_0_1_3_1_1_0() { return cLeftCurlyBracketKeyword_1_0_1_3_1_1_0; }
		
		//( parameter+=ParameterReturn )+
		public Assignment getParameterAssignment_1_0_1_3_1_1_1() { return cParameterAssignment_1_0_1_3_1_1_1; }
		
		//ParameterReturn
		public RuleCall getParameterParameterReturnParserRuleCall_1_0_1_3_1_1_1_0() { return cParameterParameterReturnParserRuleCall_1_0_1_3_1_1_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_1_0_1_3_1_1_2() { return cRightCurlyBracketKeyword_1_0_1_3_1_1_2; }
		
		//// optional unnamed section for property full declaration / definition
		//           ( port+=Port
		//           | signal+=Signal
		//           | buffer+=Buffer
		//           | channel+=Channel
		//           | typedef+=TypeDefinition
		//           | function+=Function
		//           | variable+=Variable
		//           )*
		public Alternatives getAlternatives_1_1() { return cAlternatives_1_1; }
		
		//port+=Port
		public Assignment getPortAssignment_1_1_0() { return cPortAssignment_1_1_0; }
		
		//Port
		public RuleCall getPortPortParserRuleCall_1_1_0_0() { return cPortPortParserRuleCall_1_1_0_0; }
		
		//signal+=Signal
		public Assignment getSignalAssignment_1_1_1() { return cSignalAssignment_1_1_1; }
		
		//Signal
		public RuleCall getSignalSignalParserRuleCall_1_1_1_0() { return cSignalSignalParserRuleCall_1_1_1_0; }
		
		//buffer+=Buffer
		public Assignment getBufferAssignment_1_1_2() { return cBufferAssignment_1_1_2; }
		
		//Buffer
		public RuleCall getBufferBufferParserRuleCall_1_1_2_0() { return cBufferBufferParserRuleCall_1_1_2_0; }
		
		//channel+=Channel
		public Assignment getChannelAssignment_1_1_3() { return cChannelAssignment_1_1_3; }
		
		//Channel
		public RuleCall getChannelChannelParserRuleCall_1_1_3_0() { return cChannelChannelParserRuleCall_1_1_3_0; }
		
		//typedef+=TypeDefinition
		public Assignment getTypedefAssignment_1_1_4() { return cTypedefAssignment_1_1_4; }
		
		//TypeDefinition
		public RuleCall getTypedefTypeDefinitionParserRuleCall_1_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_1_1_4_0; }
		
		//function+=Function
		public Assignment getFunctionAssignment_1_1_5() { return cFunctionAssignment_1_1_5; }
		
		//Function
		public RuleCall getFunctionFunctionParserRuleCall_1_1_5_0() { return cFunctionFunctionParserRuleCall_1_1_5_0; }
		
		//variable+=Variable
		public Assignment getVariableAssignment_1_1_6() { return cVariableAssignment_1_1_6; }
		
		//Variable
		public RuleCall getVariableVariableParserRuleCall_1_1_6_0() { return cVariableVariableParserRuleCall_1_1_6_0; }
		
		//( '@input:'
		//    ( parameter+=ParameterInput  )*
		//| '@inout:'
		//    ( parameter+=ParameterInout  )*
		//| '@output:'
		//    ( parameter+=ParameterOutput )*
		//| '@return:'
		//    ( parameter+=ParameterReturn )*
		//)*
		public Alternatives getAlternatives_2() { return cAlternatives_2; }
		
		//'@input:'
		//           ( parameter+=ParameterInput  )*
		public Group getGroup_2_0() { return cGroup_2_0; }
		
		//'@input:'
		public Keyword getInputKeyword_2_0_0() { return cInputKeyword_2_0_0; }
		
		//( parameter+=ParameterInput  )*
		public Assignment getParameterAssignment_2_0_1() { return cParameterAssignment_2_0_1; }
		
		//ParameterInput
		public RuleCall getParameterParameterInputParserRuleCall_2_0_1_0() { return cParameterParameterInputParserRuleCall_2_0_1_0; }
		
		//'@inout:'
		//           ( parameter+=ParameterInout  )*
		public Group getGroup_2_1() { return cGroup_2_1; }
		
		//'@inout:'
		public Keyword getInoutKeyword_2_1_0() { return cInoutKeyword_2_1_0; }
		
		//( parameter+=ParameterInout  )*
		public Assignment getParameterAssignment_2_1_1() { return cParameterAssignment_2_1_1; }
		
		//ParameterInout
		public RuleCall getParameterParameterInoutParserRuleCall_2_1_1_0() { return cParameterParameterInoutParserRuleCall_2_1_1_0; }
		
		//'@output:'
		//           ( parameter+=ParameterOutput )*
		public Group getGroup_2_2() { return cGroup_2_2; }
		
		//'@output:'
		public Keyword getOutputKeyword_2_2_0() { return cOutputKeyword_2_2_0; }
		
		//( parameter+=ParameterOutput )*
		public Assignment getParameterAssignment_2_2_1() { return cParameterAssignment_2_2_1; }
		
		//ParameterOutput
		public RuleCall getParameterParameterOutputParserRuleCall_2_2_1_0() { return cParameterParameterOutputParserRuleCall_2_2_1_0; }
		
		//'@return:'
		//           ( parameter+=ParameterReturn )*
		public Group getGroup_2_3() { return cGroup_2_3; }
		
		//'@return:'
		public Keyword getReturnKeyword_2_3_0() { return cReturnKeyword_2_3_0; }
		
		//( parameter+=ParameterReturn )*
		public Assignment getParameterAssignment_2_3_1() { return cParameterAssignment_2_3_1; }
		
		//ParameterReturn
		public RuleCall getParameterParameterReturnParserRuleCall_2_3_1_0() { return cParameterParameterReturnParserRuleCall_2_3_1_0; }
		
		//( '@property:'
		//    ( port+=Port
		//    | signal+=Signal
		//    | buffer+=Buffer
		//    | channel+=Channel
		//    | typedef+=TypeDefinition
		//    | function+=Function
		//    | variable+=Variable
		//    )*
		//| '@public:'
		//    ( port+=PortPublic
		//    | signal+=SignalPublic
		//    | buffer+=BufferPublic
		//    | channel+=ChannelPublic
		//    | typedef+=TypeDefinition
		//    | function+=FunctionPublic
		//    | variable+=VariablePublic
		//    )*
		//| '@protected:'
		//    ( port+=PortProtected
		//    | signal+=SignalProtected
		//    | buffer+=BufferProtected
		//    | channel+=ChannelProtected
		//    | typedef+=TypeDefinition
		//    | function+=FunctionProtected
		//    | variable+=VariableProtected
		//    )*
		//| '@private:'
		//    ( port+=PortPrivate
		//    | signal+=SignalPrivate
		//    | buffer+=BufferPrivate
		//    | channel+=ChannelPrivate
		//    | typedef+=TypeDefinition
		//    | function+=FunctionPrivate
		//    | variable+=VariablePrivate
		//    )*
		//)*
		public Alternatives getAlternatives_3() { return cAlternatives_3; }
		
		//'@property:'
		//           ( port+=Port
		//           | signal+=Signal
		//           | buffer+=Buffer
		//           | channel+=Channel
		//           | typedef+=TypeDefinition
		//           | function+=Function
		//           | variable+=Variable
		//           )*
		public Group getGroup_3_0() { return cGroup_3_0; }
		
		//'@property:'
		public Keyword getPropertyKeyword_3_0_0() { return cPropertyKeyword_3_0_0; }
		
		//( port+=Port
		//| signal+=Signal
		//| buffer+=Buffer
		//| channel+=Channel
		//| typedef+=TypeDefinition
		//| function+=Function
		//| variable+=Variable
		//)*
		public Alternatives getAlternatives_3_0_1() { return cAlternatives_3_0_1; }
		
		//port+=Port
		public Assignment getPortAssignment_3_0_1_0() { return cPortAssignment_3_0_1_0; }
		
		//Port
		public RuleCall getPortPortParserRuleCall_3_0_1_0_0() { return cPortPortParserRuleCall_3_0_1_0_0; }
		
		//signal+=Signal
		public Assignment getSignalAssignment_3_0_1_1() { return cSignalAssignment_3_0_1_1; }
		
		//Signal
		public RuleCall getSignalSignalParserRuleCall_3_0_1_1_0() { return cSignalSignalParserRuleCall_3_0_1_1_0; }
		
		//buffer+=Buffer
		public Assignment getBufferAssignment_3_0_1_2() { return cBufferAssignment_3_0_1_2; }
		
		//Buffer
		public RuleCall getBufferBufferParserRuleCall_3_0_1_2_0() { return cBufferBufferParserRuleCall_3_0_1_2_0; }
		
		//channel+=Channel
		public Assignment getChannelAssignment_3_0_1_3() { return cChannelAssignment_3_0_1_3; }
		
		//Channel
		public RuleCall getChannelChannelParserRuleCall_3_0_1_3_0() { return cChannelChannelParserRuleCall_3_0_1_3_0; }
		
		//typedef+=TypeDefinition
		public Assignment getTypedefAssignment_3_0_1_4() { return cTypedefAssignment_3_0_1_4; }
		
		//TypeDefinition
		public RuleCall getTypedefTypeDefinitionParserRuleCall_3_0_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_3_0_1_4_0; }
		
		//function+=Function
		public Assignment getFunctionAssignment_3_0_1_5() { return cFunctionAssignment_3_0_1_5; }
		
		//Function
		public RuleCall getFunctionFunctionParserRuleCall_3_0_1_5_0() { return cFunctionFunctionParserRuleCall_3_0_1_5_0; }
		
		//variable+=Variable
		public Assignment getVariableAssignment_3_0_1_6() { return cVariableAssignment_3_0_1_6; }
		
		//Variable
		public RuleCall getVariableVariableParserRuleCall_3_0_1_6_0() { return cVariableVariableParserRuleCall_3_0_1_6_0; }
		
		//'@public:'
		//           ( port+=PortPublic
		//           | signal+=SignalPublic
		//           | buffer+=BufferPublic
		//           | channel+=ChannelPublic
		//           | typedef+=TypeDefinition
		//           | function+=FunctionPublic
		//           | variable+=VariablePublic
		//           )*
		public Group getGroup_3_1() { return cGroup_3_1; }
		
		//'@public:'
		public Keyword getPublicKeyword_3_1_0() { return cPublicKeyword_3_1_0; }
		
		//( port+=PortPublic
		//| signal+=SignalPublic
		//| buffer+=BufferPublic
		//| channel+=ChannelPublic
		//| typedef+=TypeDefinition
		//| function+=FunctionPublic
		//| variable+=VariablePublic
		//)*
		public Alternatives getAlternatives_3_1_1() { return cAlternatives_3_1_1; }
		
		//port+=PortPublic
		public Assignment getPortAssignment_3_1_1_0() { return cPortAssignment_3_1_1_0; }
		
		//PortPublic
		public RuleCall getPortPortPublicParserRuleCall_3_1_1_0_0() { return cPortPortPublicParserRuleCall_3_1_1_0_0; }
		
		//signal+=SignalPublic
		public Assignment getSignalAssignment_3_1_1_1() { return cSignalAssignment_3_1_1_1; }
		
		//SignalPublic
		public RuleCall getSignalSignalPublicParserRuleCall_3_1_1_1_0() { return cSignalSignalPublicParserRuleCall_3_1_1_1_0; }
		
		//buffer+=BufferPublic
		public Assignment getBufferAssignment_3_1_1_2() { return cBufferAssignment_3_1_1_2; }
		
		//BufferPublic
		public RuleCall getBufferBufferPublicParserRuleCall_3_1_1_2_0() { return cBufferBufferPublicParserRuleCall_3_1_1_2_0; }
		
		//channel+=ChannelPublic
		public Assignment getChannelAssignment_3_1_1_3() { return cChannelAssignment_3_1_1_3; }
		
		//ChannelPublic
		public RuleCall getChannelChannelPublicParserRuleCall_3_1_1_3_0() { return cChannelChannelPublicParserRuleCall_3_1_1_3_0; }
		
		//typedef+=TypeDefinition
		public Assignment getTypedefAssignment_3_1_1_4() { return cTypedefAssignment_3_1_1_4; }
		
		//TypeDefinition
		public RuleCall getTypedefTypeDefinitionParserRuleCall_3_1_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_3_1_1_4_0; }
		
		//function+=FunctionPublic
		public Assignment getFunctionAssignment_3_1_1_5() { return cFunctionAssignment_3_1_1_5; }
		
		//FunctionPublic
		public RuleCall getFunctionFunctionPublicParserRuleCall_3_1_1_5_0() { return cFunctionFunctionPublicParserRuleCall_3_1_1_5_0; }
		
		//variable+=VariablePublic
		public Assignment getVariableAssignment_3_1_1_6() { return cVariableAssignment_3_1_1_6; }
		
		//VariablePublic
		public RuleCall getVariableVariablePublicParserRuleCall_3_1_1_6_0() { return cVariableVariablePublicParserRuleCall_3_1_1_6_0; }
		
		//'@protected:'
		//           ( port+=PortProtected
		//           | signal+=SignalProtected
		//           | buffer+=BufferProtected
		//           | channel+=ChannelProtected
		//           | typedef+=TypeDefinition
		//           | function+=FunctionProtected
		//           | variable+=VariableProtected
		//           )*
		public Group getGroup_3_2() { return cGroup_3_2; }
		
		//'@protected:'
		public Keyword getProtectedKeyword_3_2_0() { return cProtectedKeyword_3_2_0; }
		
		//( port+=PortProtected
		//| signal+=SignalProtected
		//| buffer+=BufferProtected
		//| channel+=ChannelProtected
		//| typedef+=TypeDefinition
		//| function+=FunctionProtected
		//| variable+=VariableProtected
		//)*
		public Alternatives getAlternatives_3_2_1() { return cAlternatives_3_2_1; }
		
		//port+=PortProtected
		public Assignment getPortAssignment_3_2_1_0() { return cPortAssignment_3_2_1_0; }
		
		//PortProtected
		public RuleCall getPortPortProtectedParserRuleCall_3_2_1_0_0() { return cPortPortProtectedParserRuleCall_3_2_1_0_0; }
		
		//signal+=SignalProtected
		public Assignment getSignalAssignment_3_2_1_1() { return cSignalAssignment_3_2_1_1; }
		
		//SignalProtected
		public RuleCall getSignalSignalProtectedParserRuleCall_3_2_1_1_0() { return cSignalSignalProtectedParserRuleCall_3_2_1_1_0; }
		
		//buffer+=BufferProtected
		public Assignment getBufferAssignment_3_2_1_2() { return cBufferAssignment_3_2_1_2; }
		
		//BufferProtected
		public RuleCall getBufferBufferProtectedParserRuleCall_3_2_1_2_0() { return cBufferBufferProtectedParserRuleCall_3_2_1_2_0; }
		
		//channel+=ChannelProtected
		public Assignment getChannelAssignment_3_2_1_3() { return cChannelAssignment_3_2_1_3; }
		
		//ChannelProtected
		public RuleCall getChannelChannelProtectedParserRuleCall_3_2_1_3_0() { return cChannelChannelProtectedParserRuleCall_3_2_1_3_0; }
		
		//typedef+=TypeDefinition
		public Assignment getTypedefAssignment_3_2_1_4() { return cTypedefAssignment_3_2_1_4; }
		
		//TypeDefinition
		public RuleCall getTypedefTypeDefinitionParserRuleCall_3_2_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_3_2_1_4_0; }
		
		//function+=FunctionProtected
		public Assignment getFunctionAssignment_3_2_1_5() { return cFunctionAssignment_3_2_1_5; }
		
		//FunctionProtected
		public RuleCall getFunctionFunctionProtectedParserRuleCall_3_2_1_5_0() { return cFunctionFunctionProtectedParserRuleCall_3_2_1_5_0; }
		
		//variable+=VariableProtected
		public Assignment getVariableAssignment_3_2_1_6() { return cVariableAssignment_3_2_1_6; }
		
		//VariableProtected
		public RuleCall getVariableVariableProtectedParserRuleCall_3_2_1_6_0() { return cVariableVariableProtectedParserRuleCall_3_2_1_6_0; }
		
		//'@private:'
		//           ( port+=PortPrivate
		//           | signal+=SignalPrivate
		//           | buffer+=BufferPrivate
		//           | channel+=ChannelPrivate
		//           | typedef+=TypeDefinition
		//           | function+=FunctionPrivate
		//           | variable+=VariablePrivate
		//           )*
		public Group getGroup_3_3() { return cGroup_3_3; }
		
		//'@private:'
		public Keyword getPrivateKeyword_3_3_0() { return cPrivateKeyword_3_3_0; }
		
		//( port+=PortPrivate
		//| signal+=SignalPrivate
		//| buffer+=BufferPrivate
		//| channel+=ChannelPrivate
		//| typedef+=TypeDefinition
		//| function+=FunctionPrivate
		//| variable+=VariablePrivate
		//)*
		public Alternatives getAlternatives_3_3_1() { return cAlternatives_3_3_1; }
		
		//port+=PortPrivate
		public Assignment getPortAssignment_3_3_1_0() { return cPortAssignment_3_3_1_0; }
		
		//PortPrivate
		public RuleCall getPortPortPrivateParserRuleCall_3_3_1_0_0() { return cPortPortPrivateParserRuleCall_3_3_1_0_0; }
		
		//signal+=SignalPrivate
		public Assignment getSignalAssignment_3_3_1_1() { return cSignalAssignment_3_3_1_1; }
		
		//SignalPrivate
		public RuleCall getSignalSignalPrivateParserRuleCall_3_3_1_1_0() { return cSignalSignalPrivateParserRuleCall_3_3_1_1_0; }
		
		//buffer+=BufferPrivate
		public Assignment getBufferAssignment_3_3_1_2() { return cBufferAssignment_3_3_1_2; }
		
		//BufferPrivate
		public RuleCall getBufferBufferPrivateParserRuleCall_3_3_1_2_0() { return cBufferBufferPrivateParserRuleCall_3_3_1_2_0; }
		
		//channel+=ChannelPrivate
		public Assignment getChannelAssignment_3_3_1_3() { return cChannelAssignment_3_3_1_3; }
		
		//ChannelPrivate
		public RuleCall getChannelChannelPrivateParserRuleCall_3_3_1_3_0() { return cChannelChannelPrivateParserRuleCall_3_3_1_3_0; }
		
		//typedef+=TypeDefinition
		public Assignment getTypedefAssignment_3_3_1_4() { return cTypedefAssignment_3_3_1_4; }
		
		//TypeDefinition
		public RuleCall getTypedefTypeDefinitionParserRuleCall_3_3_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_3_3_1_4_0; }
		
		//function+=FunctionPrivate
		public Assignment getFunctionAssignment_3_3_1_5() { return cFunctionAssignment_3_3_1_5; }
		
		//FunctionPrivate
		public RuleCall getFunctionFunctionPrivateParserRuleCall_3_3_1_5_0() { return cFunctionFunctionPrivateParserRuleCall_3_3_1_5_0; }
		
		//variable+=VariablePrivate
		public Assignment getVariableAssignment_3_3_1_6() { return cVariableAssignment_3_3_1_6; }
		
		//VariablePrivate
		public RuleCall getVariableVariablePrivateParserRuleCall_3_3_1_6_0() { return cVariableVariablePrivateParserRuleCall_3_3_1_6_0; }
	}
	public class CompositePartElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.CompositePart");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cCompositePartAction_0 = (Action)cGroup.eContents().get(0);
		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
		private final Alternatives cAlternatives_1_0 = (Alternatives)cAlternatives_1.eContents().get(0);
		private final Group cGroup_1_0_0 = (Group)cAlternatives_1_0.eContents().get(0);
		private final Alternatives cAlternatives_1_0_0_0 = (Alternatives)cGroup_1_0_0.eContents().get(0);
		private final Keyword cRoutineKeyword_1_0_0_0_0 = (Keyword)cAlternatives_1_0_0_0.eContents().get(0);
		private final Keyword cMacroKeyword_1_0_0_0_1 = (Keyword)cAlternatives_1_0_0_0.eContents().get(1);
		private final Assignment cRoutineAssignment_1_0_0_1 = (Assignment)cGroup_1_0_0.eContents().get(1);
		private final RuleCall cRoutineRoutineParserRuleCall_1_0_0_1_0 = (RuleCall)cRoutineAssignment_1_0_0_1.eContents().get(0);
		private final Group cGroup_1_0_1 = (Group)cAlternatives_1_0.eContents().get(1);
		private final Keyword cProcedureKeyword_1_0_1_0 = (Keyword)cGroup_1_0_1.eContents().get(0);
		private final Assignment cProcedureAssignment_1_0_1_1 = (Assignment)cGroup_1_0_1.eContents().get(1);
		private final RuleCall cProcedureProcedureParserRuleCall_1_0_1_1_0 = (RuleCall)cProcedureAssignment_1_0_1_1.eContents().get(0);
		private final Alternatives cAlternatives_1_1 = (Alternatives)cAlternatives_1.eContents().get(1);
		private final Assignment cRoutineAssignment_1_1_0 = (Assignment)cAlternatives_1_1.eContents().get(0);
		private final RuleCall cRoutineRoutineParserRuleCall_1_1_0_0 = (RuleCall)cRoutineAssignment_1_1_0.eContents().get(0);
		private final Assignment cProcedureAssignment_1_1_1 = (Assignment)cAlternatives_1_1.eContents().get(1);
		private final RuleCall cProcedureProcedureParserRuleCall_1_1_1_0 = (RuleCall)cProcedureAssignment_1_1_1.eContents().get(0);
		private final Alternatives cAlternatives_2 = (Alternatives)cGroup.eContents().get(2);
		private final Group cGroup_2_0 = (Group)cAlternatives_2.eContents().get(0);
		private final Alternatives cAlternatives_2_0_0 = (Alternatives)cGroup_2_0.eContents().get(0);
		private final Keyword cCompositeKeyword_2_0_0_0 = (Keyword)cAlternatives_2_0_0.eContents().get(0);
		private final Keyword cMachineKeyword_2_0_0_1 = (Keyword)cAlternatives_2_0_0.eContents().get(1);
		private final Alternatives cAlternatives_2_0_1 = (Alternatives)cGroup_2_0.eContents().get(1);
		private final Assignment cMachineAssignment_2_0_1_0 = (Assignment)cAlternatives_2_0_1.eContents().get(0);
		private final RuleCall cMachineAnyMachineBlockParserRuleCall_2_0_1_0_0 = (RuleCall)cMachineAssignment_2_0_1_0.eContents().get(0);
		private final Assignment cInstanceAssignment_2_0_1_1 = (Assignment)cAlternatives_2_0_1.eContents().get(1);
		private final RuleCall cInstanceInstanceMachineParserRuleCall_2_0_1_1_0 = (RuleCall)cInstanceAssignment_2_0_1_1.eContents().get(0);
		private final Group cGroup_2_1 = (Group)cAlternatives_2.eContents().get(1);
		private final Keyword cModelKeyword_2_1_0 = (Keyword)cGroup_2_1.eContents().get(0);
		private final Assignment cMachineAssignment_2_1_1 = (Assignment)cGroup_2_1.eContents().get(1);
		private final RuleCall cMachineAnyMachineBlockParserRuleCall_2_1_1_0 = (RuleCall)cMachineAssignment_2_1_1.eContents().get(0);
		private final Group cGroup_2_2 = (Group)cAlternatives_2.eContents().get(2);
		private final Keyword cPrototypeKeyword_2_2_0 = (Keyword)cGroup_2_2.eContents().get(0);
		private final Assignment cMachineAssignment_2_2_1 = (Assignment)cGroup_2_2.eContents().get(1);
		private final RuleCall cMachineAnyMachineBlockParserRuleCall_2_2_1_0 = (RuleCall)cMachineAssignment_2_2_1.eContents().get(0);
		private final Group cGroup_2_3 = (Group)cAlternatives_2.eContents().get(3);
		private final Keyword cInstanceKeyword_2_3_0 = (Keyword)cGroup_2_3.eContents().get(0);
		private final Assignment cInstanceAssignment_2_3_1 = (Assignment)cGroup_2_3.eContents().get(1);
		private final RuleCall cInstanceInstanceMachineParserRuleCall_2_3_1_0 = (RuleCall)cInstanceAssignment_2_3_1.eContents().get(0);
		
		//CompositePart returns fmlInfra::CompositePart
		//    : {fmlInfra::CompositePart}
		//        ( ( ( '@routine:' | '@macro:' ) ( routine+=Routine )+
		//          | '@procedure:' ( procedure+=Procedure )+
		//          )*
		//        | ( routine+=Routine | procedure+=Procedure )+
		//        )
		//        ( ( '@composite:' | '@machine:' )
		//            ( machine +=AnyMachineBlock
		//            | instance+=InstanceMachine
		//            )+
		//        | '@model:'     ( machine +=AnyMachineBlock )*
		//        | '@prototype:' ( machine +=AnyMachineBlock )*
		//        | '@instance:'  ( instance+=InstanceMachine )*
		//        )*
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlInfra::CompositePart}
		//       ( ( ( '@routine:' | '@macro:' ) ( routine+=Routine )+
		//         | '@procedure:' ( procedure+=Procedure )+
		//         )*
		//       | ( routine+=Routine | procedure+=Procedure )+
		//       )
		//       ( ( '@composite:' | '@machine:' )
		//           ( machine +=AnyMachineBlock
		//           | instance+=InstanceMachine
		//           )+
		//       | '@model:'     ( machine +=AnyMachineBlock )*
		//       | '@prototype:' ( machine +=AnyMachineBlock )*
		//       | '@instance:'  ( instance+=InstanceMachine )*
		//       )*
		public Group getGroup() { return cGroup; }
		
		//{fmlInfra::CompositePart}
		public Action getCompositePartAction_0() { return cCompositePartAction_0; }
		
		//( ( ( '@routine:' | '@macro:' ) ( routine+=Routine )+
		//  | '@procedure:' ( procedure+=Procedure )+
		//  )*
		//| ( routine+=Routine | procedure+=Procedure )+
		//)
		public Alternatives getAlternatives_1() { return cAlternatives_1; }
		
		//( ( '@routine:' | '@macro:' ) ( routine+=Routine )+
		//         | '@procedure:' ( procedure+=Procedure )+
		//         )*
		public Alternatives getAlternatives_1_0() { return cAlternatives_1_0; }
		
		//( '@routine:' | '@macro:' ) ( routine+=Routine )+
		public Group getGroup_1_0_0() { return cGroup_1_0_0; }
		
		//( '@routine:' | '@macro:' )
		public Alternatives getAlternatives_1_0_0_0() { return cAlternatives_1_0_0_0; }
		
		//'@routine:'
		public Keyword getRoutineKeyword_1_0_0_0_0() { return cRoutineKeyword_1_0_0_0_0; }
		
		//'@macro:'
		public Keyword getMacroKeyword_1_0_0_0_1() { return cMacroKeyword_1_0_0_0_1; }
		
		//( routine+=Routine )+
		public Assignment getRoutineAssignment_1_0_0_1() { return cRoutineAssignment_1_0_0_1; }
		
		//Routine
		public RuleCall getRoutineRoutineParserRuleCall_1_0_0_1_0() { return cRoutineRoutineParserRuleCall_1_0_0_1_0; }
		
		//'@procedure:' ( procedure+=Procedure )+
		public Group getGroup_1_0_1() { return cGroup_1_0_1; }
		
		//'@procedure:'
		public Keyword getProcedureKeyword_1_0_1_0() { return cProcedureKeyword_1_0_1_0; }
		
		//( procedure+=Procedure )+
		public Assignment getProcedureAssignment_1_0_1_1() { return cProcedureAssignment_1_0_1_1; }
		
		//Procedure
		public RuleCall getProcedureProcedureParserRuleCall_1_0_1_1_0() { return cProcedureProcedureParserRuleCall_1_0_1_1_0; }
		
		//( routine+=Routine | procedure+=Procedure )+
		public Alternatives getAlternatives_1_1() { return cAlternatives_1_1; }
		
		//routine+=Routine
		public Assignment getRoutineAssignment_1_1_0() { return cRoutineAssignment_1_1_0; }
		
		//Routine
		public RuleCall getRoutineRoutineParserRuleCall_1_1_0_0() { return cRoutineRoutineParserRuleCall_1_1_0_0; }
		
		//procedure+=Procedure
		public Assignment getProcedureAssignment_1_1_1() { return cProcedureAssignment_1_1_1; }
		
		//Procedure
		public RuleCall getProcedureProcedureParserRuleCall_1_1_1_0() { return cProcedureProcedureParserRuleCall_1_1_1_0; }
		
		//( ( '@composite:' | '@machine:' )
		//    ( machine +=AnyMachineBlock
		//    | instance+=InstanceMachine
		//    )+
		//| '@model:'     ( machine +=AnyMachineBlock )*
		//| '@prototype:' ( machine +=AnyMachineBlock )*
		//| '@instance:'  ( instance+=InstanceMachine )*
		//)*
		public Alternatives getAlternatives_2() { return cAlternatives_2; }
		
		//( '@composite:' | '@machine:' )
		//           ( machine +=AnyMachineBlock
		//           | instance+=InstanceMachine
		//           )+
		public Group getGroup_2_0() { return cGroup_2_0; }
		
		//( '@composite:' | '@machine:' )
		public Alternatives getAlternatives_2_0_0() { return cAlternatives_2_0_0; }
		
		//'@composite:'
		public Keyword getCompositeKeyword_2_0_0_0() { return cCompositeKeyword_2_0_0_0; }
		
		//'@machine:'
		public Keyword getMachineKeyword_2_0_0_1() { return cMachineKeyword_2_0_0_1; }
		
		//( machine +=AnyMachineBlock
		//| instance+=InstanceMachine
		//)+
		public Alternatives getAlternatives_2_0_1() { return cAlternatives_2_0_1; }
		
		//machine +=AnyMachineBlock
		public Assignment getMachineAssignment_2_0_1_0() { return cMachineAssignment_2_0_1_0; }
		
		//AnyMachineBlock
		public RuleCall getMachineAnyMachineBlockParserRuleCall_2_0_1_0_0() { return cMachineAnyMachineBlockParserRuleCall_2_0_1_0_0; }
		
		//instance+=InstanceMachine
		public Assignment getInstanceAssignment_2_0_1_1() { return cInstanceAssignment_2_0_1_1; }
		
		//InstanceMachine
		public RuleCall getInstanceInstanceMachineParserRuleCall_2_0_1_1_0() { return cInstanceInstanceMachineParserRuleCall_2_0_1_1_0; }
		
		//'@model:'     ( machine +=AnyMachineBlock )*
		public Group getGroup_2_1() { return cGroup_2_1; }
		
		//'@model:'
		public Keyword getModelKeyword_2_1_0() { return cModelKeyword_2_1_0; }
		
		//( machine +=AnyMachineBlock )*
		public Assignment getMachineAssignment_2_1_1() { return cMachineAssignment_2_1_1; }
		
		//AnyMachineBlock
		public RuleCall getMachineAnyMachineBlockParserRuleCall_2_1_1_0() { return cMachineAnyMachineBlockParserRuleCall_2_1_1_0; }
		
		//'@prototype:' ( machine +=AnyMachineBlock )*
		public Group getGroup_2_2() { return cGroup_2_2; }
		
		//'@prototype:'
		public Keyword getPrototypeKeyword_2_2_0() { return cPrototypeKeyword_2_2_0; }
		
		//( machine +=AnyMachineBlock )*
		public Assignment getMachineAssignment_2_2_1() { return cMachineAssignment_2_2_1; }
		
		//AnyMachineBlock
		public RuleCall getMachineAnyMachineBlockParserRuleCall_2_2_1_0() { return cMachineAnyMachineBlockParserRuleCall_2_2_1_0; }
		
		//'@instance:'  ( instance+=InstanceMachine )*
		public Group getGroup_2_3() { return cGroup_2_3; }
		
		//'@instance:'
		public Keyword getInstanceKeyword_2_3_0() { return cInstanceKeyword_2_3_0; }
		
		//( instance+=InstanceMachine )*
		public Assignment getInstanceAssignment_2_3_1() { return cInstanceAssignment_2_3_1; }
		
		//InstanceMachine
		public RuleCall getInstanceInstanceMachineParserRuleCall_2_3_1_0() { return cInstanceInstanceMachineParserRuleCall_2_3_1_0; }
	}
	public class BehaviorPartElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.BehaviorPart");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cBehaviorPartAction_0 = (Action)cGroup.eContents().get(0);
		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
		private final Group cGroup_1_0 = (Group)cAlternatives_1.eContents().get(0);
		private final Keyword cBehaviorKeyword_1_0_0 = (Keyword)cGroup_1_0.eContents().get(0);
		private final Assignment cBehaviorAssignment_1_0_1 = (Assignment)cGroup_1_0.eContents().get(1);
		private final RuleCall cBehaviorBehaviorParserRuleCall_1_0_1_0 = (RuleCall)cBehaviorAssignment_1_0_1.eContents().get(0);
		private final Group cGroup_1_1 = (Group)cAlternatives_1.eContents().get(1);
		private final Keyword cStatemachineKeyword_1_1_0 = (Keyword)cGroup_1_1.eContents().get(0);
		private final Assignment cBehaviorAssignment_1_1_1 = (Assignment)cGroup_1_1.eContents().get(1);
		private final RuleCall cBehaviorStatemachineParserRuleCall_1_1_1_0 = (RuleCall)cBehaviorAssignment_1_1_1.eContents().get(0);
		private final Assignment cMainAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cMainMoeBehaviorParserRuleCall_2_0 = (RuleCall)cMainAssignment_2.eContents().get(0);
		
		//BehaviorPart returns fmlInfra::BehaviorPart
		//    : {fmlInfra::BehaviorPart}
		//        ( '@behavior:'     ( behavior+=Behavior )+
		//        | '@statemachine:' ( behavior+=Statemachine )+
		//        )*
		//        main=MoeBehavior
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlInfra::BehaviorPart}
		//       ( '@behavior:'     ( behavior+=Behavior )+
		//       | '@statemachine:' ( behavior+=Statemachine )+
		//       )*
		//       main=MoeBehavior
		public Group getGroup() { return cGroup; }
		
		//{fmlInfra::BehaviorPart}
		public Action getBehaviorPartAction_0() { return cBehaviorPartAction_0; }
		
		//( '@behavior:'     ( behavior+=Behavior )+
		//| '@statemachine:' ( behavior+=Statemachine )+
		//)*
		public Alternatives getAlternatives_1() { return cAlternatives_1; }
		
		//'@behavior:'     ( behavior+=Behavior )+
		public Group getGroup_1_0() { return cGroup_1_0; }
		
		//'@behavior:'
		public Keyword getBehaviorKeyword_1_0_0() { return cBehaviorKeyword_1_0_0; }
		
		//( behavior+=Behavior )+
		public Assignment getBehaviorAssignment_1_0_1() { return cBehaviorAssignment_1_0_1; }
		
		//Behavior
		public RuleCall getBehaviorBehaviorParserRuleCall_1_0_1_0() { return cBehaviorBehaviorParserRuleCall_1_0_1_0; }
		
		//'@statemachine:' ( behavior+=Statemachine )+
		public Group getGroup_1_1() { return cGroup_1_1; }
		
		//'@statemachine:'
		public Keyword getStatemachineKeyword_1_1_0() { return cStatemachineKeyword_1_1_0; }
		
		//( behavior+=Statemachine )+
		public Assignment getBehaviorAssignment_1_1_1() { return cBehaviorAssignment_1_1_1; }
		
		//Statemachine
		public RuleCall getBehaviorStatemachineParserRuleCall_1_1_1_0() { return cBehaviorStatemachineParserRuleCall_1_1_1_0; }
		
		//main=MoeBehavior
		public Assignment getMainAssignment_2() { return cMainAssignment_2; }
		
		//MoeBehavior
		public RuleCall getMainMoeBehaviorParserRuleCall_2_0() { return cMainMoeBehaviorParserRuleCall_2_0; }
	}
	public class ProcedureElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.Procedure");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cVisibilityAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cVisibilityVisibilityKindEnumRuleCall_0_0 = (RuleCall)cVisibilityAssignment_0.eContents().get(0);
		private final Keyword cProcedureKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLessThanSignKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final Keyword cMocKeyword_2_1 = (Keyword)cGroup_2.eContents().get(1);
		private final Alternatives cAlternatives_2_2 = (Alternatives)cGroup_2.eContents().get(2);
		private final Keyword cAndKeyword_2_2_0 = (Keyword)cAlternatives_2_2.eContents().get(0);
		private final Keyword cOrKeyword_2_2_1 = (Keyword)cAlternatives_2_2.eContents().get(1);
		private final Keyword cGreaterThanSignKeyword_2_3 = (Keyword)cGroup_2.eContents().get(3);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
		private final Group cGroup_5 = (Group)cGroup.eContents().get(5);
		private final Group cGroup_5_0 = (Group)cGroup_5.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_5_0_0 = (Keyword)cGroup_5_0.eContents().get(0);
		private final Group cGroup_5_0_1 = (Group)cGroup_5_0.eContents().get(1);
		private final Assignment cParameterAssignment_5_0_1_0 = (Assignment)cGroup_5_0_1.eContents().get(0);
		private final RuleCall cParameterFunctionalParameterParserRuleCall_5_0_1_0_0 = (RuleCall)cParameterAssignment_5_0_1_0.eContents().get(0);
		private final Group cGroup_5_0_1_1 = (Group)cGroup_5_0_1.eContents().get(1);
		private final Keyword cCommaKeyword_5_0_1_1_0 = (Keyword)cGroup_5_0_1_1.eContents().get(0);
		private final Assignment cParameterAssignment_5_0_1_1_1 = (Assignment)cGroup_5_0_1_1.eContents().get(1);
		private final RuleCall cParameterFunctionalParameterParserRuleCall_5_0_1_1_1_0 = (RuleCall)cParameterAssignment_5_0_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_5_0_2 = (Keyword)cGroup_5_0.eContents().get(2);
		private final Group cGroup_5_1 = (Group)cGroup_5.eContents().get(1);
		private final Keyword cHyphenMinusHyphenMinusGreaterThanSignKeyword_5_1_0 = (Keyword)cGroup_5_1.eContents().get(0);
		private final Alternatives cAlternatives_5_1_1 = (Alternatives)cGroup_5_1.eContents().get(1);
		private final Assignment cParameterAssignment_5_1_1_0 = (Assignment)cAlternatives_5_1_1.eContents().get(0);
		private final RuleCall cParameterFormalParameterParserRuleCall_5_1_1_0_0 = (RuleCall)cParameterAssignment_5_1_1_0.eContents().get(0);
		private final Group cGroup_5_1_1_1 = (Group)cAlternatives_5_1_1.eContents().get(1);
		private final Keyword cLeftParenthesisKeyword_5_1_1_1_0 = (Keyword)cGroup_5_1_1_1.eContents().get(0);
		private final Assignment cParameterAssignment_5_1_1_1_1 = (Assignment)cGroup_5_1_1_1.eContents().get(1);
		private final RuleCall cParameterFormalParameterParserRuleCall_5_1_1_1_1_0 = (RuleCall)cParameterAssignment_5_1_1_1_1.eContents().get(0);
		private final Group cGroup_5_1_1_1_2 = (Group)cGroup_5_1_1_1.eContents().get(2);
		private final Keyword cCommaKeyword_5_1_1_1_2_0 = (Keyword)cGroup_5_1_1_1_2.eContents().get(0);
		private final Assignment cParameterAssignment_5_1_1_1_2_1 = (Assignment)cGroup_5_1_1_1_2.eContents().get(1);
		private final RuleCall cParameterFormalParameterParserRuleCall_5_1_1_1_2_1_0 = (RuleCall)cParameterAssignment_5_1_1_1_2_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_5_1_1_1_3 = (Keyword)cGroup_5_1_1_1.eContents().get(3);
		private final Keyword cLeftCurlyBracketKeyword_6 = (Keyword)cGroup.eContents().get(6);
		private final Alternatives cAlternatives_7 = (Alternatives)cGroup.eContents().get(7);
		private final Group cGroup_7_0 = (Group)cAlternatives_7.eContents().get(0);
		private final Keyword cParameterKeyword_7_0_0 = (Keyword)cGroup_7_0.eContents().get(0);
		private final Alternatives cAlternatives_7_0_1 = (Alternatives)cGroup_7_0.eContents().get(1);
		private final Group cGroup_7_0_1_0 = (Group)cAlternatives_7_0_1.eContents().get(0);
		private final Keyword cInputKeyword_7_0_1_0_0 = (Keyword)cGroup_7_0_1_0.eContents().get(0);
		private final Alternatives cAlternatives_7_0_1_0_1 = (Alternatives)cGroup_7_0_1_0.eContents().get(1);
		private final Assignment cParameterAssignment_7_0_1_0_1_0 = (Assignment)cAlternatives_7_0_1_0_1.eContents().get(0);
		private final RuleCall cParameterParameterInputParserRuleCall_7_0_1_0_1_0_0 = (RuleCall)cParameterAssignment_7_0_1_0_1_0.eContents().get(0);
		private final Group cGroup_7_0_1_0_1_1 = (Group)cAlternatives_7_0_1_0_1.eContents().get(1);
		private final Keyword cLeftCurlyBracketKeyword_7_0_1_0_1_1_0 = (Keyword)cGroup_7_0_1_0_1_1.eContents().get(0);
		private final Assignment cParameterAssignment_7_0_1_0_1_1_1 = (Assignment)cGroup_7_0_1_0_1_1.eContents().get(1);
		private final RuleCall cParameterParameterInputParserRuleCall_7_0_1_0_1_1_1_0 = (RuleCall)cParameterAssignment_7_0_1_0_1_1_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_7_0_1_0_1_1_2 = (Keyword)cGroup_7_0_1_0_1_1.eContents().get(2);
		private final Group cGroup_7_0_1_1 = (Group)cAlternatives_7_0_1.eContents().get(1);
		private final Keyword cInoutKeyword_7_0_1_1_0 = (Keyword)cGroup_7_0_1_1.eContents().get(0);
		private final Alternatives cAlternatives_7_0_1_1_1 = (Alternatives)cGroup_7_0_1_1.eContents().get(1);
		private final Assignment cParameterAssignment_7_0_1_1_1_0 = (Assignment)cAlternatives_7_0_1_1_1.eContents().get(0);
		private final RuleCall cParameterParameterInoutParserRuleCall_7_0_1_1_1_0_0 = (RuleCall)cParameterAssignment_7_0_1_1_1_0.eContents().get(0);
		private final Group cGroup_7_0_1_1_1_1 = (Group)cAlternatives_7_0_1_1_1.eContents().get(1);
		private final Keyword cLeftCurlyBracketKeyword_7_0_1_1_1_1_0 = (Keyword)cGroup_7_0_1_1_1_1.eContents().get(0);
		private final Assignment cParameterAssignment_7_0_1_1_1_1_1 = (Assignment)cGroup_7_0_1_1_1_1.eContents().get(1);
		private final RuleCall cParameterParameterInoutParserRuleCall_7_0_1_1_1_1_1_0 = (RuleCall)cParameterAssignment_7_0_1_1_1_1_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_7_0_1_1_1_1_2 = (Keyword)cGroup_7_0_1_1_1_1.eContents().get(2);
		private final Group cGroup_7_0_1_2 = (Group)cAlternatives_7_0_1.eContents().get(2);
		private final Keyword cOutputKeyword_7_0_1_2_0 = (Keyword)cGroup_7_0_1_2.eContents().get(0);
		private final Alternatives cAlternatives_7_0_1_2_1 = (Alternatives)cGroup_7_0_1_2.eContents().get(1);
		private final Assignment cParameterAssignment_7_0_1_2_1_0 = (Assignment)cAlternatives_7_0_1_2_1.eContents().get(0);
		private final RuleCall cParameterParameterOutputParserRuleCall_7_0_1_2_1_0_0 = (RuleCall)cParameterAssignment_7_0_1_2_1_0.eContents().get(0);
		private final Group cGroup_7_0_1_2_1_1 = (Group)cAlternatives_7_0_1_2_1.eContents().get(1);
		private final Keyword cLeftCurlyBracketKeyword_7_0_1_2_1_1_0 = (Keyword)cGroup_7_0_1_2_1_1.eContents().get(0);
		private final Assignment cParameterAssignment_7_0_1_2_1_1_1 = (Assignment)cGroup_7_0_1_2_1_1.eContents().get(1);
		private final RuleCall cParameterParameterOutputParserRuleCall_7_0_1_2_1_1_1_0 = (RuleCall)cParameterAssignment_7_0_1_2_1_1_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_7_0_1_2_1_1_2 = (Keyword)cGroup_7_0_1_2_1_1.eContents().get(2);
		private final Group cGroup_7_0_1_3 = (Group)cAlternatives_7_0_1.eContents().get(3);
		private final Keyword cReturnKeyword_7_0_1_3_0 = (Keyword)cGroup_7_0_1_3.eContents().get(0);
		private final Alternatives cAlternatives_7_0_1_3_1 = (Alternatives)cGroup_7_0_1_3.eContents().get(1);
		private final Assignment cParameterAssignment_7_0_1_3_1_0 = (Assignment)cAlternatives_7_0_1_3_1.eContents().get(0);
		private final RuleCall cParameterParameterReturnParserRuleCall_7_0_1_3_1_0_0 = (RuleCall)cParameterAssignment_7_0_1_3_1_0.eContents().get(0);
		private final Group cGroup_7_0_1_3_1_1 = (Group)cAlternatives_7_0_1_3_1.eContents().get(1);
		private final Keyword cLeftCurlyBracketKeyword_7_0_1_3_1_1_0 = (Keyword)cGroup_7_0_1_3_1_1.eContents().get(0);
		private final Assignment cParameterAssignment_7_0_1_3_1_1_1 = (Assignment)cGroup_7_0_1_3_1_1.eContents().get(1);
		private final RuleCall cParameterParameterReturnParserRuleCall_7_0_1_3_1_1_1_0 = (RuleCall)cParameterAssignment_7_0_1_3_1_1_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_7_0_1_3_1_1_2 = (Keyword)cGroup_7_0_1_3_1_1.eContents().get(2);
		private final Alternatives cAlternatives_7_1 = (Alternatives)cAlternatives_7.eContents().get(1);
		private final Assignment cPortAssignment_7_1_0 = (Assignment)cAlternatives_7_1.eContents().get(0);
		private final RuleCall cPortPortParserRuleCall_7_1_0_0 = (RuleCall)cPortAssignment_7_1_0.eContents().get(0);
		private final Assignment cSignalAssignment_7_1_1 = (Assignment)cAlternatives_7_1.eContents().get(1);
		private final RuleCall cSignalSignalParserRuleCall_7_1_1_0 = (RuleCall)cSignalAssignment_7_1_1.eContents().get(0);
		private final Assignment cBufferAssignment_7_1_2 = (Assignment)cAlternatives_7_1.eContents().get(2);
		private final RuleCall cBufferBufferParserRuleCall_7_1_2_0 = (RuleCall)cBufferAssignment_7_1_2.eContents().get(0);
		private final Assignment cChannelAssignment_7_1_3 = (Assignment)cAlternatives_7_1.eContents().get(3);
		private final RuleCall cChannelChannelParserRuleCall_7_1_3_0 = (RuleCall)cChannelAssignment_7_1_3.eContents().get(0);
		private final Assignment cTypedefAssignment_7_1_4 = (Assignment)cAlternatives_7_1.eContents().get(4);
		private final RuleCall cTypedefTypeDefinitionParserRuleCall_7_1_4_0 = (RuleCall)cTypedefAssignment_7_1_4.eContents().get(0);
		private final Assignment cFunctionAssignment_7_1_5 = (Assignment)cAlternatives_7_1.eContents().get(5);
		private final RuleCall cFunctionFunctionParserRuleCall_7_1_5_0 = (RuleCall)cFunctionAssignment_7_1_5.eContents().get(0);
		private final Assignment cVariableAssignment_7_1_6 = (Assignment)cAlternatives_7_1.eContents().get(6);
		private final RuleCall cVariableVariableParserRuleCall_7_1_6_0 = (RuleCall)cVariableAssignment_7_1_6.eContents().get(0);
		private final Alternatives cAlternatives_8 = (Alternatives)cGroup.eContents().get(8);
		private final Group cGroup_8_0 = (Group)cAlternatives_8.eContents().get(0);
		private final Keyword cInputKeyword_8_0_0 = (Keyword)cGroup_8_0.eContents().get(0);
		private final Assignment cParameterAssignment_8_0_1 = (Assignment)cGroup_8_0.eContents().get(1);
		private final RuleCall cParameterParameterInputParserRuleCall_8_0_1_0 = (RuleCall)cParameterAssignment_8_0_1.eContents().get(0);
		private final Group cGroup_8_1 = (Group)cAlternatives_8.eContents().get(1);
		private final Keyword cInoutKeyword_8_1_0 = (Keyword)cGroup_8_1.eContents().get(0);
		private final Assignment cParameterAssignment_8_1_1 = (Assignment)cGroup_8_1.eContents().get(1);
		private final RuleCall cParameterParameterInoutParserRuleCall_8_1_1_0 = (RuleCall)cParameterAssignment_8_1_1.eContents().get(0);
		private final Group cGroup_8_2 = (Group)cAlternatives_8.eContents().get(2);
		private final Keyword cOutputKeyword_8_2_0 = (Keyword)cGroup_8_2.eContents().get(0);
		private final Assignment cParameterAssignment_8_2_1 = (Assignment)cGroup_8_2.eContents().get(1);
		private final RuleCall cParameterParameterOutputParserRuleCall_8_2_1_0 = (RuleCall)cParameterAssignment_8_2_1.eContents().get(0);
		private final Group cGroup_8_3 = (Group)cAlternatives_8.eContents().get(3);
		private final Keyword cReturnKeyword_8_3_0 = (Keyword)cGroup_8_3.eContents().get(0);
		private final Assignment cParameterAssignment_8_3_1 = (Assignment)cGroup_8_3.eContents().get(1);
		private final RuleCall cParameterParameterReturnParserRuleCall_8_3_1_0 = (RuleCall)cParameterAssignment_8_3_1.eContents().get(0);
		private final Alternatives cAlternatives_9 = (Alternatives)cGroup.eContents().get(9);
		private final Group cGroup_9_0 = (Group)cAlternatives_9.eContents().get(0);
		private final Keyword cPropertyKeyword_9_0_0 = (Keyword)cGroup_9_0.eContents().get(0);
		private final Alternatives cAlternatives_9_0_1 = (Alternatives)cGroup_9_0.eContents().get(1);
		private final Assignment cPortAssignment_9_0_1_0 = (Assignment)cAlternatives_9_0_1.eContents().get(0);
		private final RuleCall cPortPortParserRuleCall_9_0_1_0_0 = (RuleCall)cPortAssignment_9_0_1_0.eContents().get(0);
		private final Assignment cSignalAssignment_9_0_1_1 = (Assignment)cAlternatives_9_0_1.eContents().get(1);
		private final RuleCall cSignalSignalParserRuleCall_9_0_1_1_0 = (RuleCall)cSignalAssignment_9_0_1_1.eContents().get(0);
		private final Assignment cBufferAssignment_9_0_1_2 = (Assignment)cAlternatives_9_0_1.eContents().get(2);
		private final RuleCall cBufferBufferParserRuleCall_9_0_1_2_0 = (RuleCall)cBufferAssignment_9_0_1_2.eContents().get(0);
		private final Assignment cChannelAssignment_9_0_1_3 = (Assignment)cAlternatives_9_0_1.eContents().get(3);
		private final RuleCall cChannelChannelParserRuleCall_9_0_1_3_0 = (RuleCall)cChannelAssignment_9_0_1_3.eContents().get(0);
		private final Assignment cTypedefAssignment_9_0_1_4 = (Assignment)cAlternatives_9_0_1.eContents().get(4);
		private final RuleCall cTypedefTypeDefinitionParserRuleCall_9_0_1_4_0 = (RuleCall)cTypedefAssignment_9_0_1_4.eContents().get(0);
		private final Assignment cFunctionAssignment_9_0_1_5 = (Assignment)cAlternatives_9_0_1.eContents().get(5);
		private final RuleCall cFunctionFunctionParserRuleCall_9_0_1_5_0 = (RuleCall)cFunctionAssignment_9_0_1_5.eContents().get(0);
		private final Assignment cVariableAssignment_9_0_1_6 = (Assignment)cAlternatives_9_0_1.eContents().get(6);
		private final RuleCall cVariableVariableParserRuleCall_9_0_1_6_0 = (RuleCall)cVariableAssignment_9_0_1_6.eContents().get(0);
		private final Group cGroup_9_1 = (Group)cAlternatives_9.eContents().get(1);
		private final Keyword cPublicKeyword_9_1_0 = (Keyword)cGroup_9_1.eContents().get(0);
		private final Alternatives cAlternatives_9_1_1 = (Alternatives)cGroup_9_1.eContents().get(1);
		private final Assignment cPortAssignment_9_1_1_0 = (Assignment)cAlternatives_9_1_1.eContents().get(0);
		private final RuleCall cPortPortPublicParserRuleCall_9_1_1_0_0 = (RuleCall)cPortAssignment_9_1_1_0.eContents().get(0);
		private final Assignment cSignalAssignment_9_1_1_1 = (Assignment)cAlternatives_9_1_1.eContents().get(1);
		private final RuleCall cSignalSignalPublicParserRuleCall_9_1_1_1_0 = (RuleCall)cSignalAssignment_9_1_1_1.eContents().get(0);
		private final Assignment cBufferAssignment_9_1_1_2 = (Assignment)cAlternatives_9_1_1.eContents().get(2);
		private final RuleCall cBufferBufferPublicParserRuleCall_9_1_1_2_0 = (RuleCall)cBufferAssignment_9_1_1_2.eContents().get(0);
		private final Assignment cChannelAssignment_9_1_1_3 = (Assignment)cAlternatives_9_1_1.eContents().get(3);
		private final RuleCall cChannelChannelPublicParserRuleCall_9_1_1_3_0 = (RuleCall)cChannelAssignment_9_1_1_3.eContents().get(0);
		private final Assignment cTypedefAssignment_9_1_1_4 = (Assignment)cAlternatives_9_1_1.eContents().get(4);
		private final RuleCall cTypedefTypeDefinitionParserRuleCall_9_1_1_4_0 = (RuleCall)cTypedefAssignment_9_1_1_4.eContents().get(0);
		private final Assignment cFunctionAssignment_9_1_1_5 = (Assignment)cAlternatives_9_1_1.eContents().get(5);
		private final RuleCall cFunctionFunctionPublicParserRuleCall_9_1_1_5_0 = (RuleCall)cFunctionAssignment_9_1_1_5.eContents().get(0);
		private final Assignment cVariableAssignment_9_1_1_6 = (Assignment)cAlternatives_9_1_1.eContents().get(6);
		private final RuleCall cVariableVariablePublicParserRuleCall_9_1_1_6_0 = (RuleCall)cVariableAssignment_9_1_1_6.eContents().get(0);
		private final Group cGroup_9_2 = (Group)cAlternatives_9.eContents().get(2);
		private final Keyword cProtectedKeyword_9_2_0 = (Keyword)cGroup_9_2.eContents().get(0);
		private final Alternatives cAlternatives_9_2_1 = (Alternatives)cGroup_9_2.eContents().get(1);
		private final Assignment cPortAssignment_9_2_1_0 = (Assignment)cAlternatives_9_2_1.eContents().get(0);
		private final RuleCall cPortPortProtectedParserRuleCall_9_2_1_0_0 = (RuleCall)cPortAssignment_9_2_1_0.eContents().get(0);
		private final Assignment cSignalAssignment_9_2_1_1 = (Assignment)cAlternatives_9_2_1.eContents().get(1);
		private final RuleCall cSignalSignalProtectedParserRuleCall_9_2_1_1_0 = (RuleCall)cSignalAssignment_9_2_1_1.eContents().get(0);
		private final Assignment cBufferAssignment_9_2_1_2 = (Assignment)cAlternatives_9_2_1.eContents().get(2);
		private final RuleCall cBufferBufferProtectedParserRuleCall_9_2_1_2_0 = (RuleCall)cBufferAssignment_9_2_1_2.eContents().get(0);
		private final Assignment cChannelAssignment_9_2_1_3 = (Assignment)cAlternatives_9_2_1.eContents().get(3);
		private final RuleCall cChannelChannelProtectedParserRuleCall_9_2_1_3_0 = (RuleCall)cChannelAssignment_9_2_1_3.eContents().get(0);
		private final Assignment cTypedefAssignment_9_2_1_4 = (Assignment)cAlternatives_9_2_1.eContents().get(4);
		private final RuleCall cTypedefTypeDefinitionParserRuleCall_9_2_1_4_0 = (RuleCall)cTypedefAssignment_9_2_1_4.eContents().get(0);
		private final Assignment cFunctionAssignment_9_2_1_5 = (Assignment)cAlternatives_9_2_1.eContents().get(5);
		private final RuleCall cFunctionFunctionProtectedParserRuleCall_9_2_1_5_0 = (RuleCall)cFunctionAssignment_9_2_1_5.eContents().get(0);
		private final Assignment cVariableAssignment_9_2_1_6 = (Assignment)cAlternatives_9_2_1.eContents().get(6);
		private final RuleCall cVariableVariableProtectedParserRuleCall_9_2_1_6_0 = (RuleCall)cVariableAssignment_9_2_1_6.eContents().get(0);
		private final Group cGroup_9_3 = (Group)cAlternatives_9.eContents().get(3);
		private final Keyword cPrivateKeyword_9_3_0 = (Keyword)cGroup_9_3.eContents().get(0);
		private final Alternatives cAlternatives_9_3_1 = (Alternatives)cGroup_9_3.eContents().get(1);
		private final Assignment cPortAssignment_9_3_1_0 = (Assignment)cAlternatives_9_3_1.eContents().get(0);
		private final RuleCall cPortPortPrivateParserRuleCall_9_3_1_0_0 = (RuleCall)cPortAssignment_9_3_1_0.eContents().get(0);
		private final Assignment cSignalAssignment_9_3_1_1 = (Assignment)cAlternatives_9_3_1.eContents().get(1);
		private final RuleCall cSignalSignalPrivateParserRuleCall_9_3_1_1_0 = (RuleCall)cSignalAssignment_9_3_1_1.eContents().get(0);
		private final Assignment cBufferAssignment_9_3_1_2 = (Assignment)cAlternatives_9_3_1.eContents().get(2);
		private final RuleCall cBufferBufferPrivateParserRuleCall_9_3_1_2_0 = (RuleCall)cBufferAssignment_9_3_1_2.eContents().get(0);
		private final Assignment cChannelAssignment_9_3_1_3 = (Assignment)cAlternatives_9_3_1.eContents().get(3);
		private final RuleCall cChannelChannelPrivateParserRuleCall_9_3_1_3_0 = (RuleCall)cChannelAssignment_9_3_1_3.eContents().get(0);
		private final Assignment cTypedefAssignment_9_3_1_4 = (Assignment)cAlternatives_9_3_1.eContents().get(4);
		private final RuleCall cTypedefTypeDefinitionParserRuleCall_9_3_1_4_0 = (RuleCall)cTypedefAssignment_9_3_1_4.eContents().get(0);
		private final Assignment cFunctionAssignment_9_3_1_5 = (Assignment)cAlternatives_9_3_1.eContents().get(5);
		private final RuleCall cFunctionFunctionPrivateParserRuleCall_9_3_1_5_0 = (RuleCall)cFunctionAssignment_9_3_1_5.eContents().get(0);
		private final Assignment cVariableAssignment_9_3_1_6 = (Assignment)cAlternatives_9_3_1.eContents().get(6);
		private final RuleCall cVariableVariablePrivateParserRuleCall_9_3_1_6_0 = (RuleCall)cVariableAssignment_9_3_1_6.eContents().get(0);
		private final Alternatives cAlternatives_10 = (Alternatives)cGroup.eContents().get(10);
		private final Alternatives cAlternatives_10_0 = (Alternatives)cAlternatives_10.eContents().get(0);
		private final Group cGroup_10_0_0 = (Group)cAlternatives_10_0.eContents().get(0);
		private final Alternatives cAlternatives_10_0_0_0 = (Alternatives)cGroup_10_0_0.eContents().get(0);
		private final Keyword cRoutineKeyword_10_0_0_0_0 = (Keyword)cAlternatives_10_0_0_0.eContents().get(0);
		private final Keyword cMacroKeyword_10_0_0_0_1 = (Keyword)cAlternatives_10_0_0_0.eContents().get(1);
		private final Assignment cRoutineAssignment_10_0_0_1 = (Assignment)cGroup_10_0_0.eContents().get(1);
		private final RuleCall cRoutineRoutineParserRuleCall_10_0_0_1_0 = (RuleCall)cRoutineAssignment_10_0_0_1.eContents().get(0);
		private final Group cGroup_10_0_1 = (Group)cAlternatives_10_0.eContents().get(1);
		private final Keyword cProcedureKeyword_10_0_1_0 = (Keyword)cGroup_10_0_1.eContents().get(0);
		private final Assignment cProcedureAssignment_10_0_1_1 = (Assignment)cGroup_10_0_1.eContents().get(1);
		private final RuleCall cProcedureProcedureParserRuleCall_10_0_1_1_0 = (RuleCall)cProcedureAssignment_10_0_1_1.eContents().get(0);
		private final Alternatives cAlternatives_10_1 = (Alternatives)cAlternatives_10.eContents().get(1);
		private final Assignment cRoutineAssignment_10_1_0 = (Assignment)cAlternatives_10_1.eContents().get(0);
		private final RuleCall cRoutineRoutineParserRuleCall_10_1_0_0 = (RuleCall)cRoutineAssignment_10_1_0.eContents().get(0);
		private final Assignment cProcedureAssignment_10_1_1 = (Assignment)cAlternatives_10_1.eContents().get(1);
		private final RuleCall cProcedureProcedureParserRuleCall_10_1_1_0 = (RuleCall)cProcedureAssignment_10_1_1.eContents().get(0);
		private final Assignment cExecutionAssignment_11 = (Assignment)cGroup.eContents().get(11);
		private final RuleCall cExecutionProcedureExecutionParserRuleCall_11_0 = (RuleCall)cExecutionAssignment_11.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_12 = (Keyword)cGroup.eContents().get(12);
		
		//////////////////////////////////////////////////////////////////////////////////
		//// Procedure View Rules
		//////////////////////////////////////////////////////////////////////////////////
		//Procedure returns fmlInfra::Procedure
		//    : ( visibility=VisibilityKind )?
		//        'procedure' ( '<' ( 'moc:' )?  ( 'and' | 'or' ) '>' )?
		//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//        ( ( '(' ( parameter+=FunctionalParameter
		//            ( ',' parameter+=FunctionalParameter )* )? ')' )?
		//             ( '-->'
		//                 ( parameter+=FormalParameter
		//                 | '('  parameter+=FormalParameter
		//                     ( ',' parameter+=FormalParameter )* ')'
		//                 )
		//             )?
		//         )?
		//        '{'
		//        ( '@parameter:'
		//            ( 'input'
		//                ( parameter+=ParameterInput
		//                | '{' ( parameter+=ParameterInput )+ '}'
		//                )
		//            | 'inout'
		//                ( parameter+=ParameterInout
		//                | '{' ( parameter+=ParameterInout )+ '}'
		//                )
		//            | 'output'
		//                ( parameter+=ParameterOutput
		//                | '{' ( parameter+=ParameterOutput )+ '}'
		//                )
		//            | 'return'
		//                ( parameter+=ParameterReturn
		//                | '{' ( parameter+=ParameterReturn )+ '}'
		//                )
		//            )*
		//        | // optional unnamed section for property full declaration / definition
		//            ( port+=Port
		//            | signal+=Signal
		//            | buffer+=Buffer
		//            | channel+=Channel
		//            | typedef+=TypeDefinition
		//            | function+=Function
		//            | variable+=Variable
		//            )*
		//        )
		//        ( '@input:'
		//            ( parameter+=ParameterInput  )*
		//        | '@inout:'
		//            ( parameter+=ParameterInout  )*
		//        | '@output:'
		//            ( parameter+=ParameterOutput )*
		//        | '@return:'
		//            ( parameter+=ParameterReturn )*
		//        )*
		//        ( '@property:'
		//            ( port+=Port
		//            | signal+=Signal
		//            | buffer+=Buffer
		//            | channel+=Channel
		//            | typedef+=TypeDefinition
		//            | function+=Function
		//            | variable+=Variable
		//            )*
		//        | '@public:'
		//            ( port+=PortPublic
		//            | signal+=SignalPublic
		//            | buffer+=BufferPublic
		//            | channel+=ChannelPublic
		//            | typedef+=TypeDefinition
		//            | function+=FunctionPublic
		//            | variable+=VariablePublic
		//            )*
		//        | '@protected:'
		//            ( port+=PortProtected
		//            | signal+=SignalProtected
		//            | buffer+=BufferProtected
		//            | channel+=ChannelProtected
		//            | typedef+=TypeDefinition
		//            | function+=FunctionProtected
		//            | variable+=VariableProtected
		//            )*
		//        | '@private:'
		//            ( port+=PortPrivate
		//            | signal+=SignalPrivate
		//            | buffer+=BufferPrivate
		//            | channel+=ChannelPrivate
		//            | typedef+=TypeDefinition
		//            | function+=FunctionPrivate
		//            | variable+=VariablePrivate
		//            )*
		//        )*
		//        ( ( ( '@routine:' | '@macro:' ) ( routine+=Routine )+
		//          | '@procedure:' ( procedure+=Procedure )+
		//          )*
		//        | ( routine+=Routine | procedure+=Procedure )+
		//        )
		////        // optional unnamed section for property full declaration / definition
		////        propertyPart=PropertyPart
		////
		////        compositePart=CompositePart
		////        ( region+=StatemachineRegion
		////        | ( region+=StatemachineNamedRegion )+
		////        | region+=StatemachineRegionLite
		////        )?
		//        ( ( execution=ProcedureExecution )?
		////        & ( computation=ModelOfComputation )?
		////        & ( interaction=ModelOfInteraction )?
		//        )
		//        '}'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		// ( visibility=VisibilityKind )?
		//        'procedure' ( '<' ( 'moc:' )?  ( 'and' | 'or' ) '>' )?
		//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//        ( ( '(' ( parameter+=FunctionalParameter
		//            ( ',' parameter+=FunctionalParameter )* )? ')' )?
		//             ( '-->'
		//                 ( parameter+=FormalParameter
		//                 | '('  parameter+=FormalParameter
		//                     ( ',' parameter+=FormalParameter )* ')'
		//                 )
		//             )?
		//         )?
		//        '{'
		//        ( '@parameter:'
		//            ( 'input'
		//                ( parameter+=ParameterInput
		//                | '{' ( parameter+=ParameterInput )+ '}'
		//                )
		//            | 'inout'
		//                ( parameter+=ParameterInout
		//                | '{' ( parameter+=ParameterInout )+ '}'
		//                )
		//            | 'output'
		//                ( parameter+=ParameterOutput
		//                | '{' ( parameter+=ParameterOutput )+ '}'
		//                )
		//            | 'return'
		//                ( parameter+=ParameterReturn
		//                | '{' ( parameter+=ParameterReturn )+ '}'
		//                )
		//            )*
		//        | // optional unnamed section for property full declaration / definition
		//            ( port+=Port
		//            | signal+=Signal
		//            | buffer+=Buffer
		//            | channel+=Channel
		//            | typedef+=TypeDefinition
		//            | function+=Function
		//            | variable+=Variable
		//            )*
		//        )
		//        ( '@input:'
		//            ( parameter+=ParameterInput  )*
		//        | '@inout:'
		//            ( parameter+=ParameterInout  )*
		//        | '@output:'
		//            ( parameter+=ParameterOutput )*
		//        | '@return:'
		//            ( parameter+=ParameterReturn )*
		//        )*
		//        ( '@property:'
		//            ( port+=Port
		//            | signal+=Signal
		//            | buffer+=Buffer
		//            | channel+=Channel
		//            | typedef+=TypeDefinition
		//            | function+=Function
		//            | variable+=Variable
		//            )*
		//        | '@public:'
		//            ( port+=PortPublic
		//            | signal+=SignalPublic
		//            | buffer+=BufferPublic
		//            | channel+=ChannelPublic
		//            | typedef+=TypeDefinition
		//            | function+=FunctionPublic
		//            | variable+=VariablePublic
		//            )*
		//        | '@protected:'
		//            ( port+=PortProtected
		//            | signal+=SignalProtected
		//            | buffer+=BufferProtected
		//            | channel+=ChannelProtected
		//            | typedef+=TypeDefinition
		//            | function+=FunctionProtected
		//            | variable+=VariableProtected
		//            )*
		//        | '@private:'
		//            ( port+=PortPrivate
		//            | signal+=SignalPrivate
		//            | buffer+=BufferPrivate
		//            | channel+=ChannelPrivate
		//            | typedef+=TypeDefinition
		//            | function+=FunctionPrivate
		//            | variable+=VariablePrivate
		//            )*
		//        )*
		//        ( ( ( '@routine:' | '@macro:' ) ( routine+=Routine )+
		//          | '@procedure:' ( procedure+=Procedure )+
		//          )*
		//        | ( routine+=Routine | procedure+=Procedure )+
		//        )
		////        // optional unnamed section for property full declaration / definition
		////        propertyPart=PropertyPart
		////
		////        compositePart=CompositePart
		////        ( region+=StatemachineRegion
		////        | ( region+=StatemachineNamedRegion )+
		////        | region+=StatemachineRegionLite
		////        )?
		//        ( ( execution=ProcedureExecution )?
		////        & ( computation=ModelOfComputation )?
		////        & ( interaction=ModelOfInteraction )?
		//        )
		//        '}'
		public Group getGroup() { return cGroup; }
		
		//( visibility=VisibilityKind )?
		public Assignment getVisibilityAssignment_0() { return cVisibilityAssignment_0; }
		
		//VisibilityKind
		public RuleCall getVisibilityVisibilityKindEnumRuleCall_0_0() { return cVisibilityVisibilityKindEnumRuleCall_0_0; }
		
		//'procedure'
		public Keyword getProcedureKeyword_1() { return cProcedureKeyword_1; }
		
		//( '<' ( 'moc:' )?  ( 'and' | 'or' ) '>' )?
		public Group getGroup_2() { return cGroup_2; }
		
		//'<'
		public Keyword getLessThanSignKeyword_2_0() { return cLessThanSignKeyword_2_0; }
		
		//( 'moc:' )?
		public Keyword getMocKeyword_2_1() { return cMocKeyword_2_1; }
		
		//( 'and' | 'or' )
		public Alternatives getAlternatives_2_2() { return cAlternatives_2_2; }
		
		//'and'
		public Keyword getAndKeyword_2_2_0() { return cAndKeyword_2_2_0; }
		
		//'or'
		public Keyword getOrKeyword_2_2_1() { return cOrKeyword_2_2_1; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_2_3() { return cGreaterThanSignKeyword_2_3; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
		
		//( ( '(' ( parameter+=FunctionalParameter
		//    ( ',' parameter+=FunctionalParameter )* )? ')' )?
		//     ( '-->'
		//         ( parameter+=FormalParameter
		//         | '('  parameter+=FormalParameter
		//             ( ',' parameter+=FormalParameter )* ')'
		//         )
		//     )?
		// )?
		public Group getGroup_5() { return cGroup_5; }
		
		//( '(' ( parameter+=FunctionalParameter
		//           ( ',' parameter+=FunctionalParameter )* )? ')' )?
		public Group getGroup_5_0() { return cGroup_5_0; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_5_0_0() { return cLeftParenthesisKeyword_5_0_0; }
		
		//( parameter+=FunctionalParameter
		//           ( ',' parameter+=FunctionalParameter )* )?
		public Group getGroup_5_0_1() { return cGroup_5_0_1; }
		
		//parameter+=FunctionalParameter
		public Assignment getParameterAssignment_5_0_1_0() { return cParameterAssignment_5_0_1_0; }
		
		//FunctionalParameter
		public RuleCall getParameterFunctionalParameterParserRuleCall_5_0_1_0_0() { return cParameterFunctionalParameterParserRuleCall_5_0_1_0_0; }
		
		//( ',' parameter+=FunctionalParameter )*
		public Group getGroup_5_0_1_1() { return cGroup_5_0_1_1; }
		
		//','
		public Keyword getCommaKeyword_5_0_1_1_0() { return cCommaKeyword_5_0_1_1_0; }
		
		//parameter+=FunctionalParameter
		public Assignment getParameterAssignment_5_0_1_1_1() { return cParameterAssignment_5_0_1_1_1; }
		
		//FunctionalParameter
		public RuleCall getParameterFunctionalParameterParserRuleCall_5_0_1_1_1_0() { return cParameterFunctionalParameterParserRuleCall_5_0_1_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_5_0_2() { return cRightParenthesisKeyword_5_0_2; }
		
		//( '-->'
		//    ( parameter+=FormalParameter
		//    | '('  parameter+=FormalParameter
		//        ( ',' parameter+=FormalParameter )* ')'
		//    )
		//)?
		public Group getGroup_5_1() { return cGroup_5_1; }
		
		//'-->'
		public Keyword getHyphenMinusHyphenMinusGreaterThanSignKeyword_5_1_0() { return cHyphenMinusHyphenMinusGreaterThanSignKeyword_5_1_0; }
		
		//( parameter+=FormalParameter
		//| '('  parameter+=FormalParameter
		//    ( ',' parameter+=FormalParameter )* ')'
		//)
		public Alternatives getAlternatives_5_1_1() { return cAlternatives_5_1_1; }
		
		//parameter+=FormalParameter
		public Assignment getParameterAssignment_5_1_1_0() { return cParameterAssignment_5_1_1_0; }
		
		//FormalParameter
		public RuleCall getParameterFormalParameterParserRuleCall_5_1_1_0_0() { return cParameterFormalParameterParserRuleCall_5_1_1_0_0; }
		
		//'('  parameter+=FormalParameter
		//                    ( ',' parameter+=FormalParameter )* ')'
		public Group getGroup_5_1_1_1() { return cGroup_5_1_1_1; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_5_1_1_1_0() { return cLeftParenthesisKeyword_5_1_1_1_0; }
		
		//parameter+=FormalParameter
		public Assignment getParameterAssignment_5_1_1_1_1() { return cParameterAssignment_5_1_1_1_1; }
		
		//FormalParameter
		public RuleCall getParameterFormalParameterParserRuleCall_5_1_1_1_1_0() { return cParameterFormalParameterParserRuleCall_5_1_1_1_1_0; }
		
		//( ',' parameter+=FormalParameter )*
		public Group getGroup_5_1_1_1_2() { return cGroup_5_1_1_1_2; }
		
		//','
		public Keyword getCommaKeyword_5_1_1_1_2_0() { return cCommaKeyword_5_1_1_1_2_0; }
		
		//parameter+=FormalParameter
		public Assignment getParameterAssignment_5_1_1_1_2_1() { return cParameterAssignment_5_1_1_1_2_1; }
		
		//FormalParameter
		public RuleCall getParameterFormalParameterParserRuleCall_5_1_1_1_2_1_0() { return cParameterFormalParameterParserRuleCall_5_1_1_1_2_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_5_1_1_1_3() { return cRightParenthesisKeyword_5_1_1_1_3; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_6() { return cLeftCurlyBracketKeyword_6; }
		
		//( '@parameter:'
		//    ( 'input'
		//        ( parameter+=ParameterInput
		//        | '{' ( parameter+=ParameterInput )+ '}'
		//        )
		//    | 'inout'
		//        ( parameter+=ParameterInout
		//        | '{' ( parameter+=ParameterInout )+ '}'
		//        )
		//    | 'output'
		//        ( parameter+=ParameterOutput
		//        | '{' ( parameter+=ParameterOutput )+ '}'
		//        )
		//    | 'return'
		//        ( parameter+=ParameterReturn
		//        | '{' ( parameter+=ParameterReturn )+ '}'
		//        )
		//    )*
		//| // optional unnamed section for property full declaration / definition
		//    ( port+=Port
		//    | signal+=Signal
		//    | buffer+=Buffer
		//    | channel+=Channel
		//    | typedef+=TypeDefinition
		//    | function+=Function
		//    | variable+=Variable
		//    )*
		//)
		public Alternatives getAlternatives_7() { return cAlternatives_7; }
		
		//'@parameter:'
		//           ( 'input'
		//               ( parameter+=ParameterInput
		//               | '{' ( parameter+=ParameterInput )+ '}'
		//               )
		//           | 'inout'
		//               ( parameter+=ParameterInout
		//               | '{' ( parameter+=ParameterInout )+ '}'
		//               )
		//           | 'output'
		//               ( parameter+=ParameterOutput
		//               | '{' ( parameter+=ParameterOutput )+ '}'
		//               )
		//           | 'return'
		//               ( parameter+=ParameterReturn
		//               | '{' ( parameter+=ParameterReturn )+ '}'
		//               )
		//           )*
		public Group getGroup_7_0() { return cGroup_7_0; }
		
		//'@parameter:'
		public Keyword getParameterKeyword_7_0_0() { return cParameterKeyword_7_0_0; }
		
		//( 'input'
		//    ( parameter+=ParameterInput
		//    | '{' ( parameter+=ParameterInput )+ '}'
		//    )
		//| 'inout'
		//    ( parameter+=ParameterInout
		//    | '{' ( parameter+=ParameterInout )+ '}'
		//    )
		//| 'output'
		//    ( parameter+=ParameterOutput
		//    | '{' ( parameter+=ParameterOutput )+ '}'
		//    )
		//| 'return'
		//    ( parameter+=ParameterReturn
		//    | '{' ( parameter+=ParameterReturn )+ '}'
		//    )
		//)*
		public Alternatives getAlternatives_7_0_1() { return cAlternatives_7_0_1; }
		
		//'input'
		//               ( parameter+=ParameterInput
		//               | '{' ( parameter+=ParameterInput )+ '}'
		//               )
		public Group getGroup_7_0_1_0() { return cGroup_7_0_1_0; }
		
		//'input'
		public Keyword getInputKeyword_7_0_1_0_0() { return cInputKeyword_7_0_1_0_0; }
		
		//( parameter+=ParameterInput
		//| '{' ( parameter+=ParameterInput )+ '}'
		//)
		public Alternatives getAlternatives_7_0_1_0_1() { return cAlternatives_7_0_1_0_1; }
		
		//parameter+=ParameterInput
		public Assignment getParameterAssignment_7_0_1_0_1_0() { return cParameterAssignment_7_0_1_0_1_0; }
		
		//ParameterInput
		public RuleCall getParameterParameterInputParserRuleCall_7_0_1_0_1_0_0() { return cParameterParameterInputParserRuleCall_7_0_1_0_1_0_0; }
		
		//'{' ( parameter+=ParameterInput )+ '}'
		public Group getGroup_7_0_1_0_1_1() { return cGroup_7_0_1_0_1_1; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_7_0_1_0_1_1_0() { return cLeftCurlyBracketKeyword_7_0_1_0_1_1_0; }
		
		//( parameter+=ParameterInput )+
		public Assignment getParameterAssignment_7_0_1_0_1_1_1() { return cParameterAssignment_7_0_1_0_1_1_1; }
		
		//ParameterInput
		public RuleCall getParameterParameterInputParserRuleCall_7_0_1_0_1_1_1_0() { return cParameterParameterInputParserRuleCall_7_0_1_0_1_1_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_7_0_1_0_1_1_2() { return cRightCurlyBracketKeyword_7_0_1_0_1_1_2; }
		
		//'inout'
		//               ( parameter+=ParameterInout
		//               | '{' ( parameter+=ParameterInout )+ '}'
		//               )
		public Group getGroup_7_0_1_1() { return cGroup_7_0_1_1; }
		
		//'inout'
		public Keyword getInoutKeyword_7_0_1_1_0() { return cInoutKeyword_7_0_1_1_0; }
		
		//( parameter+=ParameterInout
		//| '{' ( parameter+=ParameterInout )+ '}'
		//)
		public Alternatives getAlternatives_7_0_1_1_1() { return cAlternatives_7_0_1_1_1; }
		
		//parameter+=ParameterInout
		public Assignment getParameterAssignment_7_0_1_1_1_0() { return cParameterAssignment_7_0_1_1_1_0; }
		
		//ParameterInout
		public RuleCall getParameterParameterInoutParserRuleCall_7_0_1_1_1_0_0() { return cParameterParameterInoutParserRuleCall_7_0_1_1_1_0_0; }
		
		//'{' ( parameter+=ParameterInout )+ '}'
		public Group getGroup_7_0_1_1_1_1() { return cGroup_7_0_1_1_1_1; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_7_0_1_1_1_1_0() { return cLeftCurlyBracketKeyword_7_0_1_1_1_1_0; }
		
		//( parameter+=ParameterInout )+
		public Assignment getParameterAssignment_7_0_1_1_1_1_1() { return cParameterAssignment_7_0_1_1_1_1_1; }
		
		//ParameterInout
		public RuleCall getParameterParameterInoutParserRuleCall_7_0_1_1_1_1_1_0() { return cParameterParameterInoutParserRuleCall_7_0_1_1_1_1_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_7_0_1_1_1_1_2() { return cRightCurlyBracketKeyword_7_0_1_1_1_1_2; }
		
		//'output'
		//               ( parameter+=ParameterOutput
		//               | '{' ( parameter+=ParameterOutput )+ '}'
		//               )
		public Group getGroup_7_0_1_2() { return cGroup_7_0_1_2; }
		
		//'output'
		public Keyword getOutputKeyword_7_0_1_2_0() { return cOutputKeyword_7_0_1_2_0; }
		
		//( parameter+=ParameterOutput
		//| '{' ( parameter+=ParameterOutput )+ '}'
		//)
		public Alternatives getAlternatives_7_0_1_2_1() { return cAlternatives_7_0_1_2_1; }
		
		//parameter+=ParameterOutput
		public Assignment getParameterAssignment_7_0_1_2_1_0() { return cParameterAssignment_7_0_1_2_1_0; }
		
		//ParameterOutput
		public RuleCall getParameterParameterOutputParserRuleCall_7_0_1_2_1_0_0() { return cParameterParameterOutputParserRuleCall_7_0_1_2_1_0_0; }
		
		//'{' ( parameter+=ParameterOutput )+ '}'
		public Group getGroup_7_0_1_2_1_1() { return cGroup_7_0_1_2_1_1; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_7_0_1_2_1_1_0() { return cLeftCurlyBracketKeyword_7_0_1_2_1_1_0; }
		
		//( parameter+=ParameterOutput )+
		public Assignment getParameterAssignment_7_0_1_2_1_1_1() { return cParameterAssignment_7_0_1_2_1_1_1; }
		
		//ParameterOutput
		public RuleCall getParameterParameterOutputParserRuleCall_7_0_1_2_1_1_1_0() { return cParameterParameterOutputParserRuleCall_7_0_1_2_1_1_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_7_0_1_2_1_1_2() { return cRightCurlyBracketKeyword_7_0_1_2_1_1_2; }
		
		//'return'
		//               ( parameter+=ParameterReturn
		//               | '{' ( parameter+=ParameterReturn )+ '}'
		//               )
		public Group getGroup_7_0_1_3() { return cGroup_7_0_1_3; }
		
		//'return'
		public Keyword getReturnKeyword_7_0_1_3_0() { return cReturnKeyword_7_0_1_3_0; }
		
		//( parameter+=ParameterReturn
		//| '{' ( parameter+=ParameterReturn )+ '}'
		//)
		public Alternatives getAlternatives_7_0_1_3_1() { return cAlternatives_7_0_1_3_1; }
		
		//parameter+=ParameterReturn
		public Assignment getParameterAssignment_7_0_1_3_1_0() { return cParameterAssignment_7_0_1_3_1_0; }
		
		//ParameterReturn
		public RuleCall getParameterParameterReturnParserRuleCall_7_0_1_3_1_0_0() { return cParameterParameterReturnParserRuleCall_7_0_1_3_1_0_0; }
		
		//'{' ( parameter+=ParameterReturn )+ '}'
		public Group getGroup_7_0_1_3_1_1() { return cGroup_7_0_1_3_1_1; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_7_0_1_3_1_1_0() { return cLeftCurlyBracketKeyword_7_0_1_3_1_1_0; }
		
		//( parameter+=ParameterReturn )+
		public Assignment getParameterAssignment_7_0_1_3_1_1_1() { return cParameterAssignment_7_0_1_3_1_1_1; }
		
		//ParameterReturn
		public RuleCall getParameterParameterReturnParserRuleCall_7_0_1_3_1_1_1_0() { return cParameterParameterReturnParserRuleCall_7_0_1_3_1_1_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_7_0_1_3_1_1_2() { return cRightCurlyBracketKeyword_7_0_1_3_1_1_2; }
		
		//// optional unnamed section for property full declaration / definition
		//           ( port+=Port
		//           | signal+=Signal
		//           | buffer+=Buffer
		//           | channel+=Channel
		//           | typedef+=TypeDefinition
		//           | function+=Function
		//           | variable+=Variable
		//           )*
		public Alternatives getAlternatives_7_1() { return cAlternatives_7_1; }
		
		//port+=Port
		public Assignment getPortAssignment_7_1_0() { return cPortAssignment_7_1_0; }
		
		//Port
		public RuleCall getPortPortParserRuleCall_7_1_0_0() { return cPortPortParserRuleCall_7_1_0_0; }
		
		//signal+=Signal
		public Assignment getSignalAssignment_7_1_1() { return cSignalAssignment_7_1_1; }
		
		//Signal
		public RuleCall getSignalSignalParserRuleCall_7_1_1_0() { return cSignalSignalParserRuleCall_7_1_1_0; }
		
		//buffer+=Buffer
		public Assignment getBufferAssignment_7_1_2() { return cBufferAssignment_7_1_2; }
		
		//Buffer
		public RuleCall getBufferBufferParserRuleCall_7_1_2_0() { return cBufferBufferParserRuleCall_7_1_2_0; }
		
		//channel+=Channel
		public Assignment getChannelAssignment_7_1_3() { return cChannelAssignment_7_1_3; }
		
		//Channel
		public RuleCall getChannelChannelParserRuleCall_7_1_3_0() { return cChannelChannelParserRuleCall_7_1_3_0; }
		
		//typedef+=TypeDefinition
		public Assignment getTypedefAssignment_7_1_4() { return cTypedefAssignment_7_1_4; }
		
		//TypeDefinition
		public RuleCall getTypedefTypeDefinitionParserRuleCall_7_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_7_1_4_0; }
		
		//function+=Function
		public Assignment getFunctionAssignment_7_1_5() { return cFunctionAssignment_7_1_5; }
		
		//Function
		public RuleCall getFunctionFunctionParserRuleCall_7_1_5_0() { return cFunctionFunctionParserRuleCall_7_1_5_0; }
		
		//variable+=Variable
		public Assignment getVariableAssignment_7_1_6() { return cVariableAssignment_7_1_6; }
		
		//Variable
		public RuleCall getVariableVariableParserRuleCall_7_1_6_0() { return cVariableVariableParserRuleCall_7_1_6_0; }
		
		//( '@input:'
		//    ( parameter+=ParameterInput  )*
		//| '@inout:'
		//    ( parameter+=ParameterInout  )*
		//| '@output:'
		//    ( parameter+=ParameterOutput )*
		//| '@return:'
		//    ( parameter+=ParameterReturn )*
		//)*
		public Alternatives getAlternatives_8() { return cAlternatives_8; }
		
		//'@input:'
		//           ( parameter+=ParameterInput  )*
		public Group getGroup_8_0() { return cGroup_8_0; }
		
		//'@input:'
		public Keyword getInputKeyword_8_0_0() { return cInputKeyword_8_0_0; }
		
		//( parameter+=ParameterInput  )*
		public Assignment getParameterAssignment_8_0_1() { return cParameterAssignment_8_0_1; }
		
		//ParameterInput
		public RuleCall getParameterParameterInputParserRuleCall_8_0_1_0() { return cParameterParameterInputParserRuleCall_8_0_1_0; }
		
		//'@inout:'
		//           ( parameter+=ParameterInout  )*
		public Group getGroup_8_1() { return cGroup_8_1; }
		
		//'@inout:'
		public Keyword getInoutKeyword_8_1_0() { return cInoutKeyword_8_1_0; }
		
		//( parameter+=ParameterInout  )*
		public Assignment getParameterAssignment_8_1_1() { return cParameterAssignment_8_1_1; }
		
		//ParameterInout
		public RuleCall getParameterParameterInoutParserRuleCall_8_1_1_0() { return cParameterParameterInoutParserRuleCall_8_1_1_0; }
		
		//'@output:'
		//           ( parameter+=ParameterOutput )*
		public Group getGroup_8_2() { return cGroup_8_2; }
		
		//'@output:'
		public Keyword getOutputKeyword_8_2_0() { return cOutputKeyword_8_2_0; }
		
		//( parameter+=ParameterOutput )*
		public Assignment getParameterAssignment_8_2_1() { return cParameterAssignment_8_2_1; }
		
		//ParameterOutput
		public RuleCall getParameterParameterOutputParserRuleCall_8_2_1_0() { return cParameterParameterOutputParserRuleCall_8_2_1_0; }
		
		//'@return:'
		//           ( parameter+=ParameterReturn )*
		public Group getGroup_8_3() { return cGroup_8_3; }
		
		//'@return:'
		public Keyword getReturnKeyword_8_3_0() { return cReturnKeyword_8_3_0; }
		
		//( parameter+=ParameterReturn )*
		public Assignment getParameterAssignment_8_3_1() { return cParameterAssignment_8_3_1; }
		
		//ParameterReturn
		public RuleCall getParameterParameterReturnParserRuleCall_8_3_1_0() { return cParameterParameterReturnParserRuleCall_8_3_1_0; }
		
		//( '@property:'
		//    ( port+=Port
		//    | signal+=Signal
		//    | buffer+=Buffer
		//    | channel+=Channel
		//    | typedef+=TypeDefinition
		//    | function+=Function
		//    | variable+=Variable
		//    )*
		//| '@public:'
		//    ( port+=PortPublic
		//    | signal+=SignalPublic
		//    | buffer+=BufferPublic
		//    | channel+=ChannelPublic
		//    | typedef+=TypeDefinition
		//    | function+=FunctionPublic
		//    | variable+=VariablePublic
		//    )*
		//| '@protected:'
		//    ( port+=PortProtected
		//    | signal+=SignalProtected
		//    | buffer+=BufferProtected
		//    | channel+=ChannelProtected
		//    | typedef+=TypeDefinition
		//    | function+=FunctionProtected
		//    | variable+=VariableProtected
		//    )*
		//| '@private:'
		//    ( port+=PortPrivate
		//    | signal+=SignalPrivate
		//    | buffer+=BufferPrivate
		//    | channel+=ChannelPrivate
		//    | typedef+=TypeDefinition
		//    | function+=FunctionPrivate
		//    | variable+=VariablePrivate
		//    )*
		//)*
		public Alternatives getAlternatives_9() { return cAlternatives_9; }
		
		//'@property:'
		//           ( port+=Port
		//           | signal+=Signal
		//           | buffer+=Buffer
		//           | channel+=Channel
		//           | typedef+=TypeDefinition
		//           | function+=Function
		//           | variable+=Variable
		//           )*
		public Group getGroup_9_0() { return cGroup_9_0; }
		
		//'@property:'
		public Keyword getPropertyKeyword_9_0_0() { return cPropertyKeyword_9_0_0; }
		
		//( port+=Port
		//| signal+=Signal
		//| buffer+=Buffer
		//| channel+=Channel
		//| typedef+=TypeDefinition
		//| function+=Function
		//| variable+=Variable
		//)*
		public Alternatives getAlternatives_9_0_1() { return cAlternatives_9_0_1; }
		
		//port+=Port
		public Assignment getPortAssignment_9_0_1_0() { return cPortAssignment_9_0_1_0; }
		
		//Port
		public RuleCall getPortPortParserRuleCall_9_0_1_0_0() { return cPortPortParserRuleCall_9_0_1_0_0; }
		
		//signal+=Signal
		public Assignment getSignalAssignment_9_0_1_1() { return cSignalAssignment_9_0_1_1; }
		
		//Signal
		public RuleCall getSignalSignalParserRuleCall_9_0_1_1_0() { return cSignalSignalParserRuleCall_9_0_1_1_0; }
		
		//buffer+=Buffer
		public Assignment getBufferAssignment_9_0_1_2() { return cBufferAssignment_9_0_1_2; }
		
		//Buffer
		public RuleCall getBufferBufferParserRuleCall_9_0_1_2_0() { return cBufferBufferParserRuleCall_9_0_1_2_0; }
		
		//channel+=Channel
		public Assignment getChannelAssignment_9_0_1_3() { return cChannelAssignment_9_0_1_3; }
		
		//Channel
		public RuleCall getChannelChannelParserRuleCall_9_0_1_3_0() { return cChannelChannelParserRuleCall_9_0_1_3_0; }
		
		//typedef+=TypeDefinition
		public Assignment getTypedefAssignment_9_0_1_4() { return cTypedefAssignment_9_0_1_4; }
		
		//TypeDefinition
		public RuleCall getTypedefTypeDefinitionParserRuleCall_9_0_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_9_0_1_4_0; }
		
		//function+=Function
		public Assignment getFunctionAssignment_9_0_1_5() { return cFunctionAssignment_9_0_1_5; }
		
		//Function
		public RuleCall getFunctionFunctionParserRuleCall_9_0_1_5_0() { return cFunctionFunctionParserRuleCall_9_0_1_5_0; }
		
		//variable+=Variable
		public Assignment getVariableAssignment_9_0_1_6() { return cVariableAssignment_9_0_1_6; }
		
		//Variable
		public RuleCall getVariableVariableParserRuleCall_9_0_1_6_0() { return cVariableVariableParserRuleCall_9_0_1_6_0; }
		
		//'@public:'
		//           ( port+=PortPublic
		//           | signal+=SignalPublic
		//           | buffer+=BufferPublic
		//           | channel+=ChannelPublic
		//           | typedef+=TypeDefinition
		//           | function+=FunctionPublic
		//           | variable+=VariablePublic
		//           )*
		public Group getGroup_9_1() { return cGroup_9_1; }
		
		//'@public:'
		public Keyword getPublicKeyword_9_1_0() { return cPublicKeyword_9_1_0; }
		
		//( port+=PortPublic
		//| signal+=SignalPublic
		//| buffer+=BufferPublic
		//| channel+=ChannelPublic
		//| typedef+=TypeDefinition
		//| function+=FunctionPublic
		//| variable+=VariablePublic
		//)*
		public Alternatives getAlternatives_9_1_1() { return cAlternatives_9_1_1; }
		
		//port+=PortPublic
		public Assignment getPortAssignment_9_1_1_0() { return cPortAssignment_9_1_1_0; }
		
		//PortPublic
		public RuleCall getPortPortPublicParserRuleCall_9_1_1_0_0() { return cPortPortPublicParserRuleCall_9_1_1_0_0; }
		
		//signal+=SignalPublic
		public Assignment getSignalAssignment_9_1_1_1() { return cSignalAssignment_9_1_1_1; }
		
		//SignalPublic
		public RuleCall getSignalSignalPublicParserRuleCall_9_1_1_1_0() { return cSignalSignalPublicParserRuleCall_9_1_1_1_0; }
		
		//buffer+=BufferPublic
		public Assignment getBufferAssignment_9_1_1_2() { return cBufferAssignment_9_1_1_2; }
		
		//BufferPublic
		public RuleCall getBufferBufferPublicParserRuleCall_9_1_1_2_0() { return cBufferBufferPublicParserRuleCall_9_1_1_2_0; }
		
		//channel+=ChannelPublic
		public Assignment getChannelAssignment_9_1_1_3() { return cChannelAssignment_9_1_1_3; }
		
		//ChannelPublic
		public RuleCall getChannelChannelPublicParserRuleCall_9_1_1_3_0() { return cChannelChannelPublicParserRuleCall_9_1_1_3_0; }
		
		//typedef+=TypeDefinition
		public Assignment getTypedefAssignment_9_1_1_4() { return cTypedefAssignment_9_1_1_4; }
		
		//TypeDefinition
		public RuleCall getTypedefTypeDefinitionParserRuleCall_9_1_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_9_1_1_4_0; }
		
		//function+=FunctionPublic
		public Assignment getFunctionAssignment_9_1_1_5() { return cFunctionAssignment_9_1_1_5; }
		
		//FunctionPublic
		public RuleCall getFunctionFunctionPublicParserRuleCall_9_1_1_5_0() { return cFunctionFunctionPublicParserRuleCall_9_1_1_5_0; }
		
		//variable+=VariablePublic
		public Assignment getVariableAssignment_9_1_1_6() { return cVariableAssignment_9_1_1_6; }
		
		//VariablePublic
		public RuleCall getVariableVariablePublicParserRuleCall_9_1_1_6_0() { return cVariableVariablePublicParserRuleCall_9_1_1_6_0; }
		
		//'@protected:'
		//           ( port+=PortProtected
		//           | signal+=SignalProtected
		//           | buffer+=BufferProtected
		//           | channel+=ChannelProtected
		//           | typedef+=TypeDefinition
		//           | function+=FunctionProtected
		//           | variable+=VariableProtected
		//           )*
		public Group getGroup_9_2() { return cGroup_9_2; }
		
		//'@protected:'
		public Keyword getProtectedKeyword_9_2_0() { return cProtectedKeyword_9_2_0; }
		
		//( port+=PortProtected
		//| signal+=SignalProtected
		//| buffer+=BufferProtected
		//| channel+=ChannelProtected
		//| typedef+=TypeDefinition
		//| function+=FunctionProtected
		//| variable+=VariableProtected
		//)*
		public Alternatives getAlternatives_9_2_1() { return cAlternatives_9_2_1; }
		
		//port+=PortProtected
		public Assignment getPortAssignment_9_2_1_0() { return cPortAssignment_9_2_1_0; }
		
		//PortProtected
		public RuleCall getPortPortProtectedParserRuleCall_9_2_1_0_0() { return cPortPortProtectedParserRuleCall_9_2_1_0_0; }
		
		//signal+=SignalProtected
		public Assignment getSignalAssignment_9_2_1_1() { return cSignalAssignment_9_2_1_1; }
		
		//SignalProtected
		public RuleCall getSignalSignalProtectedParserRuleCall_9_2_1_1_0() { return cSignalSignalProtectedParserRuleCall_9_2_1_1_0; }
		
		//buffer+=BufferProtected
		public Assignment getBufferAssignment_9_2_1_2() { return cBufferAssignment_9_2_1_2; }
		
		//BufferProtected
		public RuleCall getBufferBufferProtectedParserRuleCall_9_2_1_2_0() { return cBufferBufferProtectedParserRuleCall_9_2_1_2_0; }
		
		//channel+=ChannelProtected
		public Assignment getChannelAssignment_9_2_1_3() { return cChannelAssignment_9_2_1_3; }
		
		//ChannelProtected
		public RuleCall getChannelChannelProtectedParserRuleCall_9_2_1_3_0() { return cChannelChannelProtectedParserRuleCall_9_2_1_3_0; }
		
		//typedef+=TypeDefinition
		public Assignment getTypedefAssignment_9_2_1_4() { return cTypedefAssignment_9_2_1_4; }
		
		//TypeDefinition
		public RuleCall getTypedefTypeDefinitionParserRuleCall_9_2_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_9_2_1_4_0; }
		
		//function+=FunctionProtected
		public Assignment getFunctionAssignment_9_2_1_5() { return cFunctionAssignment_9_2_1_5; }
		
		//FunctionProtected
		public RuleCall getFunctionFunctionProtectedParserRuleCall_9_2_1_5_0() { return cFunctionFunctionProtectedParserRuleCall_9_2_1_5_0; }
		
		//variable+=VariableProtected
		public Assignment getVariableAssignment_9_2_1_6() { return cVariableAssignment_9_2_1_6; }
		
		//VariableProtected
		public RuleCall getVariableVariableProtectedParserRuleCall_9_2_1_6_0() { return cVariableVariableProtectedParserRuleCall_9_2_1_6_0; }
		
		//'@private:'
		//           ( port+=PortPrivate
		//           | signal+=SignalPrivate
		//           | buffer+=BufferPrivate
		//           | channel+=ChannelPrivate
		//           | typedef+=TypeDefinition
		//           | function+=FunctionPrivate
		//           | variable+=VariablePrivate
		//           )*
		public Group getGroup_9_3() { return cGroup_9_3; }
		
		//'@private:'
		public Keyword getPrivateKeyword_9_3_0() { return cPrivateKeyword_9_3_0; }
		
		//( port+=PortPrivate
		//| signal+=SignalPrivate
		//| buffer+=BufferPrivate
		//| channel+=ChannelPrivate
		//| typedef+=TypeDefinition
		//| function+=FunctionPrivate
		//| variable+=VariablePrivate
		//)*
		public Alternatives getAlternatives_9_3_1() { return cAlternatives_9_3_1; }
		
		//port+=PortPrivate
		public Assignment getPortAssignment_9_3_1_0() { return cPortAssignment_9_3_1_0; }
		
		//PortPrivate
		public RuleCall getPortPortPrivateParserRuleCall_9_3_1_0_0() { return cPortPortPrivateParserRuleCall_9_3_1_0_0; }
		
		//signal+=SignalPrivate
		public Assignment getSignalAssignment_9_3_1_1() { return cSignalAssignment_9_3_1_1; }
		
		//SignalPrivate
		public RuleCall getSignalSignalPrivateParserRuleCall_9_3_1_1_0() { return cSignalSignalPrivateParserRuleCall_9_3_1_1_0; }
		
		//buffer+=BufferPrivate
		public Assignment getBufferAssignment_9_3_1_2() { return cBufferAssignment_9_3_1_2; }
		
		//BufferPrivate
		public RuleCall getBufferBufferPrivateParserRuleCall_9_3_1_2_0() { return cBufferBufferPrivateParserRuleCall_9_3_1_2_0; }
		
		//channel+=ChannelPrivate
		public Assignment getChannelAssignment_9_3_1_3() { return cChannelAssignment_9_3_1_3; }
		
		//ChannelPrivate
		public RuleCall getChannelChannelPrivateParserRuleCall_9_3_1_3_0() { return cChannelChannelPrivateParserRuleCall_9_3_1_3_0; }
		
		//typedef+=TypeDefinition
		public Assignment getTypedefAssignment_9_3_1_4() { return cTypedefAssignment_9_3_1_4; }
		
		//TypeDefinition
		public RuleCall getTypedefTypeDefinitionParserRuleCall_9_3_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_9_3_1_4_0; }
		
		//function+=FunctionPrivate
		public Assignment getFunctionAssignment_9_3_1_5() { return cFunctionAssignment_9_3_1_5; }
		
		//FunctionPrivate
		public RuleCall getFunctionFunctionPrivateParserRuleCall_9_3_1_5_0() { return cFunctionFunctionPrivateParserRuleCall_9_3_1_5_0; }
		
		//variable+=VariablePrivate
		public Assignment getVariableAssignment_9_3_1_6() { return cVariableAssignment_9_3_1_6; }
		
		//VariablePrivate
		public RuleCall getVariableVariablePrivateParserRuleCall_9_3_1_6_0() { return cVariableVariablePrivateParserRuleCall_9_3_1_6_0; }
		
		//( ( ( '@routine:' | '@macro:' ) ( routine+=Routine )+
		//  | '@procedure:' ( procedure+=Procedure )+
		//  )*
		//| ( routine+=Routine | procedure+=Procedure )+
		//)
		public Alternatives getAlternatives_10() { return cAlternatives_10; }
		
		//( ( '@routine:' | '@macro:' ) ( routine+=Routine )+
		//         | '@procedure:' ( procedure+=Procedure )+
		//         )*
		public Alternatives getAlternatives_10_0() { return cAlternatives_10_0; }
		
		//( '@routine:' | '@macro:' ) ( routine+=Routine )+
		public Group getGroup_10_0_0() { return cGroup_10_0_0; }
		
		//( '@routine:' | '@macro:' )
		public Alternatives getAlternatives_10_0_0_0() { return cAlternatives_10_0_0_0; }
		
		//'@routine:'
		public Keyword getRoutineKeyword_10_0_0_0_0() { return cRoutineKeyword_10_0_0_0_0; }
		
		//'@macro:'
		public Keyword getMacroKeyword_10_0_0_0_1() { return cMacroKeyword_10_0_0_0_1; }
		
		//( routine+=Routine )+
		public Assignment getRoutineAssignment_10_0_0_1() { return cRoutineAssignment_10_0_0_1; }
		
		//Routine
		public RuleCall getRoutineRoutineParserRuleCall_10_0_0_1_0() { return cRoutineRoutineParserRuleCall_10_0_0_1_0; }
		
		//'@procedure:' ( procedure+=Procedure )+
		public Group getGroup_10_0_1() { return cGroup_10_0_1; }
		
		//'@procedure:'
		public Keyword getProcedureKeyword_10_0_1_0() { return cProcedureKeyword_10_0_1_0; }
		
		//( procedure+=Procedure )+
		public Assignment getProcedureAssignment_10_0_1_1() { return cProcedureAssignment_10_0_1_1; }
		
		//Procedure
		public RuleCall getProcedureProcedureParserRuleCall_10_0_1_1_0() { return cProcedureProcedureParserRuleCall_10_0_1_1_0; }
		
		//( routine+=Routine | procedure+=Procedure )+
		public Alternatives getAlternatives_10_1() { return cAlternatives_10_1; }
		
		//routine+=Routine
		public Assignment getRoutineAssignment_10_1_0() { return cRoutineAssignment_10_1_0; }
		
		//Routine
		public RuleCall getRoutineRoutineParserRuleCall_10_1_0_0() { return cRoutineRoutineParserRuleCall_10_1_0_0; }
		
		//procedure+=Procedure
		public Assignment getProcedureAssignment_10_1_1() { return cProcedureAssignment_10_1_1; }
		
		//Procedure
		public RuleCall getProcedureProcedureParserRuleCall_10_1_1_0() { return cProcedureProcedureParserRuleCall_10_1_1_0; }
		
		////        // optional unnamed section for property full declaration / definition
		////        propertyPart=PropertyPart
		////
		////        compositePart=CompositePart
		////        ( region+=StatemachineRegion
		////        | ( region+=StatemachineNamedRegion )+
		////        | region+=StatemachineRegionLite
		////        )?
		//        ( ( execution=ProcedureExecution )?
		////        & ( computation=ModelOfComputation )?
		////        & ( interaction=ModelOfInteraction )?
		//        )
		public Assignment getExecutionAssignment_11() { return cExecutionAssignment_11; }
		
		//ProcedureExecution
		public RuleCall getExecutionProcedureExecutionParserRuleCall_11_0() { return cExecutionProcedureExecutionParserRuleCall_11_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_12() { return cRightCurlyBracketKeyword_12; }
	}
	public class ProcedureExecutionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ProcedureExecution");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cModelOfExecutionAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cMoeKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final UnorderedGroup cUnorderedGroup_2 = (UnorderedGroup)cGroup.eContents().get(2);
		private final Group cGroup_2_0 = (Group)cUnorderedGroup_2.eContents().get(0);
		private final Alternatives cAlternatives_2_0_0 = (Alternatives)cGroup_2_0.eContents().get(0);
		private final Keyword cScheduleKeyword_2_0_0_0 = (Keyword)cAlternatives_2_0_0.eContents().get(0);
		private final Keyword cXscheduleKeyword_2_0_0_1 = (Keyword)cAlternatives_2_0_0.eContents().get(1);
		private final Assignment cScheduleRoutineAssignment_2_0_1 = (Assignment)cGroup_2_0.eContents().get(1);
		private final RuleCall cScheduleRoutineMoeRoutineParserRuleCall_2_0_1_0 = (RuleCall)cScheduleRoutineAssignment_2_0_1.eContents().get(0);
		private final Group cGroup_2_1 = (Group)cUnorderedGroup_2.eContents().get(1);
		private final Keyword cRunKeyword_2_1_0 = (Keyword)cGroup_2_1.eContents().get(0);
		private final Assignment cRunRoutineAssignment_2_1_1 = (Assignment)cGroup_2_1.eContents().get(1);
		private final RuleCall cRunRoutineMoeRoutineParserRuleCall_2_1_1_0 = (RuleCall)cRunRoutineAssignment_2_1_1.eContents().get(0);
		
		//ProcedureExecution returns fmlInfra::ModelOfExecution
		//    : { fmlInfra::ModelOfExecution }
		//        ( '@moe:' )?
		//        ( ( ( '@schedule' | '@xschedule' )  scheduleRoutine=moeRoutine )?
		//        & ( '@run'  runRoutine=moeRoutine )?
		//        )
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{ fmlInfra::ModelOfExecution }
		//       ( '@moe:' )?
		//       ( ( ( '@schedule' | '@xschedule' )  scheduleRoutine=moeRoutine )?
		//       & ( '@run'  runRoutine=moeRoutine )?
		//       )
		public Group getGroup() { return cGroup; }
		
		//{ fmlInfra::ModelOfExecution }
		public Action getModelOfExecutionAction_0() { return cModelOfExecutionAction_0; }
		
		//( '@moe:' )?
		public Keyword getMoeKeyword_1() { return cMoeKeyword_1; }
		
		//( ( ( '@schedule' | '@xschedule' )  scheduleRoutine=moeRoutine )?
		//& ( '@run'  runRoutine=moeRoutine )?
		//)
		public UnorderedGroup getUnorderedGroup_2() { return cUnorderedGroup_2; }
		
		//( ( '@schedule' | '@xschedule' )  scheduleRoutine=moeRoutine )?
		public Group getGroup_2_0() { return cGroup_2_0; }
		
		//( '@schedule' | '@xschedule' )
		public Alternatives getAlternatives_2_0_0() { return cAlternatives_2_0_0; }
		
		//'@schedule'
		public Keyword getScheduleKeyword_2_0_0_0() { return cScheduleKeyword_2_0_0_0; }
		
		//'@xschedule'
		public Keyword getXscheduleKeyword_2_0_0_1() { return cXscheduleKeyword_2_0_0_1; }
		
		//scheduleRoutine=moeRoutine
		public Assignment getScheduleRoutineAssignment_2_0_1() { return cScheduleRoutineAssignment_2_0_1; }
		
		//moeRoutine
		public RuleCall getScheduleRoutineMoeRoutineParserRuleCall_2_0_1_0() { return cScheduleRoutineMoeRoutineParserRuleCall_2_0_1_0; }
		
		//( '@run'  runRoutine=moeRoutine )?
		public Group getGroup_2_1() { return cGroup_2_1; }
		
		//'@run'
		public Keyword getRunKeyword_2_1_0() { return cRunKeyword_2_1_0; }
		
		//runRoutine=moeRoutine
		public Assignment getRunRoutineAssignment_2_1_1() { return cRunRoutineAssignment_2_1_1; }
		
		//moeRoutine
		public RuleCall getRunRoutineMoeRoutineParserRuleCall_2_1_1_0() { return cRunRoutineMoeRoutineParserRuleCall_2_1_1_0; }
	}
	public class BehaviorElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.Behavior");
		private final RuleCall cStatemachineParserRuleCall = (RuleCall)rule.eContents().get(1);
		
		//////////////////////////////////////////////////////////////////////////////////
		//// Behavior View Rules
		//////////////////////////////////////////////////////////////////////////////////
		//Behavior returns fmlInfra::Behavior
		//    : Statemachine
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//Statemachine
		public RuleCall getStatemachineParserRuleCall() { return cStatemachineParserRuleCall; }
	}
	public class MoeBehaviorElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.MoeBehavior");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cBehaviorAction_0 = (Action)cGroup.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Keyword cLocalKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final Alternatives cAlternatives_1_1 = (Alternatives)cGroup_1.eContents().get(1);
		private final Assignment cPortAssignment_1_1_0 = (Assignment)cAlternatives_1_1.eContents().get(0);
		private final RuleCall cPortPortPrivateParserRuleCall_1_1_0_0 = (RuleCall)cPortAssignment_1_1_0.eContents().get(0);
		private final Assignment cSignalAssignment_1_1_1 = (Assignment)cAlternatives_1_1.eContents().get(1);
		private final RuleCall cSignalSignalPrivateParserRuleCall_1_1_1_0 = (RuleCall)cSignalAssignment_1_1_1.eContents().get(0);
		private final Assignment cBufferAssignment_1_1_2 = (Assignment)cAlternatives_1_1.eContents().get(2);
		private final RuleCall cBufferBufferPrivateParserRuleCall_1_1_2_0 = (RuleCall)cBufferAssignment_1_1_2.eContents().get(0);
		private final Assignment cChannelAssignment_1_1_3 = (Assignment)cAlternatives_1_1.eContents().get(3);
		private final RuleCall cChannelChannelPrivateParserRuleCall_1_1_3_0 = (RuleCall)cChannelAssignment_1_1_3.eContents().get(0);
		private final Assignment cTypedefAssignment_1_1_4 = (Assignment)cAlternatives_1_1.eContents().get(4);
		private final RuleCall cTypedefTypeDefinitionParserRuleCall_1_1_4_0 = (RuleCall)cTypedefAssignment_1_1_4.eContents().get(0);
		private final Assignment cFunctionAssignment_1_1_5 = (Assignment)cAlternatives_1_1.eContents().get(5);
		private final RuleCall cFunctionFunctionPrivateParserRuleCall_1_1_5_0 = (RuleCall)cFunctionAssignment_1_1_5.eContents().get(0);
		private final Assignment cVariableAssignment_1_1_6 = (Assignment)cAlternatives_1_1.eContents().get(6);
		private final RuleCall cVariableVariablePrivateParserRuleCall_1_1_6_0 = (RuleCall)cVariableAssignment_1_1_6.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_2 = (UnorderedGroup)cGroup.eContents().get(2);
		private final Assignment cExecutionAssignment_2_0 = (Assignment)cUnorderedGroup_2.eContents().get(0);
		private final RuleCall cExecutionModelOfExecutionParserRuleCall_2_0_0 = (RuleCall)cExecutionAssignment_2_0.eContents().get(0);
		private final Assignment cInteractionAssignment_2_1 = (Assignment)cUnorderedGroup_2.eContents().get(1);
		private final RuleCall cInteractionModelOfInteractionParserRuleCall_2_1_0 = (RuleCall)cInteractionAssignment_2_1.eContents().get(0);
		
		//MoeBehavior returns fmlInfra::Behavior
		//    : {fmlInfra::Behavior}
		//        ( '@local:'
		//            ( port+=PortPrivate
		//            | signal+=SignalPrivate
		//            | buffer+=BufferPrivate
		//            | channel+=ChannelPrivate
		//            | typedef+=TypeDefinition
		//            | function+=FunctionPrivate
		//            | variable+=VariablePrivate
		//            )*
		//        )?
		//        ( ( execution=ModelOfExecution )?
		////        & ( computation=ModelOfComputation )?
		//        & ( interaction=ModelOfInteraction )?
		//        )
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		// {fmlInfra::Behavior}
		//        ( '@local:'
		//            ( port+=PortPrivate
		//            | signal+=SignalPrivate
		//            | buffer+=BufferPrivate
		//            | channel+=ChannelPrivate
		//            | typedef+=TypeDefinition
		//            | function+=FunctionPrivate
		//            | variable+=VariablePrivate
		//            )*
		//        )?
		//        ( ( execution=ModelOfExecution )?
		////        & ( computation=ModelOfComputation )?
		//        & ( interaction=ModelOfInteraction )?
		//        )
		public Group getGroup() { return cGroup; }
		
		//{fmlInfra::Behavior}
		public Action getBehaviorAction_0() { return cBehaviorAction_0; }
		
		//( '@local:'
		//    ( port+=PortPrivate
		//    | signal+=SignalPrivate
		//    | buffer+=BufferPrivate
		//    | channel+=ChannelPrivate
		//    | typedef+=TypeDefinition
		//    | function+=FunctionPrivate
		//    | variable+=VariablePrivate
		//    )*
		//)?
		public Group getGroup_1() { return cGroup_1; }
		
		//'@local:'
		public Keyword getLocalKeyword_1_0() { return cLocalKeyword_1_0; }
		
		//( port+=PortPrivate
		//| signal+=SignalPrivate
		//| buffer+=BufferPrivate
		//| channel+=ChannelPrivate
		//| typedef+=TypeDefinition
		//| function+=FunctionPrivate
		//| variable+=VariablePrivate
		//)*
		public Alternatives getAlternatives_1_1() { return cAlternatives_1_1; }
		
		//port+=PortPrivate
		public Assignment getPortAssignment_1_1_0() { return cPortAssignment_1_1_0; }
		
		//PortPrivate
		public RuleCall getPortPortPrivateParserRuleCall_1_1_0_0() { return cPortPortPrivateParserRuleCall_1_1_0_0; }
		
		//signal+=SignalPrivate
		public Assignment getSignalAssignment_1_1_1() { return cSignalAssignment_1_1_1; }
		
		//SignalPrivate
		public RuleCall getSignalSignalPrivateParserRuleCall_1_1_1_0() { return cSignalSignalPrivateParserRuleCall_1_1_1_0; }
		
		//buffer+=BufferPrivate
		public Assignment getBufferAssignment_1_1_2() { return cBufferAssignment_1_1_2; }
		
		//BufferPrivate
		public RuleCall getBufferBufferPrivateParserRuleCall_1_1_2_0() { return cBufferBufferPrivateParserRuleCall_1_1_2_0; }
		
		//channel+=ChannelPrivate
		public Assignment getChannelAssignment_1_1_3() { return cChannelAssignment_1_1_3; }
		
		//ChannelPrivate
		public RuleCall getChannelChannelPrivateParserRuleCall_1_1_3_0() { return cChannelChannelPrivateParserRuleCall_1_1_3_0; }
		
		//typedef+=TypeDefinition
		public Assignment getTypedefAssignment_1_1_4() { return cTypedefAssignment_1_1_4; }
		
		//TypeDefinition
		public RuleCall getTypedefTypeDefinitionParserRuleCall_1_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_1_1_4_0; }
		
		//function+=FunctionPrivate
		public Assignment getFunctionAssignment_1_1_5() { return cFunctionAssignment_1_1_5; }
		
		//FunctionPrivate
		public RuleCall getFunctionFunctionPrivateParserRuleCall_1_1_5_0() { return cFunctionFunctionPrivateParserRuleCall_1_1_5_0; }
		
		//variable+=VariablePrivate
		public Assignment getVariableAssignment_1_1_6() { return cVariableAssignment_1_1_6; }
		
		//VariablePrivate
		public RuleCall getVariableVariablePrivateParserRuleCall_1_1_6_0() { return cVariableVariablePrivateParserRuleCall_1_1_6_0; }
		
		//        ( ( execution=ModelOfExecution )?
		////        & ( computation=ModelOfComputation )?
		//        & ( interaction=ModelOfInteraction )?
		//        )
		public UnorderedGroup getUnorderedGroup_2() { return cUnorderedGroup_2; }
		
		//( execution=ModelOfExecution )?
		public Assignment getExecutionAssignment_2_0() { return cExecutionAssignment_2_0; }
		
		//ModelOfExecution
		public RuleCall getExecutionModelOfExecutionParserRuleCall_2_0_0() { return cExecutionModelOfExecutionParserRuleCall_2_0_0; }
		
		//( interaction=ModelOfInteraction )?
		public Assignment getInteractionAssignment_2_1() { return cInteractionAssignment_2_1; }
		
		//ModelOfInteraction
		public RuleCall getInteractionModelOfInteractionParserRuleCall_2_1_0() { return cInteractionModelOfInteractionParserRuleCall_2_1_0; }
	}
	public class StatemachineElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.Statemachine");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cStatemachineAction_0 = (Action)cGroup.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_1 = (UnorderedGroup)cGroup.eContents().get(1);
		private final Assignment cVisibilityAssignment_1_0 = (Assignment)cUnorderedGroup_1.eContents().get(0);
		private final RuleCall cVisibilityVisibilityKindEnumRuleCall_1_0_0 = (RuleCall)cVisibilityAssignment_1_0.eContents().get(0);
		private final Assignment cTimedAssignment_1_1 = (Assignment)cUnorderedGroup_1.eContents().get(1);
		private final Keyword cTimedTimedKeyword_1_1_0 = (Keyword)cTimedAssignment_1_1.eContents().get(0);
		private final Assignment cDense_timedAssignment_1_2 = (Assignment)cUnorderedGroup_1.eContents().get(2);
		private final Keyword cDense_timedTimedDenseKeyword_1_2_0 = (Keyword)cDense_timedAssignment_1_2.eContents().get(0);
		private final Assignment cDiscrete_timedAssignment_1_3 = (Assignment)cUnorderedGroup_1.eContents().get(3);
		private final Keyword cDiscrete_timedTimedDiscreteKeyword_1_3_0 = (Keyword)cDiscrete_timedAssignment_1_3.eContents().get(0);
		private final Assignment cInput_enabledAssignment_1_4 = (Assignment)cUnorderedGroup_1.eContents().get(4);
		private final Keyword cInput_enabledInput_enabledKeyword_1_4_0 = (Keyword)cInput_enabledAssignment_1_4.eContents().get(0);
		private final Assignment cLifelineAssignment_1_5 = (Assignment)cUnorderedGroup_1.eContents().get(5);
		private final Keyword cLifelineLifelineKeyword_1_5_0 = (Keyword)cLifelineAssignment_1_5.eContents().get(0);
		private final Assignment cDesignAssignment_1_6 = (Assignment)cUnorderedGroup_1.eContents().get(6);
		private final RuleCall cDesignDesignKindEnumRuleCall_1_6_0 = (RuleCall)cDesignAssignment_1_6.eContents().get(0);
		private final Keyword cStatemachineKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
		private final Keyword cLessThanSignKeyword_3_0 = (Keyword)cGroup_3.eContents().get(0);
		private final Keyword cMocKeyword_3_1 = (Keyword)cGroup_3.eContents().get(1);
		private final RuleCall cModelOfComputationKingParserRuleCall_3_2 = (RuleCall)cGroup_3.eContents().get(2);
		private final Keyword cGreaterThanSignKeyword_3_3 = (Keyword)cGroup_3.eContents().get(3);
		private final Assignment cNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cNameESIdentifierParserRuleCall_4_0 = (RuleCall)cNameAssignment_4.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_5_0 = (RuleCall)cUnrestrictedNameAssignment_5.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_6 = (Keyword)cGroup.eContents().get(6);
		private final Alternatives cAlternatives_7 = (Alternatives)cGroup.eContents().get(7);
		private final Group cGroup_7_0 = (Group)cAlternatives_7.eContents().get(0);
		private final Keyword cParameterKeyword_7_0_0 = (Keyword)cGroup_7_0.eContents().get(0);
		private final Alternatives cAlternatives_7_0_1 = (Alternatives)cGroup_7_0.eContents().get(1);
		private final Group cGroup_7_0_1_0 = (Group)cAlternatives_7_0_1.eContents().get(0);
		private final Keyword cInputKeyword_7_0_1_0_0 = (Keyword)cGroup_7_0_1_0.eContents().get(0);
		private final Alternatives cAlternatives_7_0_1_0_1 = (Alternatives)cGroup_7_0_1_0.eContents().get(1);
		private final Assignment cParameterAssignment_7_0_1_0_1_0 = (Assignment)cAlternatives_7_0_1_0_1.eContents().get(0);
		private final RuleCall cParameterParameterInputParserRuleCall_7_0_1_0_1_0_0 = (RuleCall)cParameterAssignment_7_0_1_0_1_0.eContents().get(0);
		private final Group cGroup_7_0_1_0_1_1 = (Group)cAlternatives_7_0_1_0_1.eContents().get(1);
		private final Keyword cLeftCurlyBracketKeyword_7_0_1_0_1_1_0 = (Keyword)cGroup_7_0_1_0_1_1.eContents().get(0);
		private final Assignment cParameterAssignment_7_0_1_0_1_1_1 = (Assignment)cGroup_7_0_1_0_1_1.eContents().get(1);
		private final RuleCall cParameterParameterInputParserRuleCall_7_0_1_0_1_1_1_0 = (RuleCall)cParameterAssignment_7_0_1_0_1_1_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_7_0_1_0_1_1_2 = (Keyword)cGroup_7_0_1_0_1_1.eContents().get(2);
		private final Group cGroup_7_0_1_1 = (Group)cAlternatives_7_0_1.eContents().get(1);
		private final Keyword cInoutKeyword_7_0_1_1_0 = (Keyword)cGroup_7_0_1_1.eContents().get(0);
		private final Alternatives cAlternatives_7_0_1_1_1 = (Alternatives)cGroup_7_0_1_1.eContents().get(1);
		private final Assignment cParameterAssignment_7_0_1_1_1_0 = (Assignment)cAlternatives_7_0_1_1_1.eContents().get(0);
		private final RuleCall cParameterParameterInoutParserRuleCall_7_0_1_1_1_0_0 = (RuleCall)cParameterAssignment_7_0_1_1_1_0.eContents().get(0);
		private final Group cGroup_7_0_1_1_1_1 = (Group)cAlternatives_7_0_1_1_1.eContents().get(1);
		private final Keyword cLeftCurlyBracketKeyword_7_0_1_1_1_1_0 = (Keyword)cGroup_7_0_1_1_1_1.eContents().get(0);
		private final Assignment cParameterAssignment_7_0_1_1_1_1_1 = (Assignment)cGroup_7_0_1_1_1_1.eContents().get(1);
		private final RuleCall cParameterParameterInoutParserRuleCall_7_0_1_1_1_1_1_0 = (RuleCall)cParameterAssignment_7_0_1_1_1_1_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_7_0_1_1_1_1_2 = (Keyword)cGroup_7_0_1_1_1_1.eContents().get(2);
		private final Group cGroup_7_0_1_2 = (Group)cAlternatives_7_0_1.eContents().get(2);
		private final Keyword cOutputKeyword_7_0_1_2_0 = (Keyword)cGroup_7_0_1_2.eContents().get(0);
		private final Alternatives cAlternatives_7_0_1_2_1 = (Alternatives)cGroup_7_0_1_2.eContents().get(1);
		private final Assignment cParameterAssignment_7_0_1_2_1_0 = (Assignment)cAlternatives_7_0_1_2_1.eContents().get(0);
		private final RuleCall cParameterParameterOutputParserRuleCall_7_0_1_2_1_0_0 = (RuleCall)cParameterAssignment_7_0_1_2_1_0.eContents().get(0);
		private final Group cGroup_7_0_1_2_1_1 = (Group)cAlternatives_7_0_1_2_1.eContents().get(1);
		private final Keyword cLeftCurlyBracketKeyword_7_0_1_2_1_1_0 = (Keyword)cGroup_7_0_1_2_1_1.eContents().get(0);
		private final Assignment cParameterAssignment_7_0_1_2_1_1_1 = (Assignment)cGroup_7_0_1_2_1_1.eContents().get(1);
		private final RuleCall cParameterParameterOutputParserRuleCall_7_0_1_2_1_1_1_0 = (RuleCall)cParameterAssignment_7_0_1_2_1_1_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_7_0_1_2_1_1_2 = (Keyword)cGroup_7_0_1_2_1_1.eContents().get(2);
		private final Group cGroup_7_0_1_3 = (Group)cAlternatives_7_0_1.eContents().get(3);
		private final Keyword cReturnKeyword_7_0_1_3_0 = (Keyword)cGroup_7_0_1_3.eContents().get(0);
		private final Alternatives cAlternatives_7_0_1_3_1 = (Alternatives)cGroup_7_0_1_3.eContents().get(1);
		private final Assignment cParameterAssignment_7_0_1_3_1_0 = (Assignment)cAlternatives_7_0_1_3_1.eContents().get(0);
		private final RuleCall cParameterParameterReturnParserRuleCall_7_0_1_3_1_0_0 = (RuleCall)cParameterAssignment_7_0_1_3_1_0.eContents().get(0);
		private final Group cGroup_7_0_1_3_1_1 = (Group)cAlternatives_7_0_1_3_1.eContents().get(1);
		private final Keyword cLeftCurlyBracketKeyword_7_0_1_3_1_1_0 = (Keyword)cGroup_7_0_1_3_1_1.eContents().get(0);
		private final Assignment cParameterAssignment_7_0_1_3_1_1_1 = (Assignment)cGroup_7_0_1_3_1_1.eContents().get(1);
		private final RuleCall cParameterParameterReturnParserRuleCall_7_0_1_3_1_1_1_0 = (RuleCall)cParameterAssignment_7_0_1_3_1_1_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_7_0_1_3_1_1_2 = (Keyword)cGroup_7_0_1_3_1_1.eContents().get(2);
		private final Alternatives cAlternatives_7_1 = (Alternatives)cAlternatives_7.eContents().get(1);
		private final Assignment cPortAssignment_7_1_0 = (Assignment)cAlternatives_7_1.eContents().get(0);
		private final RuleCall cPortPortParserRuleCall_7_1_0_0 = (RuleCall)cPortAssignment_7_1_0.eContents().get(0);
		private final Assignment cSignalAssignment_7_1_1 = (Assignment)cAlternatives_7_1.eContents().get(1);
		private final RuleCall cSignalSignalParserRuleCall_7_1_1_0 = (RuleCall)cSignalAssignment_7_1_1.eContents().get(0);
		private final Assignment cBufferAssignment_7_1_2 = (Assignment)cAlternatives_7_1.eContents().get(2);
		private final RuleCall cBufferBufferParserRuleCall_7_1_2_0 = (RuleCall)cBufferAssignment_7_1_2.eContents().get(0);
		private final Assignment cChannelAssignment_7_1_3 = (Assignment)cAlternatives_7_1.eContents().get(3);
		private final RuleCall cChannelChannelParserRuleCall_7_1_3_0 = (RuleCall)cChannelAssignment_7_1_3.eContents().get(0);
		private final Assignment cTypedefAssignment_7_1_4 = (Assignment)cAlternatives_7_1.eContents().get(4);
		private final RuleCall cTypedefTypeDefinitionParserRuleCall_7_1_4_0 = (RuleCall)cTypedefAssignment_7_1_4.eContents().get(0);
		private final Assignment cFunctionAssignment_7_1_5 = (Assignment)cAlternatives_7_1.eContents().get(5);
		private final RuleCall cFunctionFunctionParserRuleCall_7_1_5_0 = (RuleCall)cFunctionAssignment_7_1_5.eContents().get(0);
		private final Assignment cVariableAssignment_7_1_6 = (Assignment)cAlternatives_7_1.eContents().get(6);
		private final RuleCall cVariableVariableParserRuleCall_7_1_6_0 = (RuleCall)cVariableAssignment_7_1_6.eContents().get(0);
		private final Alternatives cAlternatives_8 = (Alternatives)cGroup.eContents().get(8);
		private final Group cGroup_8_0 = (Group)cAlternatives_8.eContents().get(0);
		private final Keyword cInputKeyword_8_0_0 = (Keyword)cGroup_8_0.eContents().get(0);
		private final Assignment cParameterAssignment_8_0_1 = (Assignment)cGroup_8_0.eContents().get(1);
		private final RuleCall cParameterParameterInputParserRuleCall_8_0_1_0 = (RuleCall)cParameterAssignment_8_0_1.eContents().get(0);
		private final Group cGroup_8_1 = (Group)cAlternatives_8.eContents().get(1);
		private final Keyword cInoutKeyword_8_1_0 = (Keyword)cGroup_8_1.eContents().get(0);
		private final Assignment cParameterAssignment_8_1_1 = (Assignment)cGroup_8_1.eContents().get(1);
		private final RuleCall cParameterParameterInoutParserRuleCall_8_1_1_0 = (RuleCall)cParameterAssignment_8_1_1.eContents().get(0);
		private final Group cGroup_8_2 = (Group)cAlternatives_8.eContents().get(2);
		private final Keyword cOutputKeyword_8_2_0 = (Keyword)cGroup_8_2.eContents().get(0);
		private final Assignment cParameterAssignment_8_2_1 = (Assignment)cGroup_8_2.eContents().get(1);
		private final RuleCall cParameterParameterOutputParserRuleCall_8_2_1_0 = (RuleCall)cParameterAssignment_8_2_1.eContents().get(0);
		private final Group cGroup_8_3 = (Group)cAlternatives_8.eContents().get(3);
		private final Keyword cReturnKeyword_8_3_0 = (Keyword)cGroup_8_3.eContents().get(0);
		private final Assignment cParameterAssignment_8_3_1 = (Assignment)cGroup_8_3.eContents().get(1);
		private final RuleCall cParameterParameterReturnParserRuleCall_8_3_1_0 = (RuleCall)cParameterAssignment_8_3_1.eContents().get(0);
		private final Alternatives cAlternatives_9 = (Alternatives)cGroup.eContents().get(9);
		private final Group cGroup_9_0 = (Group)cAlternatives_9.eContents().get(0);
		private final Keyword cPropertyKeyword_9_0_0 = (Keyword)cGroup_9_0.eContents().get(0);
		private final Alternatives cAlternatives_9_0_1 = (Alternatives)cGroup_9_0.eContents().get(1);
		private final Assignment cPortAssignment_9_0_1_0 = (Assignment)cAlternatives_9_0_1.eContents().get(0);
		private final RuleCall cPortPortParserRuleCall_9_0_1_0_0 = (RuleCall)cPortAssignment_9_0_1_0.eContents().get(0);
		private final Assignment cSignalAssignment_9_0_1_1 = (Assignment)cAlternatives_9_0_1.eContents().get(1);
		private final RuleCall cSignalSignalParserRuleCall_9_0_1_1_0 = (RuleCall)cSignalAssignment_9_0_1_1.eContents().get(0);
		private final Assignment cBufferAssignment_9_0_1_2 = (Assignment)cAlternatives_9_0_1.eContents().get(2);
		private final RuleCall cBufferBufferParserRuleCall_9_0_1_2_0 = (RuleCall)cBufferAssignment_9_0_1_2.eContents().get(0);
		private final Assignment cChannelAssignment_9_0_1_3 = (Assignment)cAlternatives_9_0_1.eContents().get(3);
		private final RuleCall cChannelChannelParserRuleCall_9_0_1_3_0 = (RuleCall)cChannelAssignment_9_0_1_3.eContents().get(0);
		private final Assignment cTypedefAssignment_9_0_1_4 = (Assignment)cAlternatives_9_0_1.eContents().get(4);
		private final RuleCall cTypedefTypeDefinitionParserRuleCall_9_0_1_4_0 = (RuleCall)cTypedefAssignment_9_0_1_4.eContents().get(0);
		private final Assignment cFunctionAssignment_9_0_1_5 = (Assignment)cAlternatives_9_0_1.eContents().get(5);
		private final RuleCall cFunctionFunctionParserRuleCall_9_0_1_5_0 = (RuleCall)cFunctionAssignment_9_0_1_5.eContents().get(0);
		private final Assignment cVariableAssignment_9_0_1_6 = (Assignment)cAlternatives_9_0_1.eContents().get(6);
		private final RuleCall cVariableVariableParserRuleCall_9_0_1_6_0 = (RuleCall)cVariableAssignment_9_0_1_6.eContents().get(0);
		private final Group cGroup_9_1 = (Group)cAlternatives_9.eContents().get(1);
		private final Keyword cPublicKeyword_9_1_0 = (Keyword)cGroup_9_1.eContents().get(0);
		private final Alternatives cAlternatives_9_1_1 = (Alternatives)cGroup_9_1.eContents().get(1);
		private final Assignment cPortAssignment_9_1_1_0 = (Assignment)cAlternatives_9_1_1.eContents().get(0);
		private final RuleCall cPortPortPublicParserRuleCall_9_1_1_0_0 = (RuleCall)cPortAssignment_9_1_1_0.eContents().get(0);
		private final Assignment cSignalAssignment_9_1_1_1 = (Assignment)cAlternatives_9_1_1.eContents().get(1);
		private final RuleCall cSignalSignalPublicParserRuleCall_9_1_1_1_0 = (RuleCall)cSignalAssignment_9_1_1_1.eContents().get(0);
		private final Assignment cBufferAssignment_9_1_1_2 = (Assignment)cAlternatives_9_1_1.eContents().get(2);
		private final RuleCall cBufferBufferPublicParserRuleCall_9_1_1_2_0 = (RuleCall)cBufferAssignment_9_1_1_2.eContents().get(0);
		private final Assignment cChannelAssignment_9_1_1_3 = (Assignment)cAlternatives_9_1_1.eContents().get(3);
		private final RuleCall cChannelChannelPublicParserRuleCall_9_1_1_3_0 = (RuleCall)cChannelAssignment_9_1_1_3.eContents().get(0);
		private final Assignment cTypedefAssignment_9_1_1_4 = (Assignment)cAlternatives_9_1_1.eContents().get(4);
		private final RuleCall cTypedefTypeDefinitionParserRuleCall_9_1_1_4_0 = (RuleCall)cTypedefAssignment_9_1_1_4.eContents().get(0);
		private final Assignment cFunctionAssignment_9_1_1_5 = (Assignment)cAlternatives_9_1_1.eContents().get(5);
		private final RuleCall cFunctionFunctionPublicParserRuleCall_9_1_1_5_0 = (RuleCall)cFunctionAssignment_9_1_1_5.eContents().get(0);
		private final Assignment cVariableAssignment_9_1_1_6 = (Assignment)cAlternatives_9_1_1.eContents().get(6);
		private final RuleCall cVariableVariablePublicParserRuleCall_9_1_1_6_0 = (RuleCall)cVariableAssignment_9_1_1_6.eContents().get(0);
		private final Group cGroup_9_2 = (Group)cAlternatives_9.eContents().get(2);
		private final Keyword cProtectedKeyword_9_2_0 = (Keyword)cGroup_9_2.eContents().get(0);
		private final Alternatives cAlternatives_9_2_1 = (Alternatives)cGroup_9_2.eContents().get(1);
		private final Assignment cPortAssignment_9_2_1_0 = (Assignment)cAlternatives_9_2_1.eContents().get(0);
		private final RuleCall cPortPortProtectedParserRuleCall_9_2_1_0_0 = (RuleCall)cPortAssignment_9_2_1_0.eContents().get(0);
		private final Assignment cSignalAssignment_9_2_1_1 = (Assignment)cAlternatives_9_2_1.eContents().get(1);
		private final RuleCall cSignalSignalProtectedParserRuleCall_9_2_1_1_0 = (RuleCall)cSignalAssignment_9_2_1_1.eContents().get(0);
		private final Assignment cBufferAssignment_9_2_1_2 = (Assignment)cAlternatives_9_2_1.eContents().get(2);
		private final RuleCall cBufferBufferProtectedParserRuleCall_9_2_1_2_0 = (RuleCall)cBufferAssignment_9_2_1_2.eContents().get(0);
		private final Assignment cChannelAssignment_9_2_1_3 = (Assignment)cAlternatives_9_2_1.eContents().get(3);
		private final RuleCall cChannelChannelProtectedParserRuleCall_9_2_1_3_0 = (RuleCall)cChannelAssignment_9_2_1_3.eContents().get(0);
		private final Assignment cTypedefAssignment_9_2_1_4 = (Assignment)cAlternatives_9_2_1.eContents().get(4);
		private final RuleCall cTypedefTypeDefinitionParserRuleCall_9_2_1_4_0 = (RuleCall)cTypedefAssignment_9_2_1_4.eContents().get(0);
		private final Assignment cFunctionAssignment_9_2_1_5 = (Assignment)cAlternatives_9_2_1.eContents().get(5);
		private final RuleCall cFunctionFunctionProtectedParserRuleCall_9_2_1_5_0 = (RuleCall)cFunctionAssignment_9_2_1_5.eContents().get(0);
		private final Assignment cVariableAssignment_9_2_1_6 = (Assignment)cAlternatives_9_2_1.eContents().get(6);
		private final RuleCall cVariableVariableProtectedParserRuleCall_9_2_1_6_0 = (RuleCall)cVariableAssignment_9_2_1_6.eContents().get(0);
		private final Group cGroup_9_3 = (Group)cAlternatives_9.eContents().get(3);
		private final Keyword cPrivateKeyword_9_3_0 = (Keyword)cGroup_9_3.eContents().get(0);
		private final Alternatives cAlternatives_9_3_1 = (Alternatives)cGroup_9_3.eContents().get(1);
		private final Assignment cPortAssignment_9_3_1_0 = (Assignment)cAlternatives_9_3_1.eContents().get(0);
		private final RuleCall cPortPortPrivateParserRuleCall_9_3_1_0_0 = (RuleCall)cPortAssignment_9_3_1_0.eContents().get(0);
		private final Assignment cSignalAssignment_9_3_1_1 = (Assignment)cAlternatives_9_3_1.eContents().get(1);
		private final RuleCall cSignalSignalPrivateParserRuleCall_9_3_1_1_0 = (RuleCall)cSignalAssignment_9_3_1_1.eContents().get(0);
		private final Assignment cBufferAssignment_9_3_1_2 = (Assignment)cAlternatives_9_3_1.eContents().get(2);
		private final RuleCall cBufferBufferPrivateParserRuleCall_9_3_1_2_0 = (RuleCall)cBufferAssignment_9_3_1_2.eContents().get(0);
		private final Assignment cChannelAssignment_9_3_1_3 = (Assignment)cAlternatives_9_3_1.eContents().get(3);
		private final RuleCall cChannelChannelPrivateParserRuleCall_9_3_1_3_0 = (RuleCall)cChannelAssignment_9_3_1_3.eContents().get(0);
		private final Assignment cTypedefAssignment_9_3_1_4 = (Assignment)cAlternatives_9_3_1.eContents().get(4);
		private final RuleCall cTypedefTypeDefinitionParserRuleCall_9_3_1_4_0 = (RuleCall)cTypedefAssignment_9_3_1_4.eContents().get(0);
		private final Assignment cFunctionAssignment_9_3_1_5 = (Assignment)cAlternatives_9_3_1.eContents().get(5);
		private final RuleCall cFunctionFunctionPrivateParserRuleCall_9_3_1_5_0 = (RuleCall)cFunctionAssignment_9_3_1_5.eContents().get(0);
		private final Assignment cVariableAssignment_9_3_1_6 = (Assignment)cAlternatives_9_3_1.eContents().get(6);
		private final RuleCall cVariableVariablePrivateParserRuleCall_9_3_1_6_0 = (RuleCall)cVariableAssignment_9_3_1_6.eContents().get(0);
		private final Alternatives cAlternatives_10 = (Alternatives)cGroup.eContents().get(10);
		private final Alternatives cAlternatives_10_0 = (Alternatives)cAlternatives_10.eContents().get(0);
		private final Group cGroup_10_0_0 = (Group)cAlternatives_10_0.eContents().get(0);
		private final Alternatives cAlternatives_10_0_0_0 = (Alternatives)cGroup_10_0_0.eContents().get(0);
		private final Keyword cRoutineKeyword_10_0_0_0_0 = (Keyword)cAlternatives_10_0_0_0.eContents().get(0);
		private final Keyword cMacroKeyword_10_0_0_0_1 = (Keyword)cAlternatives_10_0_0_0.eContents().get(1);
		private final Assignment cRoutineAssignment_10_0_0_1 = (Assignment)cGroup_10_0_0.eContents().get(1);
		private final RuleCall cRoutineRoutineParserRuleCall_10_0_0_1_0 = (RuleCall)cRoutineAssignment_10_0_0_1.eContents().get(0);
		private final Group cGroup_10_0_1 = (Group)cAlternatives_10_0.eContents().get(1);
		private final Keyword cProcedureKeyword_10_0_1_0 = (Keyword)cGroup_10_0_1.eContents().get(0);
		private final Assignment cProcedureAssignment_10_0_1_1 = (Assignment)cGroup_10_0_1.eContents().get(1);
		private final RuleCall cProcedureProcedureParserRuleCall_10_0_1_1_0 = (RuleCall)cProcedureAssignment_10_0_1_1.eContents().get(0);
		private final Alternatives cAlternatives_10_1 = (Alternatives)cAlternatives_10.eContents().get(1);
		private final Assignment cRoutineAssignment_10_1_0 = (Assignment)cAlternatives_10_1.eContents().get(0);
		private final RuleCall cRoutineRoutineParserRuleCall_10_1_0_0 = (RuleCall)cRoutineAssignment_10_1_0.eContents().get(0);
		private final Assignment cProcedureAssignment_10_1_1 = (Assignment)cAlternatives_10_1.eContents().get(1);
		private final RuleCall cProcedureProcedureParserRuleCall_10_1_1_0 = (RuleCall)cProcedureAssignment_10_1_1.eContents().get(0);
		private final Alternatives cAlternatives_11 = (Alternatives)cGroup.eContents().get(11);
		private final Alternatives cAlternatives_11_0 = (Alternatives)cAlternatives_11.eContents().get(0);
		private final Group cGroup_11_0_0 = (Group)cAlternatives_11_0.eContents().get(0);
		private final Keyword cStatemachineKeyword_11_0_0_0 = (Keyword)cGroup_11_0_0.eContents().get(0);
		private final Assignment cMachineAssignment_11_0_0_1 = (Assignment)cGroup_11_0_0.eContents().get(1);
		private final RuleCall cMachineStatemachineParserRuleCall_11_0_0_1_0 = (RuleCall)cMachineAssignment_11_0_0_1.eContents().get(0);
		private final Group cGroup_11_0_1 = (Group)cAlternatives_11_0.eContents().get(1);
		private final Keyword cCompositeKeyword_11_0_1_0 = (Keyword)cGroup_11_0_1.eContents().get(0);
		private final Assignment cMachineAssignment_11_0_1_1 = (Assignment)cGroup_11_0_1.eContents().get(1);
		private final RuleCall cMachineAnyMachineBlockParserRuleCall_11_0_1_1_0 = (RuleCall)cMachineAssignment_11_0_1_1.eContents().get(0);
		private final Group cGroup_11_0_2 = (Group)cAlternatives_11_0.eContents().get(2);
		private final Keyword cModelKeyword_11_0_2_0 = (Keyword)cGroup_11_0_2.eContents().get(0);
		private final Assignment cMachineAssignment_11_0_2_1 = (Assignment)cGroup_11_0_2.eContents().get(1);
		private final RuleCall cMachineAnyMachineBlockParserRuleCall_11_0_2_1_0 = (RuleCall)cMachineAssignment_11_0_2_1.eContents().get(0);
		private final Group cGroup_11_0_3 = (Group)cAlternatives_11_0.eContents().get(3);
		private final Keyword cPrototypeKeyword_11_0_3_0 = (Keyword)cGroup_11_0_3.eContents().get(0);
		private final Assignment cMachineAssignment_11_0_3_1 = (Assignment)cGroup_11_0_3.eContents().get(1);
		private final RuleCall cMachineAnyMachineBlockParserRuleCall_11_0_3_1_0 = (RuleCall)cMachineAssignment_11_0_3_1.eContents().get(0);
		private final Group cGroup_11_0_4 = (Group)cAlternatives_11_0.eContents().get(4);
		private final Keyword cInstanceKeyword_11_0_4_0 = (Keyword)cGroup_11_0_4.eContents().get(0);
		private final Assignment cInstanceAssignment_11_0_4_1 = (Assignment)cGroup_11_0_4.eContents().get(1);
		private final RuleCall cInstanceInstanceMachineParserRuleCall_11_0_4_1_0 = (RuleCall)cInstanceAssignment_11_0_4_1.eContents().get(0);
		private final Assignment cRegionAssignment_11_1 = (Assignment)cAlternatives_11.eContents().get(1);
		private final RuleCall cRegionStatemachineRegionParserRuleCall_11_1_0 = (RuleCall)cRegionAssignment_11_1.eContents().get(0);
		private final Assignment cRegionAssignment_11_2 = (Assignment)cAlternatives_11.eContents().get(2);
		private final RuleCall cRegionStatemachineNamedRegionParserRuleCall_11_2_0 = (RuleCall)cRegionAssignment_11_2.eContents().get(0);
		private final Assignment cRegionAssignment_11_3 = (Assignment)cAlternatives_11.eContents().get(3);
		private final RuleCall cRegionStatemachineRegionLiteParserRuleCall_11_3_0 = (RuleCall)cRegionAssignment_11_3.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_12 = (UnorderedGroup)cGroup.eContents().get(12);
		private final Assignment cExecutionAssignment_12_0 = (Assignment)cUnorderedGroup_12.eContents().get(0);
		private final RuleCall cExecutionModelOfExecutionParserRuleCall_12_0_0 = (RuleCall)cExecutionAssignment_12_0.eContents().get(0);
		private final Assignment cInteractionAssignment_12_1 = (Assignment)cUnorderedGroup_12.eContents().get(1);
		private final RuleCall cInteractionModelOfInteractionParserRuleCall_12_1_0 = (RuleCall)cInteractionAssignment_12_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_13 = (Keyword)cGroup.eContents().get(13);
		
		//////////////////////////////////////////////////////////////////////////////////
		//// Statemachine Behavior View Rules
		//////////////////////////////////////////////////////////////////////////////////
		//Statemachine returns fmlStmchn::Statemachine
		//    : { fmlStmchn::Statemachine }
		//        ( ( visibility=VisibilityKind )?
		//        & ( timed?='timed' )?
		//        & ( dense_timed?='timed#dense' )?
		//        & ( discrete_timed?='timed#discrete' )?
		//        & ( input_enabled ?= 'input_enabled' )?
		//        & ( lifeline?='lifeline' )?
		//        & ( design=DesignKind )?
		//        )
		//        'statemachine' ( '<' ( 'moc:' )? ModelOfComputationKing '>' )?
		//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//        '{'
		//        ( '@parameter:'  //( parameter+=Parameter )+
		//            ( 'input'
		//                ( parameter+=ParameterInput
		//                | '{' ( parameter+=ParameterInput )+ '}'
		//                )
		//            | 'inout'
		//                ( parameter+=ParameterInout
		//                | '{' ( parameter+=ParameterInout )+ '}'
		//                )
		//            | 'output'
		//                ( parameter+=ParameterOutput
		//                | '{' ( parameter+=ParameterOutput )+ '}'
		//                )
		//            | 'return'
		//                ( parameter+=ParameterReturn
		//                | '{' ( parameter+=ParameterReturn )+ '}'
		//                )
		//            )*
		//        | // optional unnamed section for property full declaration / definition
		//            ( port+=Port
		//            | signal+=Signal
		//            | buffer+=Buffer
		//            | channel+=Channel
		//            | typedef+=TypeDefinition
		//            | function+=Function
		//            | variable+=Variable
		//            )*
		//        )
		//        ( '@input:'
		//            ( parameter+=ParameterInput  )*
		//        | '@inout:'
		//            ( parameter+=ParameterInout  )*
		//        | '@output:'
		//            ( parameter+=ParameterOutput )*
		//        | '@return:'
		//            ( parameter+=ParameterReturn )*
		//        )*
		//        ( '@property:'
		//            ( port+=Port
		//            | signal+=Signal
		//            | buffer+=Buffer
		//            | channel+=Channel
		//            | typedef+=TypeDefinition
		//            | function+=Function
		//            | variable+=Variable
		//            )*
		//        | '@public:'
		//            ( port+=PortPublic
		//            | signal+=SignalPublic
		//            | buffer+=BufferPublic
		//            | channel+=ChannelPublic
		//            | typedef+=TypeDefinition
		//            | function+=FunctionPublic
		//            | variable+=VariablePublic
		//            )*
		//        | '@protected:'
		//            ( port+=PortProtected
		//            | signal+=SignalProtected
		//            | buffer+=BufferProtected
		//            | channel+=ChannelProtected
		//            | typedef+=TypeDefinition
		//            | function+=FunctionProtected
		//            | variable+=VariableProtected
		//            )*
		//        | '@private:'
		//            ( port+=PortPrivate
		//            | signal+=SignalPrivate
		//            | buffer+=BufferPrivate
		//            | channel+=ChannelPrivate
		//            | typedef+=TypeDefinition
		//            | function+=FunctionPrivate
		//            | variable+=VariablePrivate
		//            )*
		//        )*
		//        ( ( ( '@routine:' | '@macro:' ) ( routine+=Routine )+
		//          | '@procedure:' ( procedure+=Procedure )+
		//          )*
		//        | ( routine+=Routine  | procedure+=Procedure )+
		//        )
		////        ( ( '@composite:' | '@statemachine:' )  ( machine +=Statemachine )+
		//        ( ( '@statemachine:' ( machine +=Statemachine    )+
		//            | '@composite:'  ( machine +=AnyMachineBlock )*
		//            | '@model:'      ( machine +=AnyMachineBlock )*
		//            | '@prototype:'  ( machine +=AnyMachineBlock )*
		//            | '@instance:'   ( instance+=InstanceMachine )*
		//            )+
		//        | region+=StatemachineRegion
		//        | ( region+=StatemachineNamedRegion )+
		//        | region+=StatemachineRegionLite
		//        )
		////        // optional unnamed section for property full declaration / definition
		////        propertyPart=PropertyPart
		////
		////        compositePart=CompositePart
		////
		////        ( region+=StatemachineRegion
		////        | ( region+=StatemachineNamedRegion )+
		////
		////        | region+=StatemachineRegionLite
		////        )
		//        ( ( execution=ModelOfExecution )?
		////        & ( computation=ModelOfComputation )?
		//        & ( interaction=ModelOfInteraction )?
		//        )
		//        '}'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		// { fmlStmchn::Statemachine }
		//        ( ( visibility=VisibilityKind )?
		//        & ( timed?='timed' )?
		//        & ( dense_timed?='timed#dense' )?
		//        & ( discrete_timed?='timed#discrete' )?
		//        & ( input_enabled ?= 'input_enabled' )?
		//        & ( lifeline?='lifeline' )?
		//        & ( design=DesignKind )?
		//        )
		//        'statemachine' ( '<' ( 'moc:' )? ModelOfComputationKing '>' )?
		//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//        '{'
		//        ( '@parameter:'  //( parameter+=Parameter )+
		//            ( 'input'
		//                ( parameter+=ParameterInput
		//                | '{' ( parameter+=ParameterInput )+ '}'
		//                )
		//            | 'inout'
		//                ( parameter+=ParameterInout
		//                | '{' ( parameter+=ParameterInout )+ '}'
		//                )
		//            | 'output'
		//                ( parameter+=ParameterOutput
		//                | '{' ( parameter+=ParameterOutput )+ '}'
		//                )
		//            | 'return'
		//                ( parameter+=ParameterReturn
		//                | '{' ( parameter+=ParameterReturn )+ '}'
		//                )
		//            )*
		//        | // optional unnamed section for property full declaration / definition
		//            ( port+=Port
		//            | signal+=Signal
		//            | buffer+=Buffer
		//            | channel+=Channel
		//            | typedef+=TypeDefinition
		//            | function+=Function
		//            | variable+=Variable
		//            )*
		//        )
		//        ( '@input:'
		//            ( parameter+=ParameterInput  )*
		//        | '@inout:'
		//            ( parameter+=ParameterInout  )*
		//        | '@output:'
		//            ( parameter+=ParameterOutput )*
		//        | '@return:'
		//            ( parameter+=ParameterReturn )*
		//        )*
		//        ( '@property:'
		//            ( port+=Port
		//            | signal+=Signal
		//            | buffer+=Buffer
		//            | channel+=Channel
		//            | typedef+=TypeDefinition
		//            | function+=Function
		//            | variable+=Variable
		//            )*
		//        | '@public:'
		//            ( port+=PortPublic
		//            | signal+=SignalPublic
		//            | buffer+=BufferPublic
		//            | channel+=ChannelPublic
		//            | typedef+=TypeDefinition
		//            | function+=FunctionPublic
		//            | variable+=VariablePublic
		//            )*
		//        | '@protected:'
		//            ( port+=PortProtected
		//            | signal+=SignalProtected
		//            | buffer+=BufferProtected
		//            | channel+=ChannelProtected
		//            | typedef+=TypeDefinition
		//            | function+=FunctionProtected
		//            | variable+=VariableProtected
		//            )*
		//        | '@private:'
		//            ( port+=PortPrivate
		//            | signal+=SignalPrivate
		//            | buffer+=BufferPrivate
		//            | channel+=ChannelPrivate
		//            | typedef+=TypeDefinition
		//            | function+=FunctionPrivate
		//            | variable+=VariablePrivate
		//            )*
		//        )*
		//        ( ( ( '@routine:' | '@macro:' ) ( routine+=Routine )+
		//          | '@procedure:' ( procedure+=Procedure )+
		//          )*
		//        | ( routine+=Routine  | procedure+=Procedure )+
		//        )
		////        ( ( '@composite:' | '@statemachine:' )  ( machine +=Statemachine )+
		//        ( ( '@statemachine:' ( machine +=Statemachine    )+
		//            | '@composite:'  ( machine +=AnyMachineBlock )*
		//            | '@model:'      ( machine +=AnyMachineBlock )*
		//            | '@prototype:'  ( machine +=AnyMachineBlock )*
		//            | '@instance:'   ( instance+=InstanceMachine )*
		//            )+
		//        | region+=StatemachineRegion
		//        | ( region+=StatemachineNamedRegion )+
		//        | region+=StatemachineRegionLite
		//        )
		////        // optional unnamed section for property full declaration / definition
		////        propertyPart=PropertyPart
		////
		////        compositePart=CompositePart
		////
		////        ( region+=StatemachineRegion
		////        | ( region+=StatemachineNamedRegion )+
		////
		////        | region+=StatemachineRegionLite
		////        )
		//        ( ( execution=ModelOfExecution )?
		////        & ( computation=ModelOfComputation )?
		//        & ( interaction=ModelOfInteraction )?
		//        )
		//        '}'
		public Group getGroup() { return cGroup; }
		
		//{ fmlStmchn::Statemachine }
		public Action getStatemachineAction_0() { return cStatemachineAction_0; }
		
		//( ( visibility=VisibilityKind )?
		//& ( timed?='timed' )?
		//& ( dense_timed?='timed#dense' )?
		//& ( discrete_timed?='timed#discrete' )?
		//& ( input_enabled ?= 'input_enabled' )?
		//& ( lifeline?='lifeline' )?
		//& ( design=DesignKind )?
		//)
		public UnorderedGroup getUnorderedGroup_1() { return cUnorderedGroup_1; }
		
		//( visibility=VisibilityKind )?
		public Assignment getVisibilityAssignment_1_0() { return cVisibilityAssignment_1_0; }
		
		//VisibilityKind
		public RuleCall getVisibilityVisibilityKindEnumRuleCall_1_0_0() { return cVisibilityVisibilityKindEnumRuleCall_1_0_0; }
		
		//( timed?='timed' )?
		public Assignment getTimedAssignment_1_1() { return cTimedAssignment_1_1; }
		
		//'timed'
		public Keyword getTimedTimedKeyword_1_1_0() { return cTimedTimedKeyword_1_1_0; }
		
		//( dense_timed?='timed#dense' )?
		public Assignment getDense_timedAssignment_1_2() { return cDense_timedAssignment_1_2; }
		
		//'timed#dense'
		public Keyword getDense_timedTimedDenseKeyword_1_2_0() { return cDense_timedTimedDenseKeyword_1_2_0; }
		
		//( discrete_timed?='timed#discrete' )?
		public Assignment getDiscrete_timedAssignment_1_3() { return cDiscrete_timedAssignment_1_3; }
		
		//'timed#discrete'
		public Keyword getDiscrete_timedTimedDiscreteKeyword_1_3_0() { return cDiscrete_timedTimedDiscreteKeyword_1_3_0; }
		
		//( input_enabled ?= 'input_enabled' )?
		public Assignment getInput_enabledAssignment_1_4() { return cInput_enabledAssignment_1_4; }
		
		//'input_enabled'
		public Keyword getInput_enabledInput_enabledKeyword_1_4_0() { return cInput_enabledInput_enabledKeyword_1_4_0; }
		
		//( lifeline?='lifeline' )?
		public Assignment getLifelineAssignment_1_5() { return cLifelineAssignment_1_5; }
		
		//'lifeline'
		public Keyword getLifelineLifelineKeyword_1_5_0() { return cLifelineLifelineKeyword_1_5_0; }
		
		//( design=DesignKind )?
		public Assignment getDesignAssignment_1_6() { return cDesignAssignment_1_6; }
		
		//DesignKind
		public RuleCall getDesignDesignKindEnumRuleCall_1_6_0() { return cDesignDesignKindEnumRuleCall_1_6_0; }
		
		//'statemachine'
		public Keyword getStatemachineKeyword_2() { return cStatemachineKeyword_2; }
		
		//( '<' ( 'moc:' )? ModelOfComputationKing '>' )?
		public Group getGroup_3() { return cGroup_3; }
		
		//'<'
		public Keyword getLessThanSignKeyword_3_0() { return cLessThanSignKeyword_3_0; }
		
		//( 'moc:' )?
		public Keyword getMocKeyword_3_1() { return cMocKeyword_3_1; }
		
		//ModelOfComputationKing
		public RuleCall getModelOfComputationKingParserRuleCall_3_2() { return cModelOfComputationKingParserRuleCall_3_2; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_3_3() { return cGreaterThanSignKeyword_3_3; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_4() { return cNameAssignment_4; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_4_0() { return cNameESIdentifierParserRuleCall_4_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_5() { return cUnrestrictedNameAssignment_5; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_5_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_6() { return cLeftCurlyBracketKeyword_6; }
		
		//( '@parameter:'  //( parameter+=Parameter )+
		//    ( 'input'
		//        ( parameter+=ParameterInput
		//        | '{' ( parameter+=ParameterInput )+ '}'
		//        )
		//    | 'inout'
		//        ( parameter+=ParameterInout
		//        | '{' ( parameter+=ParameterInout )+ '}'
		//        )
		//    | 'output'
		//        ( parameter+=ParameterOutput
		//        | '{' ( parameter+=ParameterOutput )+ '}'
		//        )
		//    | 'return'
		//        ( parameter+=ParameterReturn
		//        | '{' ( parameter+=ParameterReturn )+ '}'
		//        )
		//    )*
		//| // optional unnamed section for property full declaration / definition
		//    ( port+=Port
		//    | signal+=Signal
		//    | buffer+=Buffer
		//    | channel+=Channel
		//    | typedef+=TypeDefinition
		//    | function+=Function
		//    | variable+=Variable
		//    )*
		//)
		public Alternatives getAlternatives_7() { return cAlternatives_7; }
		
		//'@parameter:'  //( parameter+=Parameter )+
		//           ( 'input'
		//               ( parameter+=ParameterInput
		//               | '{' ( parameter+=ParameterInput )+ '}'
		//               )
		//           | 'inout'
		//               ( parameter+=ParameterInout
		//               | '{' ( parameter+=ParameterInout )+ '}'
		//               )
		//           | 'output'
		//               ( parameter+=ParameterOutput
		//               | '{' ( parameter+=ParameterOutput )+ '}'
		//               )
		//           | 'return'
		//               ( parameter+=ParameterReturn
		//               | '{' ( parameter+=ParameterReturn )+ '}'
		//               )
		//           )*
		public Group getGroup_7_0() { return cGroup_7_0; }
		
		//'@parameter:'
		public Keyword getParameterKeyword_7_0_0() { return cParameterKeyword_7_0_0; }
		
		////( parameter+=Parameter )+
		//          ( 'input'
		//              ( parameter+=ParameterInput
		//              | '{' ( parameter+=ParameterInput )+ '}'
		//              )
		//          | 'inout'
		//              ( parameter+=ParameterInout
		//              | '{' ( parameter+=ParameterInout )+ '}'
		//              )
		//          | 'output'
		//              ( parameter+=ParameterOutput
		//              | '{' ( parameter+=ParameterOutput )+ '}'
		//              )
		//          | 'return'
		//              ( parameter+=ParameterReturn
		//              | '{' ( parameter+=ParameterReturn )+ '}'
		//              )
		//          )*
		public Alternatives getAlternatives_7_0_1() { return cAlternatives_7_0_1; }
		
		//'input'
		//               ( parameter+=ParameterInput
		//               | '{' ( parameter+=ParameterInput )+ '}'
		//               )
		public Group getGroup_7_0_1_0() { return cGroup_7_0_1_0; }
		
		//'input'
		public Keyword getInputKeyword_7_0_1_0_0() { return cInputKeyword_7_0_1_0_0; }
		
		//( parameter+=ParameterInput
		//| '{' ( parameter+=ParameterInput )+ '}'
		//)
		public Alternatives getAlternatives_7_0_1_0_1() { return cAlternatives_7_0_1_0_1; }
		
		//parameter+=ParameterInput
		public Assignment getParameterAssignment_7_0_1_0_1_0() { return cParameterAssignment_7_0_1_0_1_0; }
		
		//ParameterInput
		public RuleCall getParameterParameterInputParserRuleCall_7_0_1_0_1_0_0() { return cParameterParameterInputParserRuleCall_7_0_1_0_1_0_0; }
		
		//'{' ( parameter+=ParameterInput )+ '}'
		public Group getGroup_7_0_1_0_1_1() { return cGroup_7_0_1_0_1_1; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_7_0_1_0_1_1_0() { return cLeftCurlyBracketKeyword_7_0_1_0_1_1_0; }
		
		//( parameter+=ParameterInput )+
		public Assignment getParameterAssignment_7_0_1_0_1_1_1() { return cParameterAssignment_7_0_1_0_1_1_1; }
		
		//ParameterInput
		public RuleCall getParameterParameterInputParserRuleCall_7_0_1_0_1_1_1_0() { return cParameterParameterInputParserRuleCall_7_0_1_0_1_1_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_7_0_1_0_1_1_2() { return cRightCurlyBracketKeyword_7_0_1_0_1_1_2; }
		
		//'inout'
		//               ( parameter+=ParameterInout
		//               | '{' ( parameter+=ParameterInout )+ '}'
		//               )
		public Group getGroup_7_0_1_1() { return cGroup_7_0_1_1; }
		
		//'inout'
		public Keyword getInoutKeyword_7_0_1_1_0() { return cInoutKeyword_7_0_1_1_0; }
		
		//( parameter+=ParameterInout
		//| '{' ( parameter+=ParameterInout )+ '}'
		//)
		public Alternatives getAlternatives_7_0_1_1_1() { return cAlternatives_7_0_1_1_1; }
		
		//parameter+=ParameterInout
		public Assignment getParameterAssignment_7_0_1_1_1_0() { return cParameterAssignment_7_0_1_1_1_0; }
		
		//ParameterInout
		public RuleCall getParameterParameterInoutParserRuleCall_7_0_1_1_1_0_0() { return cParameterParameterInoutParserRuleCall_7_0_1_1_1_0_0; }
		
		//'{' ( parameter+=ParameterInout )+ '}'
		public Group getGroup_7_0_1_1_1_1() { return cGroup_7_0_1_1_1_1; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_7_0_1_1_1_1_0() { return cLeftCurlyBracketKeyword_7_0_1_1_1_1_0; }
		
		//( parameter+=ParameterInout )+
		public Assignment getParameterAssignment_7_0_1_1_1_1_1() { return cParameterAssignment_7_0_1_1_1_1_1; }
		
		//ParameterInout
		public RuleCall getParameterParameterInoutParserRuleCall_7_0_1_1_1_1_1_0() { return cParameterParameterInoutParserRuleCall_7_0_1_1_1_1_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_7_0_1_1_1_1_2() { return cRightCurlyBracketKeyword_7_0_1_1_1_1_2; }
		
		//'output'
		//               ( parameter+=ParameterOutput
		//               | '{' ( parameter+=ParameterOutput )+ '}'
		//               )
		public Group getGroup_7_0_1_2() { return cGroup_7_0_1_2; }
		
		//'output'
		public Keyword getOutputKeyword_7_0_1_2_0() { return cOutputKeyword_7_0_1_2_0; }
		
		//( parameter+=ParameterOutput
		//| '{' ( parameter+=ParameterOutput )+ '}'
		//)
		public Alternatives getAlternatives_7_0_1_2_1() { return cAlternatives_7_0_1_2_1; }
		
		//parameter+=ParameterOutput
		public Assignment getParameterAssignment_7_0_1_2_1_0() { return cParameterAssignment_7_0_1_2_1_0; }
		
		//ParameterOutput
		public RuleCall getParameterParameterOutputParserRuleCall_7_0_1_2_1_0_0() { return cParameterParameterOutputParserRuleCall_7_0_1_2_1_0_0; }
		
		//'{' ( parameter+=ParameterOutput )+ '}'
		public Group getGroup_7_0_1_2_1_1() { return cGroup_7_0_1_2_1_1; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_7_0_1_2_1_1_0() { return cLeftCurlyBracketKeyword_7_0_1_2_1_1_0; }
		
		//( parameter+=ParameterOutput )+
		public Assignment getParameterAssignment_7_0_1_2_1_1_1() { return cParameterAssignment_7_0_1_2_1_1_1; }
		
		//ParameterOutput
		public RuleCall getParameterParameterOutputParserRuleCall_7_0_1_2_1_1_1_0() { return cParameterParameterOutputParserRuleCall_7_0_1_2_1_1_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_7_0_1_2_1_1_2() { return cRightCurlyBracketKeyword_7_0_1_2_1_1_2; }
		
		//'return'
		//               ( parameter+=ParameterReturn
		//               | '{' ( parameter+=ParameterReturn )+ '}'
		//               )
		public Group getGroup_7_0_1_3() { return cGroup_7_0_1_3; }
		
		//'return'
		public Keyword getReturnKeyword_7_0_1_3_0() { return cReturnKeyword_7_0_1_3_0; }
		
		//( parameter+=ParameterReturn
		//| '{' ( parameter+=ParameterReturn )+ '}'
		//)
		public Alternatives getAlternatives_7_0_1_3_1() { return cAlternatives_7_0_1_3_1; }
		
		//parameter+=ParameterReturn
		public Assignment getParameterAssignment_7_0_1_3_1_0() { return cParameterAssignment_7_0_1_3_1_0; }
		
		//ParameterReturn
		public RuleCall getParameterParameterReturnParserRuleCall_7_0_1_3_1_0_0() { return cParameterParameterReturnParserRuleCall_7_0_1_3_1_0_0; }
		
		//'{' ( parameter+=ParameterReturn )+ '}'
		public Group getGroup_7_0_1_3_1_1() { return cGroup_7_0_1_3_1_1; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_7_0_1_3_1_1_0() { return cLeftCurlyBracketKeyword_7_0_1_3_1_1_0; }
		
		//( parameter+=ParameterReturn )+
		public Assignment getParameterAssignment_7_0_1_3_1_1_1() { return cParameterAssignment_7_0_1_3_1_1_1; }
		
		//ParameterReturn
		public RuleCall getParameterParameterReturnParserRuleCall_7_0_1_3_1_1_1_0() { return cParameterParameterReturnParserRuleCall_7_0_1_3_1_1_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_7_0_1_3_1_1_2() { return cRightCurlyBracketKeyword_7_0_1_3_1_1_2; }
		
		//// optional unnamed section for property full declaration / definition
		//           ( port+=Port
		//           | signal+=Signal
		//           | buffer+=Buffer
		//           | channel+=Channel
		//           | typedef+=TypeDefinition
		//           | function+=Function
		//           | variable+=Variable
		//           )*
		public Alternatives getAlternatives_7_1() { return cAlternatives_7_1; }
		
		//port+=Port
		public Assignment getPortAssignment_7_1_0() { return cPortAssignment_7_1_0; }
		
		//Port
		public RuleCall getPortPortParserRuleCall_7_1_0_0() { return cPortPortParserRuleCall_7_1_0_0; }
		
		//signal+=Signal
		public Assignment getSignalAssignment_7_1_1() { return cSignalAssignment_7_1_1; }
		
		//Signal
		public RuleCall getSignalSignalParserRuleCall_7_1_1_0() { return cSignalSignalParserRuleCall_7_1_1_0; }
		
		//buffer+=Buffer
		public Assignment getBufferAssignment_7_1_2() { return cBufferAssignment_7_1_2; }
		
		//Buffer
		public RuleCall getBufferBufferParserRuleCall_7_1_2_0() { return cBufferBufferParserRuleCall_7_1_2_0; }
		
		//channel+=Channel
		public Assignment getChannelAssignment_7_1_3() { return cChannelAssignment_7_1_3; }
		
		//Channel
		public RuleCall getChannelChannelParserRuleCall_7_1_3_0() { return cChannelChannelParserRuleCall_7_1_3_0; }
		
		//typedef+=TypeDefinition
		public Assignment getTypedefAssignment_7_1_4() { return cTypedefAssignment_7_1_4; }
		
		//TypeDefinition
		public RuleCall getTypedefTypeDefinitionParserRuleCall_7_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_7_1_4_0; }
		
		//function+=Function
		public Assignment getFunctionAssignment_7_1_5() { return cFunctionAssignment_7_1_5; }
		
		//Function
		public RuleCall getFunctionFunctionParserRuleCall_7_1_5_0() { return cFunctionFunctionParserRuleCall_7_1_5_0; }
		
		//variable+=Variable
		public Assignment getVariableAssignment_7_1_6() { return cVariableAssignment_7_1_6; }
		
		//Variable
		public RuleCall getVariableVariableParserRuleCall_7_1_6_0() { return cVariableVariableParserRuleCall_7_1_6_0; }
		
		//( '@input:'
		//    ( parameter+=ParameterInput  )*
		//| '@inout:'
		//    ( parameter+=ParameterInout  )*
		//| '@output:'
		//    ( parameter+=ParameterOutput )*
		//| '@return:'
		//    ( parameter+=ParameterReturn )*
		//)*
		public Alternatives getAlternatives_8() { return cAlternatives_8; }
		
		//'@input:'
		//           ( parameter+=ParameterInput  )*
		public Group getGroup_8_0() { return cGroup_8_0; }
		
		//'@input:'
		public Keyword getInputKeyword_8_0_0() { return cInputKeyword_8_0_0; }
		
		//( parameter+=ParameterInput  )*
		public Assignment getParameterAssignment_8_0_1() { return cParameterAssignment_8_0_1; }
		
		//ParameterInput
		public RuleCall getParameterParameterInputParserRuleCall_8_0_1_0() { return cParameterParameterInputParserRuleCall_8_0_1_0; }
		
		//'@inout:'
		//           ( parameter+=ParameterInout  )*
		public Group getGroup_8_1() { return cGroup_8_1; }
		
		//'@inout:'
		public Keyword getInoutKeyword_8_1_0() { return cInoutKeyword_8_1_0; }
		
		//( parameter+=ParameterInout  )*
		public Assignment getParameterAssignment_8_1_1() { return cParameterAssignment_8_1_1; }
		
		//ParameterInout
		public RuleCall getParameterParameterInoutParserRuleCall_8_1_1_0() { return cParameterParameterInoutParserRuleCall_8_1_1_0; }
		
		//'@output:'
		//           ( parameter+=ParameterOutput )*
		public Group getGroup_8_2() { return cGroup_8_2; }
		
		//'@output:'
		public Keyword getOutputKeyword_8_2_0() { return cOutputKeyword_8_2_0; }
		
		//( parameter+=ParameterOutput )*
		public Assignment getParameterAssignment_8_2_1() { return cParameterAssignment_8_2_1; }
		
		//ParameterOutput
		public RuleCall getParameterParameterOutputParserRuleCall_8_2_1_0() { return cParameterParameterOutputParserRuleCall_8_2_1_0; }
		
		//'@return:'
		//           ( parameter+=ParameterReturn )*
		public Group getGroup_8_3() { return cGroup_8_3; }
		
		//'@return:'
		public Keyword getReturnKeyword_8_3_0() { return cReturnKeyword_8_3_0; }
		
		//( parameter+=ParameterReturn )*
		public Assignment getParameterAssignment_8_3_1() { return cParameterAssignment_8_3_1; }
		
		//ParameterReturn
		public RuleCall getParameterParameterReturnParserRuleCall_8_3_1_0() { return cParameterParameterReturnParserRuleCall_8_3_1_0; }
		
		//( '@property:'
		//    ( port+=Port
		//    | signal+=Signal
		//    | buffer+=Buffer
		//    | channel+=Channel
		//    | typedef+=TypeDefinition
		//    | function+=Function
		//    | variable+=Variable
		//    )*
		//| '@public:'
		//    ( port+=PortPublic
		//    | signal+=SignalPublic
		//    | buffer+=BufferPublic
		//    | channel+=ChannelPublic
		//    | typedef+=TypeDefinition
		//    | function+=FunctionPublic
		//    | variable+=VariablePublic
		//    )*
		//| '@protected:'
		//    ( port+=PortProtected
		//    | signal+=SignalProtected
		//    | buffer+=BufferProtected
		//    | channel+=ChannelProtected
		//    | typedef+=TypeDefinition
		//    | function+=FunctionProtected
		//    | variable+=VariableProtected
		//    )*
		//| '@private:'
		//    ( port+=PortPrivate
		//    | signal+=SignalPrivate
		//    | buffer+=BufferPrivate
		//    | channel+=ChannelPrivate
		//    | typedef+=TypeDefinition
		//    | function+=FunctionPrivate
		//    | variable+=VariablePrivate
		//    )*
		//)*
		public Alternatives getAlternatives_9() { return cAlternatives_9; }
		
		//'@property:'
		//           ( port+=Port
		//           | signal+=Signal
		//           | buffer+=Buffer
		//           | channel+=Channel
		//           | typedef+=TypeDefinition
		//           | function+=Function
		//           | variable+=Variable
		//           )*
		public Group getGroup_9_0() { return cGroup_9_0; }
		
		//'@property:'
		public Keyword getPropertyKeyword_9_0_0() { return cPropertyKeyword_9_0_0; }
		
		//( port+=Port
		//| signal+=Signal
		//| buffer+=Buffer
		//| channel+=Channel
		//| typedef+=TypeDefinition
		//| function+=Function
		//| variable+=Variable
		//)*
		public Alternatives getAlternatives_9_0_1() { return cAlternatives_9_0_1; }
		
		//port+=Port
		public Assignment getPortAssignment_9_0_1_0() { return cPortAssignment_9_0_1_0; }
		
		//Port
		public RuleCall getPortPortParserRuleCall_9_0_1_0_0() { return cPortPortParserRuleCall_9_0_1_0_0; }
		
		//signal+=Signal
		public Assignment getSignalAssignment_9_0_1_1() { return cSignalAssignment_9_0_1_1; }
		
		//Signal
		public RuleCall getSignalSignalParserRuleCall_9_0_1_1_0() { return cSignalSignalParserRuleCall_9_0_1_1_0; }
		
		//buffer+=Buffer
		public Assignment getBufferAssignment_9_0_1_2() { return cBufferAssignment_9_0_1_2; }
		
		//Buffer
		public RuleCall getBufferBufferParserRuleCall_9_0_1_2_0() { return cBufferBufferParserRuleCall_9_0_1_2_0; }
		
		//channel+=Channel
		public Assignment getChannelAssignment_9_0_1_3() { return cChannelAssignment_9_0_1_3; }
		
		//Channel
		public RuleCall getChannelChannelParserRuleCall_9_0_1_3_0() { return cChannelChannelParserRuleCall_9_0_1_3_0; }
		
		//typedef+=TypeDefinition
		public Assignment getTypedefAssignment_9_0_1_4() { return cTypedefAssignment_9_0_1_4; }
		
		//TypeDefinition
		public RuleCall getTypedefTypeDefinitionParserRuleCall_9_0_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_9_0_1_4_0; }
		
		//function+=Function
		public Assignment getFunctionAssignment_9_0_1_5() { return cFunctionAssignment_9_0_1_5; }
		
		//Function
		public RuleCall getFunctionFunctionParserRuleCall_9_0_1_5_0() { return cFunctionFunctionParserRuleCall_9_0_1_5_0; }
		
		//variable+=Variable
		public Assignment getVariableAssignment_9_0_1_6() { return cVariableAssignment_9_0_1_6; }
		
		//Variable
		public RuleCall getVariableVariableParserRuleCall_9_0_1_6_0() { return cVariableVariableParserRuleCall_9_0_1_6_0; }
		
		//'@public:'
		//           ( port+=PortPublic
		//           | signal+=SignalPublic
		//           | buffer+=BufferPublic
		//           | channel+=ChannelPublic
		//           | typedef+=TypeDefinition
		//           | function+=FunctionPublic
		//           | variable+=VariablePublic
		//           )*
		public Group getGroup_9_1() { return cGroup_9_1; }
		
		//'@public:'
		public Keyword getPublicKeyword_9_1_0() { return cPublicKeyword_9_1_0; }
		
		//( port+=PortPublic
		//| signal+=SignalPublic
		//| buffer+=BufferPublic
		//| channel+=ChannelPublic
		//| typedef+=TypeDefinition
		//| function+=FunctionPublic
		//| variable+=VariablePublic
		//)*
		public Alternatives getAlternatives_9_1_1() { return cAlternatives_9_1_1; }
		
		//port+=PortPublic
		public Assignment getPortAssignment_9_1_1_0() { return cPortAssignment_9_1_1_0; }
		
		//PortPublic
		public RuleCall getPortPortPublicParserRuleCall_9_1_1_0_0() { return cPortPortPublicParserRuleCall_9_1_1_0_0; }
		
		//signal+=SignalPublic
		public Assignment getSignalAssignment_9_1_1_1() { return cSignalAssignment_9_1_1_1; }
		
		//SignalPublic
		public RuleCall getSignalSignalPublicParserRuleCall_9_1_1_1_0() { return cSignalSignalPublicParserRuleCall_9_1_1_1_0; }
		
		//buffer+=BufferPublic
		public Assignment getBufferAssignment_9_1_1_2() { return cBufferAssignment_9_1_1_2; }
		
		//BufferPublic
		public RuleCall getBufferBufferPublicParserRuleCall_9_1_1_2_0() { return cBufferBufferPublicParserRuleCall_9_1_1_2_0; }
		
		//channel+=ChannelPublic
		public Assignment getChannelAssignment_9_1_1_3() { return cChannelAssignment_9_1_1_3; }
		
		//ChannelPublic
		public RuleCall getChannelChannelPublicParserRuleCall_9_1_1_3_0() { return cChannelChannelPublicParserRuleCall_9_1_1_3_0; }
		
		//typedef+=TypeDefinition
		public Assignment getTypedefAssignment_9_1_1_4() { return cTypedefAssignment_9_1_1_4; }
		
		//TypeDefinition
		public RuleCall getTypedefTypeDefinitionParserRuleCall_9_1_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_9_1_1_4_0; }
		
		//function+=FunctionPublic
		public Assignment getFunctionAssignment_9_1_1_5() { return cFunctionAssignment_9_1_1_5; }
		
		//FunctionPublic
		public RuleCall getFunctionFunctionPublicParserRuleCall_9_1_1_5_0() { return cFunctionFunctionPublicParserRuleCall_9_1_1_5_0; }
		
		//variable+=VariablePublic
		public Assignment getVariableAssignment_9_1_1_6() { return cVariableAssignment_9_1_1_6; }
		
		//VariablePublic
		public RuleCall getVariableVariablePublicParserRuleCall_9_1_1_6_0() { return cVariableVariablePublicParserRuleCall_9_1_1_6_0; }
		
		//'@protected:'
		//           ( port+=PortProtected
		//           | signal+=SignalProtected
		//           | buffer+=BufferProtected
		//           | channel+=ChannelProtected
		//           | typedef+=TypeDefinition
		//           | function+=FunctionProtected
		//           | variable+=VariableProtected
		//           )*
		public Group getGroup_9_2() { return cGroup_9_2; }
		
		//'@protected:'
		public Keyword getProtectedKeyword_9_2_0() { return cProtectedKeyword_9_2_0; }
		
		//( port+=PortProtected
		//| signal+=SignalProtected
		//| buffer+=BufferProtected
		//| channel+=ChannelProtected
		//| typedef+=TypeDefinition
		//| function+=FunctionProtected
		//| variable+=VariableProtected
		//)*
		public Alternatives getAlternatives_9_2_1() { return cAlternatives_9_2_1; }
		
		//port+=PortProtected
		public Assignment getPortAssignment_9_2_1_0() { return cPortAssignment_9_2_1_0; }
		
		//PortProtected
		public RuleCall getPortPortProtectedParserRuleCall_9_2_1_0_0() { return cPortPortProtectedParserRuleCall_9_2_1_0_0; }
		
		//signal+=SignalProtected
		public Assignment getSignalAssignment_9_2_1_1() { return cSignalAssignment_9_2_1_1; }
		
		//SignalProtected
		public RuleCall getSignalSignalProtectedParserRuleCall_9_2_1_1_0() { return cSignalSignalProtectedParserRuleCall_9_2_1_1_0; }
		
		//buffer+=BufferProtected
		public Assignment getBufferAssignment_9_2_1_2() { return cBufferAssignment_9_2_1_2; }
		
		//BufferProtected
		public RuleCall getBufferBufferProtectedParserRuleCall_9_2_1_2_0() { return cBufferBufferProtectedParserRuleCall_9_2_1_2_0; }
		
		//channel+=ChannelProtected
		public Assignment getChannelAssignment_9_2_1_3() { return cChannelAssignment_9_2_1_3; }
		
		//ChannelProtected
		public RuleCall getChannelChannelProtectedParserRuleCall_9_2_1_3_0() { return cChannelChannelProtectedParserRuleCall_9_2_1_3_0; }
		
		//typedef+=TypeDefinition
		public Assignment getTypedefAssignment_9_2_1_4() { return cTypedefAssignment_9_2_1_4; }
		
		//TypeDefinition
		public RuleCall getTypedefTypeDefinitionParserRuleCall_9_2_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_9_2_1_4_0; }
		
		//function+=FunctionProtected
		public Assignment getFunctionAssignment_9_2_1_5() { return cFunctionAssignment_9_2_1_5; }
		
		//FunctionProtected
		public RuleCall getFunctionFunctionProtectedParserRuleCall_9_2_1_5_0() { return cFunctionFunctionProtectedParserRuleCall_9_2_1_5_0; }
		
		//variable+=VariableProtected
		public Assignment getVariableAssignment_9_2_1_6() { return cVariableAssignment_9_2_1_6; }
		
		//VariableProtected
		public RuleCall getVariableVariableProtectedParserRuleCall_9_2_1_6_0() { return cVariableVariableProtectedParserRuleCall_9_2_1_6_0; }
		
		//'@private:'
		//           ( port+=PortPrivate
		//           | signal+=SignalPrivate
		//           | buffer+=BufferPrivate
		//           | channel+=ChannelPrivate
		//           | typedef+=TypeDefinition
		//           | function+=FunctionPrivate
		//           | variable+=VariablePrivate
		//           )*
		public Group getGroup_9_3() { return cGroup_9_3; }
		
		//'@private:'
		public Keyword getPrivateKeyword_9_3_0() { return cPrivateKeyword_9_3_0; }
		
		//( port+=PortPrivate
		//| signal+=SignalPrivate
		//| buffer+=BufferPrivate
		//| channel+=ChannelPrivate
		//| typedef+=TypeDefinition
		//| function+=FunctionPrivate
		//| variable+=VariablePrivate
		//)*
		public Alternatives getAlternatives_9_3_1() { return cAlternatives_9_3_1; }
		
		//port+=PortPrivate
		public Assignment getPortAssignment_9_3_1_0() { return cPortAssignment_9_3_1_0; }
		
		//PortPrivate
		public RuleCall getPortPortPrivateParserRuleCall_9_3_1_0_0() { return cPortPortPrivateParserRuleCall_9_3_1_0_0; }
		
		//signal+=SignalPrivate
		public Assignment getSignalAssignment_9_3_1_1() { return cSignalAssignment_9_3_1_1; }
		
		//SignalPrivate
		public RuleCall getSignalSignalPrivateParserRuleCall_9_3_1_1_0() { return cSignalSignalPrivateParserRuleCall_9_3_1_1_0; }
		
		//buffer+=BufferPrivate
		public Assignment getBufferAssignment_9_3_1_2() { return cBufferAssignment_9_3_1_2; }
		
		//BufferPrivate
		public RuleCall getBufferBufferPrivateParserRuleCall_9_3_1_2_0() { return cBufferBufferPrivateParserRuleCall_9_3_1_2_0; }
		
		//channel+=ChannelPrivate
		public Assignment getChannelAssignment_9_3_1_3() { return cChannelAssignment_9_3_1_3; }
		
		//ChannelPrivate
		public RuleCall getChannelChannelPrivateParserRuleCall_9_3_1_3_0() { return cChannelChannelPrivateParserRuleCall_9_3_1_3_0; }
		
		//typedef+=TypeDefinition
		public Assignment getTypedefAssignment_9_3_1_4() { return cTypedefAssignment_9_3_1_4; }
		
		//TypeDefinition
		public RuleCall getTypedefTypeDefinitionParserRuleCall_9_3_1_4_0() { return cTypedefTypeDefinitionParserRuleCall_9_3_1_4_0; }
		
		//function+=FunctionPrivate
		public Assignment getFunctionAssignment_9_3_1_5() { return cFunctionAssignment_9_3_1_5; }
		
		//FunctionPrivate
		public RuleCall getFunctionFunctionPrivateParserRuleCall_9_3_1_5_0() { return cFunctionFunctionPrivateParserRuleCall_9_3_1_5_0; }
		
		//variable+=VariablePrivate
		public Assignment getVariableAssignment_9_3_1_6() { return cVariableAssignment_9_3_1_6; }
		
		//VariablePrivate
		public RuleCall getVariableVariablePrivateParserRuleCall_9_3_1_6_0() { return cVariableVariablePrivateParserRuleCall_9_3_1_6_0; }
		
		//( ( ( '@routine:' | '@macro:' ) ( routine+=Routine )+
		//  | '@procedure:' ( procedure+=Procedure )+
		//  )*
		//| ( routine+=Routine  | procedure+=Procedure )+
		//)
		public Alternatives getAlternatives_10() { return cAlternatives_10; }
		
		//( ( '@routine:' | '@macro:' ) ( routine+=Routine )+
		//         | '@procedure:' ( procedure+=Procedure )+
		//         )*
		public Alternatives getAlternatives_10_0() { return cAlternatives_10_0; }
		
		//( '@routine:' | '@macro:' ) ( routine+=Routine )+
		public Group getGroup_10_0_0() { return cGroup_10_0_0; }
		
		//( '@routine:' | '@macro:' )
		public Alternatives getAlternatives_10_0_0_0() { return cAlternatives_10_0_0_0; }
		
		//'@routine:'
		public Keyword getRoutineKeyword_10_0_0_0_0() { return cRoutineKeyword_10_0_0_0_0; }
		
		//'@macro:'
		public Keyword getMacroKeyword_10_0_0_0_1() { return cMacroKeyword_10_0_0_0_1; }
		
		//( routine+=Routine )+
		public Assignment getRoutineAssignment_10_0_0_1() { return cRoutineAssignment_10_0_0_1; }
		
		//Routine
		public RuleCall getRoutineRoutineParserRuleCall_10_0_0_1_0() { return cRoutineRoutineParserRuleCall_10_0_0_1_0; }
		
		//'@procedure:' ( procedure+=Procedure )+
		public Group getGroup_10_0_1() { return cGroup_10_0_1; }
		
		//'@procedure:'
		public Keyword getProcedureKeyword_10_0_1_0() { return cProcedureKeyword_10_0_1_0; }
		
		//( procedure+=Procedure )+
		public Assignment getProcedureAssignment_10_0_1_1() { return cProcedureAssignment_10_0_1_1; }
		
		//Procedure
		public RuleCall getProcedureProcedureParserRuleCall_10_0_1_1_0() { return cProcedureProcedureParserRuleCall_10_0_1_1_0; }
		
		//( routine+=Routine  | procedure+=Procedure )+
		public Alternatives getAlternatives_10_1() { return cAlternatives_10_1; }
		
		//routine+=Routine
		public Assignment getRoutineAssignment_10_1_0() { return cRoutineAssignment_10_1_0; }
		
		//Routine
		public RuleCall getRoutineRoutineParserRuleCall_10_1_0_0() { return cRoutineRoutineParserRuleCall_10_1_0_0; }
		
		//procedure+=Procedure
		public Assignment getProcedureAssignment_10_1_1() { return cProcedureAssignment_10_1_1; }
		
		//Procedure
		public RuleCall getProcedureProcedureParserRuleCall_10_1_1_0() { return cProcedureProcedureParserRuleCall_10_1_1_0; }
		
		////        ( ( '@composite:' | '@statemachine:' )  ( machine +=Statemachine )+
		//        ( ( '@statemachine:' ( machine +=Statemachine    )+
		//            | '@composite:'  ( machine +=AnyMachineBlock )*
		//            | '@model:'      ( machine +=AnyMachineBlock )*
		//            | '@prototype:'  ( machine +=AnyMachineBlock )*
		//            | '@instance:'   ( instance+=InstanceMachine )*
		//            )+
		//        | region+=StatemachineRegion
		//        | ( region+=StatemachineNamedRegion )+
		//        | region+=StatemachineRegionLite
		//        )
		public Alternatives getAlternatives_11() { return cAlternatives_11; }
		
		//( '@statemachine:' ( machine +=Statemachine    )+
		//           | '@composite:'  ( machine +=AnyMachineBlock )*
		//           | '@model:'      ( machine +=AnyMachineBlock )*
		//           | '@prototype:'  ( machine +=AnyMachineBlock )*
		//           | '@instance:'   ( instance+=InstanceMachine )*
		//           )+
		public Alternatives getAlternatives_11_0() { return cAlternatives_11_0; }
		
		//'@statemachine:' ( machine +=Statemachine    )+
		public Group getGroup_11_0_0() { return cGroup_11_0_0; }
		
		//'@statemachine:'
		public Keyword getStatemachineKeyword_11_0_0_0() { return cStatemachineKeyword_11_0_0_0; }
		
		//( machine +=Statemachine    )+
		public Assignment getMachineAssignment_11_0_0_1() { return cMachineAssignment_11_0_0_1; }
		
		//Statemachine
		public RuleCall getMachineStatemachineParserRuleCall_11_0_0_1_0() { return cMachineStatemachineParserRuleCall_11_0_0_1_0; }
		
		//'@composite:'  ( machine +=AnyMachineBlock )*
		public Group getGroup_11_0_1() { return cGroup_11_0_1; }
		
		//'@composite:'
		public Keyword getCompositeKeyword_11_0_1_0() { return cCompositeKeyword_11_0_1_0; }
		
		//( machine +=AnyMachineBlock )*
		public Assignment getMachineAssignment_11_0_1_1() { return cMachineAssignment_11_0_1_1; }
		
		//AnyMachineBlock
		public RuleCall getMachineAnyMachineBlockParserRuleCall_11_0_1_1_0() { return cMachineAnyMachineBlockParserRuleCall_11_0_1_1_0; }
		
		//'@model:'      ( machine +=AnyMachineBlock )*
		public Group getGroup_11_0_2() { return cGroup_11_0_2; }
		
		//'@model:'
		public Keyword getModelKeyword_11_0_2_0() { return cModelKeyword_11_0_2_0; }
		
		//( machine +=AnyMachineBlock )*
		public Assignment getMachineAssignment_11_0_2_1() { return cMachineAssignment_11_0_2_1; }
		
		//AnyMachineBlock
		public RuleCall getMachineAnyMachineBlockParserRuleCall_11_0_2_1_0() { return cMachineAnyMachineBlockParserRuleCall_11_0_2_1_0; }
		
		//'@prototype:'  ( machine +=AnyMachineBlock )*
		public Group getGroup_11_0_3() { return cGroup_11_0_3; }
		
		//'@prototype:'
		public Keyword getPrototypeKeyword_11_0_3_0() { return cPrototypeKeyword_11_0_3_0; }
		
		//( machine +=AnyMachineBlock )*
		public Assignment getMachineAssignment_11_0_3_1() { return cMachineAssignment_11_0_3_1; }
		
		//AnyMachineBlock
		public RuleCall getMachineAnyMachineBlockParserRuleCall_11_0_3_1_0() { return cMachineAnyMachineBlockParserRuleCall_11_0_3_1_0; }
		
		//'@instance:'   ( instance+=InstanceMachine )*
		public Group getGroup_11_0_4() { return cGroup_11_0_4; }
		
		//'@instance:'
		public Keyword getInstanceKeyword_11_0_4_0() { return cInstanceKeyword_11_0_4_0; }
		
		//( instance+=InstanceMachine )*
		public Assignment getInstanceAssignment_11_0_4_1() { return cInstanceAssignment_11_0_4_1; }
		
		//InstanceMachine
		public RuleCall getInstanceInstanceMachineParserRuleCall_11_0_4_1_0() { return cInstanceInstanceMachineParserRuleCall_11_0_4_1_0; }
		
		//region+=StatemachineRegion
		public Assignment getRegionAssignment_11_1() { return cRegionAssignment_11_1; }
		
		//StatemachineRegion
		public RuleCall getRegionStatemachineRegionParserRuleCall_11_1_0() { return cRegionStatemachineRegionParserRuleCall_11_1_0; }
		
		//( region+=StatemachineNamedRegion )+
		public Assignment getRegionAssignment_11_2() { return cRegionAssignment_11_2; }
		
		//StatemachineNamedRegion
		public RuleCall getRegionStatemachineNamedRegionParserRuleCall_11_2_0() { return cRegionStatemachineNamedRegionParserRuleCall_11_2_0; }
		
		//region+=StatemachineRegionLite
		public Assignment getRegionAssignment_11_3() { return cRegionAssignment_11_3; }
		
		//StatemachineRegionLite
		public RuleCall getRegionStatemachineRegionLiteParserRuleCall_11_3_0() { return cRegionStatemachineRegionLiteParserRuleCall_11_3_0; }
		
		////        // optional unnamed section for property full declaration / definition
		////        propertyPart=PropertyPart
		////
		////        compositePart=CompositePart
		////
		////        ( region+=StatemachineRegion
		////        | ( region+=StatemachineNamedRegion )+
		////
		////        | region+=StatemachineRegionLite
		////        )
		//        ( ( execution=ModelOfExecution )?
		////        & ( computation=ModelOfComputation )?
		//        & ( interaction=ModelOfInteraction )?
		//        )
		public UnorderedGroup getUnorderedGroup_12() { return cUnorderedGroup_12; }
		
		//( execution=ModelOfExecution )?
		public Assignment getExecutionAssignment_12_0() { return cExecutionAssignment_12_0; }
		
		//ModelOfExecution
		public RuleCall getExecutionModelOfExecutionParserRuleCall_12_0_0() { return cExecutionModelOfExecutionParserRuleCall_12_0_0; }
		
		//( interaction=ModelOfInteraction )?
		public Assignment getInteractionAssignment_12_1() { return cInteractionAssignment_12_1; }
		
		//ModelOfInteraction
		public RuleCall getInteractionModelOfInteractionParserRuleCall_12_1_0() { return cInteractionModelOfInteractionParserRuleCall_12_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_13() { return cRightCurlyBracketKeyword_13; }
	}
	public class StatemachineRegionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.StatemachineRegion");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cRegionAction_0 = (Action)cGroup.eContents().get(0);
		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
		private final Keyword cStateKeyword_1_0 = (Keyword)cAlternatives_1.eContents().get(0);
		private final Keyword cRegionKeyword_1_1 = (Keyword)cAlternatives_1.eContents().get(1);
		private final Alternatives cAlternatives_2 = (Alternatives)cGroup.eContents().get(2);
		private final Assignment cVertexAssignment_2_0 = (Assignment)cAlternatives_2.eContents().get(0);
		private final RuleCall cVertexStateParserRuleCall_2_0_0 = (RuleCall)cVertexAssignment_2_0.eContents().get(0);
		private final Assignment cVertexAssignment_2_1 = (Assignment)cAlternatives_2.eContents().get(1);
		private final RuleCall cVertexPseudostateParserRuleCall_2_1_0 = (RuleCall)cVertexAssignment_2_1.eContents().get(0);
		
		//StatemachineRegion returns fmlStmchn::Region
		//    : {fmlStmchn::Region}
		//        ( '@state:' | '@region:' )
		//        ( vertex+=State
		//        | vertex+=Pseudostate
		//        )+
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlStmchn::Region}
		//       ( '@state:' | '@region:' )
		//       ( vertex+=State
		//       | vertex+=Pseudostate
		//       )+
		public Group getGroup() { return cGroup; }
		
		//{fmlStmchn::Region}
		public Action getRegionAction_0() { return cRegionAction_0; }
		
		//( '@state:' | '@region:' )
		public Alternatives getAlternatives_1() { return cAlternatives_1; }
		
		//'@state:'
		public Keyword getStateKeyword_1_0() { return cStateKeyword_1_0; }
		
		//'@region:'
		public Keyword getRegionKeyword_1_1() { return cRegionKeyword_1_1; }
		
		//( vertex+=State
		//| vertex+=Pseudostate
		//)+
		public Alternatives getAlternatives_2() { return cAlternatives_2; }
		
		//vertex+=State
		public Assignment getVertexAssignment_2_0() { return cVertexAssignment_2_0; }
		
		//State
		public RuleCall getVertexStateParserRuleCall_2_0_0() { return cVertexStateParserRuleCall_2_0_0; }
		
		//vertex+=Pseudostate
		public Assignment getVertexAssignment_2_1() { return cVertexAssignment_2_1; }
		
		//Pseudostate
		public RuleCall getVertexPseudostateParserRuleCall_2_1_0() { return cVertexPseudostateParserRuleCall_2_1_0; }
	}
	public class StatemachineNamedRegionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.StatemachineNamedRegion");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cRegionAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cRegionKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Alternatives cAlternatives_2 = (Alternatives)cGroup.eContents().get(2);
		private final Keyword cIdKeyword_2_0 = (Keyword)cAlternatives_2.eContents().get(0);
		private final Keyword cNameKeyword_2_1 = (Keyword)cAlternatives_2.eContents().get(1);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
		private final Keyword cRightParenthesisColonKeyword_5 = (Keyword)cGroup.eContents().get(5);
		private final Alternatives cAlternatives_6 = (Alternatives)cGroup.eContents().get(6);
		private final Assignment cVertexAssignment_6_0 = (Assignment)cAlternatives_6.eContents().get(0);
		private final RuleCall cVertexStateParserRuleCall_6_0_0 = (RuleCall)cVertexAssignment_6_0.eContents().get(0);
		private final Assignment cVertexAssignment_6_1 = (Assignment)cAlternatives_6.eContents().get(1);
		private final RuleCall cVertexPseudostateParserRuleCall_6_1_0 = (RuleCall)cVertexAssignment_6_1.eContents().get(0);
		
		//StatemachineNamedRegion returns fmlStmchn::Region
		//    : {fmlStmchn::Region}
		//        '@region(' ( 'id:' | 'name:' )?  name=ESIdentifier
		//            ( unrestrictedName=UnrestrictedName )?  '):'
		//        ( vertex+=State
		//        | vertex+=Pseudostate
		//        )+
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlStmchn::Region}
		//       '@region(' ( 'id:' | 'name:' )?  name=ESIdentifier
		//           ( unrestrictedName=UnrestrictedName )?  '):'
		//       ( vertex+=State
		//       | vertex+=Pseudostate
		//       )+
		public Group getGroup() { return cGroup; }
		
		//{fmlStmchn::Region}
		public Action getRegionAction_0() { return cRegionAction_0; }
		
		//'@region('
		public Keyword getRegionKeyword_1() { return cRegionKeyword_1; }
		
		//( 'id:' | 'name:' )?
		public Alternatives getAlternatives_2() { return cAlternatives_2; }
		
		//'id:'
		public Keyword getIdKeyword_2_0() { return cIdKeyword_2_0; }
		
		//'name:'
		public Keyword getNameKeyword_2_1() { return cNameKeyword_2_1; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
		
		//'):'
		public Keyword getRightParenthesisColonKeyword_5() { return cRightParenthesisColonKeyword_5; }
		
		//( vertex+=State
		//| vertex+=Pseudostate
		//)+
		public Alternatives getAlternatives_6() { return cAlternatives_6; }
		
		//vertex+=State
		public Assignment getVertexAssignment_6_0() { return cVertexAssignment_6_0; }
		
		//State
		public RuleCall getVertexStateParserRuleCall_6_0_0() { return cVertexStateParserRuleCall_6_0_0; }
		
		//vertex+=Pseudostate
		public Assignment getVertexAssignment_6_1() { return cVertexAssignment_6_1; }
		
		//Pseudostate
		public RuleCall getVertexPseudostateParserRuleCall_6_1_0() { return cVertexPseudostateParserRuleCall_6_1_0; }
	}
	public class StatemachineRegionLiteElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.StatemachineRegionLite");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final Assignment cVertexAssignment_0 = (Assignment)cAlternatives.eContents().get(0);
		private final RuleCall cVertexStateParserRuleCall_0_0 = (RuleCall)cVertexAssignment_0.eContents().get(0);
		private final Assignment cVertexAssignment_1 = (Assignment)cAlternatives.eContents().get(1);
		private final RuleCall cVertexPseudostateParserRuleCall_1_0 = (RuleCall)cVertexAssignment_1.eContents().get(0);
		
		//StatemachineRegionLite returns fmlStmchn::Region
		//    : ( vertex+=State | vertex+=Pseudostate )+
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//( vertex+=State | vertex+=Pseudostate )+
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//vertex+=State
		public Assignment getVertexAssignment_0() { return cVertexAssignment_0; }
		
		//State
		public RuleCall getVertexStateParserRuleCall_0_0() { return cVertexStateParserRuleCall_0_0; }
		
		//vertex+=Pseudostate
		public Assignment getVertexAssignment_1() { return cVertexAssignment_1; }
		
		//Pseudostate
		public RuleCall getVertexPseudostateParserRuleCall_1_0() { return cVertexPseudostateParserRuleCall_1_0; }
	}
	public class StateElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.State");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cCompositeStateParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cStartStateParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cSimpleStateParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		private final RuleCall cFinalStateParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		
		//////////////////////////////////////////////////////////////////////////////////
		//// State Rules
		//////////////////////////////////////////////////////////////////////////////////
		//State returns fmlStmchn::State
		//    : CompositeState
		//    | StartState
		//    | SimpleState
		//    | FinalState
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//CompositeState
		//   | StartState
		//   | SimpleState
		//   | FinalState
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//CompositeState
		public RuleCall getCompositeStateParserRuleCall_0() { return cCompositeStateParserRuleCall_0; }
		
		//StartState
		public RuleCall getStartStateParserRuleCall_1() { return cStartStateParserRuleCall_1; }
		
		//SimpleState
		public RuleCall getSimpleStateParserRuleCall_2() { return cSimpleStateParserRuleCall_2; }
		
		//FinalState
		public RuleCall getFinalStateParserRuleCall_3() { return cFinalStateParserRuleCall_3; }
	}
	public class CompositeStateElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.CompositeState");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cStateAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cCompositeAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final Keyword cCompositeStateKeyword_1_0 = (Keyword)cCompositeAssignment_1.eContents().get(0);
		private final Keyword cLessThanSignKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Keyword cMocKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Alternatives cAlternatives_4 = (Alternatives)cGroup.eContents().get(4);
		private final Keyword cOrKeyword_4_0 = (Keyword)cAlternatives_4.eContents().get(0);
		private final Assignment cOrthogonalAssignment_4_1 = (Assignment)cAlternatives_4.eContents().get(1);
		private final Keyword cOrthogonalAndKeyword_4_1_0 = (Keyword)cOrthogonalAssignment_4_1.eContents().get(0);
		private final Keyword cGreaterThanSignKeyword_5 = (Keyword)cGroup.eContents().get(5);
		private final Assignment cNameAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cNameESIdentifierParserRuleCall_6_0 = (RuleCall)cNameAssignment_6.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_7_0 = (RuleCall)cUnrestrictedNameAssignment_7.eContents().get(0);
		private final Alternatives cAlternatives_8 = (Alternatives)cGroup.eContents().get(8);
		private final Group cGroup_8_0 = (Group)cAlternatives_8.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_8_0_0 = (Keyword)cGroup_8_0.eContents().get(0);
		private final Alternatives cAlternatives_8_0_1 = (Alternatives)cGroup_8_0.eContents().get(1);
		private final UnorderedGroup cUnorderedGroup_8_0_1_0 = (UnorderedGroup)cAlternatives_8_0_1.eContents().get(0);
		private final Alternatives cAlternatives_8_0_1_0_0 = (Alternatives)cUnorderedGroup_8_0_1_0.eContents().get(0);
		private final Assignment cRegionAssignment_8_0_1_0_0_0 = (Assignment)cAlternatives_8_0_1_0_0.eContents().get(0);
		private final RuleCall cRegionStatemachineRegionParserRuleCall_8_0_1_0_0_0_0 = (RuleCall)cRegionAssignment_8_0_1_0_0_0.eContents().get(0);
		private final Assignment cRegionAssignment_8_0_1_0_0_1 = (Assignment)cAlternatives_8_0_1_0_0.eContents().get(1);
		private final RuleCall cRegionStatemachineNamedRegionParserRuleCall_8_0_1_0_0_1_0 = (RuleCall)cRegionAssignment_8_0_1_0_0_1.eContents().get(0);
		private final Group cGroup_8_0_1_0_1 = (Group)cUnorderedGroup_8_0_1_0.eContents().get(1);
		private final Keyword cMoeKeyword_8_0_1_0_1_0 = (Keyword)cGroup_8_0_1_0_1.eContents().get(0);
		private final Assignment cMoeAssignment_8_0_1_0_1_1 = (Assignment)cGroup_8_0_1_0_1.eContents().get(1);
		private final RuleCall cMoeMoeCompositeStateRoutinesParserRuleCall_8_0_1_0_1_1_0 = (RuleCall)cMoeAssignment_8_0_1_0_1_1.eContents().get(0);
		private final Group cGroup_8_0_1_0_2 = (Group)cUnorderedGroup_8_0_1_0.eContents().get(2);
		private final Keyword cTransitionKeyword_8_0_1_0_2_0 = (Keyword)cGroup_8_0_1_0_2.eContents().get(0);
		private final Assignment cTransitionAssignment_8_0_1_0_2_1 = (Assignment)cGroup_8_0_1_0_2.eContents().get(1);
		private final RuleCall cTransitionTransitionParserRuleCall_8_0_1_0_2_1_0 = (RuleCall)cTransitionAssignment_8_0_1_0_2_1.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_8_0_1_1 = (UnorderedGroup)cAlternatives_8_0_1.eContents().get(1);
		private final Assignment cRegionAssignment_8_0_1_1_0 = (Assignment)cUnorderedGroup_8_0_1_1.eContents().get(0);
		private final RuleCall cRegionStatemachineRegionLiteParserRuleCall_8_0_1_1_0_0 = (RuleCall)cRegionAssignment_8_0_1_1_0.eContents().get(0);
		private final Assignment cMoeAssignment_8_0_1_1_1 = (Assignment)cUnorderedGroup_8_0_1_1.eContents().get(1);
		private final RuleCall cMoeMoeCompositeStateRoutinesParserRuleCall_8_0_1_1_1_0 = (RuleCall)cMoeAssignment_8_0_1_1_1.eContents().get(0);
		private final Assignment cTransitionAssignment_8_0_1_1_2 = (Assignment)cUnorderedGroup_8_0_1_1.eContents().get(2);
		private final RuleCall cTransitionTransitionParserRuleCall_8_0_1_1_2_0 = (RuleCall)cTransitionAssignment_8_0_1_1_2.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_8_0_2 = (Keyword)cGroup_8_0.eContents().get(2);
		private final Keyword cSemicolonKeyword_8_1 = (Keyword)cAlternatives_8.eContents().get(1);
		
		//////////////////////////////////////////////////////////////////////////////////
		//// CompositeState Rules
		//////////////////////////////////////////////////////////////////////////////////
		//CompositeState returns fmlStmchn::State
		//    : { fmlStmchn::State }
		//        composite?='state' '<' ( 'moc:' )? ( 'or' | orthogonal?='and' ) '>'
		//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//        ( '{'
		//            ( ( ( region+=StatemachineRegion
		//                | ( region+=StatemachineNamedRegion )+
		//                )
		//              & ( '@moe:' moe=moeCompositeStateRoutines )?
		//              & '@transition:' ( transition+=Transition )*
		//              )
		//            | ( ( region+=StatemachineRegionLite )*
		//              & ( moe=moeCompositeStateRoutines  )?
		//              & ( transition+=Transition )*
		//              )
		//            )
		//          '}'
		//        | ';'
		//        )
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{ fmlStmchn::State }
		//       composite?='state' '<' ( 'moc:' )? ( 'or' | orthogonal?='and' ) '>'
		//       name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//       ( '{'
		//           ( ( ( region+=StatemachineRegion
		//               | ( region+=StatemachineNamedRegion )+
		//               )
		//             & ( '@moe:' moe=moeCompositeStateRoutines )?
		//             & '@transition:' ( transition+=Transition )*
		//             )
		//           | ( ( region+=StatemachineRegionLite )*
		//             & ( moe=moeCompositeStateRoutines  )?
		//             & ( transition+=Transition )*
		//             )
		//           )
		//         '}'
		//       | ';'
		//       )
		public Group getGroup() { return cGroup; }
		
		//{ fmlStmchn::State }
		public Action getStateAction_0() { return cStateAction_0; }
		
		//composite?='state'
		public Assignment getCompositeAssignment_1() { return cCompositeAssignment_1; }
		
		//'state'
		public Keyword getCompositeStateKeyword_1_0() { return cCompositeStateKeyword_1_0; }
		
		//'<'
		public Keyword getLessThanSignKeyword_2() { return cLessThanSignKeyword_2; }
		
		//( 'moc:' )?
		public Keyword getMocKeyword_3() { return cMocKeyword_3; }
		
		//( 'or' | orthogonal?='and' )
		public Alternatives getAlternatives_4() { return cAlternatives_4; }
		
		//'or'
		public Keyword getOrKeyword_4_0() { return cOrKeyword_4_0; }
		
		//orthogonal?='and'
		public Assignment getOrthogonalAssignment_4_1() { return cOrthogonalAssignment_4_1; }
		
		//'and'
		public Keyword getOrthogonalAndKeyword_4_1_0() { return cOrthogonalAndKeyword_4_1_0; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_5() { return cGreaterThanSignKeyword_5; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_6() { return cNameAssignment_6; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_6_0() { return cNameESIdentifierParserRuleCall_6_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_7() { return cUnrestrictedNameAssignment_7; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_7_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_7_0; }
		
		//( '{'
		//    ( ( ( region+=StatemachineRegion
		//        | ( region+=StatemachineNamedRegion )+
		//        )
		//      & ( '@moe:' moe=moeCompositeStateRoutines )?
		//      & '@transition:' ( transition+=Transition )*
		//      )
		//    | ( ( region+=StatemachineRegionLite )*
		//      & ( moe=moeCompositeStateRoutines  )?
		//      & ( transition+=Transition )*
		//      )
		//    )
		//  '}'
		//| ';'
		//)
		public Alternatives getAlternatives_8() { return cAlternatives_8; }
		
		//'{'
		//           ( ( ( region+=StatemachineRegion
		//               | ( region+=StatemachineNamedRegion )+
		//               )
		//             & ( '@moe:' moe=moeCompositeStateRoutines )?
		//             & '@transition:' ( transition+=Transition )*
		//             )
		//           | ( ( region+=StatemachineRegionLite )*
		//             & ( moe=moeCompositeStateRoutines  )?
		//             & ( transition+=Transition )*
		//             )
		//           )
		//         '}'
		public Group getGroup_8_0() { return cGroup_8_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_8_0_0() { return cLeftCurlyBracketKeyword_8_0_0; }
		
		//( ( ( region+=StatemachineRegion
		//    | ( region+=StatemachineNamedRegion )+
		//    )
		//  & ( '@moe:' moe=moeCompositeStateRoutines )?
		//  & '@transition:' ( transition+=Transition )*
		//  )
		//| ( ( region+=StatemachineRegionLite )*
		//  & ( moe=moeCompositeStateRoutines  )?
		//  & ( transition+=Transition )*
		//  )
		//)
		public Alternatives getAlternatives_8_0_1() { return cAlternatives_8_0_1; }
		
		//( ( region+=StatemachineRegion
		//               | ( region+=StatemachineNamedRegion )+
		//               )
		//             & ( '@moe:' moe=moeCompositeStateRoutines )?
		//             & '@transition:' ( transition+=Transition )*
		//             )
		public UnorderedGroup getUnorderedGroup_8_0_1_0() { return cUnorderedGroup_8_0_1_0; }
		
		//( region+=StatemachineRegion
		//               | ( region+=StatemachineNamedRegion )+
		//               )
		public Alternatives getAlternatives_8_0_1_0_0() { return cAlternatives_8_0_1_0_0; }
		
		//region+=StatemachineRegion
		public Assignment getRegionAssignment_8_0_1_0_0_0() { return cRegionAssignment_8_0_1_0_0_0; }
		
		//StatemachineRegion
		public RuleCall getRegionStatemachineRegionParserRuleCall_8_0_1_0_0_0_0() { return cRegionStatemachineRegionParserRuleCall_8_0_1_0_0_0_0; }
		
		//( region+=StatemachineNamedRegion )+
		public Assignment getRegionAssignment_8_0_1_0_0_1() { return cRegionAssignment_8_0_1_0_0_1; }
		
		//StatemachineNamedRegion
		public RuleCall getRegionStatemachineNamedRegionParserRuleCall_8_0_1_0_0_1_0() { return cRegionStatemachineNamedRegionParserRuleCall_8_0_1_0_0_1_0; }
		
		//( '@moe:' moe=moeCompositeStateRoutines )?
		public Group getGroup_8_0_1_0_1() { return cGroup_8_0_1_0_1; }
		
		//'@moe:'
		public Keyword getMoeKeyword_8_0_1_0_1_0() { return cMoeKeyword_8_0_1_0_1_0; }
		
		//moe=moeCompositeStateRoutines
		public Assignment getMoeAssignment_8_0_1_0_1_1() { return cMoeAssignment_8_0_1_0_1_1; }
		
		//moeCompositeStateRoutines
		public RuleCall getMoeMoeCompositeStateRoutinesParserRuleCall_8_0_1_0_1_1_0() { return cMoeMoeCompositeStateRoutinesParserRuleCall_8_0_1_0_1_1_0; }
		
		//'@transition:' ( transition+=Transition )*
		public Group getGroup_8_0_1_0_2() { return cGroup_8_0_1_0_2; }
		
		//'@transition:'
		public Keyword getTransitionKeyword_8_0_1_0_2_0() { return cTransitionKeyword_8_0_1_0_2_0; }
		
		//( transition+=Transition )*
		public Assignment getTransitionAssignment_8_0_1_0_2_1() { return cTransitionAssignment_8_0_1_0_2_1; }
		
		//Transition
		public RuleCall getTransitionTransitionParserRuleCall_8_0_1_0_2_1_0() { return cTransitionTransitionParserRuleCall_8_0_1_0_2_1_0; }
		
		//( ( region+=StatemachineRegionLite )*
		//             & ( moe=moeCompositeStateRoutines  )?
		//             & ( transition+=Transition )*
		//             )
		public UnorderedGroup getUnorderedGroup_8_0_1_1() { return cUnorderedGroup_8_0_1_1; }
		
		//( region+=StatemachineRegionLite )*
		public Assignment getRegionAssignment_8_0_1_1_0() { return cRegionAssignment_8_0_1_1_0; }
		
		//StatemachineRegionLite
		public RuleCall getRegionStatemachineRegionLiteParserRuleCall_8_0_1_1_0_0() { return cRegionStatemachineRegionLiteParserRuleCall_8_0_1_1_0_0; }
		
		//( moe=moeCompositeStateRoutines  )?
		public Assignment getMoeAssignment_8_0_1_1_1() { return cMoeAssignment_8_0_1_1_1; }
		
		//moeCompositeStateRoutines
		public RuleCall getMoeMoeCompositeStateRoutinesParserRuleCall_8_0_1_1_1_0() { return cMoeMoeCompositeStateRoutinesParserRuleCall_8_0_1_1_1_0; }
		
		//( transition+=Transition )*
		public Assignment getTransitionAssignment_8_0_1_1_2() { return cTransitionAssignment_8_0_1_1_2; }
		
		//Transition
		public RuleCall getTransitionTransitionParserRuleCall_8_0_1_1_2_0() { return cTransitionTransitionParserRuleCall_8_0_1_1_2_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_8_0_2() { return cRightCurlyBracketKeyword_8_0_2; }
		
		//';'
		public Keyword getSemicolonKeyword_8_1() { return cSemicolonKeyword_8_1; }
	}
	public class MoeCompositeStateRoutinesElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.moeCompositeStateRoutines");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cModelOfExecutionAction_0 = (Action)cGroup.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_1 = (UnorderedGroup)cGroup.eContents().get(1);
		private final Group cGroup_1_0 = (Group)cUnorderedGroup_1.eContents().get(0);
		private final Keyword cCreateKeyword_1_0_0 = (Keyword)cGroup_1_0.eContents().get(0);
		private final Assignment cCreateRoutineAssignment_1_0_1 = (Assignment)cGroup_1_0.eContents().get(1);
		private final RuleCall cCreateRoutineMoeRoutineParserRuleCall_1_0_1_0 = (RuleCall)cCreateRoutineAssignment_1_0_1.eContents().get(0);
		private final Group cGroup_1_1 = (Group)cUnorderedGroup_1.eContents().get(1);
		private final Keyword cInitKeyword_1_1_0 = (Keyword)cGroup_1_1.eContents().get(0);
		private final Assignment cInitRoutineAssignment_1_1_1 = (Assignment)cGroup_1_1.eContents().get(1);
		private final RuleCall cInitRoutineMoeRoutineParserRuleCall_1_1_1_0 = (RuleCall)cInitRoutineAssignment_1_1_1.eContents().get(0);
		private final Group cGroup_1_2 = (Group)cUnorderedGroup_1.eContents().get(2);
		private final Keyword cFinalKeyword_1_2_0 = (Keyword)cGroup_1_2.eContents().get(0);
		private final Assignment cFinalRoutineAssignment_1_2_1 = (Assignment)cGroup_1_2.eContents().get(1);
		private final RuleCall cFinalRoutineMoeRoutineParserRuleCall_1_2_1_0 = (RuleCall)cFinalRoutineAssignment_1_2_1.eContents().get(0);
		private final Group cGroup_1_3 = (Group)cUnorderedGroup_1.eContents().get(3);
		private final Keyword cEnableKeyword_1_3_0 = (Keyword)cGroup_1_3.eContents().get(0);
		private final Assignment cEnableRoutineAssignment_1_3_1 = (Assignment)cGroup_1_3.eContents().get(1);
		private final RuleCall cEnableRoutineMoeRoutineParserRuleCall_1_3_1_0 = (RuleCall)cEnableRoutineAssignment_1_3_1.eContents().get(0);
		private final Group cGroup_1_4 = (Group)cUnorderedGroup_1.eContents().get(4);
		private final Keyword cDisableKeyword_1_4_0 = (Keyword)cGroup_1_4.eContents().get(0);
		private final Assignment cDisableRoutineAssignment_1_4_1 = (Assignment)cGroup_1_4.eContents().get(1);
		private final RuleCall cDisableRoutineMoeRoutineParserRuleCall_1_4_1_0 = (RuleCall)cDisableRoutineAssignment_1_4_1.eContents().get(0);
		private final Group cGroup_1_5 = (Group)cUnorderedGroup_1.eContents().get(5);
		private final Keyword cConcurrencyKeyword_1_5_0 = (Keyword)cGroup_1_5.eContents().get(0);
		private final Assignment cConcurrencyRoutineAssignment_1_5_1 = (Assignment)cGroup_1_5.eContents().get(1);
		private final RuleCall cConcurrencyRoutineMoeRoutineParserRuleCall_1_5_1_0 = (RuleCall)cConcurrencyRoutineAssignment_1_5_1.eContents().get(0);
		private final Group cGroup_1_6 = (Group)cUnorderedGroup_1.eContents().get(6);
		private final Alternatives cAlternatives_1_6_0 = (Alternatives)cGroup_1_6.eContents().get(0);
		private final Keyword cScheduleKeyword_1_6_0_0 = (Keyword)cAlternatives_1_6_0.eContents().get(0);
		private final Keyword cXscheduleKeyword_1_6_0_1 = (Keyword)cAlternatives_1_6_0.eContents().get(1);
		private final Assignment cScheduleRoutineAssignment_1_6_1 = (Assignment)cGroup_1_6.eContents().get(1);
		private final RuleCall cScheduleRoutineMoeRoutineParserRuleCall_1_6_1_0 = (RuleCall)cScheduleRoutineAssignment_1_6_1.eContents().get(0);
		private final Group cGroup_1_7 = (Group)cUnorderedGroup_1.eContents().get(7);
		private final Keyword cIrunKeyword_1_7_0 = (Keyword)cGroup_1_7.eContents().get(0);
		private final Assignment cIrunRoutineAssignment_1_7_1 = (Assignment)cGroup_1_7.eContents().get(1);
		private final RuleCall cIrunRoutineMoeRoutineParserRuleCall_1_7_1_0 = (RuleCall)cIrunRoutineAssignment_1_7_1.eContents().get(0);
		private final Group cGroup_1_8 = (Group)cUnorderedGroup_1.eContents().get(8);
		private final Keyword cRunKeyword_1_8_0 = (Keyword)cGroup_1_8.eContents().get(0);
		private final Assignment cRunRoutineAssignment_1_8_1 = (Assignment)cGroup_1_8.eContents().get(1);
		private final RuleCall cRunRoutineMoeRoutineParserRuleCall_1_8_1_0 = (RuleCall)cRunRoutineAssignment_1_8_1.eContents().get(0);
		
		//moeCompositeStateRoutines returns fmlInfra::ModelOfExecution
		//    : { fmlInfra::ModelOfExecution }
		//    ( ( '@create' createRoutine=moeRoutine )?
		//    & ( '@init'   initRoutine=moeRoutine   )?
		//    & ( '@final'  finalRoutine=moeRoutine  )?
		//    & ( '@enable'  enableRoutine=moeRoutine  )?
		//    & ( '@disable' disableRoutine=moeRoutine )?
		//    & ( '@concurrency' concurrencyRoutine=moeRoutine )?
		//    & ( ( '@schedule' | '@xschedule' ) scheduleRoutine=moeRoutine )?
		//    & ( '@irun' irunRoutine=moeRoutine )?
		//    & ( '@run'  runRoutine=moeRoutine  )?
		//    )
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{ fmlInfra::ModelOfExecution }
		//   ( ( '@create' createRoutine=moeRoutine )?
		//   & ( '@init'   initRoutine=moeRoutine   )?
		//   & ( '@final'  finalRoutine=moeRoutine  )?
		//   & ( '@enable'  enableRoutine=moeRoutine  )?
		//   & ( '@disable' disableRoutine=moeRoutine )?
		//   & ( '@concurrency' concurrencyRoutine=moeRoutine )?
		//   & ( ( '@schedule' | '@xschedule' ) scheduleRoutine=moeRoutine )?
		//   & ( '@irun' irunRoutine=moeRoutine )?
		//   & ( '@run'  runRoutine=moeRoutine  )?
		//   )
		public Group getGroup() { return cGroup; }
		
		//{ fmlInfra::ModelOfExecution }
		public Action getModelOfExecutionAction_0() { return cModelOfExecutionAction_0; }
		
		//( ( '@create' createRoutine=moeRoutine )?
		//& ( '@init'   initRoutine=moeRoutine   )?
		//& ( '@final'  finalRoutine=moeRoutine  )?
		//& ( '@enable'  enableRoutine=moeRoutine  )?
		//& ( '@disable' disableRoutine=moeRoutine )?
		//& ( '@concurrency' concurrencyRoutine=moeRoutine )?
		//& ( ( '@schedule' | '@xschedule' ) scheduleRoutine=moeRoutine )?
		//& ( '@irun' irunRoutine=moeRoutine )?
		//& ( '@run'  runRoutine=moeRoutine  )?
		//)
		public UnorderedGroup getUnorderedGroup_1() { return cUnorderedGroup_1; }
		
		//( '@create' createRoutine=moeRoutine )?
		public Group getGroup_1_0() { return cGroup_1_0; }
		
		//'@create'
		public Keyword getCreateKeyword_1_0_0() { return cCreateKeyword_1_0_0; }
		
		//createRoutine=moeRoutine
		public Assignment getCreateRoutineAssignment_1_0_1() { return cCreateRoutineAssignment_1_0_1; }
		
		//moeRoutine
		public RuleCall getCreateRoutineMoeRoutineParserRuleCall_1_0_1_0() { return cCreateRoutineMoeRoutineParserRuleCall_1_0_1_0; }
		
		//( '@init'   initRoutine=moeRoutine   )?
		public Group getGroup_1_1() { return cGroup_1_1; }
		
		//'@init'
		public Keyword getInitKeyword_1_1_0() { return cInitKeyword_1_1_0; }
		
		//initRoutine=moeRoutine
		public Assignment getInitRoutineAssignment_1_1_1() { return cInitRoutineAssignment_1_1_1; }
		
		//moeRoutine
		public RuleCall getInitRoutineMoeRoutineParserRuleCall_1_1_1_0() { return cInitRoutineMoeRoutineParserRuleCall_1_1_1_0; }
		
		//( '@final'  finalRoutine=moeRoutine  )?
		public Group getGroup_1_2() { return cGroup_1_2; }
		
		//'@final'
		public Keyword getFinalKeyword_1_2_0() { return cFinalKeyword_1_2_0; }
		
		//finalRoutine=moeRoutine
		public Assignment getFinalRoutineAssignment_1_2_1() { return cFinalRoutineAssignment_1_2_1; }
		
		//moeRoutine
		public RuleCall getFinalRoutineMoeRoutineParserRuleCall_1_2_1_0() { return cFinalRoutineMoeRoutineParserRuleCall_1_2_1_0; }
		
		//( '@enable'  enableRoutine=moeRoutine  )?
		public Group getGroup_1_3() { return cGroup_1_3; }
		
		//'@enable'
		public Keyword getEnableKeyword_1_3_0() { return cEnableKeyword_1_3_0; }
		
		//enableRoutine=moeRoutine
		public Assignment getEnableRoutineAssignment_1_3_1() { return cEnableRoutineAssignment_1_3_1; }
		
		//moeRoutine
		public RuleCall getEnableRoutineMoeRoutineParserRuleCall_1_3_1_0() { return cEnableRoutineMoeRoutineParserRuleCall_1_3_1_0; }
		
		//( '@disable' disableRoutine=moeRoutine )?
		public Group getGroup_1_4() { return cGroup_1_4; }
		
		//'@disable'
		public Keyword getDisableKeyword_1_4_0() { return cDisableKeyword_1_4_0; }
		
		//disableRoutine=moeRoutine
		public Assignment getDisableRoutineAssignment_1_4_1() { return cDisableRoutineAssignment_1_4_1; }
		
		//moeRoutine
		public RuleCall getDisableRoutineMoeRoutineParserRuleCall_1_4_1_0() { return cDisableRoutineMoeRoutineParserRuleCall_1_4_1_0; }
		
		//( '@concurrency' concurrencyRoutine=moeRoutine )?
		public Group getGroup_1_5() { return cGroup_1_5; }
		
		//'@concurrency'
		public Keyword getConcurrencyKeyword_1_5_0() { return cConcurrencyKeyword_1_5_0; }
		
		//concurrencyRoutine=moeRoutine
		public Assignment getConcurrencyRoutineAssignment_1_5_1() { return cConcurrencyRoutineAssignment_1_5_1; }
		
		//moeRoutine
		public RuleCall getConcurrencyRoutineMoeRoutineParserRuleCall_1_5_1_0() { return cConcurrencyRoutineMoeRoutineParserRuleCall_1_5_1_0; }
		
		//( ( '@schedule' | '@xschedule' ) scheduleRoutine=moeRoutine )?
		public Group getGroup_1_6() { return cGroup_1_6; }
		
		//( '@schedule' | '@xschedule' )
		public Alternatives getAlternatives_1_6_0() { return cAlternatives_1_6_0; }
		
		//'@schedule'
		public Keyword getScheduleKeyword_1_6_0_0() { return cScheduleKeyword_1_6_0_0; }
		
		//'@xschedule'
		public Keyword getXscheduleKeyword_1_6_0_1() { return cXscheduleKeyword_1_6_0_1; }
		
		//scheduleRoutine=moeRoutine
		public Assignment getScheduleRoutineAssignment_1_6_1() { return cScheduleRoutineAssignment_1_6_1; }
		
		//moeRoutine
		public RuleCall getScheduleRoutineMoeRoutineParserRuleCall_1_6_1_0() { return cScheduleRoutineMoeRoutineParserRuleCall_1_6_1_0; }
		
		//( '@irun' irunRoutine=moeRoutine )?
		public Group getGroup_1_7() { return cGroup_1_7; }
		
		//'@irun'
		public Keyword getIrunKeyword_1_7_0() { return cIrunKeyword_1_7_0; }
		
		//irunRoutine=moeRoutine
		public Assignment getIrunRoutineAssignment_1_7_1() { return cIrunRoutineAssignment_1_7_1; }
		
		//moeRoutine
		public RuleCall getIrunRoutineMoeRoutineParserRuleCall_1_7_1_0() { return cIrunRoutineMoeRoutineParserRuleCall_1_7_1_0; }
		
		//( '@run'  runRoutine=moeRoutine  )?
		public Group getGroup_1_8() { return cGroup_1_8; }
		
		//'@run'
		public Keyword getRunKeyword_1_8_0() { return cRunKeyword_1_8_0; }
		
		//runRoutine=moeRoutine
		public Assignment getRunRoutineAssignment_1_8_1() { return cRunRoutineAssignment_1_8_1; }
		
		//moeRoutine
		public RuleCall getRunRoutineMoeRoutineParserRuleCall_1_8_1_0() { return cRunRoutineMoeRoutineParserRuleCall_1_8_1_0; }
	}
	public class SimpleStateElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.SimpleState");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cStateAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cSimpleAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final Keyword cSimpleStateKeyword_1_0 = (Keyword)cSimpleAssignment_1.eContents().get(0);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLessThanSignKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final Keyword cMocKeyword_2_1 = (Keyword)cGroup_2.eContents().get(1);
		private final Keyword cSimpleKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Keyword cGreaterThanSignKeyword_2_3 = (Keyword)cGroup_2.eContents().get(3);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
		private final Alternatives cAlternatives_5 = (Alternatives)cGroup.eContents().get(5);
		private final Group cGroup_5_0 = (Group)cAlternatives_5.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_5_0_0 = (Keyword)cGroup_5_0.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_5_0_1 = (UnorderedGroup)cGroup_5_0.eContents().get(1);
		private final Assignment cTransitionAssignment_5_0_1_0 = (Assignment)cUnorderedGroup_5_0_1.eContents().get(0);
		private final RuleCall cTransitionTransitionParserRuleCall_5_0_1_0_0 = (RuleCall)cTransitionAssignment_5_0_1_0.eContents().get(0);
		private final Assignment cMoeAssignment_5_0_1_1 = (Assignment)cUnorderedGroup_5_0_1.eContents().get(1);
		private final RuleCall cMoeMoeSimpleStateRoutinesParserRuleCall_5_0_1_1_0 = (RuleCall)cMoeAssignment_5_0_1_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_5_0_2 = (Keyword)cGroup_5_0.eContents().get(2);
		private final Keyword cSemicolonKeyword_5_1 = (Keyword)cAlternatives_5.eContents().get(1);
		
		//////////////////////////////////////////////////////////////////////////////////
		//// SimpleState Rules
		//////////////////////////////////////////////////////////////////////////////////
		//SimpleState returns fmlStmchn::State
		//    : { fmlStmchn::State }
		//    simple?='state' ( '<' ( 'moc:' )? 'simple' '>' )?
		//    name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//    ( '{'
		//        (
		//            ( ( transition+=Transition    )*
		//            & ( moe=moeSimpleStateRoutines )?
		//            )
		////        |
		////            ( ( '@transition:'  ( transition+=Transition )* )?
		////            & ( '@moe:'         moe=moeSimpleStateRoutines  )?
		////            )
		//        )
		//      '}'
		//    | ';'
		//    )
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		// { fmlStmchn::State }
		//    simple?='state' ( '<' ( 'moc:' )? 'simple' '>' )?
		//    name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//    ( '{'
		//        (
		//            ( ( transition+=Transition    )*
		//            & ( moe=moeSimpleStateRoutines )?
		//            )
		////        |
		////            ( ( '@transition:'  ( transition+=Transition )* )?
		////            & ( '@moe:'         moe=moeSimpleStateRoutines  )?
		////            )
		//        )
		//      '}'
		//    | ';'
		//    )
		public Group getGroup() { return cGroup; }
		
		//{ fmlStmchn::State }
		public Action getStateAction_0() { return cStateAction_0; }
		
		//simple?='state'
		public Assignment getSimpleAssignment_1() { return cSimpleAssignment_1; }
		
		//'state'
		public Keyword getSimpleStateKeyword_1_0() { return cSimpleStateKeyword_1_0; }
		
		//( '<' ( 'moc:' )? 'simple' '>' )?
		public Group getGroup_2() { return cGroup_2; }
		
		//'<'
		public Keyword getLessThanSignKeyword_2_0() { return cLessThanSignKeyword_2_0; }
		
		//( 'moc:' )?
		public Keyword getMocKeyword_2_1() { return cMocKeyword_2_1; }
		
		//'simple'
		public Keyword getSimpleKeyword_2_2() { return cSimpleKeyword_2_2; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_2_3() { return cGreaterThanSignKeyword_2_3; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
		
		//    ( '{'
		//        (
		//            ( ( transition+=Transition    )*
		//            & ( moe=moeSimpleStateRoutines )?
		//            )
		////        |
		////            ( ( '@transition:'  ( transition+=Transition )* )?
		////            & ( '@moe:'         moe=moeSimpleStateRoutines  )?
		////            )
		//        )
		//      '}'
		//    | ';'
		//    )
		public Alternatives getAlternatives_5() { return cAlternatives_5; }
		
		// '{'
		//        (
		//            ( ( transition+=Transition    )*
		//            & ( moe=moeSimpleStateRoutines )?
		//            )
		////        |
		////            ( ( '@transition:'  ( transition+=Transition )* )?
		////            & ( '@moe:'         moe=moeSimpleStateRoutines  )?
		////            )
		//        )
		//      '}'
		public Group getGroup_5_0() { return cGroup_5_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_5_0_0() { return cLeftCurlyBracketKeyword_5_0_0; }
		
		//        (
		//            ( ( transition+=Transition    )*
		//            & ( moe=moeSimpleStateRoutines )?
		//            )
		////        |
		////            ( ( '@transition:'  ( transition+=Transition )* )?
		////            & ( '@moe:'         moe=moeSimpleStateRoutines  )?
		////            )
		//        )
		public UnorderedGroup getUnorderedGroup_5_0_1() { return cUnorderedGroup_5_0_1; }
		
		//( transition+=Transition    )*
		public Assignment getTransitionAssignment_5_0_1_0() { return cTransitionAssignment_5_0_1_0; }
		
		//Transition
		public RuleCall getTransitionTransitionParserRuleCall_5_0_1_0_0() { return cTransitionTransitionParserRuleCall_5_0_1_0_0; }
		
		//( moe=moeSimpleStateRoutines )?
		public Assignment getMoeAssignment_5_0_1_1() { return cMoeAssignment_5_0_1_1; }
		
		//moeSimpleStateRoutines
		public RuleCall getMoeMoeSimpleStateRoutinesParserRuleCall_5_0_1_1_0() { return cMoeMoeSimpleStateRoutinesParserRuleCall_5_0_1_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_5_0_2() { return cRightCurlyBracketKeyword_5_0_2; }
		
		//';'
		public Keyword getSemicolonKeyword_5_1() { return cSemicolonKeyword_5_1; }
	}
	public class MoeSimpleStateRoutinesElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.moeSimpleStateRoutines");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cModelOfExecutionAction_0 = (Action)cGroup.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_1 = (UnorderedGroup)cGroup.eContents().get(1);
		private final Group cGroup_1_0 = (Group)cUnorderedGroup_1.eContents().get(0);
		private final Keyword cEnableKeyword_1_0_0 = (Keyword)cGroup_1_0.eContents().get(0);
		private final Assignment cEnableRoutineAssignment_1_0_1 = (Assignment)cGroup_1_0.eContents().get(1);
		private final RuleCall cEnableRoutineMoeRoutineParserRuleCall_1_0_1_0 = (RuleCall)cEnableRoutineAssignment_1_0_1.eContents().get(0);
		private final Group cGroup_1_1 = (Group)cUnorderedGroup_1.eContents().get(1);
		private final Keyword cDisableKeyword_1_1_0 = (Keyword)cGroup_1_1.eContents().get(0);
		private final Assignment cDisableRoutineAssignment_1_1_1 = (Assignment)cGroup_1_1.eContents().get(1);
		private final RuleCall cDisableRoutineMoeRoutineParserRuleCall_1_1_1_0 = (RuleCall)cDisableRoutineAssignment_1_1_1.eContents().get(0);
		private final Group cGroup_1_2 = (Group)cUnorderedGroup_1.eContents().get(2);
		private final Keyword cIrunKeyword_1_2_0 = (Keyword)cGroup_1_2.eContents().get(0);
		private final Assignment cIrunRoutineAssignment_1_2_1 = (Assignment)cGroup_1_2.eContents().get(1);
		private final RuleCall cIrunRoutineMoeRoutineParserRuleCall_1_2_1_0 = (RuleCall)cIrunRoutineAssignment_1_2_1.eContents().get(0);
		
		//moeSimpleStateRoutines returns fmlInfra::ModelOfExecution
		//    : { fmlInfra::ModelOfExecution }
		//    ( ( '@enable'  enableRoutine=moeRoutine  )?
		//    & ( '@disable' disableRoutine=moeRoutine )?
		//    & ( '@irun' irunRoutine=moeRoutine )?
		////    & ( '@run'  runRoutine=moeRoutine  )?
		//    )
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		// { fmlInfra::ModelOfExecution }
		//    ( ( '@enable'  enableRoutine=moeRoutine  )?
		//    & ( '@disable' disableRoutine=moeRoutine )?
		//    & ( '@irun' irunRoutine=moeRoutine )?
		////    & ( '@run'  runRoutine=moeRoutine  )?
		//    )
		public Group getGroup() { return cGroup; }
		
		//{ fmlInfra::ModelOfExecution }
		public Action getModelOfExecutionAction_0() { return cModelOfExecutionAction_0; }
		
		//    ( ( '@enable'  enableRoutine=moeRoutine  )?
		//    & ( '@disable' disableRoutine=moeRoutine )?
		//    & ( '@irun' irunRoutine=moeRoutine )?
		////    & ( '@run'  runRoutine=moeRoutine  )?
		//    )
		public UnorderedGroup getUnorderedGroup_1() { return cUnorderedGroup_1; }
		
		//( '@enable'  enableRoutine=moeRoutine  )?
		public Group getGroup_1_0() { return cGroup_1_0; }
		
		//'@enable'
		public Keyword getEnableKeyword_1_0_0() { return cEnableKeyword_1_0_0; }
		
		//enableRoutine=moeRoutine
		public Assignment getEnableRoutineAssignment_1_0_1() { return cEnableRoutineAssignment_1_0_1; }
		
		//moeRoutine
		public RuleCall getEnableRoutineMoeRoutineParserRuleCall_1_0_1_0() { return cEnableRoutineMoeRoutineParserRuleCall_1_0_1_0; }
		
		//( '@disable' disableRoutine=moeRoutine )?
		public Group getGroup_1_1() { return cGroup_1_1; }
		
		//'@disable'
		public Keyword getDisableKeyword_1_1_0() { return cDisableKeyword_1_1_0; }
		
		//disableRoutine=moeRoutine
		public Assignment getDisableRoutineAssignment_1_1_1() { return cDisableRoutineAssignment_1_1_1; }
		
		//moeRoutine
		public RuleCall getDisableRoutineMoeRoutineParserRuleCall_1_1_1_0() { return cDisableRoutineMoeRoutineParserRuleCall_1_1_1_0; }
		
		//( '@irun' irunRoutine=moeRoutine )?
		public Group getGroup_1_2() { return cGroup_1_2; }
		
		//'@irun'
		public Keyword getIrunKeyword_1_2_0() { return cIrunKeyword_1_2_0; }
		
		//irunRoutine=moeRoutine
		public Assignment getIrunRoutineAssignment_1_2_1() { return cIrunRoutineAssignment_1_2_1; }
		
		//moeRoutine
		public RuleCall getIrunRoutineMoeRoutineParserRuleCall_1_2_1_0() { return cIrunRoutineMoeRoutineParserRuleCall_1_2_1_0; }
	}
	public class StartStateElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.StartState");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cStartStateAction_0 = (Action)cGroup.eContents().get(0);
		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
		private final Group cGroup_1_0 = (Group)cAlternatives_1.eContents().get(0);
		private final Assignment cSimpleAssignment_1_0_0 = (Assignment)cGroup_1_0.eContents().get(0);
		private final Keyword cSimpleStateKeyword_1_0_0_0 = (Keyword)cSimpleAssignment_1_0_0.eContents().get(0);
		private final Keyword cLessThanSignKeyword_1_0_1 = (Keyword)cGroup_1_0.eContents().get(1);
		private final Keyword cMocKeyword_1_0_2 = (Keyword)cGroup_1_0.eContents().get(2);
		private final Keyword cStartKeyword_1_0_3 = (Keyword)cGroup_1_0.eContents().get(3);
		private final Keyword cGreaterThanSignKeyword_1_0_4 = (Keyword)cGroup_1_0.eContents().get(4);
		private final Assignment cNameAssignment_1_0_5 = (Assignment)cGroup_1_0.eContents().get(5);
		private final RuleCall cNameESIdentifierParserRuleCall_1_0_5_0 = (RuleCall)cNameAssignment_1_0_5.eContents().get(0);
		private final Assignment cSimpleAssignment_1_1 = (Assignment)cAlternatives_1.eContents().get(1);
		private final Keyword cSimpleStartKeyword_1_1_0 = (Keyword)cSimpleAssignment_1_1.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0 = (RuleCall)cUnrestrictedNameAssignment_2.eContents().get(0);
		private final Alternatives cAlternatives_3 = (Alternatives)cGroup.eContents().get(3);
		private final Group cGroup_3_0 = (Group)cAlternatives_3.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_3_0_0 = (Keyword)cGroup_3_0.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_3_0_1 = (UnorderedGroup)cGroup_3_0.eContents().get(1);
		private final Assignment cTransitionAssignment_3_0_1_0 = (Assignment)cUnorderedGroup_3_0_1.eContents().get(0);
		private final RuleCall cTransitionTransitionParserRuleCall_3_0_1_0_0 = (RuleCall)cTransitionAssignment_3_0_1_0.eContents().get(0);
		private final Assignment cMoeAssignment_3_0_1_1 = (Assignment)cUnorderedGroup_3_0_1.eContents().get(1);
		private final RuleCall cMoeMoeStartStateRoutinesParserRuleCall_3_0_1_1_0 = (RuleCall)cMoeAssignment_3_0_1_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_3_0_2 = (Keyword)cGroup_3_0.eContents().get(2);
		private final Keyword cSemicolonKeyword_3_1 = (Keyword)cAlternatives_3.eContents().get(1);
		
		//////////////////////////////////////////////////////////////////////////////////
		//// StartState Rules
		//////////////////////////////////////////////////////////////////////////////////
		//StartState returns fmlStmchn::StartState
		//    : { fmlStmchn::StartState }
		//    ( simple?='state' '<' ( 'moc:' )? 'start' '>' name=ESIdentifier
		//    | simple?='#start'
		//    )
		//    ( unrestrictedName=UnrestrictedName )?
		//    ( '{'
		//        (
		//            ( ( transition+=Transition    )*
		//            & ( moe=moeStartStateRoutines )?
		//            )
		////        |
		////            ( ( '@transition:'  ( transition+=Transition )* )?
		////            & ( '@moe:'         moe=moeStartStateRoutines  )?
		////            )
		//        )
		//      '}'
		//    | ';'
		//    )
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		// { fmlStmchn::StartState }
		//    ( simple?='state' '<' ( 'moc:' )? 'start' '>' name=ESIdentifier
		//    | simple?='#start'
		//    )
		//    ( unrestrictedName=UnrestrictedName )?
		//    ( '{'
		//        (
		//            ( ( transition+=Transition    )*
		//            & ( moe=moeStartStateRoutines )?
		//            )
		////        |
		////            ( ( '@transition:'  ( transition+=Transition )* )?
		////            & ( '@moe:'         moe=moeStartStateRoutines  )?
		////            )
		//        )
		//      '}'
		//    | ';'
		//    )
		public Group getGroup() { return cGroup; }
		
		//{ fmlStmchn::StartState }
		public Action getStartStateAction_0() { return cStartStateAction_0; }
		
		//( simple?='state' '<' ( 'moc:' )? 'start' '>' name=ESIdentifier
		//| simple?='#start'
		//)
		public Alternatives getAlternatives_1() { return cAlternatives_1; }
		
		//simple?='state' '<' ( 'moc:' )? 'start' '>' name=ESIdentifier
		public Group getGroup_1_0() { return cGroup_1_0; }
		
		//simple?='state'
		public Assignment getSimpleAssignment_1_0_0() { return cSimpleAssignment_1_0_0; }
		
		//'state'
		public Keyword getSimpleStateKeyword_1_0_0_0() { return cSimpleStateKeyword_1_0_0_0; }
		
		//'<'
		public Keyword getLessThanSignKeyword_1_0_1() { return cLessThanSignKeyword_1_0_1; }
		
		//( 'moc:' )?
		public Keyword getMocKeyword_1_0_2() { return cMocKeyword_1_0_2; }
		
		//'start'
		public Keyword getStartKeyword_1_0_3() { return cStartKeyword_1_0_3; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_1_0_4() { return cGreaterThanSignKeyword_1_0_4; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_1_0_5() { return cNameAssignment_1_0_5; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_1_0_5_0() { return cNameESIdentifierParserRuleCall_1_0_5_0; }
		
		//simple?='#start'
		public Assignment getSimpleAssignment_1_1() { return cSimpleAssignment_1_1; }
		
		//'#start'
		public Keyword getSimpleStartKeyword_1_1_0() { return cSimpleStartKeyword_1_1_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_2() { return cUnrestrictedNameAssignment_2; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0; }
		
		//    ( '{'
		//        (
		//            ( ( transition+=Transition    )*
		//            & ( moe=moeStartStateRoutines )?
		//            )
		////        |
		////            ( ( '@transition:'  ( transition+=Transition )* )?
		////            & ( '@moe:'         moe=moeStartStateRoutines  )?
		////            )
		//        )
		//      '}'
		//    | ';'
		//    )
		public Alternatives getAlternatives_3() { return cAlternatives_3; }
		
		// '{'
		//        (
		//            ( ( transition+=Transition    )*
		//            & ( moe=moeStartStateRoutines )?
		//            )
		////        |
		////            ( ( '@transition:'  ( transition+=Transition )* )?
		////            & ( '@moe:'         moe=moeStartStateRoutines  )?
		////            )
		//        )
		//      '}'
		public Group getGroup_3_0() { return cGroup_3_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_3_0_0() { return cLeftCurlyBracketKeyword_3_0_0; }
		
		//        (
		//            ( ( transition+=Transition    )*
		//            & ( moe=moeStartStateRoutines )?
		//            )
		////        |
		////            ( ( '@transition:'  ( transition+=Transition )* )?
		////            & ( '@moe:'         moe=moeStartStateRoutines  )?
		////            )
		//        )
		public UnorderedGroup getUnorderedGroup_3_0_1() { return cUnorderedGroup_3_0_1; }
		
		//( transition+=Transition    )*
		public Assignment getTransitionAssignment_3_0_1_0() { return cTransitionAssignment_3_0_1_0; }
		
		//Transition
		public RuleCall getTransitionTransitionParserRuleCall_3_0_1_0_0() { return cTransitionTransitionParserRuleCall_3_0_1_0_0; }
		
		//( moe=moeStartStateRoutines )?
		public Assignment getMoeAssignment_3_0_1_1() { return cMoeAssignment_3_0_1_1; }
		
		//moeStartStateRoutines
		public RuleCall getMoeMoeStartStateRoutinesParserRuleCall_3_0_1_1_0() { return cMoeMoeStartStateRoutinesParserRuleCall_3_0_1_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_3_0_2() { return cRightCurlyBracketKeyword_3_0_2; }
		
		//';'
		public Keyword getSemicolonKeyword_3_1() { return cSemicolonKeyword_3_1; }
	}
	public class MoeStartStateRoutinesElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.moeStartStateRoutines");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cModelOfExecutionAction_0 = (Action)cGroup.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_1 = (UnorderedGroup)cGroup.eContents().get(1);
		private final Group cGroup_1_0 = (Group)cUnorderedGroup_1.eContents().get(0);
		private final Keyword cCreateKeyword_1_0_0 = (Keyword)cGroup_1_0.eContents().get(0);
		private final Assignment cCreateRoutineAssignment_1_0_1 = (Assignment)cGroup_1_0.eContents().get(1);
		private final RuleCall cCreateRoutineMoeRoutineParserRuleCall_1_0_1_0 = (RuleCall)cCreateRoutineAssignment_1_0_1.eContents().get(0);
		private final Group cGroup_1_1 = (Group)cUnorderedGroup_1.eContents().get(1);
		private final Keyword cInitKeyword_1_1_0 = (Keyword)cGroup_1_1.eContents().get(0);
		private final Assignment cInitRoutineAssignment_1_1_1 = (Assignment)cGroup_1_1.eContents().get(1);
		private final RuleCall cInitRoutineMoeRoutineParserRuleCall_1_1_1_0 = (RuleCall)cInitRoutineAssignment_1_1_1.eContents().get(0);
		private final Group cGroup_1_2 = (Group)cUnorderedGroup_1.eContents().get(2);
		private final Keyword cFinalKeyword_1_2_0 = (Keyword)cGroup_1_2.eContents().get(0);
		private final Assignment cFinalRoutineAssignment_1_2_1 = (Assignment)cGroup_1_2.eContents().get(1);
		private final RuleCall cFinalRoutineMoeRoutineParserRuleCall_1_2_1_0 = (RuleCall)cFinalRoutineAssignment_1_2_1.eContents().get(0);
		private final Group cGroup_1_3 = (Group)cUnorderedGroup_1.eContents().get(3);
		private final Keyword cEnableKeyword_1_3_0 = (Keyword)cGroup_1_3.eContents().get(0);
		private final Assignment cEnableRoutineAssignment_1_3_1 = (Assignment)cGroup_1_3.eContents().get(1);
		private final RuleCall cEnableRoutineMoeRoutineParserRuleCall_1_3_1_0 = (RuleCall)cEnableRoutineAssignment_1_3_1.eContents().get(0);
		private final Group cGroup_1_4 = (Group)cUnorderedGroup_1.eContents().get(4);
		private final Keyword cDisableKeyword_1_4_0 = (Keyword)cGroup_1_4.eContents().get(0);
		private final Assignment cDisableRoutineAssignment_1_4_1 = (Assignment)cGroup_1_4.eContents().get(1);
		private final RuleCall cDisableRoutineMoeRoutineParserRuleCall_1_4_1_0 = (RuleCall)cDisableRoutineAssignment_1_4_1.eContents().get(0);
		private final Group cGroup_1_5 = (Group)cUnorderedGroup_1.eContents().get(5);
		private final Keyword cIrunKeyword_1_5_0 = (Keyword)cGroup_1_5.eContents().get(0);
		private final Assignment cIrunRoutineAssignment_1_5_1 = (Assignment)cGroup_1_5.eContents().get(1);
		private final RuleCall cIrunRoutineMoeRoutineParserRuleCall_1_5_1_0 = (RuleCall)cIrunRoutineAssignment_1_5_1.eContents().get(0);
		
		//moeStartStateRoutines returns fmlInfra::ModelOfExecution
		//    : { fmlInfra::ModelOfExecution }
		//    ( ( '@create' createRoutine=moeRoutine )?
		//    & ( '@init'   initRoutine=moeRoutine   )?
		//    & ( '@final'  finalRoutine=moeRoutine  )?
		//    & ( '@enable'  enableRoutine=moeRoutine  )?
		//    & ( '@disable' disableRoutine=moeRoutine )?
		//    & ( '@irun' irunRoutine=moeRoutine )?
		////    & ( '@run'  runRoutine=moeRoutine  )?
		//    )
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		// { fmlInfra::ModelOfExecution }
		//    ( ( '@create' createRoutine=moeRoutine )?
		//    & ( '@init'   initRoutine=moeRoutine   )?
		//    & ( '@final'  finalRoutine=moeRoutine  )?
		//    & ( '@enable'  enableRoutine=moeRoutine  )?
		//    & ( '@disable' disableRoutine=moeRoutine )?
		//    & ( '@irun' irunRoutine=moeRoutine )?
		////    & ( '@run'  runRoutine=moeRoutine  )?
		//    )
		public Group getGroup() { return cGroup; }
		
		//{ fmlInfra::ModelOfExecution }
		public Action getModelOfExecutionAction_0() { return cModelOfExecutionAction_0; }
		
		//    ( ( '@create' createRoutine=moeRoutine )?
		//    & ( '@init'   initRoutine=moeRoutine   )?
		//    & ( '@final'  finalRoutine=moeRoutine  )?
		//    & ( '@enable'  enableRoutine=moeRoutine  )?
		//    & ( '@disable' disableRoutine=moeRoutine )?
		//    & ( '@irun' irunRoutine=moeRoutine )?
		////    & ( '@run'  runRoutine=moeRoutine  )?
		//    )
		public UnorderedGroup getUnorderedGroup_1() { return cUnorderedGroup_1; }
		
		//( '@create' createRoutine=moeRoutine )?
		public Group getGroup_1_0() { return cGroup_1_0; }
		
		//'@create'
		public Keyword getCreateKeyword_1_0_0() { return cCreateKeyword_1_0_0; }
		
		//createRoutine=moeRoutine
		public Assignment getCreateRoutineAssignment_1_0_1() { return cCreateRoutineAssignment_1_0_1; }
		
		//moeRoutine
		public RuleCall getCreateRoutineMoeRoutineParserRuleCall_1_0_1_0() { return cCreateRoutineMoeRoutineParserRuleCall_1_0_1_0; }
		
		//( '@init'   initRoutine=moeRoutine   )?
		public Group getGroup_1_1() { return cGroup_1_1; }
		
		//'@init'
		public Keyword getInitKeyword_1_1_0() { return cInitKeyword_1_1_0; }
		
		//initRoutine=moeRoutine
		public Assignment getInitRoutineAssignment_1_1_1() { return cInitRoutineAssignment_1_1_1; }
		
		//moeRoutine
		public RuleCall getInitRoutineMoeRoutineParserRuleCall_1_1_1_0() { return cInitRoutineMoeRoutineParserRuleCall_1_1_1_0; }
		
		//( '@final'  finalRoutine=moeRoutine  )?
		public Group getGroup_1_2() { return cGroup_1_2; }
		
		//'@final'
		public Keyword getFinalKeyword_1_2_0() { return cFinalKeyword_1_2_0; }
		
		//finalRoutine=moeRoutine
		public Assignment getFinalRoutineAssignment_1_2_1() { return cFinalRoutineAssignment_1_2_1; }
		
		//moeRoutine
		public RuleCall getFinalRoutineMoeRoutineParserRuleCall_1_2_1_0() { return cFinalRoutineMoeRoutineParserRuleCall_1_2_1_0; }
		
		//( '@enable'  enableRoutine=moeRoutine  )?
		public Group getGroup_1_3() { return cGroup_1_3; }
		
		//'@enable'
		public Keyword getEnableKeyword_1_3_0() { return cEnableKeyword_1_3_0; }
		
		//enableRoutine=moeRoutine
		public Assignment getEnableRoutineAssignment_1_3_1() { return cEnableRoutineAssignment_1_3_1; }
		
		//moeRoutine
		public RuleCall getEnableRoutineMoeRoutineParserRuleCall_1_3_1_0() { return cEnableRoutineMoeRoutineParserRuleCall_1_3_1_0; }
		
		//( '@disable' disableRoutine=moeRoutine )?
		public Group getGroup_1_4() { return cGroup_1_4; }
		
		//'@disable'
		public Keyword getDisableKeyword_1_4_0() { return cDisableKeyword_1_4_0; }
		
		//disableRoutine=moeRoutine
		public Assignment getDisableRoutineAssignment_1_4_1() { return cDisableRoutineAssignment_1_4_1; }
		
		//moeRoutine
		public RuleCall getDisableRoutineMoeRoutineParserRuleCall_1_4_1_0() { return cDisableRoutineMoeRoutineParserRuleCall_1_4_1_0; }
		
		//( '@irun' irunRoutine=moeRoutine )?
		public Group getGroup_1_5() { return cGroup_1_5; }
		
		//'@irun'
		public Keyword getIrunKeyword_1_5_0() { return cIrunKeyword_1_5_0; }
		
		//irunRoutine=moeRoutine
		public Assignment getIrunRoutineAssignment_1_5_1() { return cIrunRoutineAssignment_1_5_1; }
		
		//moeRoutine
		public RuleCall getIrunRoutineMoeRoutineParserRuleCall_1_5_1_0() { return cIrunRoutineMoeRoutineParserRuleCall_1_5_1_0; }
	}
	public class FinalStateElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.FinalState");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cFinalStateAction_0 = (Action)cGroup.eContents().get(0);
		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
		private final Group cGroup_1_0 = (Group)cAlternatives_1.eContents().get(0);
		private final Assignment cSimpleAssignment_1_0_0 = (Assignment)cGroup_1_0.eContents().get(0);
		private final Keyword cSimpleStateKeyword_1_0_0_0 = (Keyword)cSimpleAssignment_1_0_0.eContents().get(0);
		private final Keyword cLessThanSignKeyword_1_0_1 = (Keyword)cGroup_1_0.eContents().get(1);
		private final Keyword cMocKeyword_1_0_2 = (Keyword)cGroup_1_0.eContents().get(2);
		private final Keyword cFinalKeyword_1_0_3 = (Keyword)cGroup_1_0.eContents().get(3);
		private final Keyword cGreaterThanSignKeyword_1_0_4 = (Keyword)cGroup_1_0.eContents().get(4);
		private final Assignment cNameAssignment_1_0_5 = (Assignment)cGroup_1_0.eContents().get(5);
		private final RuleCall cNameESIdentifierParserRuleCall_1_0_5_0 = (RuleCall)cNameAssignment_1_0_5.eContents().get(0);
		private final Assignment cSimpleAssignment_1_1 = (Assignment)cAlternatives_1.eContents().get(1);
		private final Keyword cSimpleFinalKeyword_1_1_0 = (Keyword)cSimpleAssignment_1_1.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0 = (RuleCall)cUnrestrictedNameAssignment_2.eContents().get(0);
		private final Alternatives cAlternatives_3 = (Alternatives)cGroup.eContents().get(3);
		private final Group cGroup_3_0 = (Group)cAlternatives_3.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_3_0_0 = (Keyword)cGroup_3_0.eContents().get(0);
		private final Group cGroup_3_0_1 = (Group)cGroup_3_0.eContents().get(1);
		private final Keyword cMoeKeyword_3_0_1_0 = (Keyword)cGroup_3_0_1.eContents().get(0);
		private final Assignment cMoeAssignment_3_0_1_1 = (Assignment)cGroup_3_0_1.eContents().get(1);
		private final RuleCall cMoeMoeFinalStateRoutinesParserRuleCall_3_0_1_1_0 = (RuleCall)cMoeAssignment_3_0_1_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_3_0_2 = (Keyword)cGroup_3_0.eContents().get(2);
		private final Keyword cSemicolonKeyword_3_1 = (Keyword)cAlternatives_3.eContents().get(1);
		
		//////////////////////////////////////////////////////////////////////////////////
		//// FinalState Rules
		//////////////////////////////////////////////////////////////////////////////////
		//FinalState returns fmlStmchn::FinalState
		//    : { fmlStmchn::FinalState }
		//    ( simple?='state' '<' ( 'moc:' )? 'final' '>' name=ESIdentifier
		//    | simple?='#final'
		//    )
		//    ( unrestrictedName=UnrestrictedName )?
		//    ( '{'
		//        ( ( '@moe:' )?  moe=moeFinalStateRoutines )?
		//      '}'
		//    | ';'
		//    )
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{ fmlStmchn::FinalState }
		//   ( simple?='state' '<' ( 'moc:' )? 'final' '>' name=ESIdentifier
		//   | simple?='#final'
		//   )
		//   ( unrestrictedName=UnrestrictedName )?
		//   ( '{'
		//       ( ( '@moe:' )?  moe=moeFinalStateRoutines )?
		//     '}'
		//   | ';'
		//   )
		public Group getGroup() { return cGroup; }
		
		//{ fmlStmchn::FinalState }
		public Action getFinalStateAction_0() { return cFinalStateAction_0; }
		
		//( simple?='state' '<' ( 'moc:' )? 'final' '>' name=ESIdentifier
		//| simple?='#final'
		//)
		public Alternatives getAlternatives_1() { return cAlternatives_1; }
		
		//simple?='state' '<' ( 'moc:' )? 'final' '>' name=ESIdentifier
		public Group getGroup_1_0() { return cGroup_1_0; }
		
		//simple?='state'
		public Assignment getSimpleAssignment_1_0_0() { return cSimpleAssignment_1_0_0; }
		
		//'state'
		public Keyword getSimpleStateKeyword_1_0_0_0() { return cSimpleStateKeyword_1_0_0_0; }
		
		//'<'
		public Keyword getLessThanSignKeyword_1_0_1() { return cLessThanSignKeyword_1_0_1; }
		
		//( 'moc:' )?
		public Keyword getMocKeyword_1_0_2() { return cMocKeyword_1_0_2; }
		
		//'final'
		public Keyword getFinalKeyword_1_0_3() { return cFinalKeyword_1_0_3; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_1_0_4() { return cGreaterThanSignKeyword_1_0_4; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_1_0_5() { return cNameAssignment_1_0_5; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_1_0_5_0() { return cNameESIdentifierParserRuleCall_1_0_5_0; }
		
		//simple?='#final'
		public Assignment getSimpleAssignment_1_1() { return cSimpleAssignment_1_1; }
		
		//'#final'
		public Keyword getSimpleFinalKeyword_1_1_0() { return cSimpleFinalKeyword_1_1_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_2() { return cUnrestrictedNameAssignment_2; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0; }
		
		//( '{'
		//    ( ( '@moe:' )?  moe=moeFinalStateRoutines )?
		//  '}'
		//| ';'
		//)
		public Alternatives getAlternatives_3() { return cAlternatives_3; }
		
		//'{'
		//       ( ( '@moe:' )?  moe=moeFinalStateRoutines )?
		//     '}'
		public Group getGroup_3_0() { return cGroup_3_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_3_0_0() { return cLeftCurlyBracketKeyword_3_0_0; }
		
		//( ( '@moe:' )?  moe=moeFinalStateRoutines )?
		public Group getGroup_3_0_1() { return cGroup_3_0_1; }
		
		//( '@moe:' )?
		public Keyword getMoeKeyword_3_0_1_0() { return cMoeKeyword_3_0_1_0; }
		
		//moe=moeFinalStateRoutines
		public Assignment getMoeAssignment_3_0_1_1() { return cMoeAssignment_3_0_1_1; }
		
		//moeFinalStateRoutines
		public RuleCall getMoeMoeFinalStateRoutinesParserRuleCall_3_0_1_1_0() { return cMoeMoeFinalStateRoutinesParserRuleCall_3_0_1_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_3_0_2() { return cRightCurlyBracketKeyword_3_0_2; }
		
		//';'
		public Keyword getSemicolonKeyword_3_1() { return cSemicolonKeyword_3_1; }
	}
	public class MoeFinalStateRoutinesElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.moeFinalStateRoutines");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cModelOfExecutionAction_0 = (Action)cGroup.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_1 = (UnorderedGroup)cGroup.eContents().get(1);
		private final Group cGroup_1_0 = (Group)cUnorderedGroup_1.eContents().get(0);
		private final Keyword cEnableKeyword_1_0_0 = (Keyword)cGroup_1_0.eContents().get(0);
		private final Assignment cEnableRoutineAssignment_1_0_1 = (Assignment)cGroup_1_0.eContents().get(1);
		private final RuleCall cEnableRoutineMoeRoutineParserRuleCall_1_0_1_0 = (RuleCall)cEnableRoutineAssignment_1_0_1.eContents().get(0);
		private final Group cGroup_1_1 = (Group)cUnorderedGroup_1.eContents().get(1);
		private final Keyword cFinalKeyword_1_1_0 = (Keyword)cGroup_1_1.eContents().get(0);
		private final Assignment cFinalRoutineAssignment_1_1_1 = (Assignment)cGroup_1_1.eContents().get(1);
		private final RuleCall cFinalRoutineMoeRoutineParserRuleCall_1_1_1_0 = (RuleCall)cFinalRoutineAssignment_1_1_1.eContents().get(0);
		
		//moeFinalStateRoutines returns fmlInfra::ModelOfExecution
		//    : { fmlInfra::ModelOfExecution }
		//    ( ( '@enable'  enableRoutine=moeRoutine )?
		//    & ( '@final'   finalRoutine=moeRoutine  )?
		////    & ( '@run'     runRoutine=moeRoutine    )?
		//    )
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		// { fmlInfra::ModelOfExecution }
		//    ( ( '@enable'  enableRoutine=moeRoutine )?
		//    & ( '@final'   finalRoutine=moeRoutine  )?
		////    & ( '@run'     runRoutine=moeRoutine    )?
		//    )
		public Group getGroup() { return cGroup; }
		
		//{ fmlInfra::ModelOfExecution }
		public Action getModelOfExecutionAction_0() { return cModelOfExecutionAction_0; }
		
		//    ( ( '@enable'  enableRoutine=moeRoutine )?
		//    & ( '@final'   finalRoutine=moeRoutine  )?
		////    & ( '@run'     runRoutine=moeRoutine    )?
		//    )
		public UnorderedGroup getUnorderedGroup_1() { return cUnorderedGroup_1; }
		
		//( '@enable'  enableRoutine=moeRoutine )?
		public Group getGroup_1_0() { return cGroup_1_0; }
		
		//'@enable'
		public Keyword getEnableKeyword_1_0_0() { return cEnableKeyword_1_0_0; }
		
		//enableRoutine=moeRoutine
		public Assignment getEnableRoutineAssignment_1_0_1() { return cEnableRoutineAssignment_1_0_1; }
		
		//moeRoutine
		public RuleCall getEnableRoutineMoeRoutineParserRuleCall_1_0_1_0() { return cEnableRoutineMoeRoutineParserRuleCall_1_0_1_0; }
		
		//( '@final'   finalRoutine=moeRoutine  )?
		public Group getGroup_1_1() { return cGroup_1_1; }
		
		//'@final'
		public Keyword getFinalKeyword_1_1_0() { return cFinalKeyword_1_1_0; }
		
		//finalRoutine=moeRoutine
		public Assignment getFinalRoutineAssignment_1_1_1() { return cFinalRoutineAssignment_1_1_1; }
		
		//moeRoutine
		public RuleCall getFinalRoutineMoeRoutineParserRuleCall_1_1_1_0() { return cFinalRoutineMoeRoutineParserRuleCall_1_1_1_0; }
	}
	public class PseudostateElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.Pseudostate");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cPseudostateInitialParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cEndingPseudostateParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cOtherPseudostateParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		
		//////////////////////////////////////////////////////////////////////////////////
		//// Pseudostate Rules
		//////////////////////////////////////////////////////////////////////////////////
		//Pseudostate returns fmlStmchn::Pseudostate
		//    : PseudostateInitial
		//    | EndingPseudostate
		//    | OtherPseudostate
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//PseudostateInitial
		//   | EndingPseudostate
		//   | OtherPseudostate
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//PseudostateInitial
		public RuleCall getPseudostateInitialParserRuleCall_0() { return cPseudostateInitialParserRuleCall_0; }
		
		//EndingPseudostate
		public RuleCall getEndingPseudostateParserRuleCall_1() { return cEndingPseudostateParserRuleCall_1; }
		
		//OtherPseudostate
		public RuleCall getOtherPseudostateParserRuleCall_2() { return cOtherPseudostateParserRuleCall_2; }
	}
	public class OtherPseudostateElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.OtherPseudostate");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cPseudostateAction_0 = (Action)cGroup.eContents().get(0);
		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
		private final Keyword cStateKeyword_1_0 = (Keyword)cAlternatives_1.eContents().get(0);
		private final Keyword cPseudostateKeyword_1_1 = (Keyword)cAlternatives_1.eContents().get(1);
		private final Keyword cLessThanSignKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Keyword cMocKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Assignment cKindAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cKindPseudostateKindEnumRuleCall_4_0 = (RuleCall)cKindAssignment_4.eContents().get(0);
		private final Keyword cGreaterThanSignKeyword_5 = (Keyword)cGroup.eContents().get(5);
		private final Assignment cNameAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cNameESIdentifierParserRuleCall_6_0 = (RuleCall)cNameAssignment_6.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_7_0 = (RuleCall)cUnrestrictedNameAssignment_7.eContents().get(0);
		private final Alternatives cAlternatives_8 = (Alternatives)cGroup.eContents().get(8);
		private final Group cGroup_8_0 = (Group)cAlternatives_8.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_8_0_0 = (Keyword)cGroup_8_0.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_8_0_1 = (UnorderedGroup)cGroup_8_0.eContents().get(1);
		private final Assignment cTransitionAssignment_8_0_1_0 = (Assignment)cUnorderedGroup_8_0_1.eContents().get(0);
		private final RuleCall cTransitionTransitionParserRuleCall_8_0_1_0_0 = (RuleCall)cTransitionAssignment_8_0_1_0.eContents().get(0);
		private final Assignment cMoeAssignment_8_0_1_1 = (Assignment)cUnorderedGroup_8_0_1.eContents().get(1);
		private final RuleCall cMoeMoePseudotateRoutinesParserRuleCall_8_0_1_1_0 = (RuleCall)cMoeAssignment_8_0_1_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_8_0_2 = (Keyword)cGroup_8_0.eContents().get(2);
		private final Keyword cSemicolonKeyword_8_1 = (Keyword)cAlternatives_8.eContents().get(1);
		
		//OtherPseudostate returns fmlStmchn::Pseudostate
		//    : { fmlStmchn::Pseudostate }
		//        ( 'state' | 'pseudostate' ) '<' ( 'moc:' )? kind=PseudostateKind '>'
		//        name=ESIdentifier
		//        ( unrestrictedName=UnrestrictedName )?
		//        ( '{'
		//        (
		//            ( ( transition+=Transition    )*
		//            & ( moe=moePseudotateRoutines )?
		//            )
		////        |
		////            ( ( '@transition:'  ( transition+=Transition )* )?
		////            & ( '@moe:'         moe=moePseudotateRoutines  )?
		////            )
		//        )
		//          '}'
		//        | ';'
		//        )
		////    | PseudostateInitial
		////    | PseudostateTerminal
		////    | PseudostateReturn
		////    | PseudostateJunction
		////    | PseudostateChoice
		////    | PseudostateFork
		////    | PseudostateJoin
		////    | PseudostateDeepHistory
		////    | PseudostateShallowHistory
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		// { fmlStmchn::Pseudostate }
		//        ( 'state' | 'pseudostate' ) '<' ( 'moc:' )? kind=PseudostateKind '>'
		//        name=ESIdentifier
		//        ( unrestrictedName=UnrestrictedName )?
		//        ( '{'
		//        (
		//            ( ( transition+=Transition    )*
		//            & ( moe=moePseudotateRoutines )?
		//            )
		////        |
		////            ( ( '@transition:'  ( transition+=Transition )* )?
		////            & ( '@moe:'         moe=moePseudotateRoutines  )?
		////            )
		//        )
		//          '}'
		//        | ';'
		//        )
		public Group getGroup() { return cGroup; }
		
		//{ fmlStmchn::Pseudostate }
		public Action getPseudostateAction_0() { return cPseudostateAction_0; }
		
		//( 'state' | 'pseudostate' )
		public Alternatives getAlternatives_1() { return cAlternatives_1; }
		
		//'state'
		public Keyword getStateKeyword_1_0() { return cStateKeyword_1_0; }
		
		//'pseudostate'
		public Keyword getPseudostateKeyword_1_1() { return cPseudostateKeyword_1_1; }
		
		//'<'
		public Keyword getLessThanSignKeyword_2() { return cLessThanSignKeyword_2; }
		
		//( 'moc:' )?
		public Keyword getMocKeyword_3() { return cMocKeyword_3; }
		
		//kind=PseudostateKind
		public Assignment getKindAssignment_4() { return cKindAssignment_4; }
		
		//PseudostateKind
		public RuleCall getKindPseudostateKindEnumRuleCall_4_0() { return cKindPseudostateKindEnumRuleCall_4_0; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_5() { return cGreaterThanSignKeyword_5; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_6() { return cNameAssignment_6; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_6_0() { return cNameESIdentifierParserRuleCall_6_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_7() { return cUnrestrictedNameAssignment_7; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_7_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_7_0; }
		
		//        ( '{'
		//        (
		//            ( ( transition+=Transition    )*
		//            & ( moe=moePseudotateRoutines )?
		//            )
		////        |
		////            ( ( '@transition:'  ( transition+=Transition )* )?
		////            & ( '@moe:'         moe=moePseudotateRoutines  )?
		////            )
		//        )
		//          '}'
		//        | ';'
		//        )
		public Alternatives getAlternatives_8() { return cAlternatives_8; }
		
		// '{'
		//        (
		//            ( ( transition+=Transition    )*
		//            & ( moe=moePseudotateRoutines )?
		//            )
		////        |
		////            ( ( '@transition:'  ( transition+=Transition )* )?
		////            & ( '@moe:'         moe=moePseudotateRoutines  )?
		////            )
		//        )
		//          '}'
		public Group getGroup_8_0() { return cGroup_8_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_8_0_0() { return cLeftCurlyBracketKeyword_8_0_0; }
		
		//        (
		//            ( ( transition+=Transition    )*
		//            & ( moe=moePseudotateRoutines )?
		//            )
		////        |
		////            ( ( '@transition:'  ( transition+=Transition )* )?
		////            & ( '@moe:'         moe=moePseudotateRoutines  )?
		////            )
		//        )
		public UnorderedGroup getUnorderedGroup_8_0_1() { return cUnorderedGroup_8_0_1; }
		
		//( transition+=Transition    )*
		public Assignment getTransitionAssignment_8_0_1_0() { return cTransitionAssignment_8_0_1_0; }
		
		//Transition
		public RuleCall getTransitionTransitionParserRuleCall_8_0_1_0_0() { return cTransitionTransitionParserRuleCall_8_0_1_0_0; }
		
		//( moe=moePseudotateRoutines )?
		public Assignment getMoeAssignment_8_0_1_1() { return cMoeAssignment_8_0_1_1; }
		
		//moePseudotateRoutines
		public RuleCall getMoeMoePseudotateRoutinesParserRuleCall_8_0_1_1_0() { return cMoeMoePseudotateRoutinesParserRuleCall_8_0_1_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_8_0_2() { return cRightCurlyBracketKeyword_8_0_2; }
		
		//';'
		public Keyword getSemicolonKeyword_8_1() { return cSemicolonKeyword_8_1; }
	}
	public class MoePseudotateRoutinesElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.moePseudotateRoutines");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cModelOfExecutionAction_0 = (Action)cGroup.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_1 = (UnorderedGroup)cGroup.eContents().get(1);
		private final Group cGroup_1_0 = (Group)cUnorderedGroup_1.eContents().get(0);
		private final Keyword cEnableKeyword_1_0_0 = (Keyword)cGroup_1_0.eContents().get(0);
		private final Assignment cEnableRoutineAssignment_1_0_1 = (Assignment)cGroup_1_0.eContents().get(1);
		private final RuleCall cEnableRoutineMoeRoutineParserRuleCall_1_0_1_0 = (RuleCall)cEnableRoutineAssignment_1_0_1.eContents().get(0);
		private final Group cGroup_1_1 = (Group)cUnorderedGroup_1.eContents().get(1);
		private final Keyword cDisableKeyword_1_1_0 = (Keyword)cGroup_1_1.eContents().get(0);
		private final Assignment cDisableRoutineAssignment_1_1_1 = (Assignment)cGroup_1_1.eContents().get(1);
		private final RuleCall cDisableRoutineMoeRoutineParserRuleCall_1_1_1_0 = (RuleCall)cDisableRoutineAssignment_1_1_1.eContents().get(0);
		
		//moePseudotateRoutines returns fmlInfra::ModelOfExecution
		//    : { fmlInfra::ModelOfExecution }
		//    ( ( '@enable'  enableRoutine=moeRoutine  )?
		//    & ( '@disable' disableRoutine=moeRoutine )?
		//    )
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{ fmlInfra::ModelOfExecution }
		//   ( ( '@enable'  enableRoutine=moeRoutine  )?
		//   & ( '@disable' disableRoutine=moeRoutine )?
		//   )
		public Group getGroup() { return cGroup; }
		
		//{ fmlInfra::ModelOfExecution }
		public Action getModelOfExecutionAction_0() { return cModelOfExecutionAction_0; }
		
		//( ( '@enable'  enableRoutine=moeRoutine  )?
		//& ( '@disable' disableRoutine=moeRoutine )?
		//)
		public UnorderedGroup getUnorderedGroup_1() { return cUnorderedGroup_1; }
		
		//( '@enable'  enableRoutine=moeRoutine  )?
		public Group getGroup_1_0() { return cGroup_1_0; }
		
		//'@enable'
		public Keyword getEnableKeyword_1_0_0() { return cEnableKeyword_1_0_0; }
		
		//enableRoutine=moeRoutine
		public Assignment getEnableRoutineAssignment_1_0_1() { return cEnableRoutineAssignment_1_0_1; }
		
		//moeRoutine
		public RuleCall getEnableRoutineMoeRoutineParserRuleCall_1_0_1_0() { return cEnableRoutineMoeRoutineParserRuleCall_1_0_1_0; }
		
		//( '@disable' disableRoutine=moeRoutine )?
		public Group getGroup_1_1() { return cGroup_1_1; }
		
		//'@disable'
		public Keyword getDisableKeyword_1_1_0() { return cDisableKeyword_1_1_0; }
		
		//disableRoutine=moeRoutine
		public Assignment getDisableRoutineAssignment_1_1_1() { return cDisableRoutineAssignment_1_1_1; }
		
		//moeRoutine
		public RuleCall getDisableRoutineMoeRoutineParserRuleCall_1_1_1_0() { return cDisableRoutineMoeRoutineParserRuleCall_1_1_1_0; }
	}
	public class PseudostateInitialElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PseudostateInitial");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cPseudostateAction_0 = (Action)cGroup.eContents().get(0);
		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
		private final Group cGroup_1_0 = (Group)cAlternatives_1.eContents().get(0);
		private final Alternatives cAlternatives_1_0_0 = (Alternatives)cGroup_1_0.eContents().get(0);
		private final Keyword cStateKeyword_1_0_0_0 = (Keyword)cAlternatives_1_0_0.eContents().get(0);
		private final Keyword cPseudostateKeyword_1_0_0_1 = (Keyword)cAlternatives_1_0_0.eContents().get(1);
		private final Keyword cLessThanSignKeyword_1_0_1 = (Keyword)cGroup_1_0.eContents().get(1);
		private final Keyword cMocKeyword_1_0_2 = (Keyword)cGroup_1_0.eContents().get(2);
		private final Assignment cKindAssignment_1_0_3 = (Assignment)cGroup_1_0.eContents().get(3);
		private final RuleCall cKindPseudostateInitialKindEnumRuleCall_1_0_3_0 = (RuleCall)cKindAssignment_1_0_3.eContents().get(0);
		private final Keyword cGreaterThanSignKeyword_1_0_4 = (Keyword)cGroup_1_0.eContents().get(4);
		private final Assignment cNameAssignment_1_0_5 = (Assignment)cGroup_1_0.eContents().get(5);
		private final Alternatives cNameAlternatives_1_0_5_0 = (Alternatives)cNameAssignment_1_0_5.eContents().get(0);
		private final RuleCall cNameESIdentifierParserRuleCall_1_0_5_0_0 = (RuleCall)cNameAlternatives_1_0_5_0.eContents().get(0);
		private final Keyword cNameInitialKeyword_1_0_5_0_1 = (Keyword)cNameAlternatives_1_0_5_0.eContents().get(1);
		private final Keyword cNameInitKeyword_1_0_5_0_2 = (Keyword)cNameAlternatives_1_0_5_0.eContents().get(2);
		private final Assignment cNameAssignment_1_1 = (Assignment)cAlternatives_1.eContents().get(1);
		private final Alternatives cNameAlternatives_1_1_0 = (Alternatives)cNameAssignment_1_1.eContents().get(0);
		private final Keyword cNameInitialKeyword_1_1_0_0 = (Keyword)cNameAlternatives_1_1_0.eContents().get(0);
		private final Keyword cNameInitKeyword_1_1_0_1 = (Keyword)cNameAlternatives_1_1_0.eContents().get(1);
		private final Assignment cUnrestrictedNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0 = (RuleCall)cUnrestrictedNameAssignment_2.eContents().get(0);
		private final Alternatives cAlternatives_3 = (Alternatives)cGroup.eContents().get(3);
		private final Group cGroup_3_0 = (Group)cAlternatives_3.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_3_0_0 = (Keyword)cGroup_3_0.eContents().get(0);
		private final Group cGroup_3_0_1 = (Group)cGroup_3_0.eContents().get(1);
		private final Keyword cTransitionKeyword_3_0_1_0 = (Keyword)cGroup_3_0_1.eContents().get(0);
		private final Assignment cTransitionAssignment_3_0_1_1 = (Assignment)cGroup_3_0_1.eContents().get(1);
		private final RuleCall cTransitionTransitionParserRuleCall_3_0_1_1_0 = (RuleCall)cTransitionAssignment_3_0_1_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_3_0_2 = (Keyword)cGroup_3_0.eContents().get(2);
		private final Keyword cSemicolonKeyword_3_1 = (Keyword)cAlternatives_3.eContents().get(1);
		
		//PseudostateInitial returns fmlStmchn::Pseudostate
		//    : { fmlStmchn::Pseudostate }
		//    ( ( 'state' | 'pseudostate' )
		//        '<' ( 'moc:' )? kind=PseudostateInitialKind '>'
		//        name=(ESIdentifier | '#initial' | '#init' )
		//    | name=( '#initial' | '#init' )
		//    )
		//    ( unrestrictedName=UnrestrictedName )?
		//    ( '{'  ( ( '@transition:' )?  ( transition+=Transition )* )?  '}'
		//    | ';'
		//    )
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{ fmlStmchn::Pseudostate }
		//   ( ( 'state' | 'pseudostate' )
		//       '<' ( 'moc:' )? kind=PseudostateInitialKind '>'
		//       name=(ESIdentifier | '#initial' | '#init' )
		//   | name=( '#initial' | '#init' )
		//   )
		//   ( unrestrictedName=UnrestrictedName )?
		//   ( '{'  ( ( '@transition:' )?  ( transition+=Transition )* )?  '}'
		//   | ';'
		//   )
		public Group getGroup() { return cGroup; }
		
		//{ fmlStmchn::Pseudostate }
		public Action getPseudostateAction_0() { return cPseudostateAction_0; }
		
		//( ( 'state' | 'pseudostate' )
		//    '<' ( 'moc:' )? kind=PseudostateInitialKind '>'
		//    name=(ESIdentifier | '#initial' | '#init' )
		//| name=( '#initial' | '#init' )
		//)
		public Alternatives getAlternatives_1() { return cAlternatives_1; }
		
		//( 'state' | 'pseudostate' )
		//       '<' ( 'moc:' )? kind=PseudostateInitialKind '>'
		//       name=(ESIdentifier | '#initial' | '#init' )
		public Group getGroup_1_0() { return cGroup_1_0; }
		
		//( 'state' | 'pseudostate' )
		public Alternatives getAlternatives_1_0_0() { return cAlternatives_1_0_0; }
		
		//'state'
		public Keyword getStateKeyword_1_0_0_0() { return cStateKeyword_1_0_0_0; }
		
		//'pseudostate'
		public Keyword getPseudostateKeyword_1_0_0_1() { return cPseudostateKeyword_1_0_0_1; }
		
		//'<'
		public Keyword getLessThanSignKeyword_1_0_1() { return cLessThanSignKeyword_1_0_1; }
		
		//( 'moc:' )?
		public Keyword getMocKeyword_1_0_2() { return cMocKeyword_1_0_2; }
		
		//kind=PseudostateInitialKind
		public Assignment getKindAssignment_1_0_3() { return cKindAssignment_1_0_3; }
		
		//PseudostateInitialKind
		public RuleCall getKindPseudostateInitialKindEnumRuleCall_1_0_3_0() { return cKindPseudostateInitialKindEnumRuleCall_1_0_3_0; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_1_0_4() { return cGreaterThanSignKeyword_1_0_4; }
		
		//name=(ESIdentifier | '#initial' | '#init' )
		public Assignment getNameAssignment_1_0_5() { return cNameAssignment_1_0_5; }
		
		//(ESIdentifier | '#initial' | '#init' )
		public Alternatives getNameAlternatives_1_0_5_0() { return cNameAlternatives_1_0_5_0; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_1_0_5_0_0() { return cNameESIdentifierParserRuleCall_1_0_5_0_0; }
		
		//'#initial'
		public Keyword getNameInitialKeyword_1_0_5_0_1() { return cNameInitialKeyword_1_0_5_0_1; }
		
		//'#init'
		public Keyword getNameInitKeyword_1_0_5_0_2() { return cNameInitKeyword_1_0_5_0_2; }
		
		//name=( '#initial' | '#init' )
		public Assignment getNameAssignment_1_1() { return cNameAssignment_1_1; }
		
		//( '#initial' | '#init' )
		public Alternatives getNameAlternatives_1_1_0() { return cNameAlternatives_1_1_0; }
		
		//'#initial'
		public Keyword getNameInitialKeyword_1_1_0_0() { return cNameInitialKeyword_1_1_0_0; }
		
		//'#init'
		public Keyword getNameInitKeyword_1_1_0_1() { return cNameInitKeyword_1_1_0_1; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_2() { return cUnrestrictedNameAssignment_2; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0; }
		
		//( '{'  ( ( '@transition:' )?  ( transition+=Transition )* )?  '}'
		//| ';'
		//)
		public Alternatives getAlternatives_3() { return cAlternatives_3; }
		
		//'{'  ( ( '@transition:' )?  ( transition+=Transition )* )?  '}'
		public Group getGroup_3_0() { return cGroup_3_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_3_0_0() { return cLeftCurlyBracketKeyword_3_0_0; }
		
		//( ( '@transition:' )?  ( transition+=Transition )* )?
		public Group getGroup_3_0_1() { return cGroup_3_0_1; }
		
		//( '@transition:' )?
		public Keyword getTransitionKeyword_3_0_1_0() { return cTransitionKeyword_3_0_1_0; }
		
		//( transition+=Transition )*
		public Assignment getTransitionAssignment_3_0_1_1() { return cTransitionAssignment_3_0_1_1; }
		
		//Transition
		public RuleCall getTransitionTransitionParserRuleCall_3_0_1_1_0() { return cTransitionTransitionParserRuleCall_3_0_1_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_3_0_2() { return cRightCurlyBracketKeyword_3_0_2; }
		
		//';'
		public Keyword getSemicolonKeyword_3_1() { return cSemicolonKeyword_3_1; }
	}
	public class EndingPseudostateElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.EndingPseudostate");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cPseudostateAction_0 = (Action)cGroup.eContents().get(0);
		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
		private final Keyword cStateKeyword_1_0 = (Keyword)cAlternatives_1.eContents().get(0);
		private final Keyword cPseudostateKeyword_1_1 = (Keyword)cAlternatives_1.eContents().get(1);
		private final Keyword cLessThanSignKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Keyword cMocKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Assignment cKindAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cKindEndingPseudostateKindEnumRuleCall_4_0 = (RuleCall)cKindAssignment_4.eContents().get(0);
		private final Keyword cGreaterThanSignKeyword_5 = (Keyword)cGroup.eContents().get(5);
		private final Assignment cNameAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cNameESIdentifierParserRuleCall_6_0 = (RuleCall)cNameAssignment_6.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_7_0 = (RuleCall)cUnrestrictedNameAssignment_7.eContents().get(0);
		private final Alternatives cAlternatives_8 = (Alternatives)cGroup.eContents().get(8);
		private final Group cGroup_8_0 = (Group)cAlternatives_8.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_8_0_0 = (Keyword)cGroup_8_0.eContents().get(0);
		private final Group cGroup_8_0_1 = (Group)cGroup_8_0.eContents().get(1);
		private final Keyword cMoeKeyword_8_0_1_0 = (Keyword)cGroup_8_0_1.eContents().get(0);
		private final Assignment cMoeAssignment_8_0_1_1 = (Assignment)cGroup_8_0_1.eContents().get(1);
		private final RuleCall cMoeMoeFinalStateRoutinesParserRuleCall_8_0_1_1_0 = (RuleCall)cMoeAssignment_8_0_1_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_8_0_2 = (Keyword)cGroup_8_0.eContents().get(2);
		private final Keyword cSemicolonKeyword_8_1 = (Keyword)cAlternatives_8.eContents().get(1);
		
		//EndingPseudostate returns fmlStmchn::Pseudostate
		//    : { fmlStmchn::Pseudostate }
		//    ( 'state' | 'pseudostate' ) '<' ( 'moc:' )? kind=EndingPseudostateKind '>'
		//    name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//    ( '{'  ( ( '@moe:' )?  moe=moeFinalStateRoutines )?  '}'
		//    | ';'
		//    )
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{ fmlStmchn::Pseudostate }
		//   ( 'state' | 'pseudostate' ) '<' ( 'moc:' )? kind=EndingPseudostateKind '>'
		//   name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//   ( '{'  ( ( '@moe:' )?  moe=moeFinalStateRoutines )?  '}'
		//   | ';'
		//   )
		public Group getGroup() { return cGroup; }
		
		//{ fmlStmchn::Pseudostate }
		public Action getPseudostateAction_0() { return cPseudostateAction_0; }
		
		//( 'state' | 'pseudostate' )
		public Alternatives getAlternatives_1() { return cAlternatives_1; }
		
		//'state'
		public Keyword getStateKeyword_1_0() { return cStateKeyword_1_0; }
		
		//'pseudostate'
		public Keyword getPseudostateKeyword_1_1() { return cPseudostateKeyword_1_1; }
		
		//'<'
		public Keyword getLessThanSignKeyword_2() { return cLessThanSignKeyword_2; }
		
		//( 'moc:' )?
		public Keyword getMocKeyword_3() { return cMocKeyword_3; }
		
		//kind=EndingPseudostateKind
		public Assignment getKindAssignment_4() { return cKindAssignment_4; }
		
		//EndingPseudostateKind
		public RuleCall getKindEndingPseudostateKindEnumRuleCall_4_0() { return cKindEndingPseudostateKindEnumRuleCall_4_0; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_5() { return cGreaterThanSignKeyword_5; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_6() { return cNameAssignment_6; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_6_0() { return cNameESIdentifierParserRuleCall_6_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_7() { return cUnrestrictedNameAssignment_7; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_7_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_7_0; }
		
		//( '{'  ( ( '@moe:' )?  moe=moeFinalStateRoutines )?  '}'
		//| ';'
		//)
		public Alternatives getAlternatives_8() { return cAlternatives_8; }
		
		//'{'  ( ( '@moe:' )?  moe=moeFinalStateRoutines )?  '}'
		public Group getGroup_8_0() { return cGroup_8_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_8_0_0() { return cLeftCurlyBracketKeyword_8_0_0; }
		
		//( ( '@moe:' )?  moe=moeFinalStateRoutines )?
		public Group getGroup_8_0_1() { return cGroup_8_0_1; }
		
		//( '@moe:' )?
		public Keyword getMoeKeyword_8_0_1_0() { return cMoeKeyword_8_0_1_0; }
		
		//moe=moeFinalStateRoutines
		public Assignment getMoeAssignment_8_0_1_1() { return cMoeAssignment_8_0_1_1; }
		
		//moeFinalStateRoutines
		public RuleCall getMoeMoeFinalStateRoutinesParserRuleCall_8_0_1_1_0() { return cMoeMoeFinalStateRoutinesParserRuleCall_8_0_1_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_8_0_2() { return cRightCurlyBracketKeyword_8_0_2; }
		
		//';'
		public Keyword getSemicolonKeyword_8_1() { return cSemicolonKeyword_8_1; }
	}
	public class ModelOfComputationElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ModelOfComputation");
		private final Action cModelOfComputationAction = (Action)rule.eContents().get(1);
		
		//////////////////////////////////////////////////////////////////////////////////
		//// Section Model Of Computation Rules
		//////////////////////////////////////////////////////////////////////////////////
		//ModelOfComputation returns fmlInfra::ModelOfComputation
		//    : { fmlInfra::ModelOfComputation }
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{ fmlInfra::ModelOfComputation }
		public Action getModelOfComputationAction() { return cModelOfComputationAction; }
	}
	public class ModelOfExecutionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ModelOfExecution");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cModelOfExecutionAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cMoeKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cRoutineAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cRoutineRoutineParserRuleCall_2_0 = (RuleCall)cRoutineAssignment_2.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_3 = (UnorderedGroup)cGroup.eContents().get(3);
		private final Group cGroup_3_0 = (Group)cUnorderedGroup_3.eContents().get(0);
		private final Keyword cCreateKeyword_3_0_0 = (Keyword)cGroup_3_0.eContents().get(0);
		private final Assignment cCreateRoutineAssignment_3_0_1 = (Assignment)cGroup_3_0.eContents().get(1);
		private final RuleCall cCreateRoutineMoeRoutineParserRuleCall_3_0_1_0 = (RuleCall)cCreateRoutineAssignment_3_0_1.eContents().get(0);
		private final Group cGroup_3_1 = (Group)cUnorderedGroup_3.eContents().get(1);
		private final Keyword cInitKeyword_3_1_0 = (Keyword)cGroup_3_1.eContents().get(0);
		private final Assignment cInitRoutineAssignment_3_1_1 = (Assignment)cGroup_3_1.eContents().get(1);
		private final RuleCall cInitRoutineMoeRoutineParserRuleCall_3_1_1_0 = (RuleCall)cInitRoutineAssignment_3_1_1.eContents().get(0);
		private final Group cGroup_3_2 = (Group)cUnorderedGroup_3.eContents().get(2);
		private final Keyword cFinalKeyword_3_2_0 = (Keyword)cGroup_3_2.eContents().get(0);
		private final Assignment cFinalRoutineAssignment_3_2_1 = (Assignment)cGroup_3_2.eContents().get(1);
		private final RuleCall cFinalRoutineMoeRoutineParserRuleCall_3_2_1_0 = (RuleCall)cFinalRoutineAssignment_3_2_1.eContents().get(0);
		private final Group cGroup_3_3 = (Group)cUnorderedGroup_3.eContents().get(3);
		private final Keyword cEnableKeyword_3_3_0 = (Keyword)cGroup_3_3.eContents().get(0);
		private final Assignment cEnableRoutineAssignment_3_3_1 = (Assignment)cGroup_3_3.eContents().get(1);
		private final RuleCall cEnableRoutineMoeRoutineParserRuleCall_3_3_1_0 = (RuleCall)cEnableRoutineAssignment_3_3_1.eContents().get(0);
		private final Group cGroup_3_4 = (Group)cUnorderedGroup_3.eContents().get(4);
		private final Keyword cDisableKeyword_3_4_0 = (Keyword)cGroup_3_4.eContents().get(0);
		private final Assignment cDisableRoutineAssignment_3_4_1 = (Assignment)cGroup_3_4.eContents().get(1);
		private final RuleCall cDisableRoutineMoeRoutineParserRuleCall_3_4_1_0 = (RuleCall)cDisableRoutineAssignment_3_4_1.eContents().get(0);
		private final Group cGroup_3_5 = (Group)cUnorderedGroup_3.eContents().get(5);
		private final Keyword cConcurrencyKeyword_3_5_0 = (Keyword)cGroup_3_5.eContents().get(0);
		private final Assignment cConcurrencyRoutineAssignment_3_5_1 = (Assignment)cGroup_3_5.eContents().get(1);
		private final RuleCall cConcurrencyRoutineMoeRoutineParserRuleCall_3_5_1_0 = (RuleCall)cConcurrencyRoutineAssignment_3_5_1.eContents().get(0);
		private final Group cGroup_3_6 = (Group)cUnorderedGroup_3.eContents().get(6);
		private final Alternatives cAlternatives_3_6_0 = (Alternatives)cGroup_3_6.eContents().get(0);
		private final Keyword cScheduleKeyword_3_6_0_0 = (Keyword)cAlternatives_3_6_0.eContents().get(0);
		private final Keyword cXscheduleKeyword_3_6_0_1 = (Keyword)cAlternatives_3_6_0.eContents().get(1);
		private final Assignment cScheduleRoutineAssignment_3_6_1 = (Assignment)cGroup_3_6.eContents().get(1);
		private final RuleCall cScheduleRoutineMoeRoutineParserRuleCall_3_6_1_0 = (RuleCall)cScheduleRoutineAssignment_3_6_1.eContents().get(0);
		private final Group cGroup_3_7 = (Group)cUnorderedGroup_3.eContents().get(7);
		private final Keyword cIrunKeyword_3_7_0 = (Keyword)cGroup_3_7.eContents().get(0);
		private final Assignment cIrunRoutineAssignment_3_7_1 = (Assignment)cGroup_3_7.eContents().get(1);
		private final RuleCall cIrunRoutineMoeRoutineParserRuleCall_3_7_1_0 = (RuleCall)cIrunRoutineAssignment_3_7_1.eContents().get(0);
		private final Group cGroup_3_8 = (Group)cUnorderedGroup_3.eContents().get(8);
		private final Keyword cRunKeyword_3_8_0 = (Keyword)cGroup_3_8.eContents().get(0);
		private final Assignment cRunRoutineAssignment_3_8_1 = (Assignment)cGroup_3_8.eContents().get(1);
		private final RuleCall cRunRoutineMoeRoutineParserRuleCall_3_8_1_0 = (RuleCall)cRunRoutineAssignment_3_8_1.eContents().get(0);
		private final Assignment cRoutineAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cRoutineRoutineParserRuleCall_4_0 = (RuleCall)cRoutineAssignment_4.eContents().get(0);
		
		//////////////////////////////////////////////////////////////////////////////////
		//// Section Model Of Execution Rules
		//////////////////////////////////////////////////////////////////////////////////
		//ModelOfExecution returns fmlInfra::ModelOfExecution
		//    : { fmlInfra::ModelOfExecution }
		//    '@moe:'
		//    ( routine+=Routine )*
		//    ( ( '@create'  createRoutine=moeRoutine )?
		//    & ( '@init'    initRoutine=moeRoutine   )?
		//    & ( '@final'   finalRoutine=moeRoutine  )?
		//    & ( '@enable'  enableRoutine=moeRoutine  )?
		//    & ( '@disable' disableRoutine=moeRoutine )?
		//    & ( '@concurrency' concurrencyRoutine=moeRoutine )?
		//    & ( ( '@schedule' | '@xschedule' )    scheduleRoutine=moeRoutine )?
		//    & ( '@irun' irunRoutine=moeRoutine )?
		//    & ( '@run'  runRoutine=moeRoutine  )?
		//    )
		//    ( routine+=Routine )*
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{ fmlInfra::ModelOfExecution }
		//   '@moe:'
		//   ( routine+=Routine )*
		//   ( ( '@create'  createRoutine=moeRoutine )?
		//   & ( '@init'    initRoutine=moeRoutine   )?
		//   & ( '@final'   finalRoutine=moeRoutine  )?
		//   & ( '@enable'  enableRoutine=moeRoutine  )?
		//   & ( '@disable' disableRoutine=moeRoutine )?
		//   & ( '@concurrency' concurrencyRoutine=moeRoutine )?
		//   & ( ( '@schedule' | '@xschedule' )    scheduleRoutine=moeRoutine )?
		//   & ( '@irun' irunRoutine=moeRoutine )?
		//   & ( '@run'  runRoutine=moeRoutine  )?
		//   )
		//   ( routine+=Routine )*
		public Group getGroup() { return cGroup; }
		
		//{ fmlInfra::ModelOfExecution }
		public Action getModelOfExecutionAction_0() { return cModelOfExecutionAction_0; }
		
		//'@moe:'
		public Keyword getMoeKeyword_1() { return cMoeKeyword_1; }
		
		//( routine+=Routine )*
		public Assignment getRoutineAssignment_2() { return cRoutineAssignment_2; }
		
		//Routine
		public RuleCall getRoutineRoutineParserRuleCall_2_0() { return cRoutineRoutineParserRuleCall_2_0; }
		
		//( ( '@create'  createRoutine=moeRoutine )?
		//& ( '@init'    initRoutine=moeRoutine   )?
		//& ( '@final'   finalRoutine=moeRoutine  )?
		//& ( '@enable'  enableRoutine=moeRoutine  )?
		//& ( '@disable' disableRoutine=moeRoutine )?
		//& ( '@concurrency' concurrencyRoutine=moeRoutine )?
		//& ( ( '@schedule' | '@xschedule' )    scheduleRoutine=moeRoutine )?
		//& ( '@irun' irunRoutine=moeRoutine )?
		//& ( '@run'  runRoutine=moeRoutine  )?
		//)
		public UnorderedGroup getUnorderedGroup_3() { return cUnorderedGroup_3; }
		
		//( '@create'  createRoutine=moeRoutine )?
		public Group getGroup_3_0() { return cGroup_3_0; }
		
		//'@create'
		public Keyword getCreateKeyword_3_0_0() { return cCreateKeyword_3_0_0; }
		
		//createRoutine=moeRoutine
		public Assignment getCreateRoutineAssignment_3_0_1() { return cCreateRoutineAssignment_3_0_1; }
		
		//moeRoutine
		public RuleCall getCreateRoutineMoeRoutineParserRuleCall_3_0_1_0() { return cCreateRoutineMoeRoutineParserRuleCall_3_0_1_0; }
		
		//( '@init'    initRoutine=moeRoutine   )?
		public Group getGroup_3_1() { return cGroup_3_1; }
		
		//'@init'
		public Keyword getInitKeyword_3_1_0() { return cInitKeyword_3_1_0; }
		
		//initRoutine=moeRoutine
		public Assignment getInitRoutineAssignment_3_1_1() { return cInitRoutineAssignment_3_1_1; }
		
		//moeRoutine
		public RuleCall getInitRoutineMoeRoutineParserRuleCall_3_1_1_0() { return cInitRoutineMoeRoutineParserRuleCall_3_1_1_0; }
		
		//( '@final'   finalRoutine=moeRoutine  )?
		public Group getGroup_3_2() { return cGroup_3_2; }
		
		//'@final'
		public Keyword getFinalKeyword_3_2_0() { return cFinalKeyword_3_2_0; }
		
		//finalRoutine=moeRoutine
		public Assignment getFinalRoutineAssignment_3_2_1() { return cFinalRoutineAssignment_3_2_1; }
		
		//moeRoutine
		public RuleCall getFinalRoutineMoeRoutineParserRuleCall_3_2_1_0() { return cFinalRoutineMoeRoutineParserRuleCall_3_2_1_0; }
		
		//( '@enable'  enableRoutine=moeRoutine  )?
		public Group getGroup_3_3() { return cGroup_3_3; }
		
		//'@enable'
		public Keyword getEnableKeyword_3_3_0() { return cEnableKeyword_3_3_0; }
		
		//enableRoutine=moeRoutine
		public Assignment getEnableRoutineAssignment_3_3_1() { return cEnableRoutineAssignment_3_3_1; }
		
		//moeRoutine
		public RuleCall getEnableRoutineMoeRoutineParserRuleCall_3_3_1_0() { return cEnableRoutineMoeRoutineParserRuleCall_3_3_1_0; }
		
		//( '@disable' disableRoutine=moeRoutine )?
		public Group getGroup_3_4() { return cGroup_3_4; }
		
		//'@disable'
		public Keyword getDisableKeyword_3_4_0() { return cDisableKeyword_3_4_0; }
		
		//disableRoutine=moeRoutine
		public Assignment getDisableRoutineAssignment_3_4_1() { return cDisableRoutineAssignment_3_4_1; }
		
		//moeRoutine
		public RuleCall getDisableRoutineMoeRoutineParserRuleCall_3_4_1_0() { return cDisableRoutineMoeRoutineParserRuleCall_3_4_1_0; }
		
		//( '@concurrency' concurrencyRoutine=moeRoutine )?
		public Group getGroup_3_5() { return cGroup_3_5; }
		
		//'@concurrency'
		public Keyword getConcurrencyKeyword_3_5_0() { return cConcurrencyKeyword_3_5_0; }
		
		//concurrencyRoutine=moeRoutine
		public Assignment getConcurrencyRoutineAssignment_3_5_1() { return cConcurrencyRoutineAssignment_3_5_1; }
		
		//moeRoutine
		public RuleCall getConcurrencyRoutineMoeRoutineParserRuleCall_3_5_1_0() { return cConcurrencyRoutineMoeRoutineParserRuleCall_3_5_1_0; }
		
		//( ( '@schedule' | '@xschedule' )    scheduleRoutine=moeRoutine )?
		public Group getGroup_3_6() { return cGroup_3_6; }
		
		//( '@schedule' | '@xschedule' )
		public Alternatives getAlternatives_3_6_0() { return cAlternatives_3_6_0; }
		
		//'@schedule'
		public Keyword getScheduleKeyword_3_6_0_0() { return cScheduleKeyword_3_6_0_0; }
		
		//'@xschedule'
		public Keyword getXscheduleKeyword_3_6_0_1() { return cXscheduleKeyword_3_6_0_1; }
		
		//scheduleRoutine=moeRoutine
		public Assignment getScheduleRoutineAssignment_3_6_1() { return cScheduleRoutineAssignment_3_6_1; }
		
		//moeRoutine
		public RuleCall getScheduleRoutineMoeRoutineParserRuleCall_3_6_1_0() { return cScheduleRoutineMoeRoutineParserRuleCall_3_6_1_0; }
		
		//( '@irun' irunRoutine=moeRoutine )?
		public Group getGroup_3_7() { return cGroup_3_7; }
		
		//'@irun'
		public Keyword getIrunKeyword_3_7_0() { return cIrunKeyword_3_7_0; }
		
		//irunRoutine=moeRoutine
		public Assignment getIrunRoutineAssignment_3_7_1() { return cIrunRoutineAssignment_3_7_1; }
		
		//moeRoutine
		public RuleCall getIrunRoutineMoeRoutineParserRuleCall_3_7_1_0() { return cIrunRoutineMoeRoutineParserRuleCall_3_7_1_0; }
		
		//( '@run'  runRoutine=moeRoutine  )?
		public Group getGroup_3_8() { return cGroup_3_8; }
		
		//'@run'
		public Keyword getRunKeyword_3_8_0() { return cRunKeyword_3_8_0; }
		
		//runRoutine=moeRoutine
		public Assignment getRunRoutineAssignment_3_8_1() { return cRunRoutineAssignment_3_8_1; }
		
		//moeRoutine
		public RuleCall getRunRoutineMoeRoutineParserRuleCall_3_8_1_0() { return cRunRoutineMoeRoutineParserRuleCall_3_8_1_0; }
		
		//( routine+=Routine )*
		public Assignment getRoutineAssignment_4() { return cRoutineAssignment_4; }
		
		//Routine
		public RuleCall getRoutineRoutineParserRuleCall_4_0() { return cRoutineRoutineParserRuleCall_4_0; }
	}
	public class MoeRoutineElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.moeRoutine");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cRoutineAction_0 = (Action)cGroup.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Keyword cLeftParenthesisKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final Assignment cParameterSetAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final RuleCall cParameterSetFormalParameterSetParserRuleCall_1_1_0 = (RuleCall)cParameterSetAssignment_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_1_2 = (Keyword)cGroup_1.eContents().get(2);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cHyphenMinusGreaterThanSignKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final Alternatives cAlternatives_2_1 = (Alternatives)cGroup_2.eContents().get(1);
		private final Assignment cResultSetAssignment_2_1_0 = (Assignment)cAlternatives_2_1.eContents().get(0);
		private final RuleCall cResultSetFormalParameterSetParserRuleCall_2_1_0_0 = (RuleCall)cResultSetAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cAlternatives_2_1.eContents().get(1);
		private final Keyword cLeftParenthesisKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cResultSetAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cResultSetFormalParameterSetParserRuleCall_2_1_1_1_0 = (RuleCall)cResultSetAssignment_2_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_1_1_2 = (Keyword)cGroup_2_1_1.eContents().get(2);
		private final Assignment cBodyBlockAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cBodyBlockBlockStatementParserRuleCall_3_0 = (RuleCall)cBodyBlockAssignment_3.eContents().get(0);
		
		//moeRoutine returns fmlInfra::Routine
		//    : { fmlInfra::Routine }
		//        ( '(' ( parameterSet=FormalParameterSet )? ')' )?
		//        ('->'
		//            (     resultSet=FormalParameterSet
		//            | '(' resultSet=FormalParameterSet ')'
		//            )
		//        )?
		//        bodyBlock=BlockStatement
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{ fmlInfra::Routine }
		//       ( '(' ( parameterSet=FormalParameterSet )? ')' )?
		//       ('->'
		//           (     resultSet=FormalParameterSet
		//           | '(' resultSet=FormalParameterSet ')'
		//           )
		//       )?
		//       bodyBlock=BlockStatement
		public Group getGroup() { return cGroup; }
		
		//{ fmlInfra::Routine }
		public Action getRoutineAction_0() { return cRoutineAction_0; }
		
		//( '(' ( parameterSet=FormalParameterSet )? ')' )?
		public Group getGroup_1() { return cGroup_1; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_1_0() { return cLeftParenthesisKeyword_1_0; }
		
		//( parameterSet=FormalParameterSet )?
		public Assignment getParameterSetAssignment_1_1() { return cParameterSetAssignment_1_1; }
		
		//FormalParameterSet
		public RuleCall getParameterSetFormalParameterSetParserRuleCall_1_1_0() { return cParameterSetFormalParameterSetParserRuleCall_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_1_2() { return cRightParenthesisKeyword_1_2; }
		
		//('->'
		//    (     resultSet=FormalParameterSet
		//    | '(' resultSet=FormalParameterSet ')'
		//    )
		//)?
		public Group getGroup_2() { return cGroup_2; }
		
		//'->'
		public Keyword getHyphenMinusGreaterThanSignKeyword_2_0() { return cHyphenMinusGreaterThanSignKeyword_2_0; }
		
		//(     resultSet=FormalParameterSet
		//| '(' resultSet=FormalParameterSet ')'
		//)
		public Alternatives getAlternatives_2_1() { return cAlternatives_2_1; }
		
		//resultSet=FormalParameterSet
		public Assignment getResultSetAssignment_2_1_0() { return cResultSetAssignment_2_1_0; }
		
		//FormalParameterSet
		public RuleCall getResultSetFormalParameterSetParserRuleCall_2_1_0_0() { return cResultSetFormalParameterSetParserRuleCall_2_1_0_0; }
		
		//'(' resultSet=FormalParameterSet ')'
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_1_1_0() { return cLeftParenthesisKeyword_2_1_1_0; }
		
		//resultSet=FormalParameterSet
		public Assignment getResultSetAssignment_2_1_1_1() { return cResultSetAssignment_2_1_1_1; }
		
		//FormalParameterSet
		public RuleCall getResultSetFormalParameterSetParserRuleCall_2_1_1_1_0() { return cResultSetFormalParameterSetParserRuleCall_2_1_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_1_1_2() { return cRightParenthesisKeyword_2_1_1_2; }
		
		//bodyBlock=BlockStatement
		public Assignment getBodyBlockAssignment_3() { return cBodyBlockAssignment_3; }
		
		//BlockStatement
		public RuleCall getBodyBlockBlockStatementParserRuleCall_3_0() { return cBodyBlockBlockStatementParserRuleCall_3_0; }
	}
	public class RoutineElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.Routine");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cVisibilityAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cVisibilityVisibilityKindEnumRuleCall_0_0 = (RuleCall)cVisibilityAssignment_0.eContents().get(0);
		private final Assignment cMacroAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final Keyword cMacroMacroKeyword_1_0 = (Keyword)cMacroAssignment_1.eContents().get(0);
		private final RuleCall cDesignDebugTraceParserRuleCall_2 = (RuleCall)cGroup.eContents().get(2);
		private final Keyword cRoutineKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Assignment cNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cNameESIdentifierParserRuleCall_4_0 = (RuleCall)cNameAssignment_4.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_5_0 = (RuleCall)cUnrestrictedNameAssignment_5.eContents().get(0);
		private final Group cGroup_6 = (Group)cGroup.eContents().get(6);
		private final Keyword cLeftParenthesisKeyword_6_0 = (Keyword)cGroup_6.eContents().get(0);
		private final Assignment cParameterSetAssignment_6_1 = (Assignment)cGroup_6.eContents().get(1);
		private final RuleCall cParameterSetFormalParameterSetParserRuleCall_6_1_0 = (RuleCall)cParameterSetAssignment_6_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_6_2 = (Keyword)cGroup_6.eContents().get(2);
		private final Group cGroup_7 = (Group)cGroup.eContents().get(7);
		private final Keyword cHyphenMinusHyphenMinusGreaterThanSignKeyword_7_0 = (Keyword)cGroup_7.eContents().get(0);
		private final Alternatives cAlternatives_7_1 = (Alternatives)cGroup_7.eContents().get(1);
		private final Assignment cResultSetAssignment_7_1_0 = (Assignment)cAlternatives_7_1.eContents().get(0);
		private final RuleCall cResultSetFormalParameterSetParserRuleCall_7_1_0_0 = (RuleCall)cResultSetAssignment_7_1_0.eContents().get(0);
		private final Group cGroup_7_1_1 = (Group)cAlternatives_7_1.eContents().get(1);
		private final Keyword cLeftParenthesisKeyword_7_1_1_0 = (Keyword)cGroup_7_1_1.eContents().get(0);
		private final Assignment cResultSetAssignment_7_1_1_1 = (Assignment)cGroup_7_1_1.eContents().get(1);
		private final RuleCall cResultSetFormalParameterSetParserRuleCall_7_1_1_1_0 = (RuleCall)cResultSetAssignment_7_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_7_1_1_2 = (Keyword)cGroup_7_1_1.eContents().get(2);
		private final Assignment cBodyBlockAssignment_8 = (Assignment)cGroup.eContents().get(8);
		private final RuleCall cBodyBlockBlockStatementParserRuleCall_8_0 = (RuleCall)cBodyBlockAssignment_8.eContents().get(0);
		
		//Routine returns fmlInfra::Routine
		//    : ( visibility=VisibilityKind )?  ( macro?='macro' )?  ( DesignDebugTrace )*
		//        'routine'
		//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//        ( '(' ( parameterSet=FormalParameterSet )? ')' )?
		//        ( '-->'
		//            (     resultSet=FormalParameterSet
		//            | '(' resultSet=FormalParameterSet ')'
		//            )
		//        )?
		//        bodyBlock=BlockStatement
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//( visibility=VisibilityKind )?  ( macro?='macro' )?  ( DesignDebugTrace )*
		//       'routine'
		//       name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//       ( '(' ( parameterSet=FormalParameterSet )? ')' )?
		//       ( '-->'
		//           (     resultSet=FormalParameterSet
		//           | '(' resultSet=FormalParameterSet ')'
		//           )
		//       )?
		//       bodyBlock=BlockStatement
		public Group getGroup() { return cGroup; }
		
		//( visibility=VisibilityKind )?
		public Assignment getVisibilityAssignment_0() { return cVisibilityAssignment_0; }
		
		//VisibilityKind
		public RuleCall getVisibilityVisibilityKindEnumRuleCall_0_0() { return cVisibilityVisibilityKindEnumRuleCall_0_0; }
		
		//( macro?='macro' )?
		public Assignment getMacroAssignment_1() { return cMacroAssignment_1; }
		
		//'macro'
		public Keyword getMacroMacroKeyword_1_0() { return cMacroMacroKeyword_1_0; }
		
		//( DesignDebugTrace )*
		public RuleCall getDesignDebugTraceParserRuleCall_2() { return cDesignDebugTraceParserRuleCall_2; }
		
		//'routine'
		public Keyword getRoutineKeyword_3() { return cRoutineKeyword_3; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_4() { return cNameAssignment_4; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_4_0() { return cNameESIdentifierParserRuleCall_4_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_5() { return cUnrestrictedNameAssignment_5; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_5_0; }
		
		//( '(' ( parameterSet=FormalParameterSet )? ')' )?
		public Group getGroup_6() { return cGroup_6; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_6_0() { return cLeftParenthesisKeyword_6_0; }
		
		//( parameterSet=FormalParameterSet )?
		public Assignment getParameterSetAssignment_6_1() { return cParameterSetAssignment_6_1; }
		
		//FormalParameterSet
		public RuleCall getParameterSetFormalParameterSetParserRuleCall_6_1_0() { return cParameterSetFormalParameterSetParserRuleCall_6_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_6_2() { return cRightParenthesisKeyword_6_2; }
		
		//( '-->'
		//    (     resultSet=FormalParameterSet
		//    | '(' resultSet=FormalParameterSet ')'
		//    )
		//)?
		public Group getGroup_7() { return cGroup_7; }
		
		//'-->'
		public Keyword getHyphenMinusHyphenMinusGreaterThanSignKeyword_7_0() { return cHyphenMinusHyphenMinusGreaterThanSignKeyword_7_0; }
		
		//(     resultSet=FormalParameterSet
		//| '(' resultSet=FormalParameterSet ')'
		//)
		public Alternatives getAlternatives_7_1() { return cAlternatives_7_1; }
		
		//resultSet=FormalParameterSet
		public Assignment getResultSetAssignment_7_1_0() { return cResultSetAssignment_7_1_0; }
		
		//FormalParameterSet
		public RuleCall getResultSetFormalParameterSetParserRuleCall_7_1_0_0() { return cResultSetFormalParameterSetParserRuleCall_7_1_0_0; }
		
		//'(' resultSet=FormalParameterSet ')'
		public Group getGroup_7_1_1() { return cGroup_7_1_1; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_7_1_1_0() { return cLeftParenthesisKeyword_7_1_1_0; }
		
		//resultSet=FormalParameterSet
		public Assignment getResultSetAssignment_7_1_1_1() { return cResultSetAssignment_7_1_1_1; }
		
		//FormalParameterSet
		public RuleCall getResultSetFormalParameterSetParserRuleCall_7_1_1_1_0() { return cResultSetFormalParameterSetParserRuleCall_7_1_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_7_1_1_2() { return cRightParenthesisKeyword_7_1_1_2; }
		
		//bodyBlock=BlockStatement
		public Assignment getBodyBlockAssignment_8() { return cBodyBlockAssignment_8; }
		
		//BlockStatement
		public RuleCall getBodyBlockBlockStatementParserRuleCall_8_0() { return cBodyBlockBlockStatementParserRuleCall_8_0; }
	}
	public class ModelOfInteractionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ModelOfInteraction");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cModelOfInteractionAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cComKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Alternatives cAlternatives_2 = (Alternatives)cGroup.eContents().get(2);
		private final Assignment cRoutesAssignment_2_0 = (Assignment)cAlternatives_2.eContents().get(0);
		private final RuleCall cRoutesRouteParserRuleCall_2_0_0 = (RuleCall)cRoutesAssignment_2_0.eContents().get(0);
		private final Assignment cConnectorsAssignment_2_1 = (Assignment)cAlternatives_2.eContents().get(1);
		private final RuleCall cConnectorsConnectorParserRuleCall_2_1_0 = (RuleCall)cConnectorsAssignment_2_1.eContents().get(0);
		
		//////////////////////////////////////////////////////////////////////////////////
		//// Section Model Of Interaction / Communication Rules
		//////////////////////////////////////////////////////////////////////////////////
		//ModelOfInteraction returns fmlInfra::ModelOfInteraction
		//    : { fmlInfra::ModelOfInteraction }
		//        '@com:'
		//        ( routes+=Route
		//        | connectors+=Connector
		//        )*
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{ fmlInfra::ModelOfInteraction }
		//       '@com:'
		//       ( routes+=Route
		//       | connectors+=Connector
		//       )*
		public Group getGroup() { return cGroup; }
		
		//{ fmlInfra::ModelOfInteraction }
		public Action getModelOfInteractionAction_0() { return cModelOfInteractionAction_0; }
		
		//'@com:'
		public Keyword getComKeyword_1() { return cComKeyword_1; }
		
		//( routes+=Route
		//| connectors+=Connector
		//)*
		public Alternatives getAlternatives_2() { return cAlternatives_2; }
		
		//routes+=Route
		public Assignment getRoutesAssignment_2_0() { return cRoutesAssignment_2_0; }
		
		//Route
		public RuleCall getRoutesRouteParserRuleCall_2_0_0() { return cRoutesRouteParserRuleCall_2_0_0; }
		
		//connectors+=Connector
		public Assignment getConnectorsAssignment_2_1() { return cConnectorsAssignment_2_1; }
		
		//Connector
		public RuleCall getConnectorsConnectorParserRuleCall_2_1_0() { return cConnectorsConnectorParserRuleCall_2_1_0; }
	}
	public class RouteElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.Route");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cRouteAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cRouteKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Keyword cLessThanSignKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cProtocolAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cProtocolComRouteProtocolParserRuleCall_3_0 = (RuleCall)cProtocolAssignment_3.eContents().get(0);
		private final Keyword cGreaterThanSignKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Group cGroup_5 = (Group)cGroup.eContents().get(5);
		private final Assignment cNameAssignment_5_0 = (Assignment)cGroup_5.eContents().get(0);
		private final RuleCall cNameESIdentifierParserRuleCall_5_0_0 = (RuleCall)cNameAssignment_5_0.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_5_1 = (Assignment)cGroup_5.eContents().get(1);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_5_1_0 = (RuleCall)cUnrestrictedNameAssignment_5_1.eContents().get(0);
		private final Keyword cLeftSquareBracketKeyword_6 = (Keyword)cGroup.eContents().get(6);
		private final Alternatives cAlternatives_7 = (Alternatives)cGroup.eContents().get(7);
		private final Keyword cAsteriskKeyword_7_0 = (Keyword)cAlternatives_7.eContents().get(0);
		private final Group cGroup_7_1 = (Group)cAlternatives_7.eContents().get(1);
		private final Assignment cSignalsAssignment_7_1_0 = (Assignment)cGroup_7_1.eContents().get(0);
		private final CrossReference cSignalsSignalCrossReference_7_1_0_0 = (CrossReference)cSignalsAssignment_7_1_0.eContents().get(0);
		private final RuleCall cSignalsSignalESUfidParserRuleCall_7_1_0_0_1 = (RuleCall)cSignalsSignalCrossReference_7_1_0_0.eContents().get(1);
		private final Group cGroup_7_1_1 = (Group)cGroup_7_1.eContents().get(1);
		private final Keyword cCommaKeyword_7_1_1_0 = (Keyword)cGroup_7_1_1.eContents().get(0);
		private final Assignment cSignalsAssignment_7_1_1_1 = (Assignment)cGroup_7_1_1.eContents().get(1);
		private final CrossReference cSignalsSignalCrossReference_7_1_1_1_0 = (CrossReference)cSignalsAssignment_7_1_1_1.eContents().get(0);
		private final RuleCall cSignalsSignalESUfidParserRuleCall_7_1_1_1_0_1 = (RuleCall)cSignalsSignalCrossReference_7_1_1_1_0.eContents().get(1);
		private final Keyword cRightSquareBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
		private final Keyword cSemicolonKeyword_9 = (Keyword)cGroup.eContents().get(9);
		
		//Route returns fmlInfra::Route
		//    : { fmlInfra::Route }
		//        'route' '<' protocol=ComRouteProtocol '>'
		//        ( name=ESIdentifier ( unrestrictedName=UnrestrictedName )? )?
		//        '['
		//        ( '*'
		//        | signals+=[fmlInfra::Signal|ESUfid]
		//            ( ',' signals+=[fmlInfra::Signal|ESUfid] )*
		//        )
		//        ']' ';'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{ fmlInfra::Route }
		//       'route' '<' protocol=ComRouteProtocol '>'
		//       ( name=ESIdentifier ( unrestrictedName=UnrestrictedName )? )?
		//       '['
		//       ( '*'
		//       | signals+=[fmlInfra::Signal|ESUfid]
		//           ( ',' signals+=[fmlInfra::Signal|ESUfid] )*
		//       )
		//       ']' ';'
		public Group getGroup() { return cGroup; }
		
		//{ fmlInfra::Route }
		public Action getRouteAction_0() { return cRouteAction_0; }
		
		//'route'
		public Keyword getRouteKeyword_1() { return cRouteKeyword_1; }
		
		//'<'
		public Keyword getLessThanSignKeyword_2() { return cLessThanSignKeyword_2; }
		
		//protocol=ComRouteProtocol
		public Assignment getProtocolAssignment_3() { return cProtocolAssignment_3; }
		
		//ComRouteProtocol
		public RuleCall getProtocolComRouteProtocolParserRuleCall_3_0() { return cProtocolComRouteProtocolParserRuleCall_3_0; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_4() { return cGreaterThanSignKeyword_4; }
		
		//( name=ESIdentifier ( unrestrictedName=UnrestrictedName )? )?
		public Group getGroup_5() { return cGroup_5; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_5_0() { return cNameAssignment_5_0; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_5_0_0() { return cNameESIdentifierParserRuleCall_5_0_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_5_1() { return cUnrestrictedNameAssignment_5_1; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_5_1_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_5_1_0; }
		
		//'['
		public Keyword getLeftSquareBracketKeyword_6() { return cLeftSquareBracketKeyword_6; }
		
		//( '*'
		//| signals+=[fmlInfra::Signal|ESUfid]
		//    ( ',' signals+=[fmlInfra::Signal|ESUfid] )*
		//)
		public Alternatives getAlternatives_7() { return cAlternatives_7; }
		
		//'*'
		public Keyword getAsteriskKeyword_7_0() { return cAsteriskKeyword_7_0; }
		
		//signals+=[fmlInfra::Signal|ESUfid]
		//           ( ',' signals+=[fmlInfra::Signal|ESUfid] )*
		public Group getGroup_7_1() { return cGroup_7_1; }
		
		//signals+=[fmlInfra::Signal|ESUfid]
		public Assignment getSignalsAssignment_7_1_0() { return cSignalsAssignment_7_1_0; }
		
		//[fmlInfra::Signal|ESUfid]
		public CrossReference getSignalsSignalCrossReference_7_1_0_0() { return cSignalsSignalCrossReference_7_1_0_0; }
		
		//ESUfid
		public RuleCall getSignalsSignalESUfidParserRuleCall_7_1_0_0_1() { return cSignalsSignalESUfidParserRuleCall_7_1_0_0_1; }
		
		//( ',' signals+=[fmlInfra::Signal|ESUfid] )*
		public Group getGroup_7_1_1() { return cGroup_7_1_1; }
		
		//','
		public Keyword getCommaKeyword_7_1_1_0() { return cCommaKeyword_7_1_1_0; }
		
		//signals+=[fmlInfra::Signal|ESUfid]
		public Assignment getSignalsAssignment_7_1_1_1() { return cSignalsAssignment_7_1_1_1; }
		
		//[fmlInfra::Signal|ESUfid]
		public CrossReference getSignalsSignalCrossReference_7_1_1_1_0() { return cSignalsSignalCrossReference_7_1_1_1_0; }
		
		//ESUfid
		public RuleCall getSignalsSignalESUfidParserRuleCall_7_1_1_1_0_1() { return cSignalsSignalESUfidParserRuleCall_7_1_1_1_0_1; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_8() { return cRightSquareBracketKeyword_8; }
		
		//';'
		public Keyword getSemicolonKeyword_9() { return cSemicolonKeyword_9; }
	}
	public class ComRouteProtocolElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ComRouteProtocol");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final Assignment cProtocolAssignment_0 = (Assignment)cAlternatives.eContents().get(0);
		private final RuleCall cProtocolComProtocolKindEnumRuleCall_0_0 = (RuleCall)cProtocolAssignment_0.eContents().get(0);
		private final Group cGroup_1 = (Group)cAlternatives.eContents().get(1);
		private final Assignment cProtocolAssignment_1_0 = (Assignment)cGroup_1.eContents().get(0);
		private final RuleCall cProtocolBufferProtocolKindEnumRuleCall_1_0_0 = (RuleCall)cProtocolAssignment_1_0.eContents().get(0);
		private final Alternatives cAlternatives_1_1 = (Alternatives)cGroup_1.eContents().get(1);
		private final Group cGroup_1_1_0 = (Group)cAlternatives_1_1.eContents().get(0);
		private final Keyword cColonKeyword_1_1_0_0 = (Keyword)cGroup_1_1_0.eContents().get(0);
		private final Alternatives cAlternatives_1_1_0_1 = (Alternatives)cGroup_1_1_0.eContents().get(1);
		private final Assignment cInner_bufferAssignment_1_1_0_1_0 = (Assignment)cAlternatives_1_1_0_1.eContents().get(0);
		private final RuleCall cInner_bufferBufferContainerTypeParserRuleCall_1_1_0_1_0_0 = (RuleCall)cInner_bufferAssignment_1_1_0_1_0.eContents().get(0);
		private final Assignment cBufferAssignment_1_1_0_1_1 = (Assignment)cAlternatives_1_1_0_1.eContents().get(1);
		private final RuleCall cBufferComBufferParserRuleCall_1_1_0_1_1_0 = (RuleCall)cBufferAssignment_1_1_0_1_1.eContents().get(0);
		private final Group cGroup_1_1_1 = (Group)cAlternatives_1_1.eContents().get(1);
		private final Keyword cLessThanSignKeyword_1_1_1_0 = (Keyword)cGroup_1_1_1.eContents().get(0);
		private final Alternatives cAlternatives_1_1_1_1 = (Alternatives)cGroup_1_1_1.eContents().get(1);
		private final Assignment cInner_bufferAssignment_1_1_1_1_0 = (Assignment)cAlternatives_1_1_1_1.eContents().get(0);
		private final RuleCall cInner_bufferBufferContainerTypeParserRuleCall_1_1_1_1_0_0 = (RuleCall)cInner_bufferAssignment_1_1_1_1_0.eContents().get(0);
		private final Assignment cBufferAssignment_1_1_1_1_1 = (Assignment)cAlternatives_1_1_1_1.eContents().get(1);
		private final RuleCall cBufferComBufferParserRuleCall_1_1_1_1_1_0 = (RuleCall)cBufferAssignment_1_1_1_1_1.eContents().get(0);
		private final Keyword cGreaterThanSignKeyword_1_1_1_2 = (Keyword)cGroup_1_1_1.eContents().get(2);
		private final Assignment cInner_bufferAssignment_2 = (Assignment)cAlternatives.eContents().get(2);
		private final RuleCall cInner_bufferBufferContainerTypeParserRuleCall_2_0 = (RuleCall)cInner_bufferAssignment_2.eContents().get(0);
		private final Assignment cBufferAssignment_3 = (Assignment)cAlternatives.eContents().get(3);
		private final RuleCall cBufferComBufferParserRuleCall_3_0 = (RuleCall)cBufferAssignment_3.eContents().get(0);
		
		//ComRouteProtocol returns fmlInfra::ComProtocol
		//    : protocol=ComProtocolKind
		//    | protocol=BufferProtocolKind
		//        ( ':'
		//            ( inner_buffer=BufferContainerType
		//            | buffer=ComBuffer
		//            )
		//        | '<'
		//            ( inner_buffer=BufferContainerType
		//            | buffer=ComBuffer
		//            ) '>'
		//        )?
		//    | inner_buffer=BufferContainerType
		//    | buffer=ComBuffer
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//protocol=ComProtocolKind
		//   | protocol=BufferProtocolKind
		//       ( ':'
		//           ( inner_buffer=BufferContainerType
		//           | buffer=ComBuffer
		//           )
		//       | '<'
		//           ( inner_buffer=BufferContainerType
		//           | buffer=ComBuffer
		//           ) '>'
		//       )?
		//   | inner_buffer=BufferContainerType
		//   | buffer=ComBuffer
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//protocol=ComProtocolKind
		public Assignment getProtocolAssignment_0() { return cProtocolAssignment_0; }
		
		//ComProtocolKind
		public RuleCall getProtocolComProtocolKindEnumRuleCall_0_0() { return cProtocolComProtocolKindEnumRuleCall_0_0; }
		
		//protocol=BufferProtocolKind
		//       ( ':'
		//           ( inner_buffer=BufferContainerType
		//           | buffer=ComBuffer
		//           )
		//       | '<'
		//           ( inner_buffer=BufferContainerType
		//           | buffer=ComBuffer
		//           ) '>'
		//       )?
		public Group getGroup_1() { return cGroup_1; }
		
		//protocol=BufferProtocolKind
		public Assignment getProtocolAssignment_1_0() { return cProtocolAssignment_1_0; }
		
		//BufferProtocolKind
		public RuleCall getProtocolBufferProtocolKindEnumRuleCall_1_0_0() { return cProtocolBufferProtocolKindEnumRuleCall_1_0_0; }
		
		//( ':'
		//    ( inner_buffer=BufferContainerType
		//    | buffer=ComBuffer
		//    )
		//| '<'
		//    ( inner_buffer=BufferContainerType
		//    | buffer=ComBuffer
		//    ) '>'
		//)?
		public Alternatives getAlternatives_1_1() { return cAlternatives_1_1; }
		
		//':'
		//           ( inner_buffer=BufferContainerType
		//           | buffer=ComBuffer
		//           )
		public Group getGroup_1_1_0() { return cGroup_1_1_0; }
		
		//':'
		public Keyword getColonKeyword_1_1_0_0() { return cColonKeyword_1_1_0_0; }
		
		//( inner_buffer=BufferContainerType
		//| buffer=ComBuffer
		//)
		public Alternatives getAlternatives_1_1_0_1() { return cAlternatives_1_1_0_1; }
		
		//inner_buffer=BufferContainerType
		public Assignment getInner_bufferAssignment_1_1_0_1_0() { return cInner_bufferAssignment_1_1_0_1_0; }
		
		//BufferContainerType
		public RuleCall getInner_bufferBufferContainerTypeParserRuleCall_1_1_0_1_0_0() { return cInner_bufferBufferContainerTypeParserRuleCall_1_1_0_1_0_0; }
		
		//buffer=ComBuffer
		public Assignment getBufferAssignment_1_1_0_1_1() { return cBufferAssignment_1_1_0_1_1; }
		
		//ComBuffer
		public RuleCall getBufferComBufferParserRuleCall_1_1_0_1_1_0() { return cBufferComBufferParserRuleCall_1_1_0_1_1_0; }
		
		//'<'
		//           ( inner_buffer=BufferContainerType
		//           | buffer=ComBuffer
		//           ) '>'
		public Group getGroup_1_1_1() { return cGroup_1_1_1; }
		
		//'<'
		public Keyword getLessThanSignKeyword_1_1_1_0() { return cLessThanSignKeyword_1_1_1_0; }
		
		//( inner_buffer=BufferContainerType
		//| buffer=ComBuffer
		//)
		public Alternatives getAlternatives_1_1_1_1() { return cAlternatives_1_1_1_1; }
		
		//inner_buffer=BufferContainerType
		public Assignment getInner_bufferAssignment_1_1_1_1_0() { return cInner_bufferAssignment_1_1_1_1_0; }
		
		//BufferContainerType
		public RuleCall getInner_bufferBufferContainerTypeParserRuleCall_1_1_1_1_0_0() { return cInner_bufferBufferContainerTypeParserRuleCall_1_1_1_1_0_0; }
		
		//buffer=ComBuffer
		public Assignment getBufferAssignment_1_1_1_1_1() { return cBufferAssignment_1_1_1_1_1; }
		
		//ComBuffer
		public RuleCall getBufferComBufferParserRuleCall_1_1_1_1_1_0() { return cBufferComBufferParserRuleCall_1_1_1_1_1_0; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_1_1_1_2() { return cGreaterThanSignKeyword_1_1_1_2; }
		
		//inner_buffer=BufferContainerType
		public Assignment getInner_bufferAssignment_2() { return cInner_bufferAssignment_2; }
		
		//BufferContainerType
		public RuleCall getInner_bufferBufferContainerTypeParserRuleCall_2_0() { return cInner_bufferBufferContainerTypeParserRuleCall_2_0; }
		
		//buffer=ComBuffer
		public Assignment getBufferAssignment_3() { return cBufferAssignment_3; }
		
		//ComBuffer
		public RuleCall getBufferComBufferParserRuleCall_3_0() { return cBufferComBufferParserRuleCall_3_0; }
	}
	public class ConnectorElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.Connector");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Alternatives cAlternatives_0 = (Alternatives)cGroup.eContents().get(0);
		private final Keyword cConnectorKeyword_0_0 = (Keyword)cAlternatives_0.eContents().get(0);
		private final Keyword cConnectKeyword_0_1 = (Keyword)cAlternatives_0.eContents().get(1);
		private final Keyword cLessThanSignKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cProtocolAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cProtocolComProtocolParserRuleCall_2_0 = (RuleCall)cProtocolAssignment_2.eContents().get(0);
		private final Keyword cGreaterThanSignKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Assignment cNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cNameESIdentifierParserRuleCall_4_0 = (RuleCall)cNameAssignment_4.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_5_0 = (RuleCall)cUnrestrictedNameAssignment_5.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_6 = (Keyword)cGroup.eContents().get(6);
		private final Assignment cConnectorEndAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cConnectorEndConnectorEndParserRuleCall_7_0 = (RuleCall)cConnectorEndAssignment_7.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
		
		//Connector returns fmlInfra::Connector
		//    : ( 'connector' | 'connect' ) '<' protocol=ComProtocol '>'
		//        ( name=ESIdentifier )?  ( unrestrictedName=UnrestrictedName )?
		//        '{' (connectorEnd+=ConnectorEnd)+ '}'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//( 'connector' | 'connect' ) '<' protocol=ComProtocol '>'
		//       ( name=ESIdentifier )?  ( unrestrictedName=UnrestrictedName )?
		//       '{' (connectorEnd+=ConnectorEnd)+ '}'
		public Group getGroup() { return cGroup; }
		
		//( 'connector' | 'connect' )
		public Alternatives getAlternatives_0() { return cAlternatives_0; }
		
		//'connector'
		public Keyword getConnectorKeyword_0_0() { return cConnectorKeyword_0_0; }
		
		//'connect'
		public Keyword getConnectKeyword_0_1() { return cConnectKeyword_0_1; }
		
		//'<'
		public Keyword getLessThanSignKeyword_1() { return cLessThanSignKeyword_1; }
		
		//protocol=ComProtocol
		public Assignment getProtocolAssignment_2() { return cProtocolAssignment_2; }
		
		//ComProtocol
		public RuleCall getProtocolComProtocolParserRuleCall_2_0() { return cProtocolComProtocolParserRuleCall_2_0; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_3() { return cGreaterThanSignKeyword_3; }
		
		//( name=ESIdentifier )?
		public Assignment getNameAssignment_4() { return cNameAssignment_4; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_4_0() { return cNameESIdentifierParserRuleCall_4_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_5() { return cUnrestrictedNameAssignment_5; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_5_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_6() { return cLeftCurlyBracketKeyword_6; }
		
		//(connectorEnd+=ConnectorEnd)+
		public Assignment getConnectorEndAssignment_7() { return cConnectorEndAssignment_7; }
		
		//ConnectorEnd
		public RuleCall getConnectorEndConnectorEndParserRuleCall_7_0() { return cConnectorEndConnectorEndParserRuleCall_7_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
	}
	public class ComProtocolElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ComProtocol");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final Assignment cProtocolAssignment_0 = (Assignment)cAlternatives.eContents().get(0);
		private final RuleCall cProtocolComEnvRdvProtocolKindEnumRuleCall_0_0 = (RuleCall)cProtocolAssignment_0.eContents().get(0);
		private final Group cGroup_1 = (Group)cAlternatives.eContents().get(1);
		private final Assignment cProtocolAssignment_1_0 = (Assignment)cGroup_1.eContents().get(0);
		private final RuleCall cProtocolComMultiRdvProtocolKindEnumRuleCall_1_0_0 = (RuleCall)cProtocolAssignment_1_0.eContents().get(0);
		private final Group cGroup_1_1 = (Group)cGroup_1.eContents().get(1);
		private final Keyword cLessThanSignKeyword_1_1_0 = (Keyword)cGroup_1_1.eContents().get(0);
		private final Assignment cCastAssignment_1_1_1 = (Assignment)cGroup_1_1.eContents().get(1);
		private final RuleCall cCastComCastKingEnumRuleCall_1_1_1_0 = (RuleCall)cCastAssignment_1_1_1.eContents().get(0);
		private final Keyword cGreaterThanSignKeyword_1_1_2 = (Keyword)cGroup_1_1.eContents().get(2);
		private final Group cGroup_2 = (Group)cAlternatives.eContents().get(2);
		private final Assignment cProtocolAssignment_2_0 = (Assignment)cGroup_2.eContents().get(0);
		private final RuleCall cProtocolBufferProtocolKindEnumRuleCall_2_0_0 = (RuleCall)cProtocolAssignment_2_0.eContents().get(0);
		private final Alternatives cAlternatives_2_1 = (Alternatives)cGroup_2.eContents().get(1);
		private final Group cGroup_2_1_0 = (Group)cAlternatives_2_1.eContents().get(0);
		private final Keyword cColonKeyword_2_1_0_0 = (Keyword)cGroup_2_1_0.eContents().get(0);
		private final Alternatives cAlternatives_2_1_0_1 = (Alternatives)cGroup_2_1_0.eContents().get(1);
		private final Assignment cInner_bufferAssignment_2_1_0_1_0 = (Assignment)cAlternatives_2_1_0_1.eContents().get(0);
		private final RuleCall cInner_bufferBufferContainerTypeParserRuleCall_2_1_0_1_0_0 = (RuleCall)cInner_bufferAssignment_2_1_0_1_0.eContents().get(0);
		private final Assignment cBufferAssignment_2_1_0_1_1 = (Assignment)cAlternatives_2_1_0_1.eContents().get(1);
		private final RuleCall cBufferComBufferParserRuleCall_2_1_0_1_1_0 = (RuleCall)cBufferAssignment_2_1_0_1_1.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cAlternatives_2_1.eContents().get(1);
		private final Keyword cLessThanSignKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Alternatives cAlternatives_2_1_1_1 = (Alternatives)cGroup_2_1_1.eContents().get(1);
		private final Assignment cInner_bufferAssignment_2_1_1_1_0 = (Assignment)cAlternatives_2_1_1_1.eContents().get(0);
		private final RuleCall cInner_bufferBufferContainerTypeParserRuleCall_2_1_1_1_0_0 = (RuleCall)cInner_bufferAssignment_2_1_1_1_0.eContents().get(0);
		private final Assignment cBufferAssignment_2_1_1_1_1 = (Assignment)cAlternatives_2_1_1_1.eContents().get(1);
		private final RuleCall cBufferComBufferParserRuleCall_2_1_1_1_1_0 = (RuleCall)cBufferAssignment_2_1_1_1_1.eContents().get(0);
		private final Keyword cGreaterThanSignKeyword_2_1_1_2 = (Keyword)cGroup_2_1_1.eContents().get(2);
		private final Assignment cInner_bufferAssignment_3 = (Assignment)cAlternatives.eContents().get(3);
		private final RuleCall cInner_bufferBufferContainerTypeParserRuleCall_3_0 = (RuleCall)cInner_bufferAssignment_3.eContents().get(0);
		private final Assignment cBufferAssignment_4 = (Assignment)cAlternatives.eContents().get(4);
		private final RuleCall cBufferComBufferParserRuleCall_4_0 = (RuleCall)cBufferAssignment_4.eContents().get(0);
		private final Assignment cCastAssignment_5 = (Assignment)cAlternatives.eContents().get(5);
		private final RuleCall cCastComCastKingEnumRuleCall_5_0 = (RuleCall)cCastAssignment_5.eContents().get(0);
		
		//ComProtocol returns fmlInfra::ComProtocol
		//    : protocol=ComEnvRdvProtocolKind
		//    | protocol=ComMultiRdvProtocolKind ( '<' cast=ComCastKing '>')?
		//    | protocol=BufferProtocolKind
		//        ( ':'
		//            ( inner_buffer=BufferContainerType
		//            | buffer=ComBuffer
		//            )
		//        | '<'
		//            ( inner_buffer=BufferContainerType
		//            | buffer=ComBuffer
		//            ) '>'
		//        )?
		//    | inner_buffer=BufferContainerType
		//    | buffer=ComBuffer
		//    | cast=ComCastKing
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//protocol=ComEnvRdvProtocolKind
		//   | protocol=ComMultiRdvProtocolKind ( '<' cast=ComCastKing '>')?
		//   | protocol=BufferProtocolKind
		//       ( ':'
		//           ( inner_buffer=BufferContainerType
		//           | buffer=ComBuffer
		//           )
		//       | '<'
		//           ( inner_buffer=BufferContainerType
		//           | buffer=ComBuffer
		//           ) '>'
		//       )?
		//   | inner_buffer=BufferContainerType
		//   | buffer=ComBuffer
		//   | cast=ComCastKing
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//protocol=ComEnvRdvProtocolKind
		public Assignment getProtocolAssignment_0() { return cProtocolAssignment_0; }
		
		//ComEnvRdvProtocolKind
		public RuleCall getProtocolComEnvRdvProtocolKindEnumRuleCall_0_0() { return cProtocolComEnvRdvProtocolKindEnumRuleCall_0_0; }
		
		//protocol=ComMultiRdvProtocolKind ( '<' cast=ComCastKing '>')?
		public Group getGroup_1() { return cGroup_1; }
		
		//protocol=ComMultiRdvProtocolKind
		public Assignment getProtocolAssignment_1_0() { return cProtocolAssignment_1_0; }
		
		//ComMultiRdvProtocolKind
		public RuleCall getProtocolComMultiRdvProtocolKindEnumRuleCall_1_0_0() { return cProtocolComMultiRdvProtocolKindEnumRuleCall_1_0_0; }
		
		//( '<' cast=ComCastKing '>')?
		public Group getGroup_1_1() { return cGroup_1_1; }
		
		//'<'
		public Keyword getLessThanSignKeyword_1_1_0() { return cLessThanSignKeyword_1_1_0; }
		
		//cast=ComCastKing
		public Assignment getCastAssignment_1_1_1() { return cCastAssignment_1_1_1; }
		
		//ComCastKing
		public RuleCall getCastComCastKingEnumRuleCall_1_1_1_0() { return cCastComCastKingEnumRuleCall_1_1_1_0; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_1_1_2() { return cGreaterThanSignKeyword_1_1_2; }
		
		//protocol=BufferProtocolKind
		//       ( ':'
		//           ( inner_buffer=BufferContainerType
		//           | buffer=ComBuffer
		//           )
		//       | '<'
		//           ( inner_buffer=BufferContainerType
		//           | buffer=ComBuffer
		//           ) '>'
		//       )?
		public Group getGroup_2() { return cGroup_2; }
		
		//protocol=BufferProtocolKind
		public Assignment getProtocolAssignment_2_0() { return cProtocolAssignment_2_0; }
		
		//BufferProtocolKind
		public RuleCall getProtocolBufferProtocolKindEnumRuleCall_2_0_0() { return cProtocolBufferProtocolKindEnumRuleCall_2_0_0; }
		
		//( ':'
		//    ( inner_buffer=BufferContainerType
		//    | buffer=ComBuffer
		//    )
		//| '<'
		//    ( inner_buffer=BufferContainerType
		//    | buffer=ComBuffer
		//    ) '>'
		//)?
		public Alternatives getAlternatives_2_1() { return cAlternatives_2_1; }
		
		//':'
		//           ( inner_buffer=BufferContainerType
		//           | buffer=ComBuffer
		//           )
		public Group getGroup_2_1_0() { return cGroup_2_1_0; }
		
		//':'
		public Keyword getColonKeyword_2_1_0_0() { return cColonKeyword_2_1_0_0; }
		
		//( inner_buffer=BufferContainerType
		//| buffer=ComBuffer
		//)
		public Alternatives getAlternatives_2_1_0_1() { return cAlternatives_2_1_0_1; }
		
		//inner_buffer=BufferContainerType
		public Assignment getInner_bufferAssignment_2_1_0_1_0() { return cInner_bufferAssignment_2_1_0_1_0; }
		
		//BufferContainerType
		public RuleCall getInner_bufferBufferContainerTypeParserRuleCall_2_1_0_1_0_0() { return cInner_bufferBufferContainerTypeParserRuleCall_2_1_0_1_0_0; }
		
		//buffer=ComBuffer
		public Assignment getBufferAssignment_2_1_0_1_1() { return cBufferAssignment_2_1_0_1_1; }
		
		//ComBuffer
		public RuleCall getBufferComBufferParserRuleCall_2_1_0_1_1_0() { return cBufferComBufferParserRuleCall_2_1_0_1_1_0; }
		
		//'<'
		//           ( inner_buffer=BufferContainerType
		//           | buffer=ComBuffer
		//           ) '>'
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
		
		//'<'
		public Keyword getLessThanSignKeyword_2_1_1_0() { return cLessThanSignKeyword_2_1_1_0; }
		
		//( inner_buffer=BufferContainerType
		//| buffer=ComBuffer
		//)
		public Alternatives getAlternatives_2_1_1_1() { return cAlternatives_2_1_1_1; }
		
		//inner_buffer=BufferContainerType
		public Assignment getInner_bufferAssignment_2_1_1_1_0() { return cInner_bufferAssignment_2_1_1_1_0; }
		
		//BufferContainerType
		public RuleCall getInner_bufferBufferContainerTypeParserRuleCall_2_1_1_1_0_0() { return cInner_bufferBufferContainerTypeParserRuleCall_2_1_1_1_0_0; }
		
		//buffer=ComBuffer
		public Assignment getBufferAssignment_2_1_1_1_1() { return cBufferAssignment_2_1_1_1_1; }
		
		//ComBuffer
		public RuleCall getBufferComBufferParserRuleCall_2_1_1_1_1_0() { return cBufferComBufferParserRuleCall_2_1_1_1_1_0; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_2_1_1_2() { return cGreaterThanSignKeyword_2_1_1_2; }
		
		//inner_buffer=BufferContainerType
		public Assignment getInner_bufferAssignment_3() { return cInner_bufferAssignment_3; }
		
		//BufferContainerType
		public RuleCall getInner_bufferBufferContainerTypeParserRuleCall_3_0() { return cInner_bufferBufferContainerTypeParserRuleCall_3_0; }
		
		//buffer=ComBuffer
		public Assignment getBufferAssignment_4() { return cBufferAssignment_4; }
		
		//ComBuffer
		public RuleCall getBufferComBufferParserRuleCall_4_0() { return cBufferComBufferParserRuleCall_4_0; }
		
		//cast=ComCastKing
		public Assignment getCastAssignment_5() { return cCastAssignment_5; }
		
		//ComCastKing
		public RuleCall getCastComCastKingEnumRuleCall_5_0() { return cCastComCastKingEnumRuleCall_5_0; }
	}
	public class ConnectorEndElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ConnectorEnd");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cConnectorEndAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cDirectionAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cDirectionChannelDirectionEnumRuleCall_1_0 = (RuleCall)cDirectionAssignment_1.eContents().get(0);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLessThanSignKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final Assignment cProtocolAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
		private final RuleCall cProtocolComPointProtocolParserRuleCall_2_1_0 = (RuleCall)cProtocolAssignment_2_1.eContents().get(0);
		private final Keyword cGreaterThanSignKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Alternatives cAlternatives_3 = (Alternatives)cGroup.eContents().get(3);
		private final Group cGroup_3_0 = (Group)cAlternatives_3.eContents().get(0);
		private final Assignment cPointsAssignment_3_0_0 = (Assignment)cGroup_3_0.eContents().get(0);
		private final RuleCall cPointsComPointParserRuleCall_3_0_0_0 = (RuleCall)cPointsAssignment_3_0_0.eContents().get(0);
		private final Keyword cSemicolonKeyword_3_0_1 = (Keyword)cGroup_3_0.eContents().get(1);
		private final Group cGroup_3_1 = (Group)cAlternatives_3.eContents().get(1);
		private final Keyword cLeftSquareBracketKeyword_3_1_0 = (Keyword)cGroup_3_1.eContents().get(0);
		private final Assignment cPointsAssignment_3_1_1 = (Assignment)cGroup_3_1.eContents().get(1);
		private final RuleCall cPointsComPointParserRuleCall_3_1_1_0 = (RuleCall)cPointsAssignment_3_1_1.eContents().get(0);
		private final Group cGroup_3_1_2 = (Group)cGroup_3_1.eContents().get(2);
		private final Keyword cCommaKeyword_3_1_2_0 = (Keyword)cGroup_3_1_2.eContents().get(0);
		private final Assignment cPointsAssignment_3_1_2_1 = (Assignment)cGroup_3_1_2.eContents().get(1);
		private final RuleCall cPointsComPointParserRuleCall_3_1_2_1_0 = (RuleCall)cPointsAssignment_3_1_2_1.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_3_1_3 = (Keyword)cGroup_3_1.eContents().get(3);
		private final Keyword cSemicolonKeyword_3_1_4 = (Keyword)cGroup_3_1.eContents().get(4);
		private final Group cGroup_3_2 = (Group)cAlternatives_3.eContents().get(2);
		private final Keyword cLeftCurlyBracketKeyword_3_2_0 = (Keyword)cGroup_3_2.eContents().get(0);
		private final Group cGroup_3_2_1 = (Group)cGroup_3_2.eContents().get(1);
		private final Assignment cPointsAssignment_3_2_1_0 = (Assignment)cGroup_3_2_1.eContents().get(0);
		private final RuleCall cPointsComPointParserRuleCall_3_2_1_0_0 = (RuleCall)cPointsAssignment_3_2_1_0.eContents().get(0);
		private final Keyword cSemicolonKeyword_3_2_1_1 = (Keyword)cGroup_3_2_1.eContents().get(1);
		private final Keyword cRightCurlyBracketKeyword_3_2_2 = (Keyword)cGroup_3_2.eContents().get(2);
		
		//ConnectorEnd returns fmlInfra::ConnectorEnd
		//    : { fmlInfra::ConnectorEnd }
		//        direction=ChannelDirection ( '<' protocol=ComPointProtocol '>' )?
		//        ( points+=ComPoint ';'
		//        | '[' points+=ComPoint ( ',' points+=ComPoint )* ']' ';'
		//        | '{' ( points+=ComPoint ';' )+ '}'
		//        )
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{ fmlInfra::ConnectorEnd }
		//       direction=ChannelDirection ( '<' protocol=ComPointProtocol '>' )?
		//       ( points+=ComPoint ';'
		//       | '[' points+=ComPoint ( ',' points+=ComPoint )* ']' ';'
		//       | '{' ( points+=ComPoint ';' )+ '}'
		//       )
		public Group getGroup() { return cGroup; }
		
		//{ fmlInfra::ConnectorEnd }
		public Action getConnectorEndAction_0() { return cConnectorEndAction_0; }
		
		//direction=ChannelDirection
		public Assignment getDirectionAssignment_1() { return cDirectionAssignment_1; }
		
		//ChannelDirection
		public RuleCall getDirectionChannelDirectionEnumRuleCall_1_0() { return cDirectionChannelDirectionEnumRuleCall_1_0; }
		
		//( '<' protocol=ComPointProtocol '>' )?
		public Group getGroup_2() { return cGroup_2; }
		
		//'<'
		public Keyword getLessThanSignKeyword_2_0() { return cLessThanSignKeyword_2_0; }
		
		//protocol=ComPointProtocol
		public Assignment getProtocolAssignment_2_1() { return cProtocolAssignment_2_1; }
		
		//ComPointProtocol
		public RuleCall getProtocolComPointProtocolParserRuleCall_2_1_0() { return cProtocolComPointProtocolParserRuleCall_2_1_0; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_2_2() { return cGreaterThanSignKeyword_2_2; }
		
		//( points+=ComPoint ';'
		//| '[' points+=ComPoint ( ',' points+=ComPoint )* ']' ';'
		//| '{' ( points+=ComPoint ';' )+ '}'
		//)
		public Alternatives getAlternatives_3() { return cAlternatives_3; }
		
		//points+=ComPoint ';'
		public Group getGroup_3_0() { return cGroup_3_0; }
		
		//points+=ComPoint
		public Assignment getPointsAssignment_3_0_0() { return cPointsAssignment_3_0_0; }
		
		//ComPoint
		public RuleCall getPointsComPointParserRuleCall_3_0_0_0() { return cPointsComPointParserRuleCall_3_0_0_0; }
		
		//';'
		public Keyword getSemicolonKeyword_3_0_1() { return cSemicolonKeyword_3_0_1; }
		
		//'[' points+=ComPoint ( ',' points+=ComPoint )* ']' ';'
		public Group getGroup_3_1() { return cGroup_3_1; }
		
		//'['
		public Keyword getLeftSquareBracketKeyword_3_1_0() { return cLeftSquareBracketKeyword_3_1_0; }
		
		//points+=ComPoint
		public Assignment getPointsAssignment_3_1_1() { return cPointsAssignment_3_1_1; }
		
		//ComPoint
		public RuleCall getPointsComPointParserRuleCall_3_1_1_0() { return cPointsComPointParserRuleCall_3_1_1_0; }
		
		//( ',' points+=ComPoint )*
		public Group getGroup_3_1_2() { return cGroup_3_1_2; }
		
		//','
		public Keyword getCommaKeyword_3_1_2_0() { return cCommaKeyword_3_1_2_0; }
		
		//points+=ComPoint
		public Assignment getPointsAssignment_3_1_2_1() { return cPointsAssignment_3_1_2_1; }
		
		//ComPoint
		public RuleCall getPointsComPointParserRuleCall_3_1_2_1_0() { return cPointsComPointParserRuleCall_3_1_2_1_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_3_1_3() { return cRightSquareBracketKeyword_3_1_3; }
		
		//';'
		public Keyword getSemicolonKeyword_3_1_4() { return cSemicolonKeyword_3_1_4; }
		
		//'{' ( points+=ComPoint ';' )+ '}'
		public Group getGroup_3_2() { return cGroup_3_2; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_3_2_0() { return cLeftCurlyBracketKeyword_3_2_0; }
		
		//( points+=ComPoint ';' )+
		public Group getGroup_3_2_1() { return cGroup_3_2_1; }
		
		//points+=ComPoint
		public Assignment getPointsAssignment_3_2_1_0() { return cPointsAssignment_3_2_1_0; }
		
		//ComPoint
		public RuleCall getPointsComPointParserRuleCall_3_2_1_0_0() { return cPointsComPointParserRuleCall_3_2_1_0_0; }
		
		//';'
		public Keyword getSemicolonKeyword_3_2_1_1() { return cSemicolonKeyword_3_2_1_1; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_3_2_2() { return cRightCurlyBracketKeyword_3_2_2; }
	}
	public class ComPointElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ComPoint");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cComPointAction_0 = (Action)cGroup.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Assignment cMachineAssignment_1_0 = (Assignment)cGroup_1.eContents().get(0);
		private final CrossReference cMachineNamedElementCrossReference_1_0_0 = (CrossReference)cMachineAssignment_1_0.eContents().get(0);
		private final RuleCall cMachineNamedElementESIdentifierParserRuleCall_1_0_0_1 = (RuleCall)cMachineNamedElementCrossReference_1_0_0.eContents().get(1);
		private final Alternatives cAlternatives_1_1 = (Alternatives)cGroup_1.eContents().get(1);
		private final Keyword cHyphenMinusGreaterThanSignKeyword_1_1_0 = (Keyword)cAlternatives_1_1.eContents().get(0);
		private final Keyword cFullStopKeyword_1_1_1 = (Keyword)cAlternatives_1_1.eContents().get(1);
		private final Assignment cPortAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final CrossReference cPortPortCrossReference_2_0 = (CrossReference)cPortAssignment_2.eContents().get(0);
		private final RuleCall cPortPortESIdentifierParserRuleCall_2_0_1 = (RuleCall)cPortPortCrossReference_2_0.eContents().get(1);
		
		//ComPoint returns fmlInfra::ComPoint
		//    : { fmlInfra::ComPoint }
		//        ( machine=[fmlCommon::NamedElement|ESIdentifier] ('->'| '.') )?
		////        ( machine=ValuePureNamedMachineExpression  ('->'| '.') )?
		//        port=[fmlInfra::Port|ESIdentifier]
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		// { fmlInfra::ComPoint }
		//        ( machine=[fmlCommon::NamedElement|ESIdentifier] ('->'| '.') )?
		////        ( machine=ValuePureNamedMachineExpression  ('->'| '.') )?
		//        port=[fmlInfra::Port|ESIdentifier]
		public Group getGroup() { return cGroup; }
		
		//{ fmlInfra::ComPoint }
		public Action getComPointAction_0() { return cComPointAction_0; }
		
		//( machine=[fmlCommon::NamedElement|ESIdentifier] ('->'| '.') )?
		public Group getGroup_1() { return cGroup_1; }
		
		//machine=[fmlCommon::NamedElement|ESIdentifier]
		public Assignment getMachineAssignment_1_0() { return cMachineAssignment_1_0; }
		
		//[fmlCommon::NamedElement|ESIdentifier]
		public CrossReference getMachineNamedElementCrossReference_1_0_0() { return cMachineNamedElementCrossReference_1_0_0; }
		
		//ESIdentifier
		public RuleCall getMachineNamedElementESIdentifierParserRuleCall_1_0_0_1() { return cMachineNamedElementESIdentifierParserRuleCall_1_0_0_1; }
		
		//('->'| '.')
		public Alternatives getAlternatives_1_1() { return cAlternatives_1_1; }
		
		//'->'
		public Keyword getHyphenMinusGreaterThanSignKeyword_1_1_0() { return cHyphenMinusGreaterThanSignKeyword_1_1_0; }
		
		//'.'
		public Keyword getFullStopKeyword_1_1_1() { return cFullStopKeyword_1_1_1; }
		
		////        ( machine=ValuePureNamedMachineExpression  ('->'| '.') )?
		//        port=[fmlInfra::Port|ESIdentifier]
		public Assignment getPortAssignment_2() { return cPortAssignment_2; }
		
		//[fmlInfra::Port|ESIdentifier]
		public CrossReference getPortPortCrossReference_2_0() { return cPortPortCrossReference_2_0; }
		
		//ESIdentifier
		public RuleCall getPortPortESIdentifierParserRuleCall_2_0_1() { return cPortPortESIdentifierParserRuleCall_2_0_1; }
	}
	public class ComPointProtocolElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ComPointProtocol");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final Group cGroup_0 = (Group)cAlternatives.eContents().get(0);
		private final Assignment cProtocolAssignment_0_0 = (Assignment)cGroup_0.eContents().get(0);
		private final RuleCall cProtocolBufferProtocolKindEnumRuleCall_0_0_0 = (RuleCall)cProtocolAssignment_0_0.eContents().get(0);
		private final Alternatives cAlternatives_0_1 = (Alternatives)cGroup_0.eContents().get(1);
		private final Group cGroup_0_1_0 = (Group)cAlternatives_0_1.eContents().get(0);
		private final Keyword cColonKeyword_0_1_0_0 = (Keyword)cGroup_0_1_0.eContents().get(0);
		private final Alternatives cAlternatives_0_1_0_1 = (Alternatives)cGroup_0_1_0.eContents().get(1);
		private final Assignment cInner_bufferAssignment_0_1_0_1_0 = (Assignment)cAlternatives_0_1_0_1.eContents().get(0);
		private final RuleCall cInner_bufferBufferContainerTypeParserRuleCall_0_1_0_1_0_0 = (RuleCall)cInner_bufferAssignment_0_1_0_1_0.eContents().get(0);
		private final Assignment cBufferAssignment_0_1_0_1_1 = (Assignment)cAlternatives_0_1_0_1.eContents().get(1);
		private final RuleCall cBufferComBufferParserRuleCall_0_1_0_1_1_0 = (RuleCall)cBufferAssignment_0_1_0_1_1.eContents().get(0);
		private final Group cGroup_0_1_1 = (Group)cAlternatives_0_1.eContents().get(1);
		private final Keyword cLessThanSignKeyword_0_1_1_0 = (Keyword)cGroup_0_1_1.eContents().get(0);
		private final Alternatives cAlternatives_0_1_1_1 = (Alternatives)cGroup_0_1_1.eContents().get(1);
		private final Assignment cInner_bufferAssignment_0_1_1_1_0 = (Assignment)cAlternatives_0_1_1_1.eContents().get(0);
		private final RuleCall cInner_bufferBufferContainerTypeParserRuleCall_0_1_1_1_0_0 = (RuleCall)cInner_bufferAssignment_0_1_1_1_0.eContents().get(0);
		private final Assignment cBufferAssignment_0_1_1_1_1 = (Assignment)cAlternatives_0_1_1_1.eContents().get(1);
		private final RuleCall cBufferComBufferParserRuleCall_0_1_1_1_1_0 = (RuleCall)cBufferAssignment_0_1_1_1_1.eContents().get(0);
		private final Keyword cGreaterThanSignKeyword_0_1_1_2 = (Keyword)cGroup_0_1_1.eContents().get(2);
		private final Assignment cInner_bufferAssignment_1 = (Assignment)cAlternatives.eContents().get(1);
		private final RuleCall cInner_bufferBufferContainerTypeParserRuleCall_1_0 = (RuleCall)cInner_bufferAssignment_1.eContents().get(0);
		private final Assignment cBufferRefAssignment_2 = (Assignment)cAlternatives.eContents().get(2);
		private final RuleCall cBufferRefComBufferRefParserRuleCall_2_0 = (RuleCall)cBufferRefAssignment_2.eContents().get(0);
		
		//ComPointProtocol returns fmlInfra::ComProtocol
		//    : protocol=BufferProtocolKind
		//        ( ':'
		//            ( inner_buffer=BufferContainerType
		//            | buffer=ComBuffer
		//            )
		//        | '<'
		//            ( inner_buffer=BufferContainerType
		//            | buffer=ComBuffer
		//            ) '>'
		//        )?
		//    | inner_buffer=BufferContainerType
		////    | buffer=ComBuffer
		//    | bufferRef=ComBufferRef
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		// protocol=BufferProtocolKind
		//        ( ':'
		//            ( inner_buffer=BufferContainerType
		//            | buffer=ComBuffer
		//            )
		//        | '<'
		//            ( inner_buffer=BufferContainerType
		//            | buffer=ComBuffer
		//            ) '>'
		//        )?
		//    | inner_buffer=BufferContainerType
		////    | buffer=ComBuffer
		//    | bufferRef=ComBufferRef
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//protocol=BufferProtocolKind
		//       ( ':'
		//           ( inner_buffer=BufferContainerType
		//           | buffer=ComBuffer
		//           )
		//       | '<'
		//           ( inner_buffer=BufferContainerType
		//           | buffer=ComBuffer
		//           ) '>'
		//       )?
		public Group getGroup_0() { return cGroup_0; }
		
		//protocol=BufferProtocolKind
		public Assignment getProtocolAssignment_0_0() { return cProtocolAssignment_0_0; }
		
		//BufferProtocolKind
		public RuleCall getProtocolBufferProtocolKindEnumRuleCall_0_0_0() { return cProtocolBufferProtocolKindEnumRuleCall_0_0_0; }
		
		//( ':'
		//    ( inner_buffer=BufferContainerType
		//    | buffer=ComBuffer
		//    )
		//| '<'
		//    ( inner_buffer=BufferContainerType
		//    | buffer=ComBuffer
		//    ) '>'
		//)?
		public Alternatives getAlternatives_0_1() { return cAlternatives_0_1; }
		
		//':'
		//           ( inner_buffer=BufferContainerType
		//           | buffer=ComBuffer
		//           )
		public Group getGroup_0_1_0() { return cGroup_0_1_0; }
		
		//':'
		public Keyword getColonKeyword_0_1_0_0() { return cColonKeyword_0_1_0_0; }
		
		//( inner_buffer=BufferContainerType
		//| buffer=ComBuffer
		//)
		public Alternatives getAlternatives_0_1_0_1() { return cAlternatives_0_1_0_1; }
		
		//inner_buffer=BufferContainerType
		public Assignment getInner_bufferAssignment_0_1_0_1_0() { return cInner_bufferAssignment_0_1_0_1_0; }
		
		//BufferContainerType
		public RuleCall getInner_bufferBufferContainerTypeParserRuleCall_0_1_0_1_0_0() { return cInner_bufferBufferContainerTypeParserRuleCall_0_1_0_1_0_0; }
		
		//buffer=ComBuffer
		public Assignment getBufferAssignment_0_1_0_1_1() { return cBufferAssignment_0_1_0_1_1; }
		
		//ComBuffer
		public RuleCall getBufferComBufferParserRuleCall_0_1_0_1_1_0() { return cBufferComBufferParserRuleCall_0_1_0_1_1_0; }
		
		//'<'
		//           ( inner_buffer=BufferContainerType
		//           | buffer=ComBuffer
		//           ) '>'
		public Group getGroup_0_1_1() { return cGroup_0_1_1; }
		
		//'<'
		public Keyword getLessThanSignKeyword_0_1_1_0() { return cLessThanSignKeyword_0_1_1_0; }
		
		//( inner_buffer=BufferContainerType
		//| buffer=ComBuffer
		//)
		public Alternatives getAlternatives_0_1_1_1() { return cAlternatives_0_1_1_1; }
		
		//inner_buffer=BufferContainerType
		public Assignment getInner_bufferAssignment_0_1_1_1_0() { return cInner_bufferAssignment_0_1_1_1_0; }
		
		//BufferContainerType
		public RuleCall getInner_bufferBufferContainerTypeParserRuleCall_0_1_1_1_0_0() { return cInner_bufferBufferContainerTypeParserRuleCall_0_1_1_1_0_0; }
		
		//buffer=ComBuffer
		public Assignment getBufferAssignment_0_1_1_1_1() { return cBufferAssignment_0_1_1_1_1; }
		
		//ComBuffer
		public RuleCall getBufferComBufferParserRuleCall_0_1_1_1_1_0() { return cBufferComBufferParserRuleCall_0_1_1_1_1_0; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_0_1_1_2() { return cGreaterThanSignKeyword_0_1_1_2; }
		
		//inner_buffer=BufferContainerType
		public Assignment getInner_bufferAssignment_1() { return cInner_bufferAssignment_1; }
		
		//BufferContainerType
		public RuleCall getInner_bufferBufferContainerTypeParserRuleCall_1_0() { return cInner_bufferBufferContainerTypeParserRuleCall_1_0; }
		
		//bufferRef=ComBufferRef
		public Assignment getBufferRefAssignment_2() { return cBufferRefAssignment_2; }
		
		//ComBufferRef
		public RuleCall getBufferRefComBufferRefParserRuleCall_2_0() { return cBufferRefComBufferRefParserRuleCall_2_0; }
	}
	public class ComBufferElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ComBuffer");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Group cGroup_0 = (Group)cGroup.eContents().get(0);
		private final Assignment cParentAssignment_0_0 = (Assignment)cGroup_0.eContents().get(0);
		private final RuleCall cParentLiteralPureReferenceMachineParserRuleCall_0_0_0 = (RuleCall)cParentAssignment_0_0.eContents().get(0);
		private final Assignment cKindAssignment_0_1 = (Assignment)cGroup_0.eContents().get(1);
		private final Alternatives cKindAlternatives_0_1_0 = (Alternatives)cKindAssignment_0_1.eContents().get(0);
		private final RuleCall cKindValueDotFieldExpressionKindEnumRuleCall_0_1_0_0 = (RuleCall)cKindAlternatives_0_1_0.eContents().get(0);
		private final RuleCall cKindValueArrowFieldExpressionKindEnumRuleCall_0_1_0_1 = (RuleCall)cKindAlternatives_0_1_0.eContents().get(1);
		private final Assignment cElementAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final CrossReference cElementBufferCrossReference_1_0 = (CrossReference)cElementAssignment_1.eContents().get(0);
		private final RuleCall cElementBufferESIdentifierParserRuleCall_1_0_1 = (RuleCall)cElementBufferCrossReference_1_0.eContents().get(1);
		
		//ComBuffer returns fmlExpr::ValueElementSpecification
		//    : ( parent=LiteralPureReferenceMachine
		//        // ( '.' | '->' ) element
		//        kind=( ValueDotFieldExpressionKind | ValueArrowFieldExpressionKind )
		//      )?
		//      element=[fmlInfra::Buffer|ESIdentifier]
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//( parent=LiteralPureReferenceMachine
		//       // ( '.' | '->' ) element
		//       kind=( ValueDotFieldExpressionKind | ValueArrowFieldExpressionKind )
		//     )?
		//     element=[fmlInfra::Buffer|ESIdentifier]
		public Group getGroup() { return cGroup; }
		
		//( parent=LiteralPureReferenceMachine
		//       // ( '.' | '->' ) element
		//       kind=( ValueDotFieldExpressionKind | ValueArrowFieldExpressionKind )
		//     )?
		public Group getGroup_0() { return cGroup_0; }
		
		//parent=LiteralPureReferenceMachine
		public Assignment getParentAssignment_0_0() { return cParentAssignment_0_0; }
		
		//LiteralPureReferenceMachine
		public RuleCall getParentLiteralPureReferenceMachineParserRuleCall_0_0_0() { return cParentLiteralPureReferenceMachineParserRuleCall_0_0_0; }
		
		//// ( '.' | '->' ) element
		//kind=( ValueDotFieldExpressionKind | ValueArrowFieldExpressionKind )
		public Assignment getKindAssignment_0_1() { return cKindAssignment_0_1; }
		
		//( ValueDotFieldExpressionKind | ValueArrowFieldExpressionKind )
		public Alternatives getKindAlternatives_0_1_0() { return cKindAlternatives_0_1_0; }
		
		//ValueDotFieldExpressionKind
		public RuleCall getKindValueDotFieldExpressionKindEnumRuleCall_0_1_0_0() { return cKindValueDotFieldExpressionKindEnumRuleCall_0_1_0_0; }
		
		//ValueArrowFieldExpressionKind
		public RuleCall getKindValueArrowFieldExpressionKindEnumRuleCall_0_1_0_1() { return cKindValueArrowFieldExpressionKindEnumRuleCall_0_1_0_1; }
		
		//element=[fmlInfra::Buffer|ESIdentifier]
		public Assignment getElementAssignment_1() { return cElementAssignment_1; }
		
		//[fmlInfra::Buffer|ESIdentifier]
		public CrossReference getElementBufferCrossReference_1_0() { return cElementBufferCrossReference_1_0; }
		
		//ESIdentifier
		public RuleCall getElementBufferESIdentifierParserRuleCall_1_0_1() { return cElementBufferESIdentifierParserRuleCall_1_0_1; }
	}
	public class ComBufferRefElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ComBufferRef");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLiteralReferenceSpecificationAction_0 = (Action)cGroup.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Assignment cParentAssignment_1_0 = (Assignment)cGroup_1.eContents().get(0);
		private final RuleCall cParentLiteralReferenceExpressionParserRuleCall_1_0_0 = (RuleCall)cParentAssignment_1_0.eContents().get(0);
		private final Alternatives cAlternatives_1_1 = (Alternatives)cGroup_1.eContents().get(1);
		private final Keyword cFullStopKeyword_1_1_0 = (Keyword)cAlternatives_1_1.eContents().get(0);
		private final Keyword cHyphenMinusGreaterThanSignKeyword_1_1_1 = (Keyword)cAlternatives_1_1.eContents().get(1);
		private final Assignment cElementAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cElementBufferReferenceElementParserRuleCall_2_0 = (RuleCall)cElementAssignment_2.eContents().get(0);
		
		//ComBufferRef returns fmlExpr::LiteralReferenceSpecification
		//    : { fmlExpr::LiteralReferenceSpecification }
		//        ( parent+=LiteralReferenceExpression ( '.'  |  '->' ) )*
		//        element=BufferReferenceElement
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{ fmlExpr::LiteralReferenceSpecification }
		//       ( parent+=LiteralReferenceExpression ( '.'  |  '->' ) )*
		//       element=BufferReferenceElement
		public Group getGroup() { return cGroup; }
		
		//{ fmlExpr::LiteralReferenceSpecification }
		public Action getLiteralReferenceSpecificationAction_0() { return cLiteralReferenceSpecificationAction_0; }
		
		//( parent+=LiteralReferenceExpression ( '.'  |  '->' ) )*
		public Group getGroup_1() { return cGroup_1; }
		
		//parent+=LiteralReferenceExpression
		public Assignment getParentAssignment_1_0() { return cParentAssignment_1_0; }
		
		//LiteralReferenceExpression
		public RuleCall getParentLiteralReferenceExpressionParserRuleCall_1_0_0() { return cParentLiteralReferenceExpressionParserRuleCall_1_0_0; }
		
		//( '.'  |  '->' )
		public Alternatives getAlternatives_1_1() { return cAlternatives_1_1; }
		
		//'.'
		public Keyword getFullStopKeyword_1_1_0() { return cFullStopKeyword_1_1_0; }
		
		//'->'
		public Keyword getHyphenMinusGreaterThanSignKeyword_1_1_1() { return cHyphenMinusGreaterThanSignKeyword_1_1_1; }
		
		//element=BufferReferenceElement
		public Assignment getElementAssignment_2() { return cElementAssignment_2; }
		
		//BufferReferenceElement
		public RuleCall getElementBufferReferenceElementParserRuleCall_2_0() { return cElementBufferReferenceElementParserRuleCall_2_0; }
	}
	public class BufferReferenceElementElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.BufferReferenceElement");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLiteralReferenceElementAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cElementAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final CrossReference cElementBufferCrossReference_1_0 = (CrossReference)cElementAssignment_1.eContents().get(0);
		private final RuleCall cElementBufferESIdentifierParserRuleCall_1_0_1 = (RuleCall)cElementBufferCrossReference_1_0.eContents().get(1);
		
		//BufferReferenceElement returns fmlExpr::LiteralReferenceElement
		//    : {fmlExpr::LiteralReferenceElement}
		//        element=[fmlInfra::Buffer|ESIdentifier]
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlExpr::LiteralReferenceElement}
		//       element=[fmlInfra::Buffer|ESIdentifier]
		public Group getGroup() { return cGroup; }
		
		//{fmlExpr::LiteralReferenceElement}
		public Action getLiteralReferenceElementAction_0() { return cLiteralReferenceElementAction_0; }
		
		//element=[fmlInfra::Buffer|ESIdentifier]
		public Assignment getElementAssignment_1() { return cElementAssignment_1; }
		
		//[fmlInfra::Buffer|ESIdentifier]
		public CrossReference getElementBufferCrossReference_1_0() { return cElementBufferCrossReference_1_0; }
		
		//ESIdentifier
		public RuleCall getElementBufferESIdentifierParserRuleCall_1_0_1() { return cElementBufferESIdentifierParserRuleCall_1_0_1; }
	}
	public class LiteralPureReferenceMachineElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralPureReferenceMachine");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final Group cGroup_0 = (Group)cAlternatives.eContents().get(0);
		private final Action cLiteralReferenceElementAction_0_0 = (Action)cGroup_0.eContents().get(0);
		private final Assignment cElementAssignment_0_1 = (Assignment)cGroup_0.eContents().get(1);
		private final CrossReference cElementMachineCrossReference_0_1_0 = (CrossReference)cElementAssignment_0_1.eContents().get(0);
		private final RuleCall cElementMachineESIdentifierParserRuleCall_0_1_0_1 = (RuleCall)cElementMachineCrossReference_0_1_0.eContents().get(1);
		private final RuleCall cLiteralReferenceMachineContextParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		
		//LiteralPureReferenceMachine returns fmlExpr::LiteralReferenceExpression
		//    : {fmlExpr::LiteralReferenceElement}
		//        element=[fmlInfra::Machine|ESIdentifier]
		//    | LiteralReferenceMachineContext
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlExpr::LiteralReferenceElement}
		//       element=[fmlInfra::Machine|ESIdentifier]
		//   | LiteralReferenceMachineContext
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//{fmlExpr::LiteralReferenceElement}
		//       element=[fmlInfra::Machine|ESIdentifier]
		public Group getGroup_0() { return cGroup_0; }
		
		//{fmlExpr::LiteralReferenceElement}
		public Action getLiteralReferenceElementAction_0_0() { return cLiteralReferenceElementAction_0_0; }
		
		//element=[fmlInfra::Machine|ESIdentifier]
		public Assignment getElementAssignment_0_1() { return cElementAssignment_0_1; }
		
		//[fmlInfra::Machine|ESIdentifier]
		public CrossReference getElementMachineCrossReference_0_1_0() { return cElementMachineCrossReference_0_1_0; }
		
		//ESIdentifier
		public RuleCall getElementMachineESIdentifierParserRuleCall_0_1_0_1() { return cElementMachineESIdentifierParserRuleCall_0_1_0_1; }
		
		//LiteralReferenceMachineContext
		public RuleCall getLiteralReferenceMachineContextParserRuleCall_1() { return cLiteralReferenceMachineContextParserRuleCall_1; }
	}
	public class TypeDefinitionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.TypeDefinition");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cEnumerationTypeDefinitionParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cStructureTypeDefinitionParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cUnionTypeDefinitionParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		private final RuleCall cChoiceTypeDefinitionParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		private final RuleCall cIntervalTypeDefinitionParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
		private final RuleCall cCollectionTypeDefinitionParserRuleCall_5 = (RuleCall)cAlternatives.eContents().get(5);
		private final RuleCall cOtherDataTypeDefinitionParserRuleCall_6 = (RuleCall)cAlternatives.eContents().get(6);
		
		//////////////////////////////////////////////////////////////////////////////////
		//// Sections Declarations Data Rules
		//////////////////////////////////////////////////////////////////////////////////
		////TypeDefinition returns fmlType::DataType
		////    : typedef?='type' name=ESIdentifier
		////        ( support=DataTypeReference ';'
		////        | support=StructuredDataType
		////        )
		////    ;
		//TypeDefinition returns fmlType::DataType
		//    : EnumerationTypeDefinition
		//    | StructureTypeDefinition
		//    | UnionTypeDefinition
		//    | ChoiceTypeDefinition
		//    | IntervalTypeDefinition
		//    | CollectionTypeDefinition
		//    | OtherDataTypeDefinition
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//EnumerationTypeDefinition
		//   | StructureTypeDefinition
		//   | UnionTypeDefinition
		//   | ChoiceTypeDefinition
		//   | IntervalTypeDefinition
		//   | CollectionTypeDefinition
		//   | OtherDataTypeDefinition
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//EnumerationTypeDefinition
		public RuleCall getEnumerationTypeDefinitionParserRuleCall_0() { return cEnumerationTypeDefinitionParserRuleCall_0; }
		
		//StructureTypeDefinition
		public RuleCall getStructureTypeDefinitionParserRuleCall_1() { return cStructureTypeDefinitionParserRuleCall_1; }
		
		//UnionTypeDefinition
		public RuleCall getUnionTypeDefinitionParserRuleCall_2() { return cUnionTypeDefinitionParserRuleCall_2; }
		
		//ChoiceTypeDefinition
		public RuleCall getChoiceTypeDefinitionParserRuleCall_3() { return cChoiceTypeDefinitionParserRuleCall_3; }
		
		//IntervalTypeDefinition
		public RuleCall getIntervalTypeDefinitionParserRuleCall_4() { return cIntervalTypeDefinitionParserRuleCall_4; }
		
		//CollectionTypeDefinition
		public RuleCall getCollectionTypeDefinitionParserRuleCall_5() { return cCollectionTypeDefinitionParserRuleCall_5; }
		
		//OtherDataTypeDefinition
		public RuleCall getOtherDataTypeDefinitionParserRuleCall_6() { return cOtherDataTypeDefinitionParserRuleCall_6; }
	}
	public class DataTypeMultiplicityElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.DataTypeMultiplicity");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cLiteralIntegerExpressionParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cLiteralReferenceElementParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		
		////TypeDefinitionImpl returns fmlType::DataTypeReference
		////    : name=ESIdentifier
		////        ( support=DataTypeReference ';'
		////        | support=StructuredDataType
		////        )
		////    ;
		////TypeDefinitionImpl returns fmlType::DataType
		////    : EnumerationTypeDefinitionImpl
		////    | StructureTypeDefinitionImpl
		////    | UnionTypeDefinitionImpl
		////    | ChoiceTypeDefinitionImpl
		////
		////    | IntervalTypeDefinitionImpl
		////    | CollectionTypeDefinitionImpl
		////
		////    | OtherDataTypeDefinitionImpl
		////    ;
		//DataTypeMultiplicity returns fmlExpr::Expression
		//    : LiteralIntegerExpression
		//    | LiteralReferenceElement
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//LiteralIntegerExpression
		//   | LiteralReferenceElement
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//LiteralIntegerExpression
		public RuleCall getLiteralIntegerExpressionParserRuleCall_0() { return cLiteralIntegerExpressionParserRuleCall_0; }
		
		//LiteralReferenceElement
		public RuleCall getLiteralReferenceElementParserRuleCall_1() { return cLiteralReferenceElementParserRuleCall_1; }
	}
	public class DataTypeReferenceElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.DataTypeReference");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final Group cGroup_0 = (Group)cAlternatives.eContents().get(0);
		private final RuleCall cSimpleDataTypeParserRuleCall_0_0 = (RuleCall)cGroup_0.eContents().get(0);
		private final Group cGroup_0_1 = (Group)cGroup_0.eContents().get(1);
		private final Action cDataTypeReferenceSupportAction_0_1_0 = (Action)cGroup_0_1.eContents().get(0);
		private final Keyword cLeftSquareBracketKeyword_0_1_1 = (Keyword)cGroup_0_1.eContents().get(1);
		private final Assignment cMultiplicityAssignment_0_1_2 = (Assignment)cGroup_0_1.eContents().get(2);
		private final RuleCall cMultiplicityDataTypeMultiplicityParserRuleCall_0_1_2_0 = (RuleCall)cMultiplicityAssignment_0_1_2.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_0_1_3 = (Keyword)cGroup_0_1.eContents().get(3);
		private final Group cGroup_1 = (Group)cAlternatives.eContents().get(1);
		private final Action cDataTypeReferenceAction_1_0 = (Action)cGroup_1.eContents().get(0);
		private final Assignment cTyperefAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final CrossReference cTyperefDataTypeCrossReference_1_1_0 = (CrossReference)cTyperefAssignment_1_1.eContents().get(0);
		private final RuleCall cTyperefDataTypeESUfidParserRuleCall_1_1_0_1 = (RuleCall)cTyperefDataTypeCrossReference_1_1_0.eContents().get(1);
		private final Group cGroup_1_2 = (Group)cGroup_1.eContents().get(2);
		private final Keyword cLeftSquareBracketKeyword_1_2_0 = (Keyword)cGroup_1_2.eContents().get(0);
		private final Assignment cMultiplicityAssignment_1_2_1 = (Assignment)cGroup_1_2.eContents().get(1);
		private final RuleCall cMultiplicityDataTypeMultiplicityParserRuleCall_1_2_1_0 = (RuleCall)cMultiplicityAssignment_1_2_1.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_1_2_2 = (Keyword)cGroup_1_2.eContents().get(2);
		
		//DataTypeReference returns fmlType::DataType
		//    : SimpleDataType
		//        ( {fmlType::DataTypeReference.support=current}
		//            '[' multiplicity=DataTypeMultiplicity ']'
		//        )?
		//    | {fmlType::DataTypeReference}
		//        typeref=[fmlType::DataType|ESUfid]
		//        ( '[' multiplicity=DataTypeMultiplicity ']' )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//SimpleDataType
		//       ( {fmlType::DataTypeReference.support=current}
		//           '[' multiplicity=DataTypeMultiplicity ']'
		//       )?
		//   | {fmlType::DataTypeReference}
		//       typeref=[fmlType::DataType|ESUfid]
		//       ( '[' multiplicity=DataTypeMultiplicity ']' )?
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//SimpleDataType
		//       ( {fmlType::DataTypeReference.support=current}
		//           '[' multiplicity=DataTypeMultiplicity ']'
		//       )?
		public Group getGroup_0() { return cGroup_0; }
		
		//SimpleDataType
		public RuleCall getSimpleDataTypeParserRuleCall_0_0() { return cSimpleDataTypeParserRuleCall_0_0; }
		
		//( {fmlType::DataTypeReference.support=current}
		//    '[' multiplicity=DataTypeMultiplicity ']'
		//)?
		public Group getGroup_0_1() { return cGroup_0_1; }
		
		//{fmlType::DataTypeReference.support=current}
		public Action getDataTypeReferenceSupportAction_0_1_0() { return cDataTypeReferenceSupportAction_0_1_0; }
		
		//'['
		public Keyword getLeftSquareBracketKeyword_0_1_1() { return cLeftSquareBracketKeyword_0_1_1; }
		
		//multiplicity=DataTypeMultiplicity
		public Assignment getMultiplicityAssignment_0_1_2() { return cMultiplicityAssignment_0_1_2; }
		
		//DataTypeMultiplicity
		public RuleCall getMultiplicityDataTypeMultiplicityParserRuleCall_0_1_2_0() { return cMultiplicityDataTypeMultiplicityParserRuleCall_0_1_2_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_0_1_3() { return cRightSquareBracketKeyword_0_1_3; }
		
		//{fmlType::DataTypeReference}
		//       typeref=[fmlType::DataType|ESUfid]
		//       ( '[' multiplicity=DataTypeMultiplicity ']' )?
		public Group getGroup_1() { return cGroup_1; }
		
		//{fmlType::DataTypeReference}
		public Action getDataTypeReferenceAction_1_0() { return cDataTypeReferenceAction_1_0; }
		
		//typeref=[fmlType::DataType|ESUfid]
		public Assignment getTyperefAssignment_1_1() { return cTyperefAssignment_1_1; }
		
		//[fmlType::DataType|ESUfid]
		public CrossReference getTyperefDataTypeCrossReference_1_1_0() { return cTyperefDataTypeCrossReference_1_1_0; }
		
		//ESUfid
		public RuleCall getTyperefDataTypeESUfidParserRuleCall_1_1_0_1() { return cTyperefDataTypeESUfidParserRuleCall_1_1_0_1; }
		
		//( '[' multiplicity=DataTypeMultiplicity ']' )?
		public Group getGroup_1_2() { return cGroup_1_2; }
		
		//'['
		public Keyword getLeftSquareBracketKeyword_1_2_0() { return cLeftSquareBracketKeyword_1_2_0; }
		
		//multiplicity=DataTypeMultiplicity
		public Assignment getMultiplicityAssignment_1_2_1() { return cMultiplicityAssignment_1_2_1; }
		
		//DataTypeMultiplicity
		public RuleCall getMultiplicityDataTypeMultiplicityParserRuleCall_1_2_1_0() { return cMultiplicityDataTypeMultiplicityParserRuleCall_1_2_1_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_1_2_2() { return cRightSquareBracketKeyword_1_2_2; }
	}
	public class OtherDataTypeDefinitionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.OtherDataTypeDefinition");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cDataTypeReferenceAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cVisibilityAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cVisibilityVisibilityKindEnumRuleCall_1_0 = (RuleCall)cVisibilityAssignment_1.eContents().get(0);
		private final Assignment cTypedefAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final Keyword cTypedefTypeKeyword_2_0 = (Keyword)cTypedefAssignment_2.eContents().get(0);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
		private final Alternatives cAlternatives_5 = (Alternatives)cGroup.eContents().get(5);
		private final Group cGroup_5_0 = (Group)cAlternatives_5.eContents().get(0);
		private final Assignment cSupportAssignment_5_0_0 = (Assignment)cGroup_5_0.eContents().get(0);
		private final RuleCall cSupportPrimitiveTypeParserRuleCall_5_0_0_0 = (RuleCall)cSupportAssignment_5_0_0.eContents().get(0);
		private final Group cGroup_5_0_1 = (Group)cGroup_5_0.eContents().get(1);
		private final Keyword cLeftSquareBracketKeyword_5_0_1_0 = (Keyword)cGroup_5_0_1.eContents().get(0);
		private final Assignment cMultiplicityAssignment_5_0_1_1 = (Assignment)cGroup_5_0_1.eContents().get(1);
		private final RuleCall cMultiplicityDataTypeMultiplicityParserRuleCall_5_0_1_1_0 = (RuleCall)cMultiplicityAssignment_5_0_1_1.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_5_0_1_2 = (Keyword)cGroup_5_0_1.eContents().get(2);
		private final Group cGroup_5_1 = (Group)cAlternatives_5.eContents().get(1);
		private final Assignment cTyperefAssignment_5_1_0 = (Assignment)cGroup_5_1.eContents().get(0);
		private final CrossReference cTyperefDataTypeCrossReference_5_1_0_0 = (CrossReference)cTyperefAssignment_5_1_0.eContents().get(0);
		private final RuleCall cTyperefDataTypeESUfidParserRuleCall_5_1_0_0_1 = (RuleCall)cTyperefDataTypeCrossReference_5_1_0_0.eContents().get(1);
		private final Group cGroup_5_1_1 = (Group)cGroup_5_1.eContents().get(1);
		private final Keyword cLeftSquareBracketKeyword_5_1_1_0 = (Keyword)cGroup_5_1_1.eContents().get(0);
		private final Assignment cMultiplicityAssignment_5_1_1_1 = (Assignment)cGroup_5_1_1.eContents().get(1);
		private final RuleCall cMultiplicityDataTypeMultiplicityParserRuleCall_5_1_1_1_0 = (RuleCall)cMultiplicityAssignment_5_1_1_1.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_5_1_1_2 = (Keyword)cGroup_5_1_1.eContents().get(2);
		private final Alternatives cAlternatives_6 = (Alternatives)cGroup.eContents().get(6);
		private final Assignment cConstraintAssignment_6_0 = (Assignment)cAlternatives_6.eContents().get(0);
		private final RuleCall cConstraintTypeConstraintRoutineParserRuleCall_6_0_0 = (RuleCall)cConstraintAssignment_6_0.eContents().get(0);
		private final Keyword cSemicolonKeyword_6_1 = (Keyword)cAlternatives_6.eContents().get(1);
		
		//OtherDataTypeDefinition returns fmlType::DataTypeReference
		//    : {fmlType::DataTypeReference}
		//        ( visibility=VisibilityKind )?  typedef?='type'
		//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//        ( support=PrimitiveType
		//            ( '[' multiplicity=DataTypeMultiplicity ']' )?
		//        | typeref=[fmlType::DataType|ESUfid]
		//            ( '[' multiplicity=DataTypeMultiplicity ']' )?
		//        )  ( constraint=TypeConstraintRoutine | ';' )
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlType::DataTypeReference}
		//       ( visibility=VisibilityKind )?  typedef?='type'
		//       name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//       ( support=PrimitiveType
		//           ( '[' multiplicity=DataTypeMultiplicity ']' )?
		//       | typeref=[fmlType::DataType|ESUfid]
		//           ( '[' multiplicity=DataTypeMultiplicity ']' )?
		//       )  ( constraint=TypeConstraintRoutine | ';' )
		public Group getGroup() { return cGroup; }
		
		//{fmlType::DataTypeReference}
		public Action getDataTypeReferenceAction_0() { return cDataTypeReferenceAction_0; }
		
		//( visibility=VisibilityKind )?
		public Assignment getVisibilityAssignment_1() { return cVisibilityAssignment_1; }
		
		//VisibilityKind
		public RuleCall getVisibilityVisibilityKindEnumRuleCall_1_0() { return cVisibilityVisibilityKindEnumRuleCall_1_0; }
		
		//typedef?='type'
		public Assignment getTypedefAssignment_2() { return cTypedefAssignment_2; }
		
		//'type'
		public Keyword getTypedefTypeKeyword_2_0() { return cTypedefTypeKeyword_2_0; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
		
		//( support=PrimitiveType
		//    ( '[' multiplicity=DataTypeMultiplicity ']' )?
		//| typeref=[fmlType::DataType|ESUfid]
		//    ( '[' multiplicity=DataTypeMultiplicity ']' )?
		//)
		public Alternatives getAlternatives_5() { return cAlternatives_5; }
		
		//support=PrimitiveType
		//           ( '[' multiplicity=DataTypeMultiplicity ']' )?
		public Group getGroup_5_0() { return cGroup_5_0; }
		
		//support=PrimitiveType
		public Assignment getSupportAssignment_5_0_0() { return cSupportAssignment_5_0_0; }
		
		//PrimitiveType
		public RuleCall getSupportPrimitiveTypeParserRuleCall_5_0_0_0() { return cSupportPrimitiveTypeParserRuleCall_5_0_0_0; }
		
		//( '[' multiplicity=DataTypeMultiplicity ']' )?
		public Group getGroup_5_0_1() { return cGroup_5_0_1; }
		
		//'['
		public Keyword getLeftSquareBracketKeyword_5_0_1_0() { return cLeftSquareBracketKeyword_5_0_1_0; }
		
		//multiplicity=DataTypeMultiplicity
		public Assignment getMultiplicityAssignment_5_0_1_1() { return cMultiplicityAssignment_5_0_1_1; }
		
		//DataTypeMultiplicity
		public RuleCall getMultiplicityDataTypeMultiplicityParserRuleCall_5_0_1_1_0() { return cMultiplicityDataTypeMultiplicityParserRuleCall_5_0_1_1_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_5_0_1_2() { return cRightSquareBracketKeyword_5_0_1_2; }
		
		//typeref=[fmlType::DataType|ESUfid]
		//           ( '[' multiplicity=DataTypeMultiplicity ']' )?
		public Group getGroup_5_1() { return cGroup_5_1; }
		
		//typeref=[fmlType::DataType|ESUfid]
		public Assignment getTyperefAssignment_5_1_0() { return cTyperefAssignment_5_1_0; }
		
		//[fmlType::DataType|ESUfid]
		public CrossReference getTyperefDataTypeCrossReference_5_1_0_0() { return cTyperefDataTypeCrossReference_5_1_0_0; }
		
		//ESUfid
		public RuleCall getTyperefDataTypeESUfidParserRuleCall_5_1_0_0_1() { return cTyperefDataTypeESUfidParserRuleCall_5_1_0_0_1; }
		
		//( '[' multiplicity=DataTypeMultiplicity ']' )?
		public Group getGroup_5_1_1() { return cGroup_5_1_1; }
		
		//'['
		public Keyword getLeftSquareBracketKeyword_5_1_1_0() { return cLeftSquareBracketKeyword_5_1_1_0; }
		
		//multiplicity=DataTypeMultiplicity
		public Assignment getMultiplicityAssignment_5_1_1_1() { return cMultiplicityAssignment_5_1_1_1; }
		
		//DataTypeMultiplicity
		public RuleCall getMultiplicityDataTypeMultiplicityParserRuleCall_5_1_1_1_0() { return cMultiplicityDataTypeMultiplicityParserRuleCall_5_1_1_1_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_5_1_1_2() { return cRightSquareBracketKeyword_5_1_1_2; }
		
		//( constraint=TypeConstraintRoutine | ';' )
		public Alternatives getAlternatives_6() { return cAlternatives_6; }
		
		//constraint=TypeConstraintRoutine
		public Assignment getConstraintAssignment_6_0() { return cConstraintAssignment_6_0; }
		
		//TypeConstraintRoutine
		public RuleCall getConstraintTypeConstraintRoutineParserRuleCall_6_0_0() { return cConstraintTypeConstraintRoutineParserRuleCall_6_0_0; }
		
		//';'
		public Keyword getSemicolonKeyword_6_1() { return cSemicolonKeyword_6_1; }
	}
	public class TypeConstraintRoutineElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.TypeConstraintRoutine");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cRoutineAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Keyword cConstraintKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
		private final Keyword cLeftParenthesisKeyword_3_0 = (Keyword)cGroup_3.eContents().get(0);
		private final Assignment cParameterSetAssignment_3_1 = (Assignment)cGroup_3.eContents().get(1);
		private final RuleCall cParameterSetVariableRoutineParameterSetParserRuleCall_3_1_0 = (RuleCall)cParameterSetAssignment_3_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_3_2 = (Keyword)cGroup_3.eContents().get(2);
		private final Alternatives cAlternatives_4 = (Alternatives)cGroup.eContents().get(4);
		private final Assignment cBodyBlockAssignment_4_0 = (Assignment)cAlternatives_4.eContents().get(0);
		private final RuleCall cBodyBlockBlockStatementParserRuleCall_4_0_0 = (RuleCall)cBodyBlockAssignment_4_0.eContents().get(0);
		private final Group cGroup_4_1 = (Group)cAlternatives_4.eContents().get(1);
		private final Assignment cBodyBlockAssignment_4_1_0 = (Assignment)cGroup_4_1.eContents().get(0);
		private final RuleCall cBodyBlockConditionalBlockStatementParserRuleCall_4_1_0_0 = (RuleCall)cBodyBlockAssignment_4_1_0.eContents().get(0);
		private final Keyword cSemicolonKeyword_4_1_1 = (Keyword)cGroup_4_1.eContents().get(1);
		private final Keyword cRightCurlyBracketKeyword_5 = (Keyword)cGroup.eContents().get(5);
		
		//TypeConstraintRoutine returns fmlInfra::Routine
		//    : { fmlInfra::Routine } '{'
		//        '@constraint'
		//        ( '(' parameterSet=VariableRoutineParameterSet ')' )?
		//        ( bodyBlock=BlockStatement
		//        | bodyBlock=ConditionalBlockStatement ';'
		//        )
		//        '}'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{ fmlInfra::Routine } '{'
		//       '@constraint'
		//       ( '(' parameterSet=VariableRoutineParameterSet ')' )?
		//       ( bodyBlock=BlockStatement
		//       | bodyBlock=ConditionalBlockStatement ';'
		//       )
		//       '}'
		public Group getGroup() { return cGroup; }
		
		//{ fmlInfra::Routine }
		public Action getRoutineAction_0() { return cRoutineAction_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_1() { return cLeftCurlyBracketKeyword_1; }
		
		//'@constraint'
		public Keyword getConstraintKeyword_2() { return cConstraintKeyword_2; }
		
		//( '(' parameterSet=VariableRoutineParameterSet ')' )?
		public Group getGroup_3() { return cGroup_3; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_3_0() { return cLeftParenthesisKeyword_3_0; }
		
		//parameterSet=VariableRoutineParameterSet
		public Assignment getParameterSetAssignment_3_1() { return cParameterSetAssignment_3_1; }
		
		//VariableRoutineParameterSet
		public RuleCall getParameterSetVariableRoutineParameterSetParserRuleCall_3_1_0() { return cParameterSetVariableRoutineParameterSetParserRuleCall_3_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_3_2() { return cRightParenthesisKeyword_3_2; }
		
		//( bodyBlock=BlockStatement
		//| bodyBlock=ConditionalBlockStatement ';'
		//)
		public Alternatives getAlternatives_4() { return cAlternatives_4; }
		
		//bodyBlock=BlockStatement
		public Assignment getBodyBlockAssignment_4_0() { return cBodyBlockAssignment_4_0; }
		
		//BlockStatement
		public RuleCall getBodyBlockBlockStatementParserRuleCall_4_0_0() { return cBodyBlockBlockStatementParserRuleCall_4_0_0; }
		
		//bodyBlock=ConditionalBlockStatement ';'
		public Group getGroup_4_1() { return cGroup_4_1; }
		
		//bodyBlock=ConditionalBlockStatement
		public Assignment getBodyBlockAssignment_4_1_0() { return cBodyBlockAssignment_4_1_0; }
		
		//ConditionalBlockStatement
		public RuleCall getBodyBlockConditionalBlockStatementParserRuleCall_4_1_0_0() { return cBodyBlockConditionalBlockStatementParserRuleCall_4_1_0_0; }
		
		//';'
		public Keyword getSemicolonKeyword_4_1_1() { return cSemicolonKeyword_4_1_1; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_5() { return cRightCurlyBracketKeyword_5; }
	}
	public class ConditionalBlockStatementElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ConditionalBlockStatement");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cBlockStatementAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cStatementAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cStatementGuardTestExpressionParserRuleCall_1_0 = (RuleCall)cStatementAssignment_1.eContents().get(0);
		
		//ConditionalBlockStatement returns fmlStmnt::BlockStatement
		//    : {fmlStmnt::BlockStatement}
		//        statement+=GuardTestExpression
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlStmnt::BlockStatement}
		//       statement+=GuardTestExpression
		public Group getGroup() { return cGroup; }
		
		//{fmlStmnt::BlockStatement}
		public Action getBlockStatementAction_0() { return cBlockStatementAction_0; }
		
		//statement+=GuardTestExpression
		public Assignment getStatementAssignment_1() { return cStatementAssignment_1; }
		
		//GuardTestExpression
		public RuleCall getStatementGuardTestExpressionParserRuleCall_1_0() { return cStatementGuardTestExpressionParserRuleCall_1_0; }
	}
	public class GuardTestExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.GuardTestExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cVerticalLineEqualsSignGreaterThanSignKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cConditionAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cConditionExpressionParserRuleCall_1_0 = (RuleCall)cConditionAssignment_1.eContents().get(0);
		
		//GuardTestExpression returns fmlStmnt::GuardStatement
		//    : '|=>' condition=Expression
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//'|=>' condition=Expression
		public Group getGroup() { return cGroup; }
		
		//'|=>'
		public Keyword getVerticalLineEqualsSignGreaterThanSignKeyword_0() { return cVerticalLineEqualsSignGreaterThanSignKeyword_0; }
		
		//condition=Expression
		public Assignment getConditionAssignment_1() { return cConditionAssignment_1; }
		
		//Expression
		public RuleCall getConditionExpressionParserRuleCall_1_0() { return cConditionExpressionParserRuleCall_1_0; }
	}
	public class DataTypeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.DataType");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cDataTypeReferenceParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cStructuredDataTypeParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		
		////OtherDataTypeDefinitionImpl returns fmlType::DataTypeReference
		////    : {fmlType::DataTypeReference}
		////        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		////        ( support=PrimitiveType
		////            ( '[' multiplicity=DataTypeMultiplicity ']' )?
		////        | typeref=[fmlType::DataType|ESUfid]
		////            ( '[' multiplicity=DataTypeMultiplicity ']' )?
		////        )  typedef?=';'
		////    ;
		//DataType returns fmlType::DataType
		//    : DataTypeReference
		//    | StructuredDataType
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//DataTypeReference
		//   | StructuredDataType
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//DataTypeReference
		public RuleCall getDataTypeReferenceParserRuleCall_0() { return cDataTypeReferenceParserRuleCall_0; }
		
		//StructuredDataType
		public RuleCall getStructuredDataTypeParserRuleCall_1() { return cStructuredDataTypeParserRuleCall_1; }
	}
	public class SimpleDataTypeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.SimpleDataType");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cPrimitiveTypeParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cIntervalTypeParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cCollectionTypeParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		
		//SimpleDataType returns fmlType::DataType
		//    : PrimitiveType
		//    | IntervalType
		//    | CollectionType
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//PrimitiveType
		//   | IntervalType
		//   | CollectionType
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//PrimitiveType
		public RuleCall getPrimitiveTypeParserRuleCall_0() { return cPrimitiveTypeParserRuleCall_0; }
		
		//IntervalType
		public RuleCall getIntervalTypeParserRuleCall_1() { return cIntervalTypeParserRuleCall_1; }
		
		//CollectionType
		public RuleCall getCollectionTypeParserRuleCall_2() { return cCollectionTypeParserRuleCall_2; }
	}
	public class StructuredDataTypeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.StructuredDataType");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cEnumerationTypeParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cStructureTypeParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cUnionTypeParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		private final RuleCall cChoiceTypeParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		
		//StructuredDataType returns fmlType::DataType
		//    : EnumerationType
		//    | StructureType
		//    | UnionType
		//    | ChoiceType
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//EnumerationType
		//   | StructureType
		//   | UnionType
		//   | ChoiceType
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//EnumerationType
		public RuleCall getEnumerationTypeParserRuleCall_0() { return cEnumerationTypeParserRuleCall_0; }
		
		//StructureType
		public RuleCall getStructureTypeParserRuleCall_1() { return cStructureTypeParserRuleCall_1; }
		
		//UnionType
		public RuleCall getUnionTypeParserRuleCall_2() { return cUnionTypeParserRuleCall_2; }
		
		//ChoiceType
		public RuleCall getChoiceTypeParserRuleCall_3() { return cChoiceTypeParserRuleCall_3; }
	}
	public class PrimitiveTypeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PrimitiveType");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cPrimitiveNumberTypeParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cOtherPrimitiveTypeParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		
		////PrimitiveType returns fmlType::PrimitiveType
		////    : kind=NumberPrimitiveTypeKind ( '<' ( 'bit:' )? bitSize = EInt '>' )?
		////    | kind=OtherPrimitiveKind
		////    ;
		////
		////enum OtherPrimitiveKind returns fmlType::PrimitiveTypeKind
		////    : BOOLEAN   = 'boolean'
		////    | BOOLEAN   = 'bool'
		////    | CHAR      = 'char'
		////    | STRING    = 'string'
		////    | BUFFER    = 'buffer'
		////    | MESSAGE   = 'message'
		////    | PORT      = 'port'
		////    | MACHINE   = 'machine'
		////    ;
		////
		////
		////enum NumberPrimitiveTypeKind returns fmlType::PrimitiveTypeKind
		////    : INTEGER   = 'integer'
		////    | RATIONAL  = 'rational'
		////    | FLOAT     = 'float'
		////    | DOUBLE    = 'double'
		////    | REAL      = 'real'
		////
		////    | TIME      = 'time'
		////
		////    | UINTEGER  = 'uinteger'
		////    | URATIONAL = 'urational'
		////    | UFLOAT    = 'ufloat'
		////    | UDOUBLE   = 'udouble'
		////    | UREAL     = 'ureal'
		////
		////    | INT       = 'int'
		////    | RAT       = 'rat'
		////
		////    | UINT      = 'uint'
		////    | URAT      = 'urat'
		////    ;
		//PrimitiveType returns fmlType::PrimitiveType
		//    : PrimitiveNumberType
		//    | OtherPrimitiveType
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//PrimitiveNumberType
		//   | OtherPrimitiveType
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//PrimitiveNumberType
		public RuleCall getPrimitiveNumberTypeParserRuleCall_0() { return cPrimitiveNumberTypeParserRuleCall_0; }
		
		//OtherPrimitiveType
		public RuleCall getOtherPrimitiveTypeParserRuleCall_1() { return cOtherPrimitiveTypeParserRuleCall_1; }
	}
	public class PrimitiveNumberTypeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PrimitiveNumberType");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cPrimitiveIntegerTypeParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cPrimitiveRationalTypeParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cPrimitiveFloatTypeParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		private final RuleCall cPrimitiveRealTypeParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		private final RuleCall cPrimitiveTimeTypeParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
		
		//PrimitiveNumberType returns fmlType::PrimitiveNumberType
		//    : PrimitiveIntegerType
		//    | PrimitiveRationalType
		//    | PrimitiveFloatType
		//    | PrimitiveRealType
		//    | PrimitiveTimeType
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//PrimitiveIntegerType
		//   | PrimitiveRationalType
		//   | PrimitiveFloatType
		//   | PrimitiveRealType
		//   | PrimitiveTimeType
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//PrimitiveIntegerType
		public RuleCall getPrimitiveIntegerTypeParserRuleCall_0() { return cPrimitiveIntegerTypeParserRuleCall_0; }
		
		//PrimitiveRationalType
		public RuleCall getPrimitiveRationalTypeParserRuleCall_1() { return cPrimitiveRationalTypeParserRuleCall_1; }
		
		//PrimitiveFloatType
		public RuleCall getPrimitiveFloatTypeParserRuleCall_2() { return cPrimitiveFloatTypeParserRuleCall_2; }
		
		//PrimitiveRealType
		public RuleCall getPrimitiveRealTypeParserRuleCall_3() { return cPrimitiveRealTypeParserRuleCall_3; }
		
		//PrimitiveTimeType
		public RuleCall getPrimitiveTimeTypeParserRuleCall_4() { return cPrimitiveTimeTypeParserRuleCall_4; }
	}
	public class PrimitiveIntegerTypeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PrimitiveIntegerType");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cPrimitiveIntegerTypeAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cSignAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cSignPrimitiveNumberSignEnumRuleCall_1_0 = (RuleCall)cSignAssignment_1.eContents().get(0);
		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final Alternatives cNameAlternatives_2_0 = (Alternatives)cNameAssignment_2.eContents().get(0);
		private final Keyword cNameIntegerKeyword_2_0_0 = (Keyword)cNameAlternatives_2_0.eContents().get(0);
		private final Keyword cNameUintegerKeyword_2_0_1 = (Keyword)cNameAlternatives_2_0.eContents().get(1);
		private final Keyword cNamePos_integerKeyword_2_0_2 = (Keyword)cNameAlternatives_2_0.eContents().get(2);
		private final Keyword cNameIntKeyword_2_0_3 = (Keyword)cNameAlternatives_2_0.eContents().get(3);
		private final Keyword cNameUintKeyword_2_0_4 = (Keyword)cNameAlternatives_2_0.eContents().get(4);
		private final Alternatives cAlternatives_3 = (Alternatives)cGroup.eContents().get(3);
		private final Group cGroup_3_0 = (Group)cAlternatives_3.eContents().get(0);
		private final Keyword cColonKeyword_3_0_0 = (Keyword)cGroup_3_0.eContents().get(0);
		private final Assignment cSizeAssignment_3_0_1 = (Assignment)cGroup_3_0.eContents().get(1);
		private final RuleCall cSizeEIntParserRuleCall_3_0_1_0 = (RuleCall)cSizeAssignment_3_0_1.eContents().get(0);
		private final Group cGroup_3_1 = (Group)cAlternatives_3.eContents().get(1);
		private final Keyword cLessThanSignKeyword_3_1_0 = (Keyword)cGroup_3_1.eContents().get(0);
		private final Keyword cSizeKeyword_3_1_1 = (Keyword)cGroup_3_1.eContents().get(1);
		private final Assignment cSizeAssignment_3_1_2 = (Assignment)cGroup_3_1.eContents().get(2);
		private final RuleCall cSizeEIntParserRuleCall_3_1_2_0 = (RuleCall)cSizeAssignment_3_1_2.eContents().get(0);
		private final Keyword cGreaterThanSignKeyword_3_1_3 = (Keyword)cGroup_3_1.eContents().get(3);
		
		//PrimitiveIntegerType returns fmlType::PrimitiveIntegerType
		//    : { fmlType::PrimitiveIntegerType }
		//        ( sign=PrimitiveNumberSign )?
		//        name=( 'integer'
		//        | 'uinteger'
		//        | 'pos_integer'
		//        | 'int'
		//        | 'uint'
		//        )
		//        ( ':' size = EInt
		//            | '<' ( 'size:' )? size = EInt '>'
		//        )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{ fmlType::PrimitiveIntegerType }
		//       ( sign=PrimitiveNumberSign )?
		//       name=( 'integer'
		//       | 'uinteger'
		//       | 'pos_integer'
		//       | 'int'
		//       | 'uint'
		//       )
		//       ( ':' size = EInt
		//           | '<' ( 'size:' )? size = EInt '>'
		//       )?
		public Group getGroup() { return cGroup; }
		
		//{ fmlType::PrimitiveIntegerType }
		public Action getPrimitiveIntegerTypeAction_0() { return cPrimitiveIntegerTypeAction_0; }
		
		//( sign=PrimitiveNumberSign )?
		public Assignment getSignAssignment_1() { return cSignAssignment_1; }
		
		//PrimitiveNumberSign
		public RuleCall getSignPrimitiveNumberSignEnumRuleCall_1_0() { return cSignPrimitiveNumberSignEnumRuleCall_1_0; }
		
		//name=( 'integer'
		//| 'uinteger'
		//| 'pos_integer'
		//| 'int'
		//| 'uint'
		//)
		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
		
		//( 'integer'
		//        | 'uinteger'
		//        | 'pos_integer'
		//        | 'int'
		//        | 'uint'
		//        )
		public Alternatives getNameAlternatives_2_0() { return cNameAlternatives_2_0; }
		
		//'integer'
		public Keyword getNameIntegerKeyword_2_0_0() { return cNameIntegerKeyword_2_0_0; }
		
		//'uinteger'
		public Keyword getNameUintegerKeyword_2_0_1() { return cNameUintegerKeyword_2_0_1; }
		
		//'pos_integer'
		public Keyword getNamePos_integerKeyword_2_0_2() { return cNamePos_integerKeyword_2_0_2; }
		
		//'int'
		public Keyword getNameIntKeyword_2_0_3() { return cNameIntKeyword_2_0_3; }
		
		//'uint'
		public Keyword getNameUintKeyword_2_0_4() { return cNameUintKeyword_2_0_4; }
		
		//( ':' size = EInt
		//    | '<' ( 'size:' )? size = EInt '>'
		//)?
		public Alternatives getAlternatives_3() { return cAlternatives_3; }
		
		//':' size = EInt
		public Group getGroup_3_0() { return cGroup_3_0; }
		
		//':'
		public Keyword getColonKeyword_3_0_0() { return cColonKeyword_3_0_0; }
		
		//size = EInt
		public Assignment getSizeAssignment_3_0_1() { return cSizeAssignment_3_0_1; }
		
		//EInt
		public RuleCall getSizeEIntParserRuleCall_3_0_1_0() { return cSizeEIntParserRuleCall_3_0_1_0; }
		
		//'<' ( 'size:' )? size = EInt '>'
		public Group getGroup_3_1() { return cGroup_3_1; }
		
		//'<'
		public Keyword getLessThanSignKeyword_3_1_0() { return cLessThanSignKeyword_3_1_0; }
		
		//( 'size:' )?
		public Keyword getSizeKeyword_3_1_1() { return cSizeKeyword_3_1_1; }
		
		//size = EInt
		public Assignment getSizeAssignment_3_1_2() { return cSizeAssignment_3_1_2; }
		
		//EInt
		public RuleCall getSizeEIntParserRuleCall_3_1_2_0() { return cSizeEIntParserRuleCall_3_1_2_0; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_3_1_3() { return cGreaterThanSignKeyword_3_1_3; }
	}
	public class PrimitiveRationalTypeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PrimitiveRationalType");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cPrimitiveRationalTypeAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cSignAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cSignPrimitiveNumberSignEnumRuleCall_1_0 = (RuleCall)cSignAssignment_1.eContents().get(0);
		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final Alternatives cNameAlternatives_2_0 = (Alternatives)cNameAssignment_2.eContents().get(0);
		private final Keyword cNameRationalKeyword_2_0_0 = (Keyword)cNameAlternatives_2_0.eContents().get(0);
		private final Keyword cNameUrationalKeyword_2_0_1 = (Keyword)cNameAlternatives_2_0.eContents().get(1);
		private final Keyword cNamePos_rationalKeyword_2_0_2 = (Keyword)cNameAlternatives_2_0.eContents().get(2);
		private final Keyword cNameRatKeyword_2_0_3 = (Keyword)cNameAlternatives_2_0.eContents().get(3);
		private final Keyword cNameUratKeyword_2_0_4 = (Keyword)cNameAlternatives_2_0.eContents().get(4);
		private final Alternatives cAlternatives_3 = (Alternatives)cGroup.eContents().get(3);
		private final Group cGroup_3_0 = (Group)cAlternatives_3.eContents().get(0);
		private final Keyword cColonKeyword_3_0_0 = (Keyword)cGroup_3_0.eContents().get(0);
		private final Assignment cSizeAssignment_3_0_1 = (Assignment)cGroup_3_0.eContents().get(1);
		private final RuleCall cSizeEIntParserRuleCall_3_0_1_0 = (RuleCall)cSizeAssignment_3_0_1.eContents().get(0);
		private final Group cGroup_3_1 = (Group)cAlternatives_3.eContents().get(1);
		private final Keyword cLessThanSignKeyword_3_1_0 = (Keyword)cGroup_3_1.eContents().get(0);
		private final Keyword cSizeKeyword_3_1_1 = (Keyword)cGroup_3_1.eContents().get(1);
		private final Assignment cSizeAssignment_3_1_2 = (Assignment)cGroup_3_1.eContents().get(2);
		private final RuleCall cSizeEIntParserRuleCall_3_1_2_0 = (RuleCall)cSizeAssignment_3_1_2.eContents().get(0);
		private final Keyword cGreaterThanSignKeyword_3_1_3 = (Keyword)cGroup_3_1.eContents().get(3);
		
		//PrimitiveRationalType returns fmlType::PrimitiveRationalType
		//    : { fmlType::PrimitiveRationalType }
		//        ( sign=PrimitiveNumberSign )?
		//        name=( 'rational'
		//        | 'urational'
		//        | 'pos_rational'
		//        | 'rat'
		//        | 'urat'
		//        )
		//        ( ':' size = EInt
		//            | '<' ( 'size:' )? size = EInt '>'
		//        )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{ fmlType::PrimitiveRationalType }
		//       ( sign=PrimitiveNumberSign )?
		//       name=( 'rational'
		//       | 'urational'
		//       | 'pos_rational'
		//       | 'rat'
		//       | 'urat'
		//       )
		//       ( ':' size = EInt
		//           | '<' ( 'size:' )? size = EInt '>'
		//       )?
		public Group getGroup() { return cGroup; }
		
		//{ fmlType::PrimitiveRationalType }
		public Action getPrimitiveRationalTypeAction_0() { return cPrimitiveRationalTypeAction_0; }
		
		//( sign=PrimitiveNumberSign )?
		public Assignment getSignAssignment_1() { return cSignAssignment_1; }
		
		//PrimitiveNumberSign
		public RuleCall getSignPrimitiveNumberSignEnumRuleCall_1_0() { return cSignPrimitiveNumberSignEnumRuleCall_1_0; }
		
		//name=( 'rational'
		//| 'urational'
		//| 'pos_rational'
		//| 'rat'
		//| 'urat'
		//)
		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
		
		//( 'rational'
		//        | 'urational'
		//        | 'pos_rational'
		//        | 'rat'
		//        | 'urat'
		//        )
		public Alternatives getNameAlternatives_2_0() { return cNameAlternatives_2_0; }
		
		//'rational'
		public Keyword getNameRationalKeyword_2_0_0() { return cNameRationalKeyword_2_0_0; }
		
		//'urational'
		public Keyword getNameUrationalKeyword_2_0_1() { return cNameUrationalKeyword_2_0_1; }
		
		//'pos_rational'
		public Keyword getNamePos_rationalKeyword_2_0_2() { return cNamePos_rationalKeyword_2_0_2; }
		
		//'rat'
		public Keyword getNameRatKeyword_2_0_3() { return cNameRatKeyword_2_0_3; }
		
		//'urat'
		public Keyword getNameUratKeyword_2_0_4() { return cNameUratKeyword_2_0_4; }
		
		//( ':' size = EInt
		//    | '<' ( 'size:' )? size = EInt '>'
		//)?
		public Alternatives getAlternatives_3() { return cAlternatives_3; }
		
		//':' size = EInt
		public Group getGroup_3_0() { return cGroup_3_0; }
		
		//':'
		public Keyword getColonKeyword_3_0_0() { return cColonKeyword_3_0_0; }
		
		//size = EInt
		public Assignment getSizeAssignment_3_0_1() { return cSizeAssignment_3_0_1; }
		
		//EInt
		public RuleCall getSizeEIntParserRuleCall_3_0_1_0() { return cSizeEIntParserRuleCall_3_0_1_0; }
		
		//'<' ( 'size:' )? size = EInt '>'
		public Group getGroup_3_1() { return cGroup_3_1; }
		
		//'<'
		public Keyword getLessThanSignKeyword_3_1_0() { return cLessThanSignKeyword_3_1_0; }
		
		//( 'size:' )?
		public Keyword getSizeKeyword_3_1_1() { return cSizeKeyword_3_1_1; }
		
		//size = EInt
		public Assignment getSizeAssignment_3_1_2() { return cSizeAssignment_3_1_2; }
		
		//EInt
		public RuleCall getSizeEIntParserRuleCall_3_1_2_0() { return cSizeEIntParserRuleCall_3_1_2_0; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_3_1_3() { return cGreaterThanSignKeyword_3_1_3; }
	}
	public class PrimitiveFloatTypeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PrimitiveFloatType");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cPrimitiveFloatTypeAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cSignAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cSignPrimitiveNumberSignEnumRuleCall_1_0 = (RuleCall)cSignAssignment_1.eContents().get(0);
		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final Alternatives cNameAlternatives_2_0 = (Alternatives)cNameAssignment_2.eContents().get(0);
		private final Keyword cNameFloatKeyword_2_0_0 = (Keyword)cNameAlternatives_2_0.eContents().get(0);
		private final Keyword cNameUfloatKeyword_2_0_1 = (Keyword)cNameAlternatives_2_0.eContents().get(1);
		private final Keyword cNamePos_floatKeyword_2_0_2 = (Keyword)cNameAlternatives_2_0.eContents().get(2);
		private final Keyword cNameDoubleKeyword_2_0_3 = (Keyword)cNameAlternatives_2_0.eContents().get(3);
		private final Keyword cNameUdoubleKeyword_2_0_4 = (Keyword)cNameAlternatives_2_0.eContents().get(4);
		private final Alternatives cAlternatives_3 = (Alternatives)cGroup.eContents().get(3);
		private final Group cGroup_3_0 = (Group)cAlternatives_3.eContents().get(0);
		private final Keyword cColonKeyword_3_0_0 = (Keyword)cGroup_3_0.eContents().get(0);
		private final Assignment cSizeAssignment_3_0_1 = (Assignment)cGroup_3_0.eContents().get(1);
		private final RuleCall cSizeEIntParserRuleCall_3_0_1_0 = (RuleCall)cSizeAssignment_3_0_1.eContents().get(0);
		private final Group cGroup_3_1 = (Group)cAlternatives_3.eContents().get(1);
		private final Keyword cLessThanSignKeyword_3_1_0 = (Keyword)cGroup_3_1.eContents().get(0);
		private final Keyword cSizeKeyword_3_1_1 = (Keyword)cGroup_3_1.eContents().get(1);
		private final Assignment cSizeAssignment_3_1_2 = (Assignment)cGroup_3_1.eContents().get(2);
		private final RuleCall cSizeEIntParserRuleCall_3_1_2_0 = (RuleCall)cSizeAssignment_3_1_2.eContents().get(0);
		private final Keyword cGreaterThanSignKeyword_3_1_3 = (Keyword)cGroup_3_1.eContents().get(3);
		
		//PrimitiveFloatType returns fmlType::PrimitiveFloatType
		//    : { fmlType::PrimitiveFloatType }
		//        ( sign=PrimitiveNumberSign )?
		//        name=( 'float'
		//        | 'ufloat'
		//        | 'pos_float'
		//        | 'double'
		//        | 'udouble'
		//        )
		//        ( ':' size = EInt
		//            | '<' ( 'size:' )? size = EInt '>'
		//        )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{ fmlType::PrimitiveFloatType }
		//       ( sign=PrimitiveNumberSign )?
		//       name=( 'float'
		//       | 'ufloat'
		//       | 'pos_float'
		//       | 'double'
		//       | 'udouble'
		//       )
		//       ( ':' size = EInt
		//           | '<' ( 'size:' )? size = EInt '>'
		//       )?
		public Group getGroup() { return cGroup; }
		
		//{ fmlType::PrimitiveFloatType }
		public Action getPrimitiveFloatTypeAction_0() { return cPrimitiveFloatTypeAction_0; }
		
		//( sign=PrimitiveNumberSign )?
		public Assignment getSignAssignment_1() { return cSignAssignment_1; }
		
		//PrimitiveNumberSign
		public RuleCall getSignPrimitiveNumberSignEnumRuleCall_1_0() { return cSignPrimitiveNumberSignEnumRuleCall_1_0; }
		
		//name=( 'float'
		//| 'ufloat'
		//| 'pos_float'
		//| 'double'
		//| 'udouble'
		//)
		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
		
		//( 'float'
		//        | 'ufloat'
		//        | 'pos_float'
		//        | 'double'
		//        | 'udouble'
		//        )
		public Alternatives getNameAlternatives_2_0() { return cNameAlternatives_2_0; }
		
		//'float'
		public Keyword getNameFloatKeyword_2_0_0() { return cNameFloatKeyword_2_0_0; }
		
		//'ufloat'
		public Keyword getNameUfloatKeyword_2_0_1() { return cNameUfloatKeyword_2_0_1; }
		
		//'pos_float'
		public Keyword getNamePos_floatKeyword_2_0_2() { return cNamePos_floatKeyword_2_0_2; }
		
		//'double'
		public Keyword getNameDoubleKeyword_2_0_3() { return cNameDoubleKeyword_2_0_3; }
		
		//'udouble'
		public Keyword getNameUdoubleKeyword_2_0_4() { return cNameUdoubleKeyword_2_0_4; }
		
		//( ':' size = EInt
		//    | '<' ( 'size:' )? size = EInt '>'
		//)?
		public Alternatives getAlternatives_3() { return cAlternatives_3; }
		
		//':' size = EInt
		public Group getGroup_3_0() { return cGroup_3_0; }
		
		//':'
		public Keyword getColonKeyword_3_0_0() { return cColonKeyword_3_0_0; }
		
		//size = EInt
		public Assignment getSizeAssignment_3_0_1() { return cSizeAssignment_3_0_1; }
		
		//EInt
		public RuleCall getSizeEIntParserRuleCall_3_0_1_0() { return cSizeEIntParserRuleCall_3_0_1_0; }
		
		//'<' ( 'size:' )? size = EInt '>'
		public Group getGroup_3_1() { return cGroup_3_1; }
		
		//'<'
		public Keyword getLessThanSignKeyword_3_1_0() { return cLessThanSignKeyword_3_1_0; }
		
		//( 'size:' )?
		public Keyword getSizeKeyword_3_1_1() { return cSizeKeyword_3_1_1; }
		
		//size = EInt
		public Assignment getSizeAssignment_3_1_2() { return cSizeAssignment_3_1_2; }
		
		//EInt
		public RuleCall getSizeEIntParserRuleCall_3_1_2_0() { return cSizeEIntParserRuleCall_3_1_2_0; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_3_1_3() { return cGreaterThanSignKeyword_3_1_3; }
	}
	public class PrimitiveRealTypeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PrimitiveRealType");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cPrimitiveRealTypeAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cSignAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cSignPrimitiveNumberSignEnumRuleCall_1_0 = (RuleCall)cSignAssignment_1.eContents().get(0);
		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final Alternatives cNameAlternatives_2_0 = (Alternatives)cNameAssignment_2.eContents().get(0);
		private final Keyword cNameRealKeyword_2_0_0 = (Keyword)cNameAlternatives_2_0.eContents().get(0);
		private final Keyword cNameUrealKeyword_2_0_1 = (Keyword)cNameAlternatives_2_0.eContents().get(1);
		private final Keyword cNamePos_realKeyword_2_0_2 = (Keyword)cNameAlternatives_2_0.eContents().get(2);
		private final Alternatives cAlternatives_3 = (Alternatives)cGroup.eContents().get(3);
		private final Group cGroup_3_0 = (Group)cAlternatives_3.eContents().get(0);
		private final Keyword cColonKeyword_3_0_0 = (Keyword)cGroup_3_0.eContents().get(0);
		private final Assignment cSizeAssignment_3_0_1 = (Assignment)cGroup_3_0.eContents().get(1);
		private final RuleCall cSizeEIntParserRuleCall_3_0_1_0 = (RuleCall)cSizeAssignment_3_0_1.eContents().get(0);
		private final Group cGroup_3_1 = (Group)cAlternatives_3.eContents().get(1);
		private final Keyword cLessThanSignKeyword_3_1_0 = (Keyword)cGroup_3_1.eContents().get(0);
		private final Keyword cSizeKeyword_3_1_1 = (Keyword)cGroup_3_1.eContents().get(1);
		private final Assignment cSizeAssignment_3_1_2 = (Assignment)cGroup_3_1.eContents().get(2);
		private final RuleCall cSizeEIntParserRuleCall_3_1_2_0 = (RuleCall)cSizeAssignment_3_1_2.eContents().get(0);
		private final Keyword cGreaterThanSignKeyword_3_1_3 = (Keyword)cGroup_3_1.eContents().get(3);
		
		//PrimitiveRealType returns fmlType::PrimitiveRealType
		//    : { fmlType::PrimitiveRealType }
		//        ( sign=PrimitiveNumberSign )?
		//        name=( 'real'
		//        | 'ureal'
		//        | 'pos_real'
		//        )
		//        ( ':' size = EInt
		//            | '<' ( 'size:' )? size = EInt '>'
		//        )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{ fmlType::PrimitiveRealType }
		//       ( sign=PrimitiveNumberSign )?
		//       name=( 'real'
		//       | 'ureal'
		//       | 'pos_real'
		//       )
		//       ( ':' size = EInt
		//           | '<' ( 'size:' )? size = EInt '>'
		//       )?
		public Group getGroup() { return cGroup; }
		
		//{ fmlType::PrimitiveRealType }
		public Action getPrimitiveRealTypeAction_0() { return cPrimitiveRealTypeAction_0; }
		
		//( sign=PrimitiveNumberSign )?
		public Assignment getSignAssignment_1() { return cSignAssignment_1; }
		
		//PrimitiveNumberSign
		public RuleCall getSignPrimitiveNumberSignEnumRuleCall_1_0() { return cSignPrimitiveNumberSignEnumRuleCall_1_0; }
		
		//name=( 'real'
		//| 'ureal'
		//| 'pos_real'
		//)
		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
		
		//( 'real'
		//        | 'ureal'
		//        | 'pos_real'
		//        )
		public Alternatives getNameAlternatives_2_0() { return cNameAlternatives_2_0; }
		
		//'real'
		public Keyword getNameRealKeyword_2_0_0() { return cNameRealKeyword_2_0_0; }
		
		//'ureal'
		public Keyword getNameUrealKeyword_2_0_1() { return cNameUrealKeyword_2_0_1; }
		
		//'pos_real'
		public Keyword getNamePos_realKeyword_2_0_2() { return cNamePos_realKeyword_2_0_2; }
		
		//( ':' size = EInt
		//    | '<' ( 'size:' )? size = EInt '>'
		//)?
		public Alternatives getAlternatives_3() { return cAlternatives_3; }
		
		//':' size = EInt
		public Group getGroup_3_0() { return cGroup_3_0; }
		
		//':'
		public Keyword getColonKeyword_3_0_0() { return cColonKeyword_3_0_0; }
		
		//size = EInt
		public Assignment getSizeAssignment_3_0_1() { return cSizeAssignment_3_0_1; }
		
		//EInt
		public RuleCall getSizeEIntParserRuleCall_3_0_1_0() { return cSizeEIntParserRuleCall_3_0_1_0; }
		
		//'<' ( 'size:' )? size = EInt '>'
		public Group getGroup_3_1() { return cGroup_3_1; }
		
		//'<'
		public Keyword getLessThanSignKeyword_3_1_0() { return cLessThanSignKeyword_3_1_0; }
		
		//( 'size:' )?
		public Keyword getSizeKeyword_3_1_1() { return cSizeKeyword_3_1_1; }
		
		//size = EInt
		public Assignment getSizeAssignment_3_1_2() { return cSizeAssignment_3_1_2; }
		
		//EInt
		public RuleCall getSizeEIntParserRuleCall_3_1_2_0() { return cSizeEIntParserRuleCall_3_1_2_0; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_3_1_3() { return cGreaterThanSignKeyword_3_1_3; }
	}
	public class PrimitiveTimeTypeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PrimitiveTimeType");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final Group cGroup_0 = (Group)cAlternatives.eContents().get(0);
		private final Action cPrimitiveTimeTypeAction_0_0 = (Action)cGroup_0.eContents().get(0);
		private final Keyword cTimeKeyword_0_1 = (Keyword)cGroup_0.eContents().get(1);
		private final Alternatives cAlternatives_0_2 = (Alternatives)cGroup_0.eContents().get(2);
		private final Group cGroup_0_2_0 = (Group)cAlternatives_0_2.eContents().get(0);
		private final Keyword cLessThanSignKeyword_0_2_0_0 = (Keyword)cGroup_0_2_0.eContents().get(0);
		private final Assignment cSupportAssignment_0_2_0_1 = (Assignment)cGroup_0_2_0.eContents().get(1);
		private final RuleCall cSupportPrimitiveTimeNumberTypeParserRuleCall_0_2_0_1_0 = (RuleCall)cSupportAssignment_0_2_0_1.eContents().get(0);
		private final Keyword cGreaterThanSignKeyword_0_2_0_2 = (Keyword)cGroup_0_2_0.eContents().get(2);
		private final Assignment cSupportAssignment_0_2_1 = (Assignment)cAlternatives_0_2.eContents().get(1);
		private final RuleCall cSupportPrimitiveTimeNumberTypeParserRuleCall_0_2_1_0 = (RuleCall)cSupportAssignment_0_2_1.eContents().get(0);
		private final Group cGroup_1 = (Group)cAlternatives.eContents().get(1);
		private final Action cPrimitiveTimeTypeAction_1_0 = (Action)cGroup_1.eContents().get(0);
		private final Assignment cClockAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final Keyword cClockClockKeyword_1_1_0 = (Keyword)cClockAssignment_1_1.eContents().get(0);
		private final Alternatives cAlternatives_1_2 = (Alternatives)cGroup_1.eContents().get(2);
		private final Group cGroup_1_2_0 = (Group)cAlternatives_1_2.eContents().get(0);
		private final Keyword cLessThanSignKeyword_1_2_0_0 = (Keyword)cGroup_1_2_0.eContents().get(0);
		private final Assignment cSupportAssignment_1_2_0_1 = (Assignment)cGroup_1_2_0.eContents().get(1);
		private final RuleCall cSupportPrimitiveTimeNumberTypeParserRuleCall_1_2_0_1_0 = (RuleCall)cSupportAssignment_1_2_0_1.eContents().get(0);
		private final Keyword cGreaterThanSignKeyword_1_2_0_2 = (Keyword)cGroup_1_2_0.eContents().get(2);
		private final Assignment cSupportAssignment_1_2_1 = (Assignment)cAlternatives_1_2.eContents().get(1);
		private final RuleCall cSupportPrimitiveTimeNumberTypeParserRuleCall_1_2_1_0 = (RuleCall)cSupportAssignment_1_2_1.eContents().get(0);
		
		//PrimitiveTimeType returns fmlType::PrimitiveTimeType
		//    : { fmlType::PrimitiveTimeType }
		//        'time'
		//        ( '<' support=PrimitiveTimeNumberType '>'
		//        | support=PrimitiveTimeNumberType
		//        )?
		//    | { fmlType::PrimitiveTimeType }
		//        clock?='clock'
		//        ( '<' support=PrimitiveTimeNumberType '>'
		//        | support=PrimitiveTimeNumberType
		//        )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{ fmlType::PrimitiveTimeType }
		//       'time'
		//       ( '<' support=PrimitiveTimeNumberType '>'
		//       | support=PrimitiveTimeNumberType
		//       )?
		//   | { fmlType::PrimitiveTimeType }
		//       clock?='clock'
		//       ( '<' support=PrimitiveTimeNumberType '>'
		//       | support=PrimitiveTimeNumberType
		//       )?
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//{ fmlType::PrimitiveTimeType }
		//       'time'
		//       ( '<' support=PrimitiveTimeNumberType '>'
		//       | support=PrimitiveTimeNumberType
		//       )?
		public Group getGroup_0() { return cGroup_0; }
		
		//{ fmlType::PrimitiveTimeType }
		public Action getPrimitiveTimeTypeAction_0_0() { return cPrimitiveTimeTypeAction_0_0; }
		
		//'time'
		public Keyword getTimeKeyword_0_1() { return cTimeKeyword_0_1; }
		
		//( '<' support=PrimitiveTimeNumberType '>'
		//| support=PrimitiveTimeNumberType
		//)?
		public Alternatives getAlternatives_0_2() { return cAlternatives_0_2; }
		
		//'<' support=PrimitiveTimeNumberType '>'
		public Group getGroup_0_2_0() { return cGroup_0_2_0; }
		
		//'<'
		public Keyword getLessThanSignKeyword_0_2_0_0() { return cLessThanSignKeyword_0_2_0_0; }
		
		//support=PrimitiveTimeNumberType
		public Assignment getSupportAssignment_0_2_0_1() { return cSupportAssignment_0_2_0_1; }
		
		//PrimitiveTimeNumberType
		public RuleCall getSupportPrimitiveTimeNumberTypeParserRuleCall_0_2_0_1_0() { return cSupportPrimitiveTimeNumberTypeParserRuleCall_0_2_0_1_0; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_0_2_0_2() { return cGreaterThanSignKeyword_0_2_0_2; }
		
		//support=PrimitiveTimeNumberType
		public Assignment getSupportAssignment_0_2_1() { return cSupportAssignment_0_2_1; }
		
		//PrimitiveTimeNumberType
		public RuleCall getSupportPrimitiveTimeNumberTypeParserRuleCall_0_2_1_0() { return cSupportPrimitiveTimeNumberTypeParserRuleCall_0_2_1_0; }
		
		//{ fmlType::PrimitiveTimeType }
		//       clock?='clock'
		//       ( '<' support=PrimitiveTimeNumberType '>'
		//       | support=PrimitiveTimeNumberType
		//       )?
		public Group getGroup_1() { return cGroup_1; }
		
		//{ fmlType::PrimitiveTimeType }
		public Action getPrimitiveTimeTypeAction_1_0() { return cPrimitiveTimeTypeAction_1_0; }
		
		//clock?='clock'
		public Assignment getClockAssignment_1_1() { return cClockAssignment_1_1; }
		
		//'clock'
		public Keyword getClockClockKeyword_1_1_0() { return cClockClockKeyword_1_1_0; }
		
		//( '<' support=PrimitiveTimeNumberType '>'
		//| support=PrimitiveTimeNumberType
		//)?
		public Alternatives getAlternatives_1_2() { return cAlternatives_1_2; }
		
		//'<' support=PrimitiveTimeNumberType '>'
		public Group getGroup_1_2_0() { return cGroup_1_2_0; }
		
		//'<'
		public Keyword getLessThanSignKeyword_1_2_0_0() { return cLessThanSignKeyword_1_2_0_0; }
		
		//support=PrimitiveTimeNumberType
		public Assignment getSupportAssignment_1_2_0_1() { return cSupportAssignment_1_2_0_1; }
		
		//PrimitiveTimeNumberType
		public RuleCall getSupportPrimitiveTimeNumberTypeParserRuleCall_1_2_0_1_0() { return cSupportPrimitiveTimeNumberTypeParserRuleCall_1_2_0_1_0; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_1_2_0_2() { return cGreaterThanSignKeyword_1_2_0_2; }
		
		//support=PrimitiveTimeNumberType
		public Assignment getSupportAssignment_1_2_1() { return cSupportAssignment_1_2_1; }
		
		//PrimitiveTimeNumberType
		public RuleCall getSupportPrimitiveTimeNumberTypeParserRuleCall_1_2_1_0() { return cSupportPrimitiveTimeNumberTypeParserRuleCall_1_2_1_0; }
	}
	public class PrimitiveTimeNumberTypeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PrimitiveTimeNumberType");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cPrimitiveIntegerTypeParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cPrimitiveRationalTypeParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cPrimitiveFloatTypeParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		private final RuleCall cPrimitiveRealTypeParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		
		//PrimitiveTimeNumberType returns fmlType::PrimitiveNumberType
		//    : PrimitiveIntegerType
		//    | PrimitiveRationalType
		//    | PrimitiveFloatType
		//    | PrimitiveRealType
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//PrimitiveIntegerType
		//   | PrimitiveRationalType
		//   | PrimitiveFloatType
		//   | PrimitiveRealType
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//PrimitiveIntegerType
		public RuleCall getPrimitiveIntegerTypeParserRuleCall_0() { return cPrimitiveIntegerTypeParserRuleCall_0; }
		
		//PrimitiveRationalType
		public RuleCall getPrimitiveRationalTypeParserRuleCall_1() { return cPrimitiveRationalTypeParserRuleCall_1; }
		
		//PrimitiveFloatType
		public RuleCall getPrimitiveFloatTypeParserRuleCall_2() { return cPrimitiveFloatTypeParserRuleCall_2; }
		
		//PrimitiveRealType
		public RuleCall getPrimitiveRealTypeParserRuleCall_3() { return cPrimitiveRealTypeParserRuleCall_3; }
	}
	public class OtherPrimitiveTypeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.OtherPrimitiveType");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cPrimitiveBooleanTypeParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cPrimitiveCharacterTypeParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cPrimitiveStringTypeParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		private final RuleCall cPrimitiveInstanceTypeParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		
		//OtherPrimitiveType returns fmlType::PrimitiveType
		//    : PrimitiveBooleanType
		//    | PrimitiveCharacterType
		//    | PrimitiveStringType
		//    | PrimitiveInstanceType
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//PrimitiveBooleanType
		//   | PrimitiveCharacterType
		//   | PrimitiveStringType
		//   | PrimitiveInstanceType
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//PrimitiveBooleanType
		public RuleCall getPrimitiveBooleanTypeParserRuleCall_0() { return cPrimitiveBooleanTypeParserRuleCall_0; }
		
		//PrimitiveCharacterType
		public RuleCall getPrimitiveCharacterTypeParserRuleCall_1() { return cPrimitiveCharacterTypeParserRuleCall_1; }
		
		//PrimitiveStringType
		public RuleCall getPrimitiveStringTypeParserRuleCall_2() { return cPrimitiveStringTypeParserRuleCall_2; }
		
		//PrimitiveInstanceType
		public RuleCall getPrimitiveInstanceTypeParserRuleCall_3() { return cPrimitiveInstanceTypeParserRuleCall_3; }
	}
	public class PrimitiveBooleanTypeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PrimitiveBooleanType");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cPrimitiveBooleanTypeAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final Alternatives cNameAlternatives_1_0 = (Alternatives)cNameAssignment_1.eContents().get(0);
		private final Keyword cNameBooleanKeyword_1_0_0 = (Keyword)cNameAlternatives_1_0.eContents().get(0);
		private final Keyword cNameBoolKeyword_1_0_1 = (Keyword)cNameAlternatives_1_0.eContents().get(1);
		
		//PrimitiveBooleanType returns fmlType::PrimitiveBooleanType
		//    : { fmlType::PrimitiveBooleanType }
		//        name=( 'boolean'| 'bool' )
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{ fmlType::PrimitiveBooleanType }
		//       name=( 'boolean'| 'bool' )
		public Group getGroup() { return cGroup; }
		
		//{ fmlType::PrimitiveBooleanType }
		public Action getPrimitiveBooleanTypeAction_0() { return cPrimitiveBooleanTypeAction_0; }
		
		//name=( 'boolean'| 'bool' )
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
		
		//( 'boolean'| 'bool' )
		public Alternatives getNameAlternatives_1_0() { return cNameAlternatives_1_0; }
		
		//'boolean'
		public Keyword getNameBooleanKeyword_1_0_0() { return cNameBooleanKeyword_1_0_0; }
		
		//'bool'
		public Keyword getNameBoolKeyword_1_0_1() { return cNameBoolKeyword_1_0_1; }
	}
	public class PrimitiveCharacterTypeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PrimitiveCharacterType");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cPrimitiveCharacterTypeAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cCharKeyword_1 = (Keyword)cGroup.eContents().get(1);
		
		//PrimitiveCharacterType returns fmlType::PrimitiveCharacterType
		//    : { fmlType::PrimitiveCharacterType } 'char'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{ fmlType::PrimitiveCharacterType } 'char'
		public Group getGroup() { return cGroup; }
		
		//{ fmlType::PrimitiveCharacterType }
		public Action getPrimitiveCharacterTypeAction_0() { return cPrimitiveCharacterTypeAction_0; }
		
		//'char'
		public Keyword getCharKeyword_1() { return cCharKeyword_1; }
	}
	public class PrimitiveStringTypeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PrimitiveStringType");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cPrimitiveStringTypeAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final Keyword cNameStringKeyword_1_0 = (Keyword)cNameAssignment_1.eContents().get(0);
		private final Alternatives cAlternatives_2 = (Alternatives)cGroup.eContents().get(2);
		private final Group cGroup_2_0 = (Group)cAlternatives_2.eContents().get(0);
		private final Keyword cColonKeyword_2_0_0 = (Keyword)cGroup_2_0.eContents().get(0);
		private final Assignment cSizeAssignment_2_0_1 = (Assignment)cGroup_2_0.eContents().get(1);
		private final RuleCall cSizeEIntParserRuleCall_2_0_1_0 = (RuleCall)cSizeAssignment_2_0_1.eContents().get(0);
		private final Group cGroup_2_1 = (Group)cAlternatives_2.eContents().get(1);
		private final Keyword cLessThanSignKeyword_2_1_0 = (Keyword)cGroup_2_1.eContents().get(0);
		private final Keyword cSizeKeyword_2_1_1 = (Keyword)cGroup_2_1.eContents().get(1);
		private final Assignment cSizeAssignment_2_1_2 = (Assignment)cGroup_2_1.eContents().get(2);
		private final RuleCall cSizeEIntParserRuleCall_2_1_2_0 = (RuleCall)cSizeAssignment_2_1_2.eContents().get(0);
		private final Keyword cGreaterThanSignKeyword_2_1_3 = (Keyword)cGroup_2_1.eContents().get(3);
		
		//PrimitiveStringType returns fmlType::PrimitiveStringType
		//    : { fmlType::PrimitiveStringType }
		//        name='string'
		//        ( ':' size = EInt
		//        | '<' ( 'size:' )? size = EInt '>'
		//        )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{ fmlType::PrimitiveStringType }
		//       name='string'
		//       ( ':' size = EInt
		//       | '<' ( 'size:' )? size = EInt '>'
		//       )?
		public Group getGroup() { return cGroup; }
		
		//{ fmlType::PrimitiveStringType }
		public Action getPrimitiveStringTypeAction_0() { return cPrimitiveStringTypeAction_0; }
		
		//name='string'
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
		
		//'string'
		public Keyword getNameStringKeyword_1_0() { return cNameStringKeyword_1_0; }
		
		//( ':' size = EInt
		//| '<' ( 'size:' )? size = EInt '>'
		//)?
		public Alternatives getAlternatives_2() { return cAlternatives_2; }
		
		//':' size = EInt
		public Group getGroup_2_0() { return cGroup_2_0; }
		
		//':'
		public Keyword getColonKeyword_2_0_0() { return cColonKeyword_2_0_0; }
		
		//size = EInt
		public Assignment getSizeAssignment_2_0_1() { return cSizeAssignment_2_0_1; }
		
		//EInt
		public RuleCall getSizeEIntParserRuleCall_2_0_1_0() { return cSizeEIntParserRuleCall_2_0_1_0; }
		
		//'<' ( 'size:' )? size = EInt '>'
		public Group getGroup_2_1() { return cGroup_2_1; }
		
		//'<'
		public Keyword getLessThanSignKeyword_2_1_0() { return cLessThanSignKeyword_2_1_0; }
		
		//( 'size:' )?
		public Keyword getSizeKeyword_2_1_1() { return cSizeKeyword_2_1_1; }
		
		//size = EInt
		public Assignment getSizeAssignment_2_1_2() { return cSizeAssignment_2_1_2; }
		
		//EInt
		public RuleCall getSizeEIntParserRuleCall_2_1_2_0() { return cSizeEIntParserRuleCall_2_1_2_0; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_2_1_3() { return cGreaterThanSignKeyword_2_1_3; }
	}
	public class PrimitiveInstanceTypeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PrimitiveInstanceType");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cPrimitiveInstanceTypeAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cExpectedAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cExpectedPrimitiveInstanceKindEnumRuleCall_1_0 = (RuleCall)cExpectedAssignment_1.eContents().get(0);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLessThanSignKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final Assignment cModelAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
		private final CrossReference cModelNamedElementCrossReference_2_1_0 = (CrossReference)cModelAssignment_2_1.eContents().get(0);
		private final RuleCall cModelNamedElementESIdentifierParserRuleCall_2_1_0_1 = (RuleCall)cModelNamedElementCrossReference_2_1_0.eContents().get(1);
		private final Keyword cGreaterThanSignKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		
		//PrimitiveInstanceType returns fmlType::PrimitiveInstanceType
		//    : { fmlType::PrimitiveInstanceType }
		//        expected=PrimitiveInstanceKind
		//        ( '<' model=[fmlCommon::NamedElement|ESIdentifier] '>' )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{ fmlType::PrimitiveInstanceType }
		//       expected=PrimitiveInstanceKind
		//       ( '<' model=[fmlCommon::NamedElement|ESIdentifier] '>' )?
		public Group getGroup() { return cGroup; }
		
		//{ fmlType::PrimitiveInstanceType }
		public Action getPrimitiveInstanceTypeAction_0() { return cPrimitiveInstanceTypeAction_0; }
		
		//expected=PrimitiveInstanceKind
		public Assignment getExpectedAssignment_1() { return cExpectedAssignment_1; }
		
		//PrimitiveInstanceKind
		public RuleCall getExpectedPrimitiveInstanceKindEnumRuleCall_1_0() { return cExpectedPrimitiveInstanceKindEnumRuleCall_1_0; }
		
		//( '<' model=[fmlCommon::NamedElement|ESIdentifier] '>' )?
		public Group getGroup_2() { return cGroup_2; }
		
		//'<'
		public Keyword getLessThanSignKeyword_2_0() { return cLessThanSignKeyword_2_0; }
		
		//model=[fmlCommon::NamedElement|ESIdentifier]
		public Assignment getModelAssignment_2_1() { return cModelAssignment_2_1; }
		
		//[fmlCommon::NamedElement|ESIdentifier]
		public CrossReference getModelNamedElementCrossReference_2_1_0() { return cModelNamedElementCrossReference_2_1_0; }
		
		//ESIdentifier
		public RuleCall getModelNamedElementESIdentifierParserRuleCall_2_1_0_1() { return cModelNamedElementESIdentifierParserRuleCall_2_1_0_1; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_2_2() { return cGreaterThanSignKeyword_2_2; }
	}
	public class IntervalTypeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.IntervalType");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cIntervalTypeAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final Keyword cNameIntervalKeyword_1_0 = (Keyword)cNameAssignment_1.eContents().get(0);
		private final Keyword cLessThanSignKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cSupportAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cSupportPrimitiveNumberTypeParserRuleCall_3_0 = (RuleCall)cSupportAssignment_3.eContents().get(0);
		private final Alternatives cAlternatives_4 = (Alternatives)cGroup.eContents().get(4);
		private final Assignment cLopenAssignment_4_0 = (Assignment)cAlternatives_4.eContents().get(0);
		private final Keyword cLopenRightSquareBracketKeyword_4_0_0 = (Keyword)cLopenAssignment_4_0.eContents().get(0);
		private final Keyword cLeftSquareBracketKeyword_4_1 = (Keyword)cAlternatives_4.eContents().get(1);
		private final Assignment cInfimumAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cInfimumExpressionParserRuleCall_5_0 = (RuleCall)cInfimumAssignment_5.eContents().get(0);
		private final Keyword cCommaKeyword_6 = (Keyword)cGroup.eContents().get(6);
		private final Assignment cSupremumAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cSupremumExpressionParserRuleCall_7_0 = (RuleCall)cSupremumAssignment_7.eContents().get(0);
		private final Alternatives cAlternatives_8 = (Alternatives)cGroup.eContents().get(8);
		private final Keyword cRightSquareBracketKeyword_8_0 = (Keyword)cAlternatives_8.eContents().get(0);
		private final Assignment cRopenAssignment_8_1 = (Assignment)cAlternatives_8.eContents().get(1);
		private final Keyword cRopenLeftSquareBracketKeyword_8_1_0 = (Keyword)cRopenAssignment_8_1.eContents().get(0);
		private final Keyword cGreaterThanSignKeyword_9 = (Keyword)cGroup.eContents().get(9);
		
		//IntervalType returns fmlType::IntervalType
		//    : {fmlType::IntervalType}
		//        name='interval'
		//        '<'
		//            support=PrimitiveNumberType
		//            ( lopen?=']' | '[' )
		//            infimum=Expression ',' supremum=Expression
		//            ( ']' |  ropen?='[' )
		//        '>'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlType::IntervalType}
		//       name='interval'
		//       '<'
		//           support=PrimitiveNumberType
		//           ( lopen?=']' | '[' )
		//           infimum=Expression ',' supremum=Expression
		//           ( ']' |  ropen?='[' )
		//       '>'
		public Group getGroup() { return cGroup; }
		
		//{fmlType::IntervalType}
		public Action getIntervalTypeAction_0() { return cIntervalTypeAction_0; }
		
		//name='interval'
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
		
		//'interval'
		public Keyword getNameIntervalKeyword_1_0() { return cNameIntervalKeyword_1_0; }
		
		//'<'
		public Keyword getLessThanSignKeyword_2() { return cLessThanSignKeyword_2; }
		
		//support=PrimitiveNumberType
		public Assignment getSupportAssignment_3() { return cSupportAssignment_3; }
		
		//PrimitiveNumberType
		public RuleCall getSupportPrimitiveNumberTypeParserRuleCall_3_0() { return cSupportPrimitiveNumberTypeParserRuleCall_3_0; }
		
		//( lopen?=']' | '[' )
		public Alternatives getAlternatives_4() { return cAlternatives_4; }
		
		//lopen?=']'
		public Assignment getLopenAssignment_4_0() { return cLopenAssignment_4_0; }
		
		//']'
		public Keyword getLopenRightSquareBracketKeyword_4_0_0() { return cLopenRightSquareBracketKeyword_4_0_0; }
		
		//'['
		public Keyword getLeftSquareBracketKeyword_4_1() { return cLeftSquareBracketKeyword_4_1; }
		
		//infimum=Expression
		public Assignment getInfimumAssignment_5() { return cInfimumAssignment_5; }
		
		//Expression
		public RuleCall getInfimumExpressionParserRuleCall_5_0() { return cInfimumExpressionParserRuleCall_5_0; }
		
		//','
		public Keyword getCommaKeyword_6() { return cCommaKeyword_6; }
		
		//supremum=Expression
		public Assignment getSupremumAssignment_7() { return cSupremumAssignment_7; }
		
		//Expression
		public RuleCall getSupremumExpressionParserRuleCall_7_0() { return cSupremumExpressionParserRuleCall_7_0; }
		
		//( ']' |  ropen?='[' )
		public Alternatives getAlternatives_8() { return cAlternatives_8; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_8_0() { return cRightSquareBracketKeyword_8_0; }
		
		//ropen?='['
		public Assignment getRopenAssignment_8_1() { return cRopenAssignment_8_1; }
		
		//'['
		public Keyword getRopenLeftSquareBracketKeyword_8_1_0() { return cRopenLeftSquareBracketKeyword_8_1_0; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_9() { return cGreaterThanSignKeyword_9; }
	}
	public class IntervalTypeDefinitionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.IntervalTypeDefinition");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cIntervalTypeAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cVisibilityAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cVisibilityVisibilityKindEnumRuleCall_1_0 = (RuleCall)cVisibilityAssignment_1.eContents().get(0);
		private final Keyword cTypeKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
		private final Keyword cIntervalKeyword_5 = (Keyword)cGroup.eContents().get(5);
		private final Keyword cLessThanSignKeyword_6 = (Keyword)cGroup.eContents().get(6);
		private final Assignment cSupportAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cSupportPrimitiveNumberTypeParserRuleCall_7_0 = (RuleCall)cSupportAssignment_7.eContents().get(0);
		private final Alternatives cAlternatives_8 = (Alternatives)cGroup.eContents().get(8);
		private final Assignment cLopenAssignment_8_0 = (Assignment)cAlternatives_8.eContents().get(0);
		private final Keyword cLopenRightSquareBracketKeyword_8_0_0 = (Keyword)cLopenAssignment_8_0.eContents().get(0);
		private final Keyword cLeftSquareBracketKeyword_8_1 = (Keyword)cAlternatives_8.eContents().get(1);
		private final Assignment cInfimumAssignment_9 = (Assignment)cGroup.eContents().get(9);
		private final RuleCall cInfimumExpressionParserRuleCall_9_0 = (RuleCall)cInfimumAssignment_9.eContents().get(0);
		private final Keyword cCommaKeyword_10 = (Keyword)cGroup.eContents().get(10);
		private final Assignment cSupremumAssignment_11 = (Assignment)cGroup.eContents().get(11);
		private final RuleCall cSupremumExpressionParserRuleCall_11_0 = (RuleCall)cSupremumAssignment_11.eContents().get(0);
		private final Alternatives cAlternatives_12 = (Alternatives)cGroup.eContents().get(12);
		private final Keyword cRightSquareBracketKeyword_12_0 = (Keyword)cAlternatives_12.eContents().get(0);
		private final Assignment cRopenAssignment_12_1 = (Assignment)cAlternatives_12.eContents().get(1);
		private final Keyword cRopenLeftSquareBracketKeyword_12_1_0 = (Keyword)cRopenAssignment_12_1.eContents().get(0);
		private final Keyword cGreaterThanSignKeyword_13 = (Keyword)cGroup.eContents().get(13);
		private final Keyword cSemicolonKeyword_14 = (Keyword)cGroup.eContents().get(14);
		
		//IntervalTypeDefinition returns fmlType::IntervalType
		//    : {fmlType::IntervalType}
		//        ( visibility=VisibilityKind )? 'type'
		//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//        'interval'
		//        '<'
		//            support=PrimitiveNumberType
		//            ( lopen?=']' | '[' )
		//            infimum=Expression ',' supremum=Expression
		//            ( ']' |  ropen?='[' )
		//        '>' ';'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlType::IntervalType}
		//       ( visibility=VisibilityKind )? 'type'
		//       name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//       'interval'
		//       '<'
		//           support=PrimitiveNumberType
		//           ( lopen?=']' | '[' )
		//           infimum=Expression ',' supremum=Expression
		//           ( ']' |  ropen?='[' )
		//       '>' ';'
		public Group getGroup() { return cGroup; }
		
		//{fmlType::IntervalType}
		public Action getIntervalTypeAction_0() { return cIntervalTypeAction_0; }
		
		//( visibility=VisibilityKind )?
		public Assignment getVisibilityAssignment_1() { return cVisibilityAssignment_1; }
		
		//VisibilityKind
		public RuleCall getVisibilityVisibilityKindEnumRuleCall_1_0() { return cVisibilityVisibilityKindEnumRuleCall_1_0; }
		
		//'type'
		public Keyword getTypeKeyword_2() { return cTypeKeyword_2; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
		
		//'interval'
		public Keyword getIntervalKeyword_5() { return cIntervalKeyword_5; }
		
		//'<'
		public Keyword getLessThanSignKeyword_6() { return cLessThanSignKeyword_6; }
		
		//support=PrimitiveNumberType
		public Assignment getSupportAssignment_7() { return cSupportAssignment_7; }
		
		//PrimitiveNumberType
		public RuleCall getSupportPrimitiveNumberTypeParserRuleCall_7_0() { return cSupportPrimitiveNumberTypeParserRuleCall_7_0; }
		
		//( lopen?=']' | '[' )
		public Alternatives getAlternatives_8() { return cAlternatives_8; }
		
		//lopen?=']'
		public Assignment getLopenAssignment_8_0() { return cLopenAssignment_8_0; }
		
		//']'
		public Keyword getLopenRightSquareBracketKeyword_8_0_0() { return cLopenRightSquareBracketKeyword_8_0_0; }
		
		//'['
		public Keyword getLeftSquareBracketKeyword_8_1() { return cLeftSquareBracketKeyword_8_1; }
		
		//infimum=Expression
		public Assignment getInfimumAssignment_9() { return cInfimumAssignment_9; }
		
		//Expression
		public RuleCall getInfimumExpressionParserRuleCall_9_0() { return cInfimumExpressionParserRuleCall_9_0; }
		
		//','
		public Keyword getCommaKeyword_10() { return cCommaKeyword_10; }
		
		//supremum=Expression
		public Assignment getSupremumAssignment_11() { return cSupremumAssignment_11; }
		
		//Expression
		public RuleCall getSupremumExpressionParserRuleCall_11_0() { return cSupremumExpressionParserRuleCall_11_0; }
		
		//( ']' |  ropen?='[' )
		public Alternatives getAlternatives_12() { return cAlternatives_12; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_12_0() { return cRightSquareBracketKeyword_12_0; }
		
		//ropen?='['
		public Assignment getRopenAssignment_12_1() { return cRopenAssignment_12_1; }
		
		//'['
		public Keyword getRopenLeftSquareBracketKeyword_12_1_0() { return cRopenLeftSquareBracketKeyword_12_1_0; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_13() { return cGreaterThanSignKeyword_13; }
		
		//';'
		public Keyword getSemicolonKeyword_14() { return cSemicolonKeyword_14; }
	}
	public class IntervalTypeDefinitionImplElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.IntervalTypeDefinitionImpl");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cIntervalTypeAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameESIdentifierParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0 = (RuleCall)cUnrestrictedNameAssignment_2.eContents().get(0);
		private final Keyword cIntervalKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Keyword cLessThanSignKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Assignment cSupportAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cSupportPrimitiveNumberTypeParserRuleCall_5_0 = (RuleCall)cSupportAssignment_5.eContents().get(0);
		private final Alternatives cAlternatives_6 = (Alternatives)cGroup.eContents().get(6);
		private final Assignment cLopenAssignment_6_0 = (Assignment)cAlternatives_6.eContents().get(0);
		private final Keyword cLopenRightSquareBracketKeyword_6_0_0 = (Keyword)cLopenAssignment_6_0.eContents().get(0);
		private final Keyword cLeftSquareBracketKeyword_6_1 = (Keyword)cAlternatives_6.eContents().get(1);
		private final Assignment cInfimumAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cInfimumExpressionParserRuleCall_7_0 = (RuleCall)cInfimumAssignment_7.eContents().get(0);
		private final Keyword cCommaKeyword_8 = (Keyword)cGroup.eContents().get(8);
		private final Assignment cSupremumAssignment_9 = (Assignment)cGroup.eContents().get(9);
		private final RuleCall cSupremumExpressionParserRuleCall_9_0 = (RuleCall)cSupremumAssignment_9.eContents().get(0);
		private final Alternatives cAlternatives_10 = (Alternatives)cGroup.eContents().get(10);
		private final Keyword cRightSquareBracketKeyword_10_0 = (Keyword)cAlternatives_10.eContents().get(0);
		private final Assignment cRopenAssignment_10_1 = (Assignment)cAlternatives_10.eContents().get(1);
		private final Keyword cRopenLeftSquareBracketKeyword_10_1_0 = (Keyword)cRopenAssignment_10_1.eContents().get(0);
		private final Keyword cGreaterThanSignKeyword_11 = (Keyword)cGroup.eContents().get(11);
		private final Keyword cSemicolonKeyword_12 = (Keyword)cGroup.eContents().get(12);
		
		//IntervalTypeDefinitionImpl returns fmlType::IntervalType
		//    : {fmlType::IntervalType}
		//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//        'interval'
		//        '<'
		//            support=PrimitiveNumberType
		//            ( lopen?=']' | '[' )
		//            infimum=Expression ',' supremum=Expression
		//            ( ']' |  ropen?='[' )
		//        '>' ';'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlType::IntervalType}
		//       name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//       'interval'
		//       '<'
		//           support=PrimitiveNumberType
		//           ( lopen?=']' | '[' )
		//           infimum=Expression ',' supremum=Expression
		//           ( ']' |  ropen?='[' )
		//       '>' ';'
		public Group getGroup() { return cGroup; }
		
		//{fmlType::IntervalType}
		public Action getIntervalTypeAction_0() { return cIntervalTypeAction_0; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_1_0() { return cNameESIdentifierParserRuleCall_1_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_2() { return cUnrestrictedNameAssignment_2; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0; }
		
		//'interval'
		public Keyword getIntervalKeyword_3() { return cIntervalKeyword_3; }
		
		//'<'
		public Keyword getLessThanSignKeyword_4() { return cLessThanSignKeyword_4; }
		
		//support=PrimitiveNumberType
		public Assignment getSupportAssignment_5() { return cSupportAssignment_5; }
		
		//PrimitiveNumberType
		public RuleCall getSupportPrimitiveNumberTypeParserRuleCall_5_0() { return cSupportPrimitiveNumberTypeParserRuleCall_5_0; }
		
		//( lopen?=']' | '[' )
		public Alternatives getAlternatives_6() { return cAlternatives_6; }
		
		//lopen?=']'
		public Assignment getLopenAssignment_6_0() { return cLopenAssignment_6_0; }
		
		//']'
		public Keyword getLopenRightSquareBracketKeyword_6_0_0() { return cLopenRightSquareBracketKeyword_6_0_0; }
		
		//'['
		public Keyword getLeftSquareBracketKeyword_6_1() { return cLeftSquareBracketKeyword_6_1; }
		
		//infimum=Expression
		public Assignment getInfimumAssignment_7() { return cInfimumAssignment_7; }
		
		//Expression
		public RuleCall getInfimumExpressionParserRuleCall_7_0() { return cInfimumExpressionParserRuleCall_7_0; }
		
		//','
		public Keyword getCommaKeyword_8() { return cCommaKeyword_8; }
		
		//supremum=Expression
		public Assignment getSupremumAssignment_9() { return cSupremumAssignment_9; }
		
		//Expression
		public RuleCall getSupremumExpressionParserRuleCall_9_0() { return cSupremumExpressionParserRuleCall_9_0; }
		
		//( ']' |  ropen?='[' )
		public Alternatives getAlternatives_10() { return cAlternatives_10; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_10_0() { return cRightSquareBracketKeyword_10_0; }
		
		//ropen?='['
		public Assignment getRopenAssignment_10_1() { return cRopenAssignment_10_1; }
		
		//'['
		public Keyword getRopenLeftSquareBracketKeyword_10_1_0() { return cRopenLeftSquareBracketKeyword_10_1_0; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_11() { return cGreaterThanSignKeyword_11; }
		
		//';'
		public Keyword getSemicolonKeyword_12() { return cSemicolonKeyword_12; }
	}
	public class CollectionTypeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.CollectionType");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cCollectionTypeAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cContainerAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cContainerCollectionKindEnumRuleCall_1_0 = (RuleCall)cContainerAssignment_1.eContents().get(0);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLessThanSignKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final Assignment cSupportAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
		private final RuleCall cSupportDataTypeParserRuleCall_2_1_0 = (RuleCall)cSupportAssignment_2_1.eContents().get(0);
		private final Group cGroup_2_2 = (Group)cGroup_2.eContents().get(2);
		private final Keyword cCommaKeyword_2_2_0 = (Keyword)cGroup_2_2.eContents().get(0);
		private final Alternatives cAlternatives_2_2_1 = (Alternatives)cGroup_2_2.eContents().get(1);
		private final Assignment cSizeAssignment_2_2_1_0 = (Assignment)cAlternatives_2_2_1.eContents().get(0);
		private final RuleCall cSizeEIntParserRuleCall_2_2_1_0_0 = (RuleCall)cSizeAssignment_2_2_1_0.eContents().get(0);
		private final Assignment cUnboundedAssignment_2_2_1_1 = (Assignment)cAlternatives_2_2_1.eContents().get(1);
		private final Keyword cUnboundedAsteriskKeyword_2_2_1_1_0 = (Keyword)cUnboundedAssignment_2_2_1_1.eContents().get(0);
		private final Keyword cGreaterThanSignKeyword_2_3 = (Keyword)cGroup_2.eContents().get(3);
		
		//// TODO
		//// mettre à jour la grammaire par rapport au noyau, i.e.
		//// CollectionKind | CollectionKind< size > | CollectionKind< type , size >
		//CollectionType returns fmlType::CollectionType
		//    : {fmlType::CollectionType}
		//        container = CollectionKind
		//        ( '<'
		//            support=DataType
		//            ( ',' ( size=EInt | unbounded?='*' ) )?
		//        '>' )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlType::CollectionType}
		//       container = CollectionKind
		//       ( '<'
		//           support=DataType
		//           ( ',' ( size=EInt | unbounded?='*' ) )?
		//       '>' )?
		public Group getGroup() { return cGroup; }
		
		//{fmlType::CollectionType}
		public Action getCollectionTypeAction_0() { return cCollectionTypeAction_0; }
		
		//container = CollectionKind
		public Assignment getContainerAssignment_1() { return cContainerAssignment_1; }
		
		//CollectionKind
		public RuleCall getContainerCollectionKindEnumRuleCall_1_0() { return cContainerCollectionKindEnumRuleCall_1_0; }
		
		//( '<'
		//    support=DataType
		//    ( ',' ( size=EInt | unbounded?='*' ) )?
		//'>' )?
		public Group getGroup_2() { return cGroup_2; }
		
		//'<'
		public Keyword getLessThanSignKeyword_2_0() { return cLessThanSignKeyword_2_0; }
		
		//support=DataType
		public Assignment getSupportAssignment_2_1() { return cSupportAssignment_2_1; }
		
		//DataType
		public RuleCall getSupportDataTypeParserRuleCall_2_1_0() { return cSupportDataTypeParserRuleCall_2_1_0; }
		
		//( ',' ( size=EInt | unbounded?='*' ) )?
		public Group getGroup_2_2() { return cGroup_2_2; }
		
		//','
		public Keyword getCommaKeyword_2_2_0() { return cCommaKeyword_2_2_0; }
		
		//( size=EInt | unbounded?='*' )
		public Alternatives getAlternatives_2_2_1() { return cAlternatives_2_2_1; }
		
		//size=EInt
		public Assignment getSizeAssignment_2_2_1_0() { return cSizeAssignment_2_2_1_0; }
		
		//EInt
		public RuleCall getSizeEIntParserRuleCall_2_2_1_0_0() { return cSizeEIntParserRuleCall_2_2_1_0_0; }
		
		//unbounded?='*'
		public Assignment getUnboundedAssignment_2_2_1_1() { return cUnboundedAssignment_2_2_1_1; }
		
		//'*'
		public Keyword getUnboundedAsteriskKeyword_2_2_1_1_0() { return cUnboundedAsteriskKeyword_2_2_1_1_0; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_2_3() { return cGreaterThanSignKeyword_2_3; }
	}
	public class CollectionTypeDefinitionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.CollectionTypeDefinition");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cCollectionTypeAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cVisibilityAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cVisibilityVisibilityKindEnumRuleCall_1_0 = (RuleCall)cVisibilityAssignment_1.eContents().get(0);
		private final Keyword cTypeKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
		private final Assignment cContainerAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cContainerCollectionKindEnumRuleCall_5_0 = (RuleCall)cContainerAssignment_5.eContents().get(0);
		private final Keyword cLessThanSignKeyword_6 = (Keyword)cGroup.eContents().get(6);
		private final Assignment cSupportAssignment_7 = (Assignment)cGroup.eContents().get(7);
		private final RuleCall cSupportDataTypeParserRuleCall_7_0 = (RuleCall)cSupportAssignment_7.eContents().get(0);
		private final Group cGroup_8 = (Group)cGroup.eContents().get(8);
		private final Keyword cCommaKeyword_8_0 = (Keyword)cGroup_8.eContents().get(0);
		private final Alternatives cAlternatives_8_1 = (Alternatives)cGroup_8.eContents().get(1);
		private final Assignment cSizeAssignment_8_1_0 = (Assignment)cAlternatives_8_1.eContents().get(0);
		private final RuleCall cSizeEIntParserRuleCall_8_1_0_0 = (RuleCall)cSizeAssignment_8_1_0.eContents().get(0);
		private final Assignment cUnboundedAssignment_8_1_1 = (Assignment)cAlternatives_8_1.eContents().get(1);
		private final Keyword cUnboundedAsteriskKeyword_8_1_1_0 = (Keyword)cUnboundedAssignment_8_1_1.eContents().get(0);
		private final Keyword cGreaterThanSignKeyword_9 = (Keyword)cGroup.eContents().get(9);
		private final Keyword cSemicolonKeyword_10 = (Keyword)cGroup.eContents().get(10);
		
		//CollectionTypeDefinition returns fmlType::CollectionType
		//    : {fmlType::CollectionType}
		//        ( visibility=VisibilityKind )? 'type'
		//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//        container = CollectionKind
		//        '<'
		//            support=DataType
		//            ( ',' ( size=EInt | unbounded?='*' ) )?
		//        '>' ';'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlType::CollectionType}
		//       ( visibility=VisibilityKind )? 'type'
		//       name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//       container = CollectionKind
		//       '<'
		//           support=DataType
		//           ( ',' ( size=EInt | unbounded?='*' ) )?
		//       '>' ';'
		public Group getGroup() { return cGroup; }
		
		//{fmlType::CollectionType}
		public Action getCollectionTypeAction_0() { return cCollectionTypeAction_0; }
		
		//( visibility=VisibilityKind )?
		public Assignment getVisibilityAssignment_1() { return cVisibilityAssignment_1; }
		
		//VisibilityKind
		public RuleCall getVisibilityVisibilityKindEnumRuleCall_1_0() { return cVisibilityVisibilityKindEnumRuleCall_1_0; }
		
		//'type'
		public Keyword getTypeKeyword_2() { return cTypeKeyword_2; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
		
		//container = CollectionKind
		public Assignment getContainerAssignment_5() { return cContainerAssignment_5; }
		
		//CollectionKind
		public RuleCall getContainerCollectionKindEnumRuleCall_5_0() { return cContainerCollectionKindEnumRuleCall_5_0; }
		
		//'<'
		public Keyword getLessThanSignKeyword_6() { return cLessThanSignKeyword_6; }
		
		//support=DataType
		public Assignment getSupportAssignment_7() { return cSupportAssignment_7; }
		
		//DataType
		public RuleCall getSupportDataTypeParserRuleCall_7_0() { return cSupportDataTypeParserRuleCall_7_0; }
		
		//( ',' ( size=EInt | unbounded?='*' ) )?
		public Group getGroup_8() { return cGroup_8; }
		
		//','
		public Keyword getCommaKeyword_8_0() { return cCommaKeyword_8_0; }
		
		//( size=EInt | unbounded?='*' )
		public Alternatives getAlternatives_8_1() { return cAlternatives_8_1; }
		
		//size=EInt
		public Assignment getSizeAssignment_8_1_0() { return cSizeAssignment_8_1_0; }
		
		//EInt
		public RuleCall getSizeEIntParserRuleCall_8_1_0_0() { return cSizeEIntParserRuleCall_8_1_0_0; }
		
		//unbounded?='*'
		public Assignment getUnboundedAssignment_8_1_1() { return cUnboundedAssignment_8_1_1; }
		
		//'*'
		public Keyword getUnboundedAsteriskKeyword_8_1_1_0() { return cUnboundedAsteriskKeyword_8_1_1_0; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_9() { return cGreaterThanSignKeyword_9; }
		
		//';'
		public Keyword getSemicolonKeyword_10() { return cSemicolonKeyword_10; }
	}
	public class CollectionTypeDefinitionImplElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.CollectionTypeDefinitionImpl");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cCollectionTypeAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameESIdentifierParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0 = (RuleCall)cUnrestrictedNameAssignment_2.eContents().get(0);
		private final Assignment cContainerAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cContainerCollectionKindEnumRuleCall_3_0 = (RuleCall)cContainerAssignment_3.eContents().get(0);
		private final Keyword cLessThanSignKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Assignment cSupportAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cSupportDataTypeParserRuleCall_5_0 = (RuleCall)cSupportAssignment_5.eContents().get(0);
		private final Group cGroup_6 = (Group)cGroup.eContents().get(6);
		private final Keyword cCommaKeyword_6_0 = (Keyword)cGroup_6.eContents().get(0);
		private final Alternatives cAlternatives_6_1 = (Alternatives)cGroup_6.eContents().get(1);
		private final Assignment cSizeAssignment_6_1_0 = (Assignment)cAlternatives_6_1.eContents().get(0);
		private final RuleCall cSizeEIntParserRuleCall_6_1_0_0 = (RuleCall)cSizeAssignment_6_1_0.eContents().get(0);
		private final Assignment cUnboundedAssignment_6_1_1 = (Assignment)cAlternatives_6_1.eContents().get(1);
		private final Keyword cUnboundedAsteriskKeyword_6_1_1_0 = (Keyword)cUnboundedAssignment_6_1_1.eContents().get(0);
		private final Keyword cGreaterThanSignKeyword_7 = (Keyword)cGroup.eContents().get(7);
		private final Keyword cSemicolonKeyword_8 = (Keyword)cGroup.eContents().get(8);
		
		//CollectionTypeDefinitionImpl returns fmlType::CollectionType
		//    : {fmlType::CollectionType}
		//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//        container = CollectionKind
		//        '<'
		//            support=DataType
		//            ( ',' ( size=EInt | unbounded?='*' ) )?
		//        '>' ';'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlType::CollectionType}
		//       name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//       container = CollectionKind
		//       '<'
		//           support=DataType
		//           ( ',' ( size=EInt | unbounded?='*' ) )?
		//       '>' ';'
		public Group getGroup() { return cGroup; }
		
		//{fmlType::CollectionType}
		public Action getCollectionTypeAction_0() { return cCollectionTypeAction_0; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_1_0() { return cNameESIdentifierParserRuleCall_1_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_2() { return cUnrestrictedNameAssignment_2; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0; }
		
		//container = CollectionKind
		public Assignment getContainerAssignment_3() { return cContainerAssignment_3; }
		
		//CollectionKind
		public RuleCall getContainerCollectionKindEnumRuleCall_3_0() { return cContainerCollectionKindEnumRuleCall_3_0; }
		
		//'<'
		public Keyword getLessThanSignKeyword_4() { return cLessThanSignKeyword_4; }
		
		//support=DataType
		public Assignment getSupportAssignment_5() { return cSupportAssignment_5; }
		
		//DataType
		public RuleCall getSupportDataTypeParserRuleCall_5_0() { return cSupportDataTypeParserRuleCall_5_0; }
		
		//( ',' ( size=EInt | unbounded?='*' ) )?
		public Group getGroup_6() { return cGroup_6; }
		
		//','
		public Keyword getCommaKeyword_6_0() { return cCommaKeyword_6_0; }
		
		//( size=EInt | unbounded?='*' )
		public Alternatives getAlternatives_6_1() { return cAlternatives_6_1; }
		
		//size=EInt
		public Assignment getSizeAssignment_6_1_0() { return cSizeAssignment_6_1_0; }
		
		//EInt
		public RuleCall getSizeEIntParserRuleCall_6_1_0_0() { return cSizeEIntParserRuleCall_6_1_0_0; }
		
		//unbounded?='*'
		public Assignment getUnboundedAssignment_6_1_1() { return cUnboundedAssignment_6_1_1; }
		
		//'*'
		public Keyword getUnboundedAsteriskKeyword_6_1_1_0() { return cUnboundedAsteriskKeyword_6_1_1_0; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_7() { return cGreaterThanSignKeyword_7; }
		
		//';'
		public Keyword getSemicolonKeyword_8() { return cSemicolonKeyword_8; }
	}
	public class EnumerationTypeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.EnumerationType");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cEnumerationTypeAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cEnumKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLessThanSignKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final Keyword cSuperKeyword_2_1 = (Keyword)cGroup_2.eContents().get(1);
		private final Assignment cSuperTypeAssignment_2_2 = (Assignment)cGroup_2.eContents().get(2);
		private final CrossReference cSuperTypeEnumerationTypeCrossReference_2_2_0 = (CrossReference)cSuperTypeAssignment_2_2.eContents().get(0);
		private final RuleCall cSuperTypeEnumerationTypeESUfidParserRuleCall_2_2_0_1 = (RuleCall)cSuperTypeEnumerationTypeCrossReference_2_2_0.eContents().get(1);
		private final Keyword cGreaterThanSignKeyword_2_3 = (Keyword)cGroup_2.eContents().get(3);
		private final Keyword cLeftCurlyBracketKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Assignment cLiteralAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cLiteralEnumerationLiteralParserRuleCall_4_0 = (RuleCall)cLiteralAssignment_4.eContents().get(0);
		private final Group cGroup_5 = (Group)cGroup.eContents().get(5);
		private final Keyword cCommaKeyword_5_0 = (Keyword)cGroup_5.eContents().get(0);
		private final Assignment cLiteralAssignment_5_1 = (Assignment)cGroup_5.eContents().get(1);
		private final RuleCall cLiteralEnumerationLiteralParserRuleCall_5_1_0 = (RuleCall)cLiteralAssignment_5_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_6 = (Keyword)cGroup.eContents().get(6);
		
		//EnumerationType returns fmlType::EnumerationType
		//    : {fmlType::EnumerationType}
		//        'enum'  ( '<' ( 'super:' )? superType=[fmlType::EnumerationType|ESUfid] '>') ?
		//        '{'
		//            literal+= EnumerationLiteral  ( ',' literal+= EnumerationLiteral )*
		//        '}'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlType::EnumerationType}
		//       'enum'  ( '<' ( 'super:' )? superType=[fmlType::EnumerationType|ESUfid] '>') ?
		//       '{'
		//           literal+= EnumerationLiteral  ( ',' literal+= EnumerationLiteral )*
		//       '}'
		public Group getGroup() { return cGroup; }
		
		//{fmlType::EnumerationType}
		public Action getEnumerationTypeAction_0() { return cEnumerationTypeAction_0; }
		
		//'enum'
		public Keyword getEnumKeyword_1() { return cEnumKeyword_1; }
		
		//( '<' ( 'super:' )? superType=[fmlType::EnumerationType|ESUfid] '>') ?
		public Group getGroup_2() { return cGroup_2; }
		
		//'<'
		public Keyword getLessThanSignKeyword_2_0() { return cLessThanSignKeyword_2_0; }
		
		//( 'super:' )?
		public Keyword getSuperKeyword_2_1() { return cSuperKeyword_2_1; }
		
		//superType=[fmlType::EnumerationType|ESUfid]
		public Assignment getSuperTypeAssignment_2_2() { return cSuperTypeAssignment_2_2; }
		
		//[fmlType::EnumerationType|ESUfid]
		public CrossReference getSuperTypeEnumerationTypeCrossReference_2_2_0() { return cSuperTypeEnumerationTypeCrossReference_2_2_0; }
		
		//ESUfid
		public RuleCall getSuperTypeEnumerationTypeESUfidParserRuleCall_2_2_0_1() { return cSuperTypeEnumerationTypeESUfidParserRuleCall_2_2_0_1; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_2_3() { return cGreaterThanSignKeyword_2_3; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_3() { return cLeftCurlyBracketKeyword_3; }
		
		//literal+= EnumerationLiteral
		public Assignment getLiteralAssignment_4() { return cLiteralAssignment_4; }
		
		//EnumerationLiteral
		public RuleCall getLiteralEnumerationLiteralParserRuleCall_4_0() { return cLiteralEnumerationLiteralParserRuleCall_4_0; }
		
		//( ',' literal+= EnumerationLiteral )*
		public Group getGroup_5() { return cGroup_5; }
		
		//','
		public Keyword getCommaKeyword_5_0() { return cCommaKeyword_5_0; }
		
		//literal+= EnumerationLiteral
		public Assignment getLiteralAssignment_5_1() { return cLiteralAssignment_5_1; }
		
		//EnumerationLiteral
		public RuleCall getLiteralEnumerationLiteralParserRuleCall_5_1_0() { return cLiteralEnumerationLiteralParserRuleCall_5_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_6() { return cRightCurlyBracketKeyword_6; }
	}
	public class EnumerationTypeDefinitionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.EnumerationTypeDefinition");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cEnumerationTypeAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cVisibilityAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cVisibilityVisibilityKindEnumRuleCall_1_0 = (RuleCall)cVisibilityAssignment_1.eContents().get(0);
		private final Assignment cTypedefAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final Keyword cTypedefTypeKeyword_2_0 = (Keyword)cTypedefAssignment_2.eContents().get(0);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
		private final Keyword cEnumKeyword_5 = (Keyword)cGroup.eContents().get(5);
		private final Group cGroup_6 = (Group)cGroup.eContents().get(6);
		private final Keyword cLessThanSignKeyword_6_0 = (Keyword)cGroup_6.eContents().get(0);
		private final Keyword cSuperKeyword_6_1 = (Keyword)cGroup_6.eContents().get(1);
		private final Assignment cSuperTypeAssignment_6_2 = (Assignment)cGroup_6.eContents().get(2);
		private final CrossReference cSuperTypeEnumerationTypeCrossReference_6_2_0 = (CrossReference)cSuperTypeAssignment_6_2.eContents().get(0);
		private final RuleCall cSuperTypeEnumerationTypeESUfidParserRuleCall_6_2_0_1 = (RuleCall)cSuperTypeEnumerationTypeCrossReference_6_2_0.eContents().get(1);
		private final Keyword cGreaterThanSignKeyword_6_3 = (Keyword)cGroup_6.eContents().get(3);
		private final Keyword cLeftCurlyBracketKeyword_7 = (Keyword)cGroup.eContents().get(7);
		private final Assignment cLiteralAssignment_8 = (Assignment)cGroup.eContents().get(8);
		private final RuleCall cLiteralEnumerationLiteralParserRuleCall_8_0 = (RuleCall)cLiteralAssignment_8.eContents().get(0);
		private final Group cGroup_9 = (Group)cGroup.eContents().get(9);
		private final Keyword cCommaKeyword_9_0 = (Keyword)cGroup_9.eContents().get(0);
		private final Assignment cLiteralAssignment_9_1 = (Assignment)cGroup_9.eContents().get(1);
		private final RuleCall cLiteralEnumerationLiteralParserRuleCall_9_1_0 = (RuleCall)cLiteralAssignment_9_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_10 = (Keyword)cGroup.eContents().get(10);
		
		//EnumerationTypeDefinition returns fmlType::EnumerationType
		//    : {fmlType::EnumerationType}
		//        ( visibility=VisibilityKind )? typedef?='type'
		//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//        'enum'  ( '<' ( 'super:' )? superType=[fmlType::EnumerationType|ESUfid] '>') ?
		//        '{'
		//            literal+= EnumerationLiteral  ( ',' literal+= EnumerationLiteral )*
		//        '}'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlType::EnumerationType}
		//       ( visibility=VisibilityKind )? typedef?='type'
		//       name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//       'enum'  ( '<' ( 'super:' )? superType=[fmlType::EnumerationType|ESUfid] '>') ?
		//       '{'
		//           literal+= EnumerationLiteral  ( ',' literal+= EnumerationLiteral )*
		//       '}'
		public Group getGroup() { return cGroup; }
		
		//{fmlType::EnumerationType}
		public Action getEnumerationTypeAction_0() { return cEnumerationTypeAction_0; }
		
		//( visibility=VisibilityKind )?
		public Assignment getVisibilityAssignment_1() { return cVisibilityAssignment_1; }
		
		//VisibilityKind
		public RuleCall getVisibilityVisibilityKindEnumRuleCall_1_0() { return cVisibilityVisibilityKindEnumRuleCall_1_0; }
		
		//typedef?='type'
		public Assignment getTypedefAssignment_2() { return cTypedefAssignment_2; }
		
		//'type'
		public Keyword getTypedefTypeKeyword_2_0() { return cTypedefTypeKeyword_2_0; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
		
		//'enum'
		public Keyword getEnumKeyword_5() { return cEnumKeyword_5; }
		
		//( '<' ( 'super:' )? superType=[fmlType::EnumerationType|ESUfid] '>') ?
		public Group getGroup_6() { return cGroup_6; }
		
		//'<'
		public Keyword getLessThanSignKeyword_6_0() { return cLessThanSignKeyword_6_0; }
		
		//( 'super:' )?
		public Keyword getSuperKeyword_6_1() { return cSuperKeyword_6_1; }
		
		//superType=[fmlType::EnumerationType|ESUfid]
		public Assignment getSuperTypeAssignment_6_2() { return cSuperTypeAssignment_6_2; }
		
		//[fmlType::EnumerationType|ESUfid]
		public CrossReference getSuperTypeEnumerationTypeCrossReference_6_2_0() { return cSuperTypeEnumerationTypeCrossReference_6_2_0; }
		
		//ESUfid
		public RuleCall getSuperTypeEnumerationTypeESUfidParserRuleCall_6_2_0_1() { return cSuperTypeEnumerationTypeESUfidParserRuleCall_6_2_0_1; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_6_3() { return cGreaterThanSignKeyword_6_3; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_7() { return cLeftCurlyBracketKeyword_7; }
		
		//literal+= EnumerationLiteral
		public Assignment getLiteralAssignment_8() { return cLiteralAssignment_8; }
		
		//EnumerationLiteral
		public RuleCall getLiteralEnumerationLiteralParserRuleCall_8_0() { return cLiteralEnumerationLiteralParserRuleCall_8_0; }
		
		//( ',' literal+= EnumerationLiteral )*
		public Group getGroup_9() { return cGroup_9; }
		
		//','
		public Keyword getCommaKeyword_9_0() { return cCommaKeyword_9_0; }
		
		//literal+= EnumerationLiteral
		public Assignment getLiteralAssignment_9_1() { return cLiteralAssignment_9_1; }
		
		//EnumerationLiteral
		public RuleCall getLiteralEnumerationLiteralParserRuleCall_9_1_0() { return cLiteralEnumerationLiteralParserRuleCall_9_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_10() { return cRightCurlyBracketKeyword_10; }
	}
	public class EnumerationTypeDefinitionImplElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.EnumerationTypeDefinitionImpl");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cEnumerationTypeAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameESIdentifierParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0 = (RuleCall)cUnrestrictedNameAssignment_2.eContents().get(0);
		private final Assignment cTypedefAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final Keyword cTypedefEnumKeyword_3_0 = (Keyword)cTypedefAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLessThanSignKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Keyword cSuperKeyword_4_1 = (Keyword)cGroup_4.eContents().get(1);
		private final Assignment cSuperTypeAssignment_4_2 = (Assignment)cGroup_4.eContents().get(2);
		private final CrossReference cSuperTypeEnumerationTypeCrossReference_4_2_0 = (CrossReference)cSuperTypeAssignment_4_2.eContents().get(0);
		private final RuleCall cSuperTypeEnumerationTypeESUfidParserRuleCall_4_2_0_1 = (RuleCall)cSuperTypeEnumerationTypeCrossReference_4_2_0.eContents().get(1);
		private final Keyword cGreaterThanSignKeyword_4_3 = (Keyword)cGroup_4.eContents().get(3);
		private final Keyword cLeftCurlyBracketKeyword_5 = (Keyword)cGroup.eContents().get(5);
		private final Assignment cLiteralAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cLiteralEnumerationLiteralParserRuleCall_6_0 = (RuleCall)cLiteralAssignment_6.eContents().get(0);
		private final Group cGroup_7 = (Group)cGroup.eContents().get(7);
		private final Keyword cCommaKeyword_7_0 = (Keyword)cGroup_7.eContents().get(0);
		private final Assignment cLiteralAssignment_7_1 = (Assignment)cGroup_7.eContents().get(1);
		private final RuleCall cLiteralEnumerationLiteralParserRuleCall_7_1_0 = (RuleCall)cLiteralAssignment_7_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
		
		//EnumerationTypeDefinitionImpl returns fmlType::EnumerationType
		//    : {fmlType::EnumerationType}
		//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//        typedef?='enum'
		//        ( '<' ( 'super:' )? superType=[fmlType::EnumerationType|ESUfid] '>') ?
		//        '{'
		//            literal+= EnumerationLiteral  ( ',' literal+= EnumerationLiteral )*
		//        '}'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlType::EnumerationType}
		//       name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//       typedef?='enum'
		//       ( '<' ( 'super:' )? superType=[fmlType::EnumerationType|ESUfid] '>') ?
		//       '{'
		//           literal+= EnumerationLiteral  ( ',' literal+= EnumerationLiteral )*
		//       '}'
		public Group getGroup() { return cGroup; }
		
		//{fmlType::EnumerationType}
		public Action getEnumerationTypeAction_0() { return cEnumerationTypeAction_0; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_1_0() { return cNameESIdentifierParserRuleCall_1_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_2() { return cUnrestrictedNameAssignment_2; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0; }
		
		//typedef?='enum'
		public Assignment getTypedefAssignment_3() { return cTypedefAssignment_3; }
		
		//'enum'
		public Keyword getTypedefEnumKeyword_3_0() { return cTypedefEnumKeyword_3_0; }
		
		//( '<' ( 'super:' )? superType=[fmlType::EnumerationType|ESUfid] '>') ?
		public Group getGroup_4() { return cGroup_4; }
		
		//'<'
		public Keyword getLessThanSignKeyword_4_0() { return cLessThanSignKeyword_4_0; }
		
		//( 'super:' )?
		public Keyword getSuperKeyword_4_1() { return cSuperKeyword_4_1; }
		
		//superType=[fmlType::EnumerationType|ESUfid]
		public Assignment getSuperTypeAssignment_4_2() { return cSuperTypeAssignment_4_2; }
		
		//[fmlType::EnumerationType|ESUfid]
		public CrossReference getSuperTypeEnumerationTypeCrossReference_4_2_0() { return cSuperTypeEnumerationTypeCrossReference_4_2_0; }
		
		//ESUfid
		public RuleCall getSuperTypeEnumerationTypeESUfidParserRuleCall_4_2_0_1() { return cSuperTypeEnumerationTypeESUfidParserRuleCall_4_2_0_1; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_4_3() { return cGreaterThanSignKeyword_4_3; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_5() { return cLeftCurlyBracketKeyword_5; }
		
		//literal+= EnumerationLiteral
		public Assignment getLiteralAssignment_6() { return cLiteralAssignment_6; }
		
		//EnumerationLiteral
		public RuleCall getLiteralEnumerationLiteralParserRuleCall_6_0() { return cLiteralEnumerationLiteralParserRuleCall_6_0; }
		
		//( ',' literal+= EnumerationLiteral )*
		public Group getGroup_7() { return cGroup_7; }
		
		//','
		public Keyword getCommaKeyword_7_0() { return cCommaKeyword_7_0; }
		
		//literal+= EnumerationLiteral
		public Assignment getLiteralAssignment_7_1() { return cLiteralAssignment_7_1; }
		
		//EnumerationLiteral
		public RuleCall getLiteralEnumerationLiteralParserRuleCall_7_1_0() { return cLiteralEnumerationLiteralParserRuleCall_7_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
	}
	public class EnumerationLiteralElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.EnumerationLiteral");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cNameAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cNameESIdentifierParserRuleCall_0_0 = (RuleCall)cNameAssignment_0.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_1_0 = (RuleCall)cUnrestrictedNameAssignment_1.eContents().get(0);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cEqualsSignKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final Assignment cValueAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
		private final RuleCall cValueLiteralTerminalExpressionParserRuleCall_2_1_0 = (RuleCall)cValueAssignment_2_1.eContents().get(0);
		
		//EnumerationLiteral returns fmlType::EnumerationLiteral
		//    : name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//        ( '=' value=LiteralTerminalExpression )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//       ( '=' value=LiteralTerminalExpression )?
		public Group getGroup() { return cGroup; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_0() { return cNameAssignment_0; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_0_0() { return cNameESIdentifierParserRuleCall_0_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_1() { return cUnrestrictedNameAssignment_1; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_1_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_1_0; }
		
		//( '=' value=LiteralTerminalExpression )?
		public Group getGroup_2() { return cGroup_2; }
		
		//'='
		public Keyword getEqualsSignKeyword_2_0() { return cEqualsSignKeyword_2_0; }
		
		//value=LiteralTerminalExpression
		public Assignment getValueAssignment_2_1() { return cValueAssignment_2_1; }
		
		//LiteralTerminalExpression
		public RuleCall getValueLiteralTerminalExpressionParserRuleCall_2_1_0() { return cValueLiteralTerminalExpressionParserRuleCall_2_1_0; }
	}
	public class StructureTypeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.StructureType");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cStructureTypeAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cStructKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Keyword cPropertyKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Assignment cPropertyAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cPropertyVariableParserRuleCall_4_0 = (RuleCall)cPropertyAssignment_4.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_5 = (Keyword)cGroup.eContents().get(5);
		
		//StructureType returns fmlType::StructureType
		//    : {fmlType::StructureType}
		//        'struct'
		//        '{'
		//            ( '@property:' )?
		//            ( property+=Variable )+
		//        '}'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlType::StructureType}
		//       'struct'
		//       '{'
		//           ( '@property:' )?
		//           ( property+=Variable )+
		//       '}'
		public Group getGroup() { return cGroup; }
		
		//{fmlType::StructureType}
		public Action getStructureTypeAction_0() { return cStructureTypeAction_0; }
		
		//'struct'
		public Keyword getStructKeyword_1() { return cStructKeyword_1; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
		
		//( '@property:' )?
		public Keyword getPropertyKeyword_3() { return cPropertyKeyword_3; }
		
		//( property+=Variable )+
		public Assignment getPropertyAssignment_4() { return cPropertyAssignment_4; }
		
		//Variable
		public RuleCall getPropertyVariableParserRuleCall_4_0() { return cPropertyVariableParserRuleCall_4_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_5() { return cRightCurlyBracketKeyword_5; }
	}
	public class StructureTypeDefinitionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.StructureTypeDefinition");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cStructureTypeAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cVisibilityAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cVisibilityVisibilityKindEnumRuleCall_1_0 = (RuleCall)cVisibilityAssignment_1.eContents().get(0);
		private final Assignment cTypedefAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final Keyword cTypedefTypeKeyword_2_0 = (Keyword)cTypedefAssignment_2.eContents().get(0);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
		private final Keyword cStructKeyword_5 = (Keyword)cGroup.eContents().get(5);
		private final Keyword cLeftCurlyBracketKeyword_6 = (Keyword)cGroup.eContents().get(6);
		private final Keyword cPropertyKeyword_7 = (Keyword)cGroup.eContents().get(7);
		private final Assignment cPropertyAssignment_8 = (Assignment)cGroup.eContents().get(8);
		private final RuleCall cPropertyVariableParserRuleCall_8_0 = (RuleCall)cPropertyAssignment_8.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_9 = (Keyword)cGroup.eContents().get(9);
		
		//StructureTypeDefinition returns fmlType::StructureType
		//    : {fmlType::StructureType}
		//        ( visibility=VisibilityKind )? typedef?='type'
		//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//        'struct'
		//        '{'
		//            ( '@property:' )?
		//            ( property+=Variable )+
		//        '}'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlType::StructureType}
		//       ( visibility=VisibilityKind )? typedef?='type'
		//       name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//       'struct'
		//       '{'
		//           ( '@property:' )?
		//           ( property+=Variable )+
		//       '}'
		public Group getGroup() { return cGroup; }
		
		//{fmlType::StructureType}
		public Action getStructureTypeAction_0() { return cStructureTypeAction_0; }
		
		//( visibility=VisibilityKind )?
		public Assignment getVisibilityAssignment_1() { return cVisibilityAssignment_1; }
		
		//VisibilityKind
		public RuleCall getVisibilityVisibilityKindEnumRuleCall_1_0() { return cVisibilityVisibilityKindEnumRuleCall_1_0; }
		
		//typedef?='type'
		public Assignment getTypedefAssignment_2() { return cTypedefAssignment_2; }
		
		//'type'
		public Keyword getTypedefTypeKeyword_2_0() { return cTypedefTypeKeyword_2_0; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
		
		//'struct'
		public Keyword getStructKeyword_5() { return cStructKeyword_5; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_6() { return cLeftCurlyBracketKeyword_6; }
		
		//( '@property:' )?
		public Keyword getPropertyKeyword_7() { return cPropertyKeyword_7; }
		
		//( property+=Variable )+
		public Assignment getPropertyAssignment_8() { return cPropertyAssignment_8; }
		
		//Variable
		public RuleCall getPropertyVariableParserRuleCall_8_0() { return cPropertyVariableParserRuleCall_8_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_9() { return cRightCurlyBracketKeyword_9; }
	}
	public class StructureTypeDefinitionImplElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.StructureTypeDefinitionImpl");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cStructureTypeAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameESIdentifierParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0 = (RuleCall)cUnrestrictedNameAssignment_2.eContents().get(0);
		private final Assignment cTypedefAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final Keyword cTypedefStructKeyword_3_0 = (Keyword)cTypedefAssignment_3.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Keyword cPropertyKeyword_5 = (Keyword)cGroup.eContents().get(5);
		private final Assignment cPropertyAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cPropertyVariableParserRuleCall_6_0 = (RuleCall)cPropertyAssignment_6.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_7 = (Keyword)cGroup.eContents().get(7);
		
		//StructureTypeDefinitionImpl returns fmlType::StructureType
		//    : {fmlType::StructureType}
		//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//        typedef?='struct'
		//        '{'
		//            ( '@property:' )?
		//            ( property+=Variable )+
		//        '}'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlType::StructureType}
		//       name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//       typedef?='struct'
		//       '{'
		//           ( '@property:' )?
		//           ( property+=Variable )+
		//       '}'
		public Group getGroup() { return cGroup; }
		
		//{fmlType::StructureType}
		public Action getStructureTypeAction_0() { return cStructureTypeAction_0; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_1_0() { return cNameESIdentifierParserRuleCall_1_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_2() { return cUnrestrictedNameAssignment_2; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0; }
		
		//typedef?='struct'
		public Assignment getTypedefAssignment_3() { return cTypedefAssignment_3; }
		
		//'struct'
		public Keyword getTypedefStructKeyword_3_0() { return cTypedefStructKeyword_3_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
		
		//( '@property:' )?
		public Keyword getPropertyKeyword_5() { return cPropertyKeyword_5; }
		
		//( property+=Variable )+
		public Assignment getPropertyAssignment_6() { return cPropertyAssignment_6; }
		
		//Variable
		public RuleCall getPropertyVariableParserRuleCall_6_0() { return cPropertyVariableParserRuleCall_6_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_7() { return cRightCurlyBracketKeyword_7; }
	}
	public class UnionTypeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.UnionType");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUnionTypeAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cUnionKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Keyword cPropertyKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Assignment cPropertyAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cPropertyVariableParserRuleCall_4_0 = (RuleCall)cPropertyAssignment_4.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_5 = (Keyword)cGroup.eContents().get(5);
		
		//UnionType returns fmlType::UnionType
		//    : {fmlType::UnionType}
		//        'union'
		//        '{'
		//            ( '@property:' )?
		//            ( property+=Variable )+
		//        '}'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlType::UnionType}
		//       'union'
		//       '{'
		//           ( '@property:' )?
		//           ( property+=Variable )+
		//       '}'
		public Group getGroup() { return cGroup; }
		
		//{fmlType::UnionType}
		public Action getUnionTypeAction_0() { return cUnionTypeAction_0; }
		
		//'union'
		public Keyword getUnionKeyword_1() { return cUnionKeyword_1; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
		
		//( '@property:' )?
		public Keyword getPropertyKeyword_3() { return cPropertyKeyword_3; }
		
		//( property+=Variable )+
		public Assignment getPropertyAssignment_4() { return cPropertyAssignment_4; }
		
		//Variable
		public RuleCall getPropertyVariableParserRuleCall_4_0() { return cPropertyVariableParserRuleCall_4_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_5() { return cRightCurlyBracketKeyword_5; }
	}
	public class UnionTypeDefinitionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.UnionTypeDefinition");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUnionTypeAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cVisibilityAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cVisibilityVisibilityKindEnumRuleCall_1_0 = (RuleCall)cVisibilityAssignment_1.eContents().get(0);
		private final Assignment cTypedefAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final Keyword cTypedefTypeKeyword_2_0 = (Keyword)cTypedefAssignment_2.eContents().get(0);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
		private final Keyword cUnionKeyword_5 = (Keyword)cGroup.eContents().get(5);
		private final Keyword cLeftCurlyBracketKeyword_6 = (Keyword)cGroup.eContents().get(6);
		private final Keyword cPropertyKeyword_7 = (Keyword)cGroup.eContents().get(7);
		private final Assignment cPropertyAssignment_8 = (Assignment)cGroup.eContents().get(8);
		private final RuleCall cPropertyVariableParserRuleCall_8_0 = (RuleCall)cPropertyAssignment_8.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_9 = (Keyword)cGroup.eContents().get(9);
		
		//UnionTypeDefinition returns fmlType::UnionType
		//    : {fmlType::UnionType}
		//        ( visibility=VisibilityKind )? typedef?='type'
		//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//        'union'
		//        '{'
		//            ( '@property:' )?
		//            ( property+=Variable )+
		//        '}'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlType::UnionType}
		//       ( visibility=VisibilityKind )? typedef?='type'
		//       name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//       'union'
		//       '{'
		//           ( '@property:' )?
		//           ( property+=Variable )+
		//       '}'
		public Group getGroup() { return cGroup; }
		
		//{fmlType::UnionType}
		public Action getUnionTypeAction_0() { return cUnionTypeAction_0; }
		
		//( visibility=VisibilityKind )?
		public Assignment getVisibilityAssignment_1() { return cVisibilityAssignment_1; }
		
		//VisibilityKind
		public RuleCall getVisibilityVisibilityKindEnumRuleCall_1_0() { return cVisibilityVisibilityKindEnumRuleCall_1_0; }
		
		//typedef?='type'
		public Assignment getTypedefAssignment_2() { return cTypedefAssignment_2; }
		
		//'type'
		public Keyword getTypedefTypeKeyword_2_0() { return cTypedefTypeKeyword_2_0; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
		
		//'union'
		public Keyword getUnionKeyword_5() { return cUnionKeyword_5; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_6() { return cLeftCurlyBracketKeyword_6; }
		
		//( '@property:' )?
		public Keyword getPropertyKeyword_7() { return cPropertyKeyword_7; }
		
		//( property+=Variable )+
		public Assignment getPropertyAssignment_8() { return cPropertyAssignment_8; }
		
		//Variable
		public RuleCall getPropertyVariableParserRuleCall_8_0() { return cPropertyVariableParserRuleCall_8_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_9() { return cRightCurlyBracketKeyword_9; }
	}
	public class UnionTypeDefinitionImplElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.UnionTypeDefinitionImpl");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cUnionTypeAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameESIdentifierParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0 = (RuleCall)cUnrestrictedNameAssignment_2.eContents().get(0);
		private final Assignment cTypedefAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final Keyword cTypedefUnionKeyword_3_0 = (Keyword)cTypedefAssignment_3.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Keyword cPropertyKeyword_5 = (Keyword)cGroup.eContents().get(5);
		private final Assignment cPropertyAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cPropertyVariableParserRuleCall_6_0 = (RuleCall)cPropertyAssignment_6.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_7 = (Keyword)cGroup.eContents().get(7);
		
		//UnionTypeDefinitionImpl returns fmlType::UnionType
		//    : {fmlType::UnionType}
		//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//        typedef?='union'
		//        '{'
		//            ( '@property:' )?
		//            ( property+=Variable )+
		//        '}'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlType::UnionType}
		//       name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//       typedef?='union'
		//       '{'
		//           ( '@property:' )?
		//           ( property+=Variable )+
		//       '}'
		public Group getGroup() { return cGroup; }
		
		//{fmlType::UnionType}
		public Action getUnionTypeAction_0() { return cUnionTypeAction_0; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_1_0() { return cNameESIdentifierParserRuleCall_1_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_2() { return cUnrestrictedNameAssignment_2; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0; }
		
		//typedef?='union'
		public Assignment getTypedefAssignment_3() { return cTypedefAssignment_3; }
		
		//'union'
		public Keyword getTypedefUnionKeyword_3_0() { return cTypedefUnionKeyword_3_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
		
		//( '@property:' )?
		public Keyword getPropertyKeyword_5() { return cPropertyKeyword_5; }
		
		//( property+=Variable )+
		public Assignment getPropertyAssignment_6() { return cPropertyAssignment_6; }
		
		//Variable
		public RuleCall getPropertyVariableParserRuleCall_6_0() { return cPropertyVariableParserRuleCall_6_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_7() { return cRightCurlyBracketKeyword_7; }
	}
	public class ChoiceTypeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ChoiceType");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cChoiceTypeAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cChoiceKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Keyword cPropertyKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Assignment cPropertyAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cPropertyVariableParserRuleCall_4_0 = (RuleCall)cPropertyAssignment_4.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_5 = (Keyword)cGroup.eContents().get(5);
		
		//ChoiceType returns fmlType::ChoiceType
		//    : {fmlType::ChoiceType}
		//        'choice'
		//        '{'
		//            ( '@property:' )?
		//            ( property+=Variable )+
		//        '}'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlType::ChoiceType}
		//       'choice'
		//       '{'
		//           ( '@property:' )?
		//           ( property+=Variable )+
		//       '}'
		public Group getGroup() { return cGroup; }
		
		//{fmlType::ChoiceType}
		public Action getChoiceTypeAction_0() { return cChoiceTypeAction_0; }
		
		//'choice'
		public Keyword getChoiceKeyword_1() { return cChoiceKeyword_1; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
		
		//( '@property:' )?
		public Keyword getPropertyKeyword_3() { return cPropertyKeyword_3; }
		
		//( property+=Variable )+
		public Assignment getPropertyAssignment_4() { return cPropertyAssignment_4; }
		
		//Variable
		public RuleCall getPropertyVariableParserRuleCall_4_0() { return cPropertyVariableParserRuleCall_4_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_5() { return cRightCurlyBracketKeyword_5; }
	}
	public class ChoiceTypeDefinitionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ChoiceTypeDefinition");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cChoiceTypeAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cVisibilityAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cVisibilityVisibilityKindEnumRuleCall_1_0 = (RuleCall)cVisibilityAssignment_1.eContents().get(0);
		private final Assignment cTypedefAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final Keyword cTypedefTypeKeyword_2_0 = (Keyword)cTypedefAssignment_2.eContents().get(0);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
		private final Keyword cChoiceKeyword_5 = (Keyword)cGroup.eContents().get(5);
		private final Keyword cLeftCurlyBracketKeyword_6 = (Keyword)cGroup.eContents().get(6);
		private final Keyword cPropertyKeyword_7 = (Keyword)cGroup.eContents().get(7);
		private final Assignment cPropertyAssignment_8 = (Assignment)cGroup.eContents().get(8);
		private final RuleCall cPropertyVariableParserRuleCall_8_0 = (RuleCall)cPropertyAssignment_8.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_9 = (Keyword)cGroup.eContents().get(9);
		
		//ChoiceTypeDefinition returns fmlType::ChoiceType
		//    : {fmlType::ChoiceType}
		//        ( visibility=VisibilityKind )? typedef?='type'
		//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//        'choice'
		//        '{'
		//            ( '@property:' )?
		//            ( property+=Variable )+
		//        '}'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlType::ChoiceType}
		//       ( visibility=VisibilityKind )? typedef?='type'
		//       name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//       'choice'
		//       '{'
		//           ( '@property:' )?
		//           ( property+=Variable )+
		//       '}'
		public Group getGroup() { return cGroup; }
		
		//{fmlType::ChoiceType}
		public Action getChoiceTypeAction_0() { return cChoiceTypeAction_0; }
		
		//( visibility=VisibilityKind )?
		public Assignment getVisibilityAssignment_1() { return cVisibilityAssignment_1; }
		
		//VisibilityKind
		public RuleCall getVisibilityVisibilityKindEnumRuleCall_1_0() { return cVisibilityVisibilityKindEnumRuleCall_1_0; }
		
		//typedef?='type'
		public Assignment getTypedefAssignment_2() { return cTypedefAssignment_2; }
		
		//'type'
		public Keyword getTypedefTypeKeyword_2_0() { return cTypedefTypeKeyword_2_0; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
		
		//'choice'
		public Keyword getChoiceKeyword_5() { return cChoiceKeyword_5; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_6() { return cLeftCurlyBracketKeyword_6; }
		
		//( '@property:' )?
		public Keyword getPropertyKeyword_7() { return cPropertyKeyword_7; }
		
		//( property+=Variable )+
		public Assignment getPropertyAssignment_8() { return cPropertyAssignment_8; }
		
		//Variable
		public RuleCall getPropertyVariableParserRuleCall_8_0() { return cPropertyVariableParserRuleCall_8_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_9() { return cRightCurlyBracketKeyword_9; }
	}
	public class ChoiceTypeDefinitionImplElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ChoiceTypeDefinitionImpl");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cChoiceTypeAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameESIdentifierParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0 = (RuleCall)cUnrestrictedNameAssignment_2.eContents().get(0);
		private final Assignment cTypedefAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final Keyword cTypedefChoiceKeyword_3_0 = (Keyword)cTypedefAssignment_3.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Keyword cPropertyKeyword_5 = (Keyword)cGroup.eContents().get(5);
		private final Assignment cPropertyAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cPropertyVariableParserRuleCall_6_0 = (RuleCall)cPropertyAssignment_6.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_7 = (Keyword)cGroup.eContents().get(7);
		
		//ChoiceTypeDefinitionImpl returns fmlType::ChoiceType
		//    : {fmlType::ChoiceType}
		//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//        typedef?='choice'
		//        '{'
		//            ( '@property:' )?
		//            ( property+=Variable )+
		//        '}'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlType::ChoiceType}
		//       name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//       typedef?='choice'
		//       '{'
		//           ( '@property:' )?
		//           ( property+=Variable )+
		//       '}'
		public Group getGroup() { return cGroup; }
		
		//{fmlType::ChoiceType}
		public Action getChoiceTypeAction_0() { return cChoiceTypeAction_0; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_1_0() { return cNameESIdentifierParserRuleCall_1_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_2() { return cUnrestrictedNameAssignment_2; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_2_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_2_0; }
		
		//typedef?='choice'
		public Assignment getTypedefAssignment_3() { return cTypedefAssignment_3; }
		
		//'choice'
		public Keyword getTypedefChoiceKeyword_3_0() { return cTypedefChoiceKeyword_3_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
		
		//( '@property:' )?
		public Keyword getPropertyKeyword_5() { return cPropertyKeyword_5; }
		
		//( property+=Variable )+
		public Assignment getPropertyAssignment_6() { return cPropertyAssignment_6; }
		
		//Variable
		public RuleCall getPropertyVariableParserRuleCall_6_0() { return cPropertyVariableParserRuleCall_6_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_7() { return cRightCurlyBracketKeyword_7; }
	}
	public class ModifierElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.Modifier");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cModifierAction_0 = (Action)cGroup.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_1 = (UnorderedGroup)cGroup.eContents().get(1);
		private final Assignment cStaticAssignment_1_0 = (Assignment)cUnorderedGroup_1.eContents().get(0);
		private final Keyword cStaticStaticKeyword_1_0_0 = (Keyword)cStaticAssignment_1_0.eContents().get(0);
		private final Assignment cFinalAssignment_1_1 = (Assignment)cUnorderedGroup_1.eContents().get(1);
		private final Keyword cFinalFinalKeyword_1_1_0 = (Keyword)cFinalAssignment_1_1.eContents().get(0);
		private final Assignment cVolatileAssignment_1_2 = (Assignment)cUnorderedGroup_1.eContents().get(2);
		private final Keyword cVolatileVolatileKeyword_1_2_0 = (Keyword)cVolatileAssignment_1_2.eContents().get(0);
		private final Assignment cTransientAssignment_1_3 = (Assignment)cUnorderedGroup_1.eContents().get(3);
		private final Keyword cTransientTransientKeyword_1_3_0 = (Keyword)cTransientAssignment_1_3.eContents().get(0);
		private final Assignment cOptionalAssignment_1_4 = (Assignment)cUnorderedGroup_1.eContents().get(4);
		private final Keyword cOptionalOptionalKeyword_1_4_0 = (Keyword)cOptionalAssignment_1_4.eContents().get(0);
		
		///*
		//enum TypeSpecifyerKind returns TypeSpecifyerKind
		//    : ALIAS = 'ALIAS'
		//    | BOOLEAN = 'BOOLEAN'
		//    | CHAR = 'CHAR'
		//    | INT = 'INT'
		//    | RATIONAL = 'RATIONAL'
		//    | URATIONAL = 'URATIONAL'
		//    | FLOAT = 'FLOAT'
		//    | UFLOAT = 'UFLOAT'
		//    | DOUBLE = 'DOUBLE'
		//    | UDOUBLE = 'UDOUBLE'
		//    | REAL = 'REAL'
		//    | UREAL = 'UREAL'
		//    | CTIME = 'CTIME'
		//    | DTIME = 'DTIME'
		//    | STRING = 'STRING'
		//    | IDENTIFIER = 'IDENTIFIER'
		//    | UFI = 'UFI'
		//    | ARRAY = 'ARRAY'
		//    | VECTOR = 'VECTOR'
		//    | LIST = 'LIST'
		//    | FIFO = 'FIFO'
		//    | LIFO = 'LIFO'
		//    | MULTISET = 'MULTISET'
		//    | SET = 'SET'
		//    | INTERVAL = 'INTERVAL'
		//    | ENUM = 'ENUM'
		//    | STRUCTURE = 'STRUCTURE'
		//    | BUFFER = 'BUFFER'
		//    | MESSAGE = 'MESSAGE'
		//    | PORT = 'PORT'
		//    | CONNECTION = 'CONNECTION'
		//    | OPERATOR = 'OPERATOR'
		//    | MACHINE = 'MACHINE'
		//    | LAMBDA = 'LAMBDA'
		//    | UNIVERSAL = 'UNIVERSAL'
		//    ;
		//*/
		//////////////////////////////////////////////////////////////////////////////////
		//// Modifier Rules
		//////////////////////////////////////////////////////////////////////////////////
		//Modifier returns fmlInfra::Modifier
		//    : {fmlInfra::Modifier}
		//        ( ( static?='static' )?
		//        & ( final ?='final'  )?
		//        & ( volatile ?='volatile'  )?
		//        & ( transient?='transient' )?
		//        & ( optional?='optional' )?
		//        )
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlInfra::Modifier}
		//       ( ( static?='static' )?
		//       & ( final ?='final'  )?
		//       & ( volatile ?='volatile'  )?
		//       & ( transient?='transient' )?
		//       & ( optional?='optional' )?
		//       )
		public Group getGroup() { return cGroup; }
		
		//{fmlInfra::Modifier}
		public Action getModifierAction_0() { return cModifierAction_0; }
		
		//( ( static?='static' )?
		//& ( final ?='final'  )?
		//& ( volatile ?='volatile'  )?
		//& ( transient?='transient' )?
		//& ( optional?='optional' )?
		//)
		public UnorderedGroup getUnorderedGroup_1() { return cUnorderedGroup_1; }
		
		//( static?='static' )?
		public Assignment getStaticAssignment_1_0() { return cStaticAssignment_1_0; }
		
		//'static'
		public Keyword getStaticStaticKeyword_1_0_0() { return cStaticStaticKeyword_1_0_0; }
		
		//( final ?='final'  )?
		public Assignment getFinalAssignment_1_1() { return cFinalAssignment_1_1; }
		
		//'final'
		public Keyword getFinalFinalKeyword_1_1_0() { return cFinalFinalKeyword_1_1_0; }
		
		//( volatile ?='volatile'  )?
		public Assignment getVolatileAssignment_1_2() { return cVolatileAssignment_1_2; }
		
		//'volatile'
		public Keyword getVolatileVolatileKeyword_1_2_0() { return cVolatileVolatileKeyword_1_2_0; }
		
		//( transient?='transient' )?
		public Assignment getTransientAssignment_1_3() { return cTransientAssignment_1_3; }
		
		//'transient'
		public Keyword getTransientTransientKeyword_1_3_0() { return cTransientTransientKeyword_1_3_0; }
		
		//( optional?='optional' )?
		public Assignment getOptionalAssignment_1_4() { return cOptionalAssignment_1_4; }
		
		//'optional'
		public Keyword getOptionalOptionalKeyword_1_4_0() { return cOptionalOptionalKeyword_1_4_0; }
	}
	public class FunctionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.Function");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cFunctionAction_0 = (Action)cGroup.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_1 = (UnorderedGroup)cGroup.eContents().get(1);
		private final Assignment cVisibilityAssignment_1_0 = (Assignment)cUnorderedGroup_1.eContents().get(0);
		private final RuleCall cVisibilityVisibilityKindEnumRuleCall_1_0_0 = (RuleCall)cVisibilityAssignment_1_0.eContents().get(0);
		private final Assignment cModifierAssignment_1_1 = (Assignment)cUnorderedGroup_1.eContents().get(1);
		private final RuleCall cModifierModifierParserRuleCall_1_1_0 = (RuleCall)cModifierAssignment_1_1.eContents().get(0);
		private final Keyword cFunKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
		private final Group cGroup_5 = (Group)cGroup.eContents().get(5);
		private final Keyword cLeftParenthesisKeyword_5_0 = (Keyword)cGroup_5.eContents().get(0);
		private final Assignment cParameterSetAssignment_5_1 = (Assignment)cGroup_5.eContents().get(1);
		private final RuleCall cParameterSetFormalParameterSetParserRuleCall_5_1_0 = (RuleCall)cParameterSetAssignment_5_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_5_2 = (Keyword)cGroup_5.eContents().get(2);
		private final Keyword cHyphenMinusGreaterThanSignKeyword_6 = (Keyword)cGroup.eContents().get(6);
		private final Alternatives cAlternatives_7 = (Alternatives)cGroup.eContents().get(7);
		private final Assignment cResultSetAssignment_7_0 = (Assignment)cAlternatives_7.eContents().get(0);
		private final RuleCall cResultSetFormalParameterSetParserRuleCall_7_0_0 = (RuleCall)cResultSetAssignment_7_0.eContents().get(0);
		private final Group cGroup_7_1 = (Group)cAlternatives_7.eContents().get(1);
		private final Keyword cLeftParenthesisKeyword_7_1_0 = (Keyword)cGroup_7_1.eContents().get(0);
		private final Assignment cResultSetAssignment_7_1_1 = (Assignment)cGroup_7_1.eContents().get(1);
		private final RuleCall cResultSetFormalParameterSetParserRuleCall_7_1_1_0 = (RuleCall)cResultSetAssignment_7_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_7_1_2 = (Keyword)cGroup_7_1.eContents().get(2);
		private final Keyword cSemicolonKeyword_8 = (Keyword)cGroup.eContents().get(8);
		
		//////////////////////////////////////////////////////////////////////////////////
		//// Function Rules
		//////////////////////////////////////////////////////////////////////////////////
		//Function returns fmlInfra::Function
		//    : {fmlInfra::Function}
		//        ( visibility=VisibilityKind
		//          & modifier=Modifier
		//        )?
		//        'fun'
		//        name=ESIdentifier  ( unrestrictedName=UnrestrictedName )?
		//        ( '(' ( parameterSet=FormalParameterSet )? ')' )?
		//        '->'
		//        (     resultSet=FormalParameterSet
		//        | '(' resultSet=FormalParameterSet ')'
		//        )
		//        ';'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlInfra::Function}
		//       ( visibility=VisibilityKind
		//         & modifier=Modifier
		//       )?
		//       'fun'
		//       name=ESIdentifier  ( unrestrictedName=UnrestrictedName )?
		//       ( '(' ( parameterSet=FormalParameterSet )? ')' )?
		//       '->'
		//       (     resultSet=FormalParameterSet
		//       | '(' resultSet=FormalParameterSet ')'
		//       )
		//       ';'
		public Group getGroup() { return cGroup; }
		
		//{fmlInfra::Function}
		public Action getFunctionAction_0() { return cFunctionAction_0; }
		
		//( visibility=VisibilityKind
		//  & modifier=Modifier
		//)?
		public UnorderedGroup getUnorderedGroup_1() { return cUnorderedGroup_1; }
		
		//visibility=VisibilityKind
		public Assignment getVisibilityAssignment_1_0() { return cVisibilityAssignment_1_0; }
		
		//VisibilityKind
		public RuleCall getVisibilityVisibilityKindEnumRuleCall_1_0_0() { return cVisibilityVisibilityKindEnumRuleCall_1_0_0; }
		
		//modifier=Modifier
		public Assignment getModifierAssignment_1_1() { return cModifierAssignment_1_1; }
		
		//Modifier
		public RuleCall getModifierModifierParserRuleCall_1_1_0() { return cModifierModifierParserRuleCall_1_1_0; }
		
		//'fun'
		public Keyword getFunKeyword_2() { return cFunKeyword_2; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
		
		//( '(' ( parameterSet=FormalParameterSet )? ')' )?
		public Group getGroup_5() { return cGroup_5; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_5_0() { return cLeftParenthesisKeyword_5_0; }
		
		//( parameterSet=FormalParameterSet )?
		public Assignment getParameterSetAssignment_5_1() { return cParameterSetAssignment_5_1; }
		
		//FormalParameterSet
		public RuleCall getParameterSetFormalParameterSetParserRuleCall_5_1_0() { return cParameterSetFormalParameterSetParserRuleCall_5_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_5_2() { return cRightParenthesisKeyword_5_2; }
		
		//'->'
		public Keyword getHyphenMinusGreaterThanSignKeyword_6() { return cHyphenMinusGreaterThanSignKeyword_6; }
		
		//(     resultSet=FormalParameterSet
		//| '(' resultSet=FormalParameterSet ')'
		//)
		public Alternatives getAlternatives_7() { return cAlternatives_7; }
		
		//resultSet=FormalParameterSet
		public Assignment getResultSetAssignment_7_0() { return cResultSetAssignment_7_0; }
		
		//FormalParameterSet
		public RuleCall getResultSetFormalParameterSetParserRuleCall_7_0_0() { return cResultSetFormalParameterSetParserRuleCall_7_0_0; }
		
		//'(' resultSet=FormalParameterSet ')'
		public Group getGroup_7_1() { return cGroup_7_1; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_7_1_0() { return cLeftParenthesisKeyword_7_1_0; }
		
		//resultSet=FormalParameterSet
		public Assignment getResultSetAssignment_7_1_1() { return cResultSetAssignment_7_1_1; }
		
		//FormalParameterSet
		public RuleCall getResultSetFormalParameterSetParserRuleCall_7_1_1_0() { return cResultSetFormalParameterSetParserRuleCall_7_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_7_1_2() { return cRightParenthesisKeyword_7_1_2; }
		
		//';'
		public Keyword getSemicolonKeyword_8() { return cSemicolonKeyword_8; }
	}
	public class FunctionImplElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.FunctionImpl");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cFunctionAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cModifierAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cModifierModifierParserRuleCall_1_0 = (RuleCall)cModifierAssignment_1.eContents().get(0);
		private final Keyword cFunKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
		private final Group cGroup_5 = (Group)cGroup.eContents().get(5);
		private final Keyword cLeftParenthesisKeyword_5_0 = (Keyword)cGroup_5.eContents().get(0);
		private final Assignment cParameterSetAssignment_5_1 = (Assignment)cGroup_5.eContents().get(1);
		private final RuleCall cParameterSetFormalParameterSetParserRuleCall_5_1_0 = (RuleCall)cParameterSetAssignment_5_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_5_2 = (Keyword)cGroup_5.eContents().get(2);
		private final Keyword cHyphenMinusGreaterThanSignKeyword_6 = (Keyword)cGroup.eContents().get(6);
		private final Alternatives cAlternatives_7 = (Alternatives)cGroup.eContents().get(7);
		private final Assignment cResultSetAssignment_7_0 = (Assignment)cAlternatives_7.eContents().get(0);
		private final RuleCall cResultSetFormalParameterSetParserRuleCall_7_0_0 = (RuleCall)cResultSetAssignment_7_0.eContents().get(0);
		private final Group cGroup_7_1 = (Group)cAlternatives_7.eContents().get(1);
		private final Keyword cLeftParenthesisKeyword_7_1_0 = (Keyword)cGroup_7_1.eContents().get(0);
		private final Assignment cResultSetAssignment_7_1_1 = (Assignment)cGroup_7_1.eContents().get(1);
		private final RuleCall cResultSetFormalParameterSetParserRuleCall_7_1_1_0 = (RuleCall)cResultSetAssignment_7_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_7_1_2 = (Keyword)cGroup_7_1.eContents().get(2);
		private final Keyword cSemicolonKeyword_8 = (Keyword)cGroup.eContents().get(8);
		
		//FunctionImpl returns fmlInfra::Function
		//    : {fmlInfra::Function}
		//        ( modifier=Modifier )?
		//        'fun'
		//        name=ESIdentifier  ( unrestrictedName=UnrestrictedName )?
		//        ( '(' ( parameterSet=FormalParameterSet )? ')' )?
		//        '->'
		//        (     resultSet=FormalParameterSet
		//        | '(' resultSet=FormalParameterSet ')'
		//        )
		//        ';'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlInfra::Function}
		//       ( modifier=Modifier )?
		//       'fun'
		//       name=ESIdentifier  ( unrestrictedName=UnrestrictedName )?
		//       ( '(' ( parameterSet=FormalParameterSet )? ')' )?
		//       '->'
		//       (     resultSet=FormalParameterSet
		//       | '(' resultSet=FormalParameterSet ')'
		//       )
		//       ';'
		public Group getGroup() { return cGroup; }
		
		//{fmlInfra::Function}
		public Action getFunctionAction_0() { return cFunctionAction_0; }
		
		//( modifier=Modifier )?
		public Assignment getModifierAssignment_1() { return cModifierAssignment_1; }
		
		//Modifier
		public RuleCall getModifierModifierParserRuleCall_1_0() { return cModifierModifierParserRuleCall_1_0; }
		
		//'fun'
		public Keyword getFunKeyword_2() { return cFunKeyword_2; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
		
		//( '(' ( parameterSet=FormalParameterSet )? ')' )?
		public Group getGroup_5() { return cGroup_5; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_5_0() { return cLeftParenthesisKeyword_5_0; }
		
		//( parameterSet=FormalParameterSet )?
		public Assignment getParameterSetAssignment_5_1() { return cParameterSetAssignment_5_1; }
		
		//FormalParameterSet
		public RuleCall getParameterSetFormalParameterSetParserRuleCall_5_1_0() { return cParameterSetFormalParameterSetParserRuleCall_5_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_5_2() { return cRightParenthesisKeyword_5_2; }
		
		//'->'
		public Keyword getHyphenMinusGreaterThanSignKeyword_6() { return cHyphenMinusGreaterThanSignKeyword_6; }
		
		//(     resultSet=FormalParameterSet
		//| '(' resultSet=FormalParameterSet ')'
		//)
		public Alternatives getAlternatives_7() { return cAlternatives_7; }
		
		//resultSet=FormalParameterSet
		public Assignment getResultSetAssignment_7_0() { return cResultSetAssignment_7_0; }
		
		//FormalParameterSet
		public RuleCall getResultSetFormalParameterSetParserRuleCall_7_0_0() { return cResultSetFormalParameterSetParserRuleCall_7_0_0; }
		
		//'(' resultSet=FormalParameterSet ')'
		public Group getGroup_7_1() { return cGroup_7_1; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_7_1_0() { return cLeftParenthesisKeyword_7_1_0; }
		
		//resultSet=FormalParameterSet
		public Assignment getResultSetAssignment_7_1_1() { return cResultSetAssignment_7_1_1; }
		
		//FormalParameterSet
		public RuleCall getResultSetFormalParameterSetParserRuleCall_7_1_1_0() { return cResultSetFormalParameterSetParserRuleCall_7_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_7_1_2() { return cRightParenthesisKeyword_7_1_2; }
		
		//';'
		public Keyword getSemicolonKeyword_8() { return cSemicolonKeyword_8; }
	}
	public class FunctionPublicElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.FunctionPublic");
		private final RuleCall cFunctionImplParserRuleCall = (RuleCall)rule.eContents().get(1);
		
		//FunctionPublic returns fmlInfra::Function
		//    : FunctionImpl
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//FunctionImpl
		public RuleCall getFunctionImplParserRuleCall() { return cFunctionImplParserRuleCall; }
	}
	public class FunctionProtectedElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.FunctionProtected");
		private final RuleCall cFunctionImplParserRuleCall = (RuleCall)rule.eContents().get(1);
		
		//FunctionProtected returns fmlInfra::Function
		//    : FunctionImpl
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//FunctionImpl
		public RuleCall getFunctionImplParserRuleCall() { return cFunctionImplParserRuleCall; }
	}
	public class FunctionPrivateElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.FunctionPrivate");
		private final RuleCall cFunctionImplParserRuleCall = (RuleCall)rule.eContents().get(1);
		
		//FunctionPrivate returns fmlInfra::Function
		//    : FunctionImpl
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//FunctionImpl
		public RuleCall getFunctionImplParserRuleCall() { return cFunctionImplParserRuleCall; }
	}
	public class ModifierVarElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ModifierVar");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cModifierAction_0 = (Action)cGroup.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_1 = (UnorderedGroup)cGroup.eContents().get(1);
		private final Assignment cStaticAssignment_1_0 = (Assignment)cUnorderedGroup_1.eContents().get(0);
		private final Keyword cStaticStaticKeyword_1_0_0 = (Keyword)cStaticAssignment_1_0.eContents().get(0);
		private final Assignment cFinalAssignment_1_1 = (Assignment)cUnorderedGroup_1.eContents().get(1);
		private final Alternatives cFinalAlternatives_1_1_0 = (Alternatives)cFinalAssignment_1_1.eContents().get(0);
		private final Keyword cFinalFinalKeyword_1_1_0_0 = (Keyword)cFinalAlternatives_1_1_0.eContents().get(0);
		private final Keyword cFinalConstKeyword_1_1_0_1 = (Keyword)cFinalAlternatives_1_1_0.eContents().get(1);
		private final Assignment cVolatileAssignment_1_2 = (Assignment)cUnorderedGroup_1.eContents().get(2);
		private final Keyword cVolatileVolatileKeyword_1_2_0 = (Keyword)cVolatileAssignment_1_2.eContents().get(0);
		private final Assignment cTransientAssignment_1_3 = (Assignment)cUnorderedGroup_1.eContents().get(3);
		private final Keyword cTransientTransientKeyword_1_3_0 = (Keyword)cTransientAssignment_1_3.eContents().get(0);
		
		//////////////////////////////////////////////////////////////////////////////////
		//// Variable Rules
		//////////////////////////////////////////////////////////////////////////////////
		//ModifierVar returns fmlInfra::Modifier
		//    : {fmlInfra::Modifier}
		//        ( ( static?='static' )?
		//        & ( final ?=('final' | 'const') )?
		//        & ( volatile ?='volatile'  )?
		//        & ( transient?='transient' )?
		//        )
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlInfra::Modifier}
		//       ( ( static?='static' )?
		//       & ( final ?=('final' | 'const') )?
		//       & ( volatile ?='volatile'  )?
		//       & ( transient?='transient' )?
		//       )
		public Group getGroup() { return cGroup; }
		
		//{fmlInfra::Modifier}
		public Action getModifierAction_0() { return cModifierAction_0; }
		
		//( ( static?='static' )?
		//& ( final ?=('final' | 'const') )?
		//& ( volatile ?='volatile'  )?
		//& ( transient?='transient' )?
		//)
		public UnorderedGroup getUnorderedGroup_1() { return cUnorderedGroup_1; }
		
		//( static?='static' )?
		public Assignment getStaticAssignment_1_0() { return cStaticAssignment_1_0; }
		
		//'static'
		public Keyword getStaticStaticKeyword_1_0_0() { return cStaticStaticKeyword_1_0_0; }
		
		//( final ?=('final' | 'const') )?
		public Assignment getFinalAssignment_1_1() { return cFinalAssignment_1_1; }
		
		//('final' | 'const')
		public Alternatives getFinalAlternatives_1_1_0() { return cFinalAlternatives_1_1_0; }
		
		//'final'
		public Keyword getFinalFinalKeyword_1_1_0_0() { return cFinalFinalKeyword_1_1_0_0; }
		
		//'const'
		public Keyword getFinalConstKeyword_1_1_0_1() { return cFinalConstKeyword_1_1_0_1; }
		
		//( volatile ?='volatile'  )?
		public Assignment getVolatileAssignment_1_2() { return cVolatileAssignment_1_2; }
		
		//'volatile'
		public Keyword getVolatileVolatileKeyword_1_2_0() { return cVolatileVolatileKeyword_1_2_0; }
		
		//( transient?='transient' )?
		public Assignment getTransientAssignment_1_3() { return cTransientAssignment_1_3; }
		
		//'transient'
		public Keyword getTransientTransientKeyword_1_3_0() { return cTransientTransientKeyword_1_3_0; }
	}
	public class VariableElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.Variable");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final UnorderedGroup cUnorderedGroup_0 = (UnorderedGroup)cGroup.eContents().get(0);
		private final Assignment cVisibilityAssignment_0_0 = (Assignment)cUnorderedGroup_0.eContents().get(0);
		private final RuleCall cVisibilityVisibilityKindEnumRuleCall_0_0_0 = (RuleCall)cVisibilityAssignment_0_0.eContents().get(0);
		private final Assignment cModifierAssignment_0_1 = (Assignment)cUnorderedGroup_0.eContents().get(1);
		private final RuleCall cModifierModifierParserRuleCall_0_1_0 = (RuleCall)cModifierAssignment_0_1.eContents().get(0);
		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
		private final Keyword cVarKeyword_1_0 = (Keyword)cAlternatives_1.eContents().get(0);
		private final Assignment cConstAssignment_1_1 = (Assignment)cAlternatives_1.eContents().get(1);
		private final Keyword cConstValKeyword_1_1_0 = (Keyword)cConstAssignment_1_1.eContents().get(0);
		private final Group cGroup_1_2 = (Group)cAlternatives_1.eContents().get(2);
		private final Alternatives cAlternatives_1_2_0 = (Alternatives)cGroup_1_2.eContents().get(0);
		private final Assignment cConstAssignment_1_2_0_0 = (Assignment)cAlternatives_1_2_0.eContents().get(0);
		private final Keyword cConstConstKeyword_1_2_0_0_0 = (Keyword)cConstAssignment_1_2_0_0.eContents().get(0);
		private final Assignment cConstAssignment_1_2_0_1 = (Assignment)cAlternatives_1_2_0.eContents().get(1);
		private final Keyword cConstFinalKeyword_1_2_0_1_0 = (Keyword)cConstAssignment_1_2_0_1.eContents().get(0);
		private final Assignment cMacroAssignment_1_2_1 = (Assignment)cGroup_1_2.eContents().get(1);
		private final Keyword cMacroMacroKeyword_1_2_1_0 = (Keyword)cMacroAssignment_1_2_1.eContents().get(0);
		private final Keyword cVarKeyword_1_2_2 = (Keyword)cGroup_1_2.eContents().get(2);
		private final Group cGroup_1_3 = (Group)cAlternatives_1.eContents().get(3);
		private final Assignment cMacroAssignment_1_3_0 = (Assignment)cGroup_1_3.eContents().get(0);
		private final Keyword cMacroMacroKeyword_1_3_0_0 = (Keyword)cMacroAssignment_1_3_0.eContents().get(0);
		private final Alternatives cAlternatives_1_3_1 = (Alternatives)cGroup_1_3.eContents().get(1);
		private final Keyword cVarKeyword_1_3_1_0 = (Keyword)cAlternatives_1_3_1.eContents().get(0);
		private final Assignment cConstAssignment_1_3_1_1 = (Assignment)cAlternatives_1_3_1.eContents().get(1);
		private final Keyword cConstValKeyword_1_3_1_1_0 = (Keyword)cConstAssignment_1_3_1_1.eContents().get(0);
		private final Assignment cTypeAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cTypeDataTypeParserRuleCall_2_0 = (RuleCall)cTypeAssignment_2.eContents().get(0);
		private final Assignment cReferenceAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final Keyword cReferenceAmpersandKeyword_3_0 = (Keyword)cReferenceAssignment_3.eContents().get(0);
		private final Assignment cNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cNameESIdentifierParserRuleCall_4_0 = (RuleCall)cNameAssignment_4.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_5_0 = (RuleCall)cUnrestrictedNameAssignment_5.eContents().get(0);
		private final Group cGroup_6 = (Group)cGroup.eContents().get(6);
		private final Keyword cEqualsSignKeyword_6_0 = (Keyword)cGroup_6.eContents().get(0);
		private final Assignment cDefaultValueAssignment_6_1 = (Assignment)cGroup_6.eContents().get(1);
		private final RuleCall cDefaultValueExpressionParserRuleCall_6_1_0 = (RuleCall)cDefaultValueAssignment_6_1.eContents().get(0);
		private final Alternatives cAlternatives_7 = (Alternatives)cGroup.eContents().get(7);
		private final Group cGroup_7_0 = (Group)cAlternatives_7.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_7_0_0 = (Keyword)cGroup_7_0.eContents().get(0);
		private final Assignment cOnWriteActionAssignment_7_0_1 = (Assignment)cGroup_7_0.eContents().get(1);
		private final RuleCall cOnWriteActionOnWriteRoutineParserRuleCall_7_0_1_0 = (RuleCall)cOnWriteActionAssignment_7_0_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_7_0_2 = (Keyword)cGroup_7_0.eContents().get(2);
		private final Keyword cSemicolonKeyword_7_1 = (Keyword)cAlternatives_7.eContents().get(1);
		
		//Variable returns fmlInfra::Variable
		//    : ( ( visibility=VisibilityKind )?
		//        & ( modifier=Modifier )?
		//        )
		//        ( 'var' | const?='val'
		//        | ( const?='const' | const?='final' ) ( macro?='macro' )? ( 'var' )?
		//        | macro?='macro' ( 'var' | const?='val' )?
		//        )
		//         type=DataType  ( reference?='&' )?
		//         name=ESIdentifier  ( unrestrictedName=UnrestrictedName )?
		//        ( '=' defaultValue=Expression )?
		//        ( ( '{' onWriteAction=OnWriteRoutine  '}' )
		//        | ';'
		//        )
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//( ( visibility=VisibilityKind )?
		//       & ( modifier=Modifier )?
		//       )
		//       ( 'var' | const?='val'
		//       | ( const?='const' | const?='final' ) ( macro?='macro' )? ( 'var' )?
		//       | macro?='macro' ( 'var' | const?='val' )?
		//       )
		//        type=DataType  ( reference?='&' )?
		//        name=ESIdentifier  ( unrestrictedName=UnrestrictedName )?
		//       ( '=' defaultValue=Expression )?
		//       ( ( '{' onWriteAction=OnWriteRoutine  '}' )
		//       | ';'
		//       )
		public Group getGroup() { return cGroup; }
		
		//( ( visibility=VisibilityKind )?
		//       & ( modifier=Modifier )?
		//       )
		public UnorderedGroup getUnorderedGroup_0() { return cUnorderedGroup_0; }
		
		//( visibility=VisibilityKind )?
		public Assignment getVisibilityAssignment_0_0() { return cVisibilityAssignment_0_0; }
		
		//VisibilityKind
		public RuleCall getVisibilityVisibilityKindEnumRuleCall_0_0_0() { return cVisibilityVisibilityKindEnumRuleCall_0_0_0; }
		
		//( modifier=Modifier )?
		public Assignment getModifierAssignment_0_1() { return cModifierAssignment_0_1; }
		
		//Modifier
		public RuleCall getModifierModifierParserRuleCall_0_1_0() { return cModifierModifierParserRuleCall_0_1_0; }
		
		//( 'var' | const?='val'
		//| ( const?='const' | const?='final' ) ( macro?='macro' )? ( 'var' )?
		//| macro?='macro' ( 'var' | const?='val' )?
		//)
		public Alternatives getAlternatives_1() { return cAlternatives_1; }
		
		//'var'
		public Keyword getVarKeyword_1_0() { return cVarKeyword_1_0; }
		
		//const?='val'
		public Assignment getConstAssignment_1_1() { return cConstAssignment_1_1; }
		
		//'val'
		public Keyword getConstValKeyword_1_1_0() { return cConstValKeyword_1_1_0; }
		
		//( const?='const' | const?='final' ) ( macro?='macro' )? ( 'var' )?
		public Group getGroup_1_2() { return cGroup_1_2; }
		
		//( const?='const' | const?='final' )
		public Alternatives getAlternatives_1_2_0() { return cAlternatives_1_2_0; }
		
		//const?='const'
		public Assignment getConstAssignment_1_2_0_0() { return cConstAssignment_1_2_0_0; }
		
		//'const'
		public Keyword getConstConstKeyword_1_2_0_0_0() { return cConstConstKeyword_1_2_0_0_0; }
		
		//const?='final'
		public Assignment getConstAssignment_1_2_0_1() { return cConstAssignment_1_2_0_1; }
		
		//'final'
		public Keyword getConstFinalKeyword_1_2_0_1_0() { return cConstFinalKeyword_1_2_0_1_0; }
		
		//( macro?='macro' )?
		public Assignment getMacroAssignment_1_2_1() { return cMacroAssignment_1_2_1; }
		
		//'macro'
		public Keyword getMacroMacroKeyword_1_2_1_0() { return cMacroMacroKeyword_1_2_1_0; }
		
		//( 'var' )?
		public Keyword getVarKeyword_1_2_2() { return cVarKeyword_1_2_2; }
		
		//macro?='macro' ( 'var' | const?='val' )?
		public Group getGroup_1_3() { return cGroup_1_3; }
		
		//macro?='macro'
		public Assignment getMacroAssignment_1_3_0() { return cMacroAssignment_1_3_0; }
		
		//'macro'
		public Keyword getMacroMacroKeyword_1_3_0_0() { return cMacroMacroKeyword_1_3_0_0; }
		
		//( 'var' | const?='val' )?
		public Alternatives getAlternatives_1_3_1() { return cAlternatives_1_3_1; }
		
		//'var'
		public Keyword getVarKeyword_1_3_1_0() { return cVarKeyword_1_3_1_0; }
		
		//const?='val'
		public Assignment getConstAssignment_1_3_1_1() { return cConstAssignment_1_3_1_1; }
		
		//'val'
		public Keyword getConstValKeyword_1_3_1_1_0() { return cConstValKeyword_1_3_1_1_0; }
		
		//type=DataType
		public Assignment getTypeAssignment_2() { return cTypeAssignment_2; }
		
		//DataType
		public RuleCall getTypeDataTypeParserRuleCall_2_0() { return cTypeDataTypeParserRuleCall_2_0; }
		
		//( reference?='&' )?
		public Assignment getReferenceAssignment_3() { return cReferenceAssignment_3; }
		
		//'&'
		public Keyword getReferenceAmpersandKeyword_3_0() { return cReferenceAmpersandKeyword_3_0; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_4() { return cNameAssignment_4; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_4_0() { return cNameESIdentifierParserRuleCall_4_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_5() { return cUnrestrictedNameAssignment_5; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_5_0; }
		
		//( '=' defaultValue=Expression )?
		public Group getGroup_6() { return cGroup_6; }
		
		//'='
		public Keyword getEqualsSignKeyword_6_0() { return cEqualsSignKeyword_6_0; }
		
		//defaultValue=Expression
		public Assignment getDefaultValueAssignment_6_1() { return cDefaultValueAssignment_6_1; }
		
		//Expression
		public RuleCall getDefaultValueExpressionParserRuleCall_6_1_0() { return cDefaultValueExpressionParserRuleCall_6_1_0; }
		
		//( ( '{' onWriteAction=OnWriteRoutine  '}' )
		//| ';'
		//)
		public Alternatives getAlternatives_7() { return cAlternatives_7; }
		
		//( '{' onWriteAction=OnWriteRoutine  '}' )
		public Group getGroup_7_0() { return cGroup_7_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_7_0_0() { return cLeftCurlyBracketKeyword_7_0_0; }
		
		//onWriteAction=OnWriteRoutine
		public Assignment getOnWriteActionAssignment_7_0_1() { return cOnWriteActionAssignment_7_0_1; }
		
		//OnWriteRoutine
		public RuleCall getOnWriteActionOnWriteRoutineParserRuleCall_7_0_1_0() { return cOnWriteActionOnWriteRoutineParserRuleCall_7_0_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_7_0_2() { return cRightCurlyBracketKeyword_7_0_2; }
		
		//';'
		public Keyword getSemicolonKeyword_7_1() { return cSemicolonKeyword_7_1; }
	}
	public class VariableImplElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.VariableImpl");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cModifierAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cModifierModifierParserRuleCall_0_0 = (RuleCall)cModifierAssignment_0.eContents().get(0);
		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
		private final Keyword cVarKeyword_1_0 = (Keyword)cAlternatives_1.eContents().get(0);
		private final Assignment cConstAssignment_1_1 = (Assignment)cAlternatives_1.eContents().get(1);
		private final Keyword cConstValKeyword_1_1_0 = (Keyword)cConstAssignment_1_1.eContents().get(0);
		private final Group cGroup_1_2 = (Group)cAlternatives_1.eContents().get(2);
		private final Assignment cConstAssignment_1_2_0 = (Assignment)cGroup_1_2.eContents().get(0);
		private final Keyword cConstConstKeyword_1_2_0_0 = (Keyword)cConstAssignment_1_2_0.eContents().get(0);
		private final Assignment cMacroAssignment_1_2_1 = (Assignment)cGroup_1_2.eContents().get(1);
		private final Keyword cMacroMacroKeyword_1_2_1_0 = (Keyword)cMacroAssignment_1_2_1.eContents().get(0);
		private final Keyword cVarKeyword_1_2_2 = (Keyword)cGroup_1_2.eContents().get(2);
		private final Group cGroup_1_3 = (Group)cAlternatives_1.eContents().get(3);
		private final Assignment cMacroAssignment_1_3_0 = (Assignment)cGroup_1_3.eContents().get(0);
		private final Keyword cMacroMacroKeyword_1_3_0_0 = (Keyword)cMacroAssignment_1_3_0.eContents().get(0);
		private final Alternatives cAlternatives_1_3_1 = (Alternatives)cGroup_1_3.eContents().get(1);
		private final Keyword cVarKeyword_1_3_1_0 = (Keyword)cAlternatives_1_3_1.eContents().get(0);
		private final Assignment cConstAssignment_1_3_1_1 = (Assignment)cAlternatives_1_3_1.eContents().get(1);
		private final Keyword cConstValKeyword_1_3_1_1_0 = (Keyword)cConstAssignment_1_3_1_1.eContents().get(0);
		private final Assignment cTypeAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cTypeDataTypeParserRuleCall_2_0 = (RuleCall)cTypeAssignment_2.eContents().get(0);
		private final Assignment cReferenceAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final Keyword cReferenceAmpersandKeyword_3_0 = (Keyword)cReferenceAssignment_3.eContents().get(0);
		private final Assignment cNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cNameESIdentifierParserRuleCall_4_0 = (RuleCall)cNameAssignment_4.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_5_0 = (RuleCall)cUnrestrictedNameAssignment_5.eContents().get(0);
		private final Group cGroup_6 = (Group)cGroup.eContents().get(6);
		private final Keyword cEqualsSignKeyword_6_0 = (Keyword)cGroup_6.eContents().get(0);
		private final Assignment cDefaultValueAssignment_6_1 = (Assignment)cGroup_6.eContents().get(1);
		private final RuleCall cDefaultValueExpressionParserRuleCall_6_1_0 = (RuleCall)cDefaultValueAssignment_6_1.eContents().get(0);
		private final Alternatives cAlternatives_7 = (Alternatives)cGroup.eContents().get(7);
		private final Group cGroup_7_0 = (Group)cAlternatives_7.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_7_0_0 = (Keyword)cGroup_7_0.eContents().get(0);
		private final Assignment cOnWriteActionAssignment_7_0_1 = (Assignment)cGroup_7_0.eContents().get(1);
		private final RuleCall cOnWriteActionOnWriteRoutineParserRuleCall_7_0_1_0 = (RuleCall)cOnWriteActionAssignment_7_0_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_7_0_2 = (Keyword)cGroup_7_0.eContents().get(2);
		private final Keyword cSemicolonKeyword_7_1 = (Keyword)cAlternatives_7.eContents().get(1);
		
		//VariableImpl returns fmlInfra::Variable
		//    : ( modifier=Modifier )?
		//        ( 'var' | const?='val'
		//        | const?='const' ( macro?='macro' )? ( 'var' )?
		//        | macro?='macro' ( 'var' | const?='val' )?
		//        )
		//         type=DataType  ( reference?='&' )?
		//         name=ESIdentifier  ( unrestrictedName=UnrestrictedName )?
		//        ( '=' defaultValue=Expression )?
		//        ( ( '{' onWriteAction=OnWriteRoutine  '}' )
		//        | ';'
		//        )
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//( modifier=Modifier )?
		//       ( 'var' | const?='val'
		//       | const?='const' ( macro?='macro' )? ( 'var' )?
		//       | macro?='macro' ( 'var' | const?='val' )?
		//       )
		//        type=DataType  ( reference?='&' )?
		//        name=ESIdentifier  ( unrestrictedName=UnrestrictedName )?
		//       ( '=' defaultValue=Expression )?
		//       ( ( '{' onWriteAction=OnWriteRoutine  '}' )
		//       | ';'
		//       )
		public Group getGroup() { return cGroup; }
		
		//( modifier=Modifier )?
		public Assignment getModifierAssignment_0() { return cModifierAssignment_0; }
		
		//Modifier
		public RuleCall getModifierModifierParserRuleCall_0_0() { return cModifierModifierParserRuleCall_0_0; }
		
		//( 'var' | const?='val'
		//| const?='const' ( macro?='macro' )? ( 'var' )?
		//| macro?='macro' ( 'var' | const?='val' )?
		//)
		public Alternatives getAlternatives_1() { return cAlternatives_1; }
		
		//'var'
		public Keyword getVarKeyword_1_0() { return cVarKeyword_1_0; }
		
		//const?='val'
		public Assignment getConstAssignment_1_1() { return cConstAssignment_1_1; }
		
		//'val'
		public Keyword getConstValKeyword_1_1_0() { return cConstValKeyword_1_1_0; }
		
		//const?='const' ( macro?='macro' )? ( 'var' )?
		public Group getGroup_1_2() { return cGroup_1_2; }
		
		//const?='const'
		public Assignment getConstAssignment_1_2_0() { return cConstAssignment_1_2_0; }
		
		//'const'
		public Keyword getConstConstKeyword_1_2_0_0() { return cConstConstKeyword_1_2_0_0; }
		
		//( macro?='macro' )?
		public Assignment getMacroAssignment_1_2_1() { return cMacroAssignment_1_2_1; }
		
		//'macro'
		public Keyword getMacroMacroKeyword_1_2_1_0() { return cMacroMacroKeyword_1_2_1_0; }
		
		//( 'var' )?
		public Keyword getVarKeyword_1_2_2() { return cVarKeyword_1_2_2; }
		
		//macro?='macro' ( 'var' | const?='val' )?
		public Group getGroup_1_3() { return cGroup_1_3; }
		
		//macro?='macro'
		public Assignment getMacroAssignment_1_3_0() { return cMacroAssignment_1_3_0; }
		
		//'macro'
		public Keyword getMacroMacroKeyword_1_3_0_0() { return cMacroMacroKeyword_1_3_0_0; }
		
		//( 'var' | const?='val' )?
		public Alternatives getAlternatives_1_3_1() { return cAlternatives_1_3_1; }
		
		//'var'
		public Keyword getVarKeyword_1_3_1_0() { return cVarKeyword_1_3_1_0; }
		
		//const?='val'
		public Assignment getConstAssignment_1_3_1_1() { return cConstAssignment_1_3_1_1; }
		
		//'val'
		public Keyword getConstValKeyword_1_3_1_1_0() { return cConstValKeyword_1_3_1_1_0; }
		
		//type=DataType
		public Assignment getTypeAssignment_2() { return cTypeAssignment_2; }
		
		//DataType
		public RuleCall getTypeDataTypeParserRuleCall_2_0() { return cTypeDataTypeParserRuleCall_2_0; }
		
		//( reference?='&' )?
		public Assignment getReferenceAssignment_3() { return cReferenceAssignment_3; }
		
		//'&'
		public Keyword getReferenceAmpersandKeyword_3_0() { return cReferenceAmpersandKeyword_3_0; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_4() { return cNameAssignment_4; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_4_0() { return cNameESIdentifierParserRuleCall_4_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_5() { return cUnrestrictedNameAssignment_5; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_5_0; }
		
		//( '=' defaultValue=Expression )?
		public Group getGroup_6() { return cGroup_6; }
		
		//'='
		public Keyword getEqualsSignKeyword_6_0() { return cEqualsSignKeyword_6_0; }
		
		//defaultValue=Expression
		public Assignment getDefaultValueAssignment_6_1() { return cDefaultValueAssignment_6_1; }
		
		//Expression
		public RuleCall getDefaultValueExpressionParserRuleCall_6_1_0() { return cDefaultValueExpressionParserRuleCall_6_1_0; }
		
		//( ( '{' onWriteAction=OnWriteRoutine  '}' )
		//| ';'
		//)
		public Alternatives getAlternatives_7() { return cAlternatives_7; }
		
		//( '{' onWriteAction=OnWriteRoutine  '}' )
		public Group getGroup_7_0() { return cGroup_7_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_7_0_0() { return cLeftCurlyBracketKeyword_7_0_0; }
		
		//onWriteAction=OnWriteRoutine
		public Assignment getOnWriteActionAssignment_7_0_1() { return cOnWriteActionAssignment_7_0_1; }
		
		//OnWriteRoutine
		public RuleCall getOnWriteActionOnWriteRoutineParserRuleCall_7_0_1_0() { return cOnWriteActionOnWriteRoutineParserRuleCall_7_0_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_7_0_2() { return cRightCurlyBracketKeyword_7_0_2; }
		
		//';'
		public Keyword getSemicolonKeyword_7_1() { return cSemicolonKeyword_7_1; }
	}
	public class OnWriteRoutineElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.OnWriteRoutine");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cRoutineAction_0 = (Action)cGroup.eContents().get(0);
		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
		private final Keyword cWriteKeyword_1_0 = (Keyword)cAlternatives_1.eContents().get(0);
		private final Keyword cOn_writeKeyword_1_1 = (Keyword)cAlternatives_1.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final Assignment cParameterSetAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
		private final RuleCall cParameterSetVariableRoutineParameterSetParserRuleCall_2_1_0 = (RuleCall)cParameterSetAssignment_2_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cBodyBlockAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cBodyBlockBlockStatementParserRuleCall_3_0 = (RuleCall)cBodyBlockAssignment_3.eContents().get(0);
		
		//OnWriteRoutine returns fmlInfra::Routine
		//    : { fmlInfra::Routine }
		//        ( '@write' | '@on_write' )
		//        ( '(' parameterSet=VariableRoutineParameterSet ')' )?
		//        bodyBlock=BlockStatement
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{ fmlInfra::Routine }
		//       ( '@write' | '@on_write' )
		//       ( '(' parameterSet=VariableRoutineParameterSet ')' )?
		//       bodyBlock=BlockStatement
		public Group getGroup() { return cGroup; }
		
		//{ fmlInfra::Routine }
		public Action getRoutineAction_0() { return cRoutineAction_0; }
		
		//( '@write' | '@on_write' )
		public Alternatives getAlternatives_1() { return cAlternatives_1; }
		
		//'@write'
		public Keyword getWriteKeyword_1_0() { return cWriteKeyword_1_0; }
		
		//'@on_write'
		public Keyword getOn_writeKeyword_1_1() { return cOn_writeKeyword_1_1; }
		
		//( '(' parameterSet=VariableRoutineParameterSet ')' )?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//parameterSet=VariableRoutineParameterSet
		public Assignment getParameterSetAssignment_2_1() { return cParameterSetAssignment_2_1; }
		
		//VariableRoutineParameterSet
		public RuleCall getParameterSetVariableRoutineParameterSetParserRuleCall_2_1_0() { return cParameterSetVariableRoutineParameterSetParserRuleCall_2_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
		
		//bodyBlock=BlockStatement
		public Assignment getBodyBlockAssignment_3() { return cBodyBlockAssignment_3; }
		
		//BlockStatement
		public RuleCall getBodyBlockBlockStatementParserRuleCall_3_0() { return cBodyBlockBlockStatementParserRuleCall_3_0; }
	}
	public class VariableRoutineParameterSetElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.VariableRoutineParameterSet");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cParameterSetAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cParameterAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cParameterVariableRoutineParameterParserRuleCall_1_0 = (RuleCall)cParameterAssignment_1.eContents().get(0);
		
		//VariableRoutineParameterSet returns fmlInfra::ParameterSet
		//    : {fmlInfra::ParameterSet}
		//        parameter+=VariableRoutineParameter
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlInfra::ParameterSet}
		//       parameter+=VariableRoutineParameter
		public Group getGroup() { return cGroup; }
		
		//{fmlInfra::ParameterSet}
		public Action getParameterSetAction_0() { return cParameterSetAction_0; }
		
		//parameter+=VariableRoutineParameter
		public Assignment getParameterAssignment_1() { return cParameterAssignment_1; }
		
		//VariableRoutineParameter
		public RuleCall getParameterVariableRoutineParameterParserRuleCall_1_0() { return cParameterVariableRoutineParameterParserRuleCall_1_0; }
	}
	public class VariableRoutineParameterElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.VariableRoutineParameter");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final RuleCall cFormalParameterOffsetParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
		private final Assignment cDirectionAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cDirectionParameterDirectionKindEnumRuleCall_1_0 = (RuleCall)cDirectionAssignment_1.eContents().get(0);
		private final Assignment cTypeAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cTypeDataTypeParserRuleCall_2_0 = (RuleCall)cTypeAssignment_2.eContents().get(0);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cEqualsSignKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Assignment cDefaultValueAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
		private final RuleCall cDefaultValueExpressionParserRuleCall_4_1_0 = (RuleCall)cDefaultValueAssignment_4_1.eContents().get(0);
		
		//VariableRoutineParameter returns fmlInfra::Parameter
		//    : ( FormalParameterOffset )?
		//        ( direction=ParameterDirectionKind )?
		//        ( type=DataType )?
		//        name=ESIdentifier
		//        ( '=' defaultValue=Expression )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//( FormalParameterOffset )?
		//       ( direction=ParameterDirectionKind )?
		//       ( type=DataType )?
		//       name=ESIdentifier
		//       ( '=' defaultValue=Expression )?
		public Group getGroup() { return cGroup; }
		
		//( FormalParameterOffset )?
		public RuleCall getFormalParameterOffsetParserRuleCall_0() { return cFormalParameterOffsetParserRuleCall_0; }
		
		//( direction=ParameterDirectionKind )?
		public Assignment getDirectionAssignment_1() { return cDirectionAssignment_1; }
		
		//ParameterDirectionKind
		public RuleCall getDirectionParameterDirectionKindEnumRuleCall_1_0() { return cDirectionParameterDirectionKindEnumRuleCall_1_0; }
		
		//( type=DataType )?
		public Assignment getTypeAssignment_2() { return cTypeAssignment_2; }
		
		//DataType
		public RuleCall getTypeDataTypeParserRuleCall_2_0() { return cTypeDataTypeParserRuleCall_2_0; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
		
		//( '=' defaultValue=Expression )?
		public Group getGroup_4() { return cGroup_4; }
		
		//'='
		public Keyword getEqualsSignKeyword_4_0() { return cEqualsSignKeyword_4_0; }
		
		//defaultValue=Expression
		public Assignment getDefaultValueAssignment_4_1() { return cDefaultValueAssignment_4_1; }
		
		//Expression
		public RuleCall getDefaultValueExpressionParserRuleCall_4_1_0() { return cDefaultValueExpressionParserRuleCall_4_1_0; }
	}
	public class VariablePublicElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.VariablePublic");
		private final RuleCall cVariableImplParserRuleCall = (RuleCall)rule.eContents().get(1);
		
		//VariablePublic returns fmlInfra::Variable
		//    : VariableImpl
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//VariableImpl
		public RuleCall getVariableImplParserRuleCall() { return cVariableImplParserRuleCall; }
	}
	public class VariableProtectedElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.VariableProtected");
		private final RuleCall cVariableImplParserRuleCall = (RuleCall)rule.eContents().get(1);
		
		//VariableProtected returns fmlInfra::Variable
		//    : VariableImpl
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//VariableImpl
		public RuleCall getVariableImplParserRuleCall() { return cVariableImplParserRuleCall; }
	}
	public class VariablePrivateElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.VariablePrivate");
		private final RuleCall cVariableImplParserRuleCall = (RuleCall)rule.eContents().get(1);
		
		//VariablePrivate returns fmlInfra::Variable
		//    : VariableImpl
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//VariableImpl
		public RuleCall getVariableImplParserRuleCall() { return cVariableImplParserRuleCall; }
	}
	public class FunctionalParameterSetElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.FunctionalParameterSet");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cParameterSetAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cParameterAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cParameterFunctionalParameterParserRuleCall_1_0 = (RuleCall)cParameterAssignment_1.eContents().get(0);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cCommaKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final Assignment cParameterAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
		private final RuleCall cParameterFunctionalParameterParserRuleCall_2_1_0 = (RuleCall)cParameterAssignment_2_1.eContents().get(0);
		
		//FunctionalParameterSet returns fmlInfra::ParameterSet
		//    : {fmlInfra::ParameterSet}
		//        parameter+=FunctionalParameter
		//        ( ',' parameter+=FunctionalParameter )*
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlInfra::ParameterSet}
		//       parameter+=FunctionalParameter
		//       ( ',' parameter+=FunctionalParameter )*
		public Group getGroup() { return cGroup; }
		
		//{fmlInfra::ParameterSet}
		public Action getParameterSetAction_0() { return cParameterSetAction_0; }
		
		//parameter+=FunctionalParameter
		public Assignment getParameterAssignment_1() { return cParameterAssignment_1; }
		
		//FunctionalParameter
		public RuleCall getParameterFunctionalParameterParserRuleCall_1_0() { return cParameterFunctionalParameterParserRuleCall_1_0; }
		
		//( ',' parameter+=FunctionalParameter )*
		public Group getGroup_2() { return cGroup_2; }
		
		//','
		public Keyword getCommaKeyword_2_0() { return cCommaKeyword_2_0; }
		
		//parameter+=FunctionalParameter
		public Assignment getParameterAssignment_2_1() { return cParameterAssignment_2_1; }
		
		//FunctionalParameter
		public RuleCall getParameterFunctionalParameterParserRuleCall_2_1_0() { return cParameterFunctionalParameterParserRuleCall_2_1_0; }
	}
	public class FunctionalParameterElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.FunctionalParameter");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cParameterAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cDirectionAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cDirectionParameterDirectionKindEnumRuleCall_1_0 = (RuleCall)cDirectionAssignment_1.eContents().get(0);
		private final Assignment cTypeAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cTypeDataTypeParserRuleCall_2_0 = (RuleCall)cTypeAssignment_2.eContents().get(0);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cEqualsSignKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Assignment cDefaultValueAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
		private final RuleCall cDefaultValueExpressionParserRuleCall_4_1_0 = (RuleCall)cDefaultValueAssignment_4_1.eContents().get(0);
		
		//FunctionalParameter returns fmlInfra::Parameter
		//    : {fmlInfra::Parameter}
		//        ( direction=ParameterDirectionKind )?  type=DataType
		//         name=ESIdentifier
		//        ( '=' defaultValue=Expression )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlInfra::Parameter}
		//       ( direction=ParameterDirectionKind )?  type=DataType
		//        name=ESIdentifier
		//       ( '=' defaultValue=Expression )?
		public Group getGroup() { return cGroup; }
		
		//{fmlInfra::Parameter}
		public Action getParameterAction_0() { return cParameterAction_0; }
		
		//( direction=ParameterDirectionKind )?
		public Assignment getDirectionAssignment_1() { return cDirectionAssignment_1; }
		
		//ParameterDirectionKind
		public RuleCall getDirectionParameterDirectionKindEnumRuleCall_1_0() { return cDirectionParameterDirectionKindEnumRuleCall_1_0; }
		
		//type=DataType
		public Assignment getTypeAssignment_2() { return cTypeAssignment_2; }
		
		//DataType
		public RuleCall getTypeDataTypeParserRuleCall_2_0() { return cTypeDataTypeParserRuleCall_2_0; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
		
		//( '=' defaultValue=Expression )?
		public Group getGroup_4() { return cGroup_4; }
		
		//'='
		public Keyword getEqualsSignKeyword_4_0() { return cEqualsSignKeyword_4_0; }
		
		//defaultValue=Expression
		public Assignment getDefaultValueAssignment_4_1() { return cDefaultValueAssignment_4_1; }
		
		//Expression
		public RuleCall getDefaultValueExpressionParserRuleCall_4_1_0() { return cDefaultValueExpressionParserRuleCall_4_1_0; }
	}
	public class FormalParameterSetElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.FormalParameterSet");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cParameterSetAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cParameterAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cParameterFormalParameterParserRuleCall_1_0 = (RuleCall)cParameterAssignment_1.eContents().get(0);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cCommaKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final Assignment cParameterAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
		private final RuleCall cParameterFormalParameterParserRuleCall_2_1_0 = (RuleCall)cParameterAssignment_2_1.eContents().get(0);
		
		//FormalParameterSet returns fmlInfra::ParameterSet
		//    : {fmlInfra::ParameterSet}
		//        parameter+=FormalParameter
		//        ( ',' parameter+=FormalParameter )*
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlInfra::ParameterSet}
		//       parameter+=FormalParameter
		//       ( ',' parameter+=FormalParameter )*
		public Group getGroup() { return cGroup; }
		
		//{fmlInfra::ParameterSet}
		public Action getParameterSetAction_0() { return cParameterSetAction_0; }
		
		//parameter+=FormalParameter
		public Assignment getParameterAssignment_1() { return cParameterAssignment_1; }
		
		//FormalParameter
		public RuleCall getParameterFormalParameterParserRuleCall_1_0() { return cParameterFormalParameterParserRuleCall_1_0; }
		
		//( ',' parameter+=FormalParameter )*
		public Group getGroup_2() { return cGroup_2; }
		
		//','
		public Keyword getCommaKeyword_2_0() { return cCommaKeyword_2_0; }
		
		//parameter+=FormalParameter
		public Assignment getParameterAssignment_2_1() { return cParameterAssignment_2_1; }
		
		//FormalParameter
		public RuleCall getParameterFormalParameterParserRuleCall_2_1_0() { return cParameterFormalParameterParserRuleCall_2_1_0; }
	}
	public class FormalParameterElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.FormalParameter");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cParameterAction_0 = (Action)cGroup.eContents().get(0);
		private final RuleCall cFormalParameterOffsetParserRuleCall_1 = (RuleCall)cGroup.eContents().get(1);
		private final Assignment cDirectionAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cDirectionParameterDirectionKindEnumRuleCall_2_0 = (RuleCall)cDirectionAssignment_2.eContents().get(0);
		private final Assignment cModifierAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cModifierModifierParserRuleCall_3_0 = (RuleCall)cModifierAssignment_3.eContents().get(0);
		private final Assignment cTypeAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cTypeDataTypeParserRuleCall_4_0 = (RuleCall)cTypeAssignment_4.eContents().get(0);
		private final Assignment cNameAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cNameESIdentifierParserRuleCall_5_0 = (RuleCall)cNameAssignment_5.eContents().get(0);
		private final Group cGroup_6 = (Group)cGroup.eContents().get(6);
		private final Keyword cEqualsSignKeyword_6_0 = (Keyword)cGroup_6.eContents().get(0);
		private final Assignment cDefaultValueAssignment_6_1 = (Assignment)cGroup_6.eContents().get(1);
		private final RuleCall cDefaultValueExpressionParserRuleCall_6_1_0 = (RuleCall)cDefaultValueAssignment_6_1.eContents().get(0);
		
		//FormalParameter returns fmlInfra::Parameter
		//    : {fmlInfra::Parameter}
		//        ( FormalParameterOffset )?
		//        ( direction=ParameterDirectionKind )? ( modifier=Modifier )?
		//        type=DataType  ( name=ESIdentifier )?
		//        ( '=' defaultValue=Expression )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlInfra::Parameter}
		//       ( FormalParameterOffset )?
		//       ( direction=ParameterDirectionKind )? ( modifier=Modifier )?
		//       type=DataType  ( name=ESIdentifier )?
		//       ( '=' defaultValue=Expression )?
		public Group getGroup() { return cGroup; }
		
		//{fmlInfra::Parameter}
		public Action getParameterAction_0() { return cParameterAction_0; }
		
		//( FormalParameterOffset )?
		public RuleCall getFormalParameterOffsetParserRuleCall_1() { return cFormalParameterOffsetParserRuleCall_1; }
		
		//( direction=ParameterDirectionKind )?
		public Assignment getDirectionAssignment_2() { return cDirectionAssignment_2; }
		
		//ParameterDirectionKind
		public RuleCall getDirectionParameterDirectionKindEnumRuleCall_2_0() { return cDirectionParameterDirectionKindEnumRuleCall_2_0; }
		
		//( modifier=Modifier )?
		public Assignment getModifierAssignment_3() { return cModifierAssignment_3; }
		
		//Modifier
		public RuleCall getModifierModifierParserRuleCall_3_0() { return cModifierModifierParserRuleCall_3_0; }
		
		//type=DataType
		public Assignment getTypeAssignment_4() { return cTypeAssignment_4; }
		
		//DataType
		public RuleCall getTypeDataTypeParserRuleCall_4_0() { return cTypeDataTypeParserRuleCall_4_0; }
		
		//( name=ESIdentifier )?
		public Assignment getNameAssignment_5() { return cNameAssignment_5; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_5_0() { return cNameESIdentifierParserRuleCall_5_0; }
		
		//( '=' defaultValue=Expression )?
		public Group getGroup_6() { return cGroup_6; }
		
		//'='
		public Keyword getEqualsSignKeyword_6_0() { return cEqualsSignKeyword_6_0; }
		
		//defaultValue=Expression
		public Assignment getDefaultValueAssignment_6_1() { return cDefaultValueAssignment_6_1; }
		
		//Expression
		public RuleCall getDefaultValueExpressionParserRuleCall_6_1_0() { return cDefaultValueExpressionParserRuleCall_6_1_0; }
	}
	public class FormalParameterOffsetElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.FormalParameterOffset");
		private final RuleCall cEOffsetParserRuleCall = (RuleCall)rule.eContents().get(1);
		
		//FormalParameterOffset
		//    : EOffset
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//EOffset
		public RuleCall getEOffsetParserRuleCall() { return cEOffsetParserRuleCall; }
	}
	public class BlockParameterSetElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.BlockParameterSet");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cParameterSetAction_0 = (Action)cGroup.eContents().get(0);
		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
		private final Group cGroup_1_0 = (Group)cAlternatives_1.eContents().get(0);
		private final Keyword cInputKeyword_1_0_0 = (Keyword)cGroup_1_0.eContents().get(0);
		private final Alternatives cAlternatives_1_0_1 = (Alternatives)cGroup_1_0.eContents().get(1);
		private final Assignment cParameterAssignment_1_0_1_0 = (Assignment)cAlternatives_1_0_1.eContents().get(0);
		private final RuleCall cParameterParameterInputParserRuleCall_1_0_1_0_0 = (RuleCall)cParameterAssignment_1_0_1_0.eContents().get(0);
		private final Group cGroup_1_0_1_1 = (Group)cAlternatives_1_0_1.eContents().get(1);
		private final Keyword cLeftCurlyBracketKeyword_1_0_1_1_0 = (Keyword)cGroup_1_0_1_1.eContents().get(0);
		private final Assignment cParameterAssignment_1_0_1_1_1 = (Assignment)cGroup_1_0_1_1.eContents().get(1);
		private final RuleCall cParameterParameterInputParserRuleCall_1_0_1_1_1_0 = (RuleCall)cParameterAssignment_1_0_1_1_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_1_0_1_1_2 = (Keyword)cGroup_1_0_1_1.eContents().get(2);
		private final Group cGroup_1_1 = (Group)cAlternatives_1.eContents().get(1);
		private final Keyword cInoutKeyword_1_1_0 = (Keyword)cGroup_1_1.eContents().get(0);
		private final Alternatives cAlternatives_1_1_1 = (Alternatives)cGroup_1_1.eContents().get(1);
		private final Assignment cParameterAssignment_1_1_1_0 = (Assignment)cAlternatives_1_1_1.eContents().get(0);
		private final RuleCall cParameterParameterInoutParserRuleCall_1_1_1_0_0 = (RuleCall)cParameterAssignment_1_1_1_0.eContents().get(0);
		private final Group cGroup_1_1_1_1 = (Group)cAlternatives_1_1_1.eContents().get(1);
		private final Keyword cLeftCurlyBracketKeyword_1_1_1_1_0 = (Keyword)cGroup_1_1_1_1.eContents().get(0);
		private final Assignment cParameterAssignment_1_1_1_1_1 = (Assignment)cGroup_1_1_1_1.eContents().get(1);
		private final RuleCall cParameterParameterInoutParserRuleCall_1_1_1_1_1_0 = (RuleCall)cParameterAssignment_1_1_1_1_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_1_1_1_1_2 = (Keyword)cGroup_1_1_1_1.eContents().get(2);
		private final Group cGroup_1_2 = (Group)cAlternatives_1.eContents().get(2);
		private final Keyword cOutputKeyword_1_2_0 = (Keyword)cGroup_1_2.eContents().get(0);
		private final Alternatives cAlternatives_1_2_1 = (Alternatives)cGroup_1_2.eContents().get(1);
		private final Assignment cParameterAssignment_1_2_1_0 = (Assignment)cAlternatives_1_2_1.eContents().get(0);
		private final RuleCall cParameterParameterOutputParserRuleCall_1_2_1_0_0 = (RuleCall)cParameterAssignment_1_2_1_0.eContents().get(0);
		private final Group cGroup_1_2_1_1 = (Group)cAlternatives_1_2_1.eContents().get(1);
		private final Keyword cLeftCurlyBracketKeyword_1_2_1_1_0 = (Keyword)cGroup_1_2_1_1.eContents().get(0);
		private final Assignment cParameterAssignment_1_2_1_1_1 = (Assignment)cGroup_1_2_1_1.eContents().get(1);
		private final RuleCall cParameterParameterOutputParserRuleCall_1_2_1_1_1_0 = (RuleCall)cParameterAssignment_1_2_1_1_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_1_2_1_1_2 = (Keyword)cGroup_1_2_1_1.eContents().get(2);
		private final Group cGroup_1_3 = (Group)cAlternatives_1.eContents().get(3);
		private final Keyword cReturnKeyword_1_3_0 = (Keyword)cGroup_1_3.eContents().get(0);
		private final Alternatives cAlternatives_1_3_1 = (Alternatives)cGroup_1_3.eContents().get(1);
		private final Assignment cParameterAssignment_1_3_1_0 = (Assignment)cAlternatives_1_3_1.eContents().get(0);
		private final RuleCall cParameterParameterReturnParserRuleCall_1_3_1_0_0 = (RuleCall)cParameterAssignment_1_3_1_0.eContents().get(0);
		private final Group cGroup_1_3_1_1 = (Group)cAlternatives_1_3_1.eContents().get(1);
		private final Keyword cLeftCurlyBracketKeyword_1_3_1_1_0 = (Keyword)cGroup_1_3_1_1.eContents().get(0);
		private final Assignment cParameterAssignment_1_3_1_1_1 = (Assignment)cGroup_1_3_1_1.eContents().get(1);
		private final RuleCall cParameterParameterReturnParserRuleCall_1_3_1_1_1_0 = (RuleCall)cParameterAssignment_1_3_1_1_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_1_3_1_1_2 = (Keyword)cGroup_1_3_1_1.eContents().get(2);
		
		//////////////////////////////////////////////////////////////////////////////////
		//// Block ParameterSet Rules
		//////////////////////////////////////////////////////////////////////////////////
		//BlockParameterSet returns fmlInfra::ParameterSet
		//    : {fmlInfra::ParameterSet}
		//        ( 'input'
		//            ( parameter+=ParameterInput
		//            | '{' ( parameter+=ParameterInput )+ '}'
		//            )
		//        | 'inout'
		//            ( parameter+=ParameterInout
		//            | '{' ( parameter+=ParameterInout )+ '}'
		//            )
		//        | 'output'
		//            ( parameter+=ParameterOutput
		//            | '{' ( parameter+=ParameterOutput )+ '}'
		//            )
		//        | 'return'
		//            ( parameter+=ParameterReturn
		//            | '{' ( parameter+=ParameterReturn )+ '}'
		//            )
		//        )*
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlInfra::ParameterSet}
		//       ( 'input'
		//           ( parameter+=ParameterInput
		//           | '{' ( parameter+=ParameterInput )+ '}'
		//           )
		//       | 'inout'
		//           ( parameter+=ParameterInout
		//           | '{' ( parameter+=ParameterInout )+ '}'
		//           )
		//       | 'output'
		//           ( parameter+=ParameterOutput
		//           | '{' ( parameter+=ParameterOutput )+ '}'
		//           )
		//       | 'return'
		//           ( parameter+=ParameterReturn
		//           | '{' ( parameter+=ParameterReturn )+ '}'
		//           )
		//       )*
		public Group getGroup() { return cGroup; }
		
		//{fmlInfra::ParameterSet}
		public Action getParameterSetAction_0() { return cParameterSetAction_0; }
		
		//( 'input'
		//    ( parameter+=ParameterInput
		//    | '{' ( parameter+=ParameterInput )+ '}'
		//    )
		//| 'inout'
		//    ( parameter+=ParameterInout
		//    | '{' ( parameter+=ParameterInout )+ '}'
		//    )
		//| 'output'
		//    ( parameter+=ParameterOutput
		//    | '{' ( parameter+=ParameterOutput )+ '}'
		//    )
		//| 'return'
		//    ( parameter+=ParameterReturn
		//    | '{' ( parameter+=ParameterReturn )+ '}'
		//    )
		//)*
		public Alternatives getAlternatives_1() { return cAlternatives_1; }
		
		//'input'
		//           ( parameter+=ParameterInput
		//           | '{' ( parameter+=ParameterInput )+ '}'
		//           )
		public Group getGroup_1_0() { return cGroup_1_0; }
		
		//'input'
		public Keyword getInputKeyword_1_0_0() { return cInputKeyword_1_0_0; }
		
		//( parameter+=ParameterInput
		//| '{' ( parameter+=ParameterInput )+ '}'
		//)
		public Alternatives getAlternatives_1_0_1() { return cAlternatives_1_0_1; }
		
		//parameter+=ParameterInput
		public Assignment getParameterAssignment_1_0_1_0() { return cParameterAssignment_1_0_1_0; }
		
		//ParameterInput
		public RuleCall getParameterParameterInputParserRuleCall_1_0_1_0_0() { return cParameterParameterInputParserRuleCall_1_0_1_0_0; }
		
		//'{' ( parameter+=ParameterInput )+ '}'
		public Group getGroup_1_0_1_1() { return cGroup_1_0_1_1; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_1_0_1_1_0() { return cLeftCurlyBracketKeyword_1_0_1_1_0; }
		
		//( parameter+=ParameterInput )+
		public Assignment getParameterAssignment_1_0_1_1_1() { return cParameterAssignment_1_0_1_1_1; }
		
		//ParameterInput
		public RuleCall getParameterParameterInputParserRuleCall_1_0_1_1_1_0() { return cParameterParameterInputParserRuleCall_1_0_1_1_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_1_0_1_1_2() { return cRightCurlyBracketKeyword_1_0_1_1_2; }
		
		//'inout'
		//           ( parameter+=ParameterInout
		//           | '{' ( parameter+=ParameterInout )+ '}'
		//           )
		public Group getGroup_1_1() { return cGroup_1_1; }
		
		//'inout'
		public Keyword getInoutKeyword_1_1_0() { return cInoutKeyword_1_1_0; }
		
		//( parameter+=ParameterInout
		//| '{' ( parameter+=ParameterInout )+ '}'
		//)
		public Alternatives getAlternatives_1_1_1() { return cAlternatives_1_1_1; }
		
		//parameter+=ParameterInout
		public Assignment getParameterAssignment_1_1_1_0() { return cParameterAssignment_1_1_1_0; }
		
		//ParameterInout
		public RuleCall getParameterParameterInoutParserRuleCall_1_1_1_0_0() { return cParameterParameterInoutParserRuleCall_1_1_1_0_0; }
		
		//'{' ( parameter+=ParameterInout )+ '}'
		public Group getGroup_1_1_1_1() { return cGroup_1_1_1_1; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_1_1_1_1_0() { return cLeftCurlyBracketKeyword_1_1_1_1_0; }
		
		//( parameter+=ParameterInout )+
		public Assignment getParameterAssignment_1_1_1_1_1() { return cParameterAssignment_1_1_1_1_1; }
		
		//ParameterInout
		public RuleCall getParameterParameterInoutParserRuleCall_1_1_1_1_1_0() { return cParameterParameterInoutParserRuleCall_1_1_1_1_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_1_1_1_1_2() { return cRightCurlyBracketKeyword_1_1_1_1_2; }
		
		//'output'
		//           ( parameter+=ParameterOutput
		//           | '{' ( parameter+=ParameterOutput )+ '}'
		//           )
		public Group getGroup_1_2() { return cGroup_1_2; }
		
		//'output'
		public Keyword getOutputKeyword_1_2_0() { return cOutputKeyword_1_2_0; }
		
		//( parameter+=ParameterOutput
		//| '{' ( parameter+=ParameterOutput )+ '}'
		//)
		public Alternatives getAlternatives_1_2_1() { return cAlternatives_1_2_1; }
		
		//parameter+=ParameterOutput
		public Assignment getParameterAssignment_1_2_1_0() { return cParameterAssignment_1_2_1_0; }
		
		//ParameterOutput
		public RuleCall getParameterParameterOutputParserRuleCall_1_2_1_0_0() { return cParameterParameterOutputParserRuleCall_1_2_1_0_0; }
		
		//'{' ( parameter+=ParameterOutput )+ '}'
		public Group getGroup_1_2_1_1() { return cGroup_1_2_1_1; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_1_2_1_1_0() { return cLeftCurlyBracketKeyword_1_2_1_1_0; }
		
		//( parameter+=ParameterOutput )+
		public Assignment getParameterAssignment_1_2_1_1_1() { return cParameterAssignment_1_2_1_1_1; }
		
		//ParameterOutput
		public RuleCall getParameterParameterOutputParserRuleCall_1_2_1_1_1_0() { return cParameterParameterOutputParserRuleCall_1_2_1_1_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_1_2_1_1_2() { return cRightCurlyBracketKeyword_1_2_1_1_2; }
		
		//'return'
		//           ( parameter+=ParameterReturn
		//           | '{' ( parameter+=ParameterReturn )+ '}'
		//           )
		public Group getGroup_1_3() { return cGroup_1_3; }
		
		//'return'
		public Keyword getReturnKeyword_1_3_0() { return cReturnKeyword_1_3_0; }
		
		//( parameter+=ParameterReturn
		//| '{' ( parameter+=ParameterReturn )+ '}'
		//)
		public Alternatives getAlternatives_1_3_1() { return cAlternatives_1_3_1; }
		
		//parameter+=ParameterReturn
		public Assignment getParameterAssignment_1_3_1_0() { return cParameterAssignment_1_3_1_0; }
		
		//ParameterReturn
		public RuleCall getParameterParameterReturnParserRuleCall_1_3_1_0_0() { return cParameterParameterReturnParserRuleCall_1_3_1_0_0; }
		
		//'{' ( parameter+=ParameterReturn )+ '}'
		public Group getGroup_1_3_1_1() { return cGroup_1_3_1_1; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_1_3_1_1_0() { return cLeftCurlyBracketKeyword_1_3_1_1_0; }
		
		//( parameter+=ParameterReturn )+
		public Assignment getParameterAssignment_1_3_1_1_1() { return cParameterAssignment_1_3_1_1_1; }
		
		//ParameterReturn
		public RuleCall getParameterParameterReturnParserRuleCall_1_3_1_1_1_0() { return cParameterParameterReturnParserRuleCall_1_3_1_1_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_1_3_1_1_2() { return cRightCurlyBracketKeyword_1_3_1_1_2; }
	}
	public class ParameterElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.Parameter");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cParameterAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cVisibilityAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cVisibilityVisibilityKindEnumRuleCall_1_0 = (RuleCall)cVisibilityAssignment_1.eContents().get(0);
		private final Assignment cDirectionAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cDirectionParameterDirectionKindEnumRuleCall_2_0 = (RuleCall)cDirectionAssignment_2.eContents().get(0);
		private final Keyword cVarKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Assignment cTypeAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cTypeDataTypeParserRuleCall_4_0 = (RuleCall)cTypeAssignment_4.eContents().get(0);
		private final Assignment cNameAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cNameESIdentifierParserRuleCall_5_0 = (RuleCall)cNameAssignment_5.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_6_0 = (RuleCall)cUnrestrictedNameAssignment_6.eContents().get(0);
		private final Group cGroup_7 = (Group)cGroup.eContents().get(7);
		private final Keyword cEqualsSignKeyword_7_0 = (Keyword)cGroup_7.eContents().get(0);
		private final Assignment cDefaultValueAssignment_7_1 = (Assignment)cGroup_7.eContents().get(1);
		private final RuleCall cDefaultValueExpressionParserRuleCall_7_1_0 = (RuleCall)cDefaultValueAssignment_7_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_8 = (Keyword)cGroup.eContents().get(8);
		
		//Parameter returns fmlInfra::Parameter
		//    : {fmlInfra::Parameter}
		//        ( visibility=VisibilityKind )?
		//        direction=ParameterDirectionKind
		//        'var'  type=DataType
		//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//        ( '=' defaultValue=Expression )?  ';'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlInfra::Parameter}
		//       ( visibility=VisibilityKind )?
		//       direction=ParameterDirectionKind
		//       'var'  type=DataType
		//       name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//       ( '=' defaultValue=Expression )?  ';'
		public Group getGroup() { return cGroup; }
		
		//{fmlInfra::Parameter}
		public Action getParameterAction_0() { return cParameterAction_0; }
		
		//( visibility=VisibilityKind )?
		public Assignment getVisibilityAssignment_1() { return cVisibilityAssignment_1; }
		
		//VisibilityKind
		public RuleCall getVisibilityVisibilityKindEnumRuleCall_1_0() { return cVisibilityVisibilityKindEnumRuleCall_1_0; }
		
		//direction=ParameterDirectionKind
		public Assignment getDirectionAssignment_2() { return cDirectionAssignment_2; }
		
		//ParameterDirectionKind
		public RuleCall getDirectionParameterDirectionKindEnumRuleCall_2_0() { return cDirectionParameterDirectionKindEnumRuleCall_2_0; }
		
		//'var'
		public Keyword getVarKeyword_3() { return cVarKeyword_3; }
		
		//type=DataType
		public Assignment getTypeAssignment_4() { return cTypeAssignment_4; }
		
		//DataType
		public RuleCall getTypeDataTypeParserRuleCall_4_0() { return cTypeDataTypeParserRuleCall_4_0; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_5() { return cNameAssignment_5; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_5_0() { return cNameESIdentifierParserRuleCall_5_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_6() { return cUnrestrictedNameAssignment_6; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_6_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_6_0; }
		
		//( '=' defaultValue=Expression )?
		public Group getGroup_7() { return cGroup_7; }
		
		//'='
		public Keyword getEqualsSignKeyword_7_0() { return cEqualsSignKeyword_7_0; }
		
		//defaultValue=Expression
		public Assignment getDefaultValueAssignment_7_1() { return cDefaultValueAssignment_7_1; }
		
		//Expression
		public RuleCall getDefaultValueExpressionParserRuleCall_7_1_0() { return cDefaultValueExpressionParserRuleCall_7_1_0; }
		
		//';'
		public Keyword getSemicolonKeyword_8() { return cSemicolonKeyword_8; }
	}
	public class ParameterImplElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ParameterImpl");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cParameterAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cVarKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cTypeAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cTypeDataTypeParserRuleCall_2_0 = (RuleCall)cTypeAssignment_2.eContents().get(0);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
		private final Group cGroup_5 = (Group)cGroup.eContents().get(5);
		private final Keyword cEqualsSignKeyword_5_0 = (Keyword)cGroup_5.eContents().get(0);
		private final Assignment cDefaultValueAssignment_5_1 = (Assignment)cGroup_5.eContents().get(1);
		private final RuleCall cDefaultValueExpressionParserRuleCall_5_1_0 = (RuleCall)cDefaultValueAssignment_5_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_6 = (Keyword)cGroup.eContents().get(6);
		
		//ParameterImpl returns fmlInfra::Parameter
		//    : {fmlInfra::Parameter}
		//        'var'  type=DataType
		//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//        ( '=' defaultValue=Expression )?  ';'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlInfra::Parameter}
		//       'var'  type=DataType
		//       name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//       ( '=' defaultValue=Expression )?  ';'
		public Group getGroup() { return cGroup; }
		
		//{fmlInfra::Parameter}
		public Action getParameterAction_0() { return cParameterAction_0; }
		
		//'var'
		public Keyword getVarKeyword_1() { return cVarKeyword_1; }
		
		//type=DataType
		public Assignment getTypeAssignment_2() { return cTypeAssignment_2; }
		
		//DataType
		public RuleCall getTypeDataTypeParserRuleCall_2_0() { return cTypeDataTypeParserRuleCall_2_0; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
		
		//( '=' defaultValue=Expression )?
		public Group getGroup_5() { return cGroup_5; }
		
		//'='
		public Keyword getEqualsSignKeyword_5_0() { return cEqualsSignKeyword_5_0; }
		
		//defaultValue=Expression
		public Assignment getDefaultValueAssignment_5_1() { return cDefaultValueAssignment_5_1; }
		
		//Expression
		public RuleCall getDefaultValueExpressionParserRuleCall_5_1_0() { return cDefaultValueExpressionParserRuleCall_5_1_0; }
		
		//';'
		public Keyword getSemicolonKeyword_6() { return cSemicolonKeyword_6; }
	}
	public class ParameterInputElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ParameterInput");
		private final RuleCall cParameterImplParserRuleCall = (RuleCall)rule.eContents().get(1);
		
		//ParameterInput returns fmlInfra::Parameter
		//    : ParameterImpl
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//ParameterImpl
		public RuleCall getParameterImplParserRuleCall() { return cParameterImplParserRuleCall; }
	}
	public class ParameterInoutElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ParameterInout");
		private final RuleCall cParameterImplParserRuleCall = (RuleCall)rule.eContents().get(1);
		
		//ParameterInout returns fmlInfra::Parameter
		//    : ParameterImpl
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//ParameterImpl
		public RuleCall getParameterImplParserRuleCall() { return cParameterImplParserRuleCall; }
	}
	public class ParameterOutputElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ParameterOutput");
		private final RuleCall cParameterImplParserRuleCall = (RuleCall)rule.eContents().get(1);
		
		//ParameterOutput returns fmlInfra::Parameter
		//    : ParameterImpl
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//ParameterImpl
		public RuleCall getParameterImplParserRuleCall() { return cParameterImplParserRuleCall; }
	}
	public class ParameterReturnElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ParameterReturn");
		private final RuleCall cParameterImplParserRuleCall = (RuleCall)rule.eContents().get(1);
		
		//ParameterReturn returns fmlInfra::Parameter
		//    : ParameterImpl
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//ParameterImpl
		public RuleCall getParameterImplParserRuleCall() { return cParameterImplParserRuleCall; }
	}
	public class BufferContainerTypeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.BufferContainerType");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cCollectionTypeAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cContainerAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cContainerBufferContainerKindEnumRuleCall_1_0 = (RuleCall)cContainerAssignment_1.eContents().get(0);
		private final Alternatives cAlternatives_2 = (Alternatives)cGroup.eContents().get(2);
		private final Group cGroup_2_0 = (Group)cAlternatives_2.eContents().get(0);
		private final Keyword cLessThanSignKeyword_2_0_0 = (Keyword)cGroup_2_0.eContents().get(0);
		private final Alternatives cAlternatives_2_0_1 = (Alternatives)cGroup_2_0.eContents().get(1);
		private final Group cGroup_2_0_1_0 = (Group)cAlternatives_2_0_1.eContents().get(0);
		private final Keyword cSizeKeyword_2_0_1_0_0 = (Keyword)cGroup_2_0_1_0.eContents().get(0);
		private final Assignment cSizeAssignment_2_0_1_0_1 = (Assignment)cGroup_2_0_1_0.eContents().get(1);
		private final RuleCall cSizeEIntParserRuleCall_2_0_1_0_1_0 = (RuleCall)cSizeAssignment_2_0_1_0_1.eContents().get(0);
		private final Assignment cUnboundedAssignment_2_0_1_1 = (Assignment)cAlternatives_2_0_1.eContents().get(1);
		private final Keyword cUnboundedAsteriskKeyword_2_0_1_1_0 = (Keyword)cUnboundedAssignment_2_0_1_1.eContents().get(0);
		private final Keyword cGreaterThanSignKeyword_2_0_2 = (Keyword)cGroup_2_0.eContents().get(2);
		private final Group cGroup_2_1 = (Group)cAlternatives_2.eContents().get(1);
		private final Keyword cLeftSquareBracketKeyword_2_1_0 = (Keyword)cGroup_2_1.eContents().get(0);
		private final Alternatives cAlternatives_2_1_1 = (Alternatives)cGroup_2_1.eContents().get(1);
		private final Group cGroup_2_1_1_0 = (Group)cAlternatives_2_1_1.eContents().get(0);
		private final Keyword cSizeKeyword_2_1_1_0_0 = (Keyword)cGroup_2_1_1_0.eContents().get(0);
		private final Assignment cSizeAssignment_2_1_1_0_1 = (Assignment)cGroup_2_1_1_0.eContents().get(1);
		private final RuleCall cSizeEIntParserRuleCall_2_1_1_0_1_0 = (RuleCall)cSizeAssignment_2_1_1_0_1.eContents().get(0);
		private final Assignment cUnboundedAssignment_2_1_1_1 = (Assignment)cAlternatives_2_1_1.eContents().get(1);
		private final Keyword cUnboundedAsteriskKeyword_2_1_1_1_0 = (Keyword)cUnboundedAssignment_2_1_1_1.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_2_1_2 = (Keyword)cGroup_2_1.eContents().get(2);
		
		//////////////////////////////////////////////////////////////////////////////////
		//// Buffer Rules
		//////////////////////////////////////////////////////////////////////////////////
		//BufferContainerType returns fmlType::CollectionType
		//    : {fmlType::CollectionType}
		//        container = BufferContainerKind
		//        ( '<' ( ( 'size:' )? size=EInt | unbounded?='*' )? '>'
		//        | '[' ( ( 'size:' )? size=EInt | unbounded?='*' )? ']'
		//        )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlType::CollectionType}
		//       container = BufferContainerKind
		//       ( '<' ( ( 'size:' )? size=EInt | unbounded?='*' )? '>'
		//       | '[' ( ( 'size:' )? size=EInt | unbounded?='*' )? ']'
		//       )?
		public Group getGroup() { return cGroup; }
		
		//{fmlType::CollectionType}
		public Action getCollectionTypeAction_0() { return cCollectionTypeAction_0; }
		
		//container = BufferContainerKind
		public Assignment getContainerAssignment_1() { return cContainerAssignment_1; }
		
		//BufferContainerKind
		public RuleCall getContainerBufferContainerKindEnumRuleCall_1_0() { return cContainerBufferContainerKindEnumRuleCall_1_0; }
		
		//( '<' ( ( 'size:' )? size=EInt | unbounded?='*' )? '>'
		//| '[' ( ( 'size:' )? size=EInt | unbounded?='*' )? ']'
		//)?
		public Alternatives getAlternatives_2() { return cAlternatives_2; }
		
		//'<' ( ( 'size:' )? size=EInt | unbounded?='*' )? '>'
		public Group getGroup_2_0() { return cGroup_2_0; }
		
		//'<'
		public Keyword getLessThanSignKeyword_2_0_0() { return cLessThanSignKeyword_2_0_0; }
		
		//( ( 'size:' )? size=EInt | unbounded?='*' )?
		public Alternatives getAlternatives_2_0_1() { return cAlternatives_2_0_1; }
		
		//( 'size:' )? size=EInt
		public Group getGroup_2_0_1_0() { return cGroup_2_0_1_0; }
		
		//( 'size:' )?
		public Keyword getSizeKeyword_2_0_1_0_0() { return cSizeKeyword_2_0_1_0_0; }
		
		//size=EInt
		public Assignment getSizeAssignment_2_0_1_0_1() { return cSizeAssignment_2_0_1_0_1; }
		
		//EInt
		public RuleCall getSizeEIntParserRuleCall_2_0_1_0_1_0() { return cSizeEIntParserRuleCall_2_0_1_0_1_0; }
		
		//unbounded?='*'
		public Assignment getUnboundedAssignment_2_0_1_1() { return cUnboundedAssignment_2_0_1_1; }
		
		//'*'
		public Keyword getUnboundedAsteriskKeyword_2_0_1_1_0() { return cUnboundedAsteriskKeyword_2_0_1_1_0; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_2_0_2() { return cGreaterThanSignKeyword_2_0_2; }
		
		//'[' ( ( 'size:' )? size=EInt | unbounded?='*' )? ']'
		public Group getGroup_2_1() { return cGroup_2_1; }
		
		//'['
		public Keyword getLeftSquareBracketKeyword_2_1_0() { return cLeftSquareBracketKeyword_2_1_0; }
		
		//( ( 'size:' )? size=EInt | unbounded?='*' )?
		public Alternatives getAlternatives_2_1_1() { return cAlternatives_2_1_1; }
		
		//( 'size:' )? size=EInt
		public Group getGroup_2_1_1_0() { return cGroup_2_1_1_0; }
		
		//( 'size:' )?
		public Keyword getSizeKeyword_2_1_1_0_0() { return cSizeKeyword_2_1_1_0_0; }
		
		//size=EInt
		public Assignment getSizeAssignment_2_1_1_0_1() { return cSizeAssignment_2_1_1_0_1; }
		
		//EInt
		public RuleCall getSizeEIntParserRuleCall_2_1_1_0_1_0() { return cSizeEIntParserRuleCall_2_1_1_0_1_0; }
		
		//unbounded?='*'
		public Assignment getUnboundedAssignment_2_1_1_1() { return cUnboundedAssignment_2_1_1_1; }
		
		//'*'
		public Keyword getUnboundedAsteriskKeyword_2_1_1_1_0() { return cUnboundedAsteriskKeyword_2_1_1_1_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_2_1_2() { return cRightSquareBracketKeyword_2_1_2; }
	}
	public class BufferElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.Buffer");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cBufferAction_0 = (Action)cGroup.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_1 = (UnorderedGroup)cGroup.eContents().get(1);
		private final Assignment cVisibilityAssignment_1_0 = (Assignment)cUnorderedGroup_1.eContents().get(0);
		private final RuleCall cVisibilityVisibilityKindEnumRuleCall_1_0_0 = (RuleCall)cVisibilityAssignment_1_0.eContents().get(0);
		private final Assignment cModifierAssignment_1_1 = (Assignment)cUnorderedGroup_1.eContents().get(1);
		private final RuleCall cModifierModifierParserRuleCall_1_1_0 = (RuleCall)cModifierAssignment_1_1.eContents().get(0);
		private final Keyword cBufferKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cTypeAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cTypeBufferContainerTypeParserRuleCall_3_0 = (RuleCall)cTypeAssignment_3.eContents().get(0);
		private final Assignment cNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cNameESIdentifierParserRuleCall_4_0 = (RuleCall)cNameAssignment_4.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_5_0 = (RuleCall)cUnrestrictedNameAssignment_5.eContents().get(0);
		private final Keyword cSemicolonKeyword_6 = (Keyword)cGroup.eContents().get(6);
		
		//Buffer returns fmlInfra::Buffer
		//    : {fmlInfra::Buffer}
		//        ( visibility=VisibilityKind
		//          & modifier=Modifier
		//        )?
		//        'buffer' type=BufferContainerType
		//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )? ';'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlInfra::Buffer}
		//       ( visibility=VisibilityKind
		//         & modifier=Modifier
		//       )?
		//       'buffer' type=BufferContainerType
		//       name=ESIdentifier ( unrestrictedName=UnrestrictedName )? ';'
		public Group getGroup() { return cGroup; }
		
		//{fmlInfra::Buffer}
		public Action getBufferAction_0() { return cBufferAction_0; }
		
		//( visibility=VisibilityKind
		//  & modifier=Modifier
		//)?
		public UnorderedGroup getUnorderedGroup_1() { return cUnorderedGroup_1; }
		
		//visibility=VisibilityKind
		public Assignment getVisibilityAssignment_1_0() { return cVisibilityAssignment_1_0; }
		
		//VisibilityKind
		public RuleCall getVisibilityVisibilityKindEnumRuleCall_1_0_0() { return cVisibilityVisibilityKindEnumRuleCall_1_0_0; }
		
		//modifier=Modifier
		public Assignment getModifierAssignment_1_1() { return cModifierAssignment_1_1; }
		
		//Modifier
		public RuleCall getModifierModifierParserRuleCall_1_1_0() { return cModifierModifierParserRuleCall_1_1_0; }
		
		//'buffer'
		public Keyword getBufferKeyword_2() { return cBufferKeyword_2; }
		
		//type=BufferContainerType
		public Assignment getTypeAssignment_3() { return cTypeAssignment_3; }
		
		//BufferContainerType
		public RuleCall getTypeBufferContainerTypeParserRuleCall_3_0() { return cTypeBufferContainerTypeParserRuleCall_3_0; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_4() { return cNameAssignment_4; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_4_0() { return cNameESIdentifierParserRuleCall_4_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_5() { return cUnrestrictedNameAssignment_5; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_5_0; }
		
		//';'
		public Keyword getSemicolonKeyword_6() { return cSemicolonKeyword_6; }
	}
	public class BufferImplElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.BufferImpl");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cBufferAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cModifierAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cModifierModifierParserRuleCall_1_0 = (RuleCall)cModifierAssignment_1.eContents().get(0);
		private final Keyword cBufferKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cTypeAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cTypeBufferContainerTypeParserRuleCall_3_0 = (RuleCall)cTypeAssignment_3.eContents().get(0);
		private final Assignment cNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cNameESIdentifierParserRuleCall_4_0 = (RuleCall)cNameAssignment_4.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_5_0 = (RuleCall)cUnrestrictedNameAssignment_5.eContents().get(0);
		private final Keyword cSemicolonKeyword_6 = (Keyword)cGroup.eContents().get(6);
		
		//BufferImpl returns fmlInfra::Buffer
		//    : {fmlInfra::Buffer}
		//        ( modifier=Modifier )?
		//        'buffer' type=BufferContainerType
		//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )? ';'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlInfra::Buffer}
		//       ( modifier=Modifier )?
		//       'buffer' type=BufferContainerType
		//       name=ESIdentifier ( unrestrictedName=UnrestrictedName )? ';'
		public Group getGroup() { return cGroup; }
		
		//{fmlInfra::Buffer}
		public Action getBufferAction_0() { return cBufferAction_0; }
		
		//( modifier=Modifier )?
		public Assignment getModifierAssignment_1() { return cModifierAssignment_1; }
		
		//Modifier
		public RuleCall getModifierModifierParserRuleCall_1_0() { return cModifierModifierParserRuleCall_1_0; }
		
		//'buffer'
		public Keyword getBufferKeyword_2() { return cBufferKeyword_2; }
		
		//type=BufferContainerType
		public Assignment getTypeAssignment_3() { return cTypeAssignment_3; }
		
		//BufferContainerType
		public RuleCall getTypeBufferContainerTypeParserRuleCall_3_0() { return cTypeBufferContainerTypeParserRuleCall_3_0; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_4() { return cNameAssignment_4; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_4_0() { return cNameESIdentifierParserRuleCall_4_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_5() { return cUnrestrictedNameAssignment_5; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_5_0; }
		
		//';'
		public Keyword getSemicolonKeyword_6() { return cSemicolonKeyword_6; }
	}
	public class BufferPublicElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.BufferPublic");
		private final RuleCall cBufferImplParserRuleCall = (RuleCall)rule.eContents().get(1);
		
		//BufferPublic returns fmlInfra::Buffer
		//    : BufferImpl
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//BufferImpl
		public RuleCall getBufferImplParserRuleCall() { return cBufferImplParserRuleCall; }
	}
	public class BufferProtectedElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.BufferProtected");
		private final RuleCall cBufferImplParserRuleCall = (RuleCall)rule.eContents().get(1);
		
		//BufferProtected returns fmlInfra::Buffer
		//    : BufferImpl
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//BufferImpl
		public RuleCall getBufferImplParserRuleCall() { return cBufferImplParserRuleCall; }
	}
	public class BufferPrivateElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.BufferPrivate");
		private final RuleCall cBufferImplParserRuleCall = (RuleCall)rule.eContents().get(1);
		
		//BufferPrivate returns fmlInfra::Buffer
		//    : BufferImpl
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//BufferImpl
		public RuleCall getBufferImplParserRuleCall() { return cBufferImplParserRuleCall; }
	}
	public class PortElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.Port");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cPortAction_0 = (Action)cGroup.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_1 = (UnorderedGroup)cGroup.eContents().get(1);
		private final Assignment cVisibilityAssignment_1_0 = (Assignment)cUnorderedGroup_1.eContents().get(0);
		private final RuleCall cVisibilityVisibilityKindEnumRuleCall_1_0_0 = (RuleCall)cVisibilityAssignment_1_0.eContents().get(0);
		private final Assignment cModifierAssignment_1_1 = (Assignment)cUnorderedGroup_1.eContents().get(1);
		private final RuleCall cModifierModifierParserRuleCall_1_1_0 = (RuleCall)cModifierAssignment_1_1.eContents().get(0);
		private final Alternatives cAlternatives_2 = (Alternatives)cGroup.eContents().get(2);
		private final Group cGroup_2_0 = (Group)cAlternatives_2.eContents().get(0);
		private final Assignment cDirectionAssignment_2_0_0 = (Assignment)cGroup_2_0.eContents().get(0);
		private final RuleCall cDirectionChannelDirectionEnumRuleCall_2_0_0_0 = (RuleCall)cDirectionAssignment_2_0_0.eContents().get(0);
		private final Keyword cPortKeyword_2_0_1 = (Keyword)cGroup_2_0.eContents().get(1);
		private final Group cGroup_2_1 = (Group)cAlternatives_2.eContents().get(1);
		private final Keyword cPortKeyword_2_1_0 = (Keyword)cGroup_2_1.eContents().get(0);
		private final Assignment cDirectionAssignment_2_1_1 = (Assignment)cGroup_2_1.eContents().get(1);
		private final RuleCall cDirectionChannelDirectionEnumRuleCall_2_1_1_0 = (RuleCall)cDirectionAssignment_2_1_1.eContents().get(0);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
		private final Group cGroup_5 = (Group)cGroup.eContents().get(5);
		private final Keyword cLeftParenthesisKeyword_5_0 = (Keyword)cGroup_5.eContents().get(0);
		private final Assignment cParameterSetAssignment_5_1 = (Assignment)cGroup_5.eContents().get(1);
		private final RuleCall cParameterSetFormalParameterSetParserRuleCall_5_1_0 = (RuleCall)cParameterSetAssignment_5_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_5_2 = (Keyword)cGroup_5.eContents().get(2);
		private final Keyword cSemicolonKeyword_6 = (Keyword)cGroup.eContents().get(6);
		
		//////////////////////////////////////////////////////////////////////////////////
		//// Port rules
		//////////////////////////////////////////////////////////////////////////////////
		//Port returns fmlInfra::Port
		//    : {fmlInfra::Port}
		//        ( visibility=VisibilityKind
		//          & modifier=Modifier
		//        )?
		//        ( direction=ChannelDirection  'port'
		//        | 'port'  ( direction=ChannelDirection )?
		//        )
		//        name=ESIdentifier  ( unrestrictedName=UnrestrictedName )?
		//        ( '(' ( parameterSet=FormalParameterSet )? ')' )?
		//        ';'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlInfra::Port}
		//       ( visibility=VisibilityKind
		//         & modifier=Modifier
		//       )?
		//       ( direction=ChannelDirection  'port'
		//       | 'port'  ( direction=ChannelDirection )?
		//       )
		//       name=ESIdentifier  ( unrestrictedName=UnrestrictedName )?
		//       ( '(' ( parameterSet=FormalParameterSet )? ')' )?
		//       ';'
		public Group getGroup() { return cGroup; }
		
		//{fmlInfra::Port}
		public Action getPortAction_0() { return cPortAction_0; }
		
		//( visibility=VisibilityKind
		//  & modifier=Modifier
		//)?
		public UnorderedGroup getUnorderedGroup_1() { return cUnorderedGroup_1; }
		
		//visibility=VisibilityKind
		public Assignment getVisibilityAssignment_1_0() { return cVisibilityAssignment_1_0; }
		
		//VisibilityKind
		public RuleCall getVisibilityVisibilityKindEnumRuleCall_1_0_0() { return cVisibilityVisibilityKindEnumRuleCall_1_0_0; }
		
		//modifier=Modifier
		public Assignment getModifierAssignment_1_1() { return cModifierAssignment_1_1; }
		
		//Modifier
		public RuleCall getModifierModifierParserRuleCall_1_1_0() { return cModifierModifierParserRuleCall_1_1_0; }
		
		//( direction=ChannelDirection  'port'
		//| 'port'  ( direction=ChannelDirection )?
		//)
		public Alternatives getAlternatives_2() { return cAlternatives_2; }
		
		//direction=ChannelDirection  'port'
		public Group getGroup_2_0() { return cGroup_2_0; }
		
		//direction=ChannelDirection
		public Assignment getDirectionAssignment_2_0_0() { return cDirectionAssignment_2_0_0; }
		
		//ChannelDirection
		public RuleCall getDirectionChannelDirectionEnumRuleCall_2_0_0_0() { return cDirectionChannelDirectionEnumRuleCall_2_0_0_0; }
		
		//'port'
		public Keyword getPortKeyword_2_0_1() { return cPortKeyword_2_0_1; }
		
		//'port'  ( direction=ChannelDirection )?
		public Group getGroup_2_1() { return cGroup_2_1; }
		
		//'port'
		public Keyword getPortKeyword_2_1_0() { return cPortKeyword_2_1_0; }
		
		//( direction=ChannelDirection )?
		public Assignment getDirectionAssignment_2_1_1() { return cDirectionAssignment_2_1_1; }
		
		//ChannelDirection
		public RuleCall getDirectionChannelDirectionEnumRuleCall_2_1_1_0() { return cDirectionChannelDirectionEnumRuleCall_2_1_1_0; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
		
		//( '(' ( parameterSet=FormalParameterSet )? ')' )?
		public Group getGroup_5() { return cGroup_5; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_5_0() { return cLeftParenthesisKeyword_5_0; }
		
		//( parameterSet=FormalParameterSet )?
		public Assignment getParameterSetAssignment_5_1() { return cParameterSetAssignment_5_1; }
		
		//FormalParameterSet
		public RuleCall getParameterSetFormalParameterSetParserRuleCall_5_1_0() { return cParameterSetFormalParameterSetParserRuleCall_5_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_5_2() { return cRightParenthesisKeyword_5_2; }
		
		//';'
		public Keyword getSemicolonKeyword_6() { return cSemicolonKeyword_6; }
	}
	public class PortImplElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PortImpl");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cPortAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cModifierAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cModifierModifierParserRuleCall_1_0 = (RuleCall)cModifierAssignment_1.eContents().get(0);
		private final Alternatives cAlternatives_2 = (Alternatives)cGroup.eContents().get(2);
		private final Group cGroup_2_0 = (Group)cAlternatives_2.eContents().get(0);
		private final Assignment cDirectionAssignment_2_0_0 = (Assignment)cGroup_2_0.eContents().get(0);
		private final RuleCall cDirectionChannelDirectionEnumRuleCall_2_0_0_0 = (RuleCall)cDirectionAssignment_2_0_0.eContents().get(0);
		private final Keyword cPortKeyword_2_0_1 = (Keyword)cGroup_2_0.eContents().get(1);
		private final Group cGroup_2_1 = (Group)cAlternatives_2.eContents().get(1);
		private final Keyword cPortKeyword_2_1_0 = (Keyword)cGroup_2_1.eContents().get(0);
		private final Assignment cDirectionAssignment_2_1_1 = (Assignment)cGroup_2_1.eContents().get(1);
		private final RuleCall cDirectionChannelDirectionEnumRuleCall_2_1_1_0 = (RuleCall)cDirectionAssignment_2_1_1.eContents().get(0);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
		private final Group cGroup_5 = (Group)cGroup.eContents().get(5);
		private final Keyword cLeftParenthesisKeyword_5_0 = (Keyword)cGroup_5.eContents().get(0);
		private final Assignment cParameterSetAssignment_5_1 = (Assignment)cGroup_5.eContents().get(1);
		private final RuleCall cParameterSetFormalParameterSetParserRuleCall_5_1_0 = (RuleCall)cParameterSetAssignment_5_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_5_2 = (Keyword)cGroup_5.eContents().get(2);
		private final Keyword cSemicolonKeyword_6 = (Keyword)cGroup.eContents().get(6);
		
		//PortImpl returns fmlInfra::Port
		//    : {fmlInfra::Port}
		//        ( modifier=Modifier )?
		//        ( direction=ChannelDirection  'port'
		//        | 'port'  ( direction=ChannelDirection )?
		//        )
		//        name=ESIdentifier  ( unrestrictedName=UnrestrictedName )?
		//        ( '(' ( parameterSet=FormalParameterSet )? ')' )?
		//        ';'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlInfra::Port}
		//       ( modifier=Modifier )?
		//       ( direction=ChannelDirection  'port'
		//       | 'port'  ( direction=ChannelDirection )?
		//       )
		//       name=ESIdentifier  ( unrestrictedName=UnrestrictedName )?
		//       ( '(' ( parameterSet=FormalParameterSet )? ')' )?
		//       ';'
		public Group getGroup() { return cGroup; }
		
		//{fmlInfra::Port}
		public Action getPortAction_0() { return cPortAction_0; }
		
		//( modifier=Modifier )?
		public Assignment getModifierAssignment_1() { return cModifierAssignment_1; }
		
		//Modifier
		public RuleCall getModifierModifierParserRuleCall_1_0() { return cModifierModifierParserRuleCall_1_0; }
		
		//( direction=ChannelDirection  'port'
		//| 'port'  ( direction=ChannelDirection )?
		//)
		public Alternatives getAlternatives_2() { return cAlternatives_2; }
		
		//direction=ChannelDirection  'port'
		public Group getGroup_2_0() { return cGroup_2_0; }
		
		//direction=ChannelDirection
		public Assignment getDirectionAssignment_2_0_0() { return cDirectionAssignment_2_0_0; }
		
		//ChannelDirection
		public RuleCall getDirectionChannelDirectionEnumRuleCall_2_0_0_0() { return cDirectionChannelDirectionEnumRuleCall_2_0_0_0; }
		
		//'port'
		public Keyword getPortKeyword_2_0_1() { return cPortKeyword_2_0_1; }
		
		//'port'  ( direction=ChannelDirection )?
		public Group getGroup_2_1() { return cGroup_2_1; }
		
		//'port'
		public Keyword getPortKeyword_2_1_0() { return cPortKeyword_2_1_0; }
		
		//( direction=ChannelDirection )?
		public Assignment getDirectionAssignment_2_1_1() { return cDirectionAssignment_2_1_1; }
		
		//ChannelDirection
		public RuleCall getDirectionChannelDirectionEnumRuleCall_2_1_1_0() { return cDirectionChannelDirectionEnumRuleCall_2_1_1_0; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
		
		//( '(' ( parameterSet=FormalParameterSet )? ')' )?
		public Group getGroup_5() { return cGroup_5; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_5_0() { return cLeftParenthesisKeyword_5_0; }
		
		//( parameterSet=FormalParameterSet )?
		public Assignment getParameterSetAssignment_5_1() { return cParameterSetAssignment_5_1; }
		
		//FormalParameterSet
		public RuleCall getParameterSetFormalParameterSetParserRuleCall_5_1_0() { return cParameterSetFormalParameterSetParserRuleCall_5_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_5_2() { return cRightParenthesisKeyword_5_2; }
		
		//';'
		public Keyword getSemicolonKeyword_6() { return cSemicolonKeyword_6; }
	}
	public class PortPublicElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PortPublic");
		private final RuleCall cPortImplParserRuleCall = (RuleCall)rule.eContents().get(1);
		
		//PortPublic returns fmlInfra::Port
		//    : PortImpl
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//PortImpl
		public RuleCall getPortImplParserRuleCall() { return cPortImplParserRuleCall; }
	}
	public class PortProtectedElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PortProtected");
		private final RuleCall cPortImplParserRuleCall = (RuleCall)rule.eContents().get(1);
		
		//PortProtected returns fmlInfra::Port
		//    : PortImpl
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//PortImpl
		public RuleCall getPortImplParserRuleCall() { return cPortImplParserRuleCall; }
	}
	public class PortPrivateElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PortPrivate");
		private final RuleCall cPortImplParserRuleCall = (RuleCall)rule.eContents().get(1);
		
		//PortPrivate returns fmlInfra::Port
		//    : PortImpl
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//PortImpl
		public RuleCall getPortImplParserRuleCall() { return cPortImplParserRuleCall; }
	}
	public class SignalElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.Signal");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cSignalAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cVisibilityAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cVisibilityVisibilityKindEnumRuleCall_1_0 = (RuleCall)cVisibilityAssignment_1.eContents().get(0);
		private final Alternatives cAlternatives_2 = (Alternatives)cGroup.eContents().get(2);
		private final Group cGroup_2_0 = (Group)cAlternatives_2.eContents().get(0);
		private final Assignment cDirectionAssignment_2_0_0 = (Assignment)cGroup_2_0.eContents().get(0);
		private final RuleCall cDirectionChannelDirectionEnumRuleCall_2_0_0_0 = (RuleCall)cDirectionAssignment_2_0_0.eContents().get(0);
		private final Keyword cSignalKeyword_2_0_1 = (Keyword)cGroup_2_0.eContents().get(1);
		private final Group cGroup_2_1 = (Group)cAlternatives_2.eContents().get(1);
		private final Keyword cSignalKeyword_2_1_0 = (Keyword)cGroup_2_1.eContents().get(0);
		private final Assignment cDirectionAssignment_2_1_1 = (Assignment)cGroup_2_1.eContents().get(1);
		private final RuleCall cDirectionChannelDirectionEnumRuleCall_2_1_1_0 = (RuleCall)cDirectionAssignment_2_1_1.eContents().get(0);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
		private final Group cGroup_5 = (Group)cGroup.eContents().get(5);
		private final Keyword cLeftParenthesisKeyword_5_0 = (Keyword)cGroup_5.eContents().get(0);
		private final Assignment cParameterSetAssignment_5_1 = (Assignment)cGroup_5.eContents().get(1);
		private final RuleCall cParameterSetFormalParameterSetParserRuleCall_5_1_0 = (RuleCall)cParameterSetAssignment_5_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_5_2 = (Keyword)cGroup_5.eContents().get(2);
		private final Keyword cSemicolonKeyword_6 = (Keyword)cGroup.eContents().get(6);
		
		//////////////////////////////////////////////////////////////////////////////////
		//// Signal rules
		//////////////////////////////////////////////////////////////////////////////////
		//Signal returns fmlInfra::Signal
		//    : {fmlInfra::Signal}
		//        ( visibility=VisibilityKind )?
		//        ( direction=ChannelDirection  'signal'
		//        | 'signal'  ( direction=ChannelDirection )?
		//        )
		//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//        ( '(' ( parameterSet=FormalParameterSet )? ')' )?
		//        ';'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlInfra::Signal}
		//       ( visibility=VisibilityKind )?
		//       ( direction=ChannelDirection  'signal'
		//       | 'signal'  ( direction=ChannelDirection )?
		//       )
		//       name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//       ( '(' ( parameterSet=FormalParameterSet )? ')' )?
		//       ';'
		public Group getGroup() { return cGroup; }
		
		//{fmlInfra::Signal}
		public Action getSignalAction_0() { return cSignalAction_0; }
		
		//( visibility=VisibilityKind )?
		public Assignment getVisibilityAssignment_1() { return cVisibilityAssignment_1; }
		
		//VisibilityKind
		public RuleCall getVisibilityVisibilityKindEnumRuleCall_1_0() { return cVisibilityVisibilityKindEnumRuleCall_1_0; }
		
		//( direction=ChannelDirection  'signal'
		//| 'signal'  ( direction=ChannelDirection )?
		//)
		public Alternatives getAlternatives_2() { return cAlternatives_2; }
		
		//direction=ChannelDirection  'signal'
		public Group getGroup_2_0() { return cGroup_2_0; }
		
		//direction=ChannelDirection
		public Assignment getDirectionAssignment_2_0_0() { return cDirectionAssignment_2_0_0; }
		
		//ChannelDirection
		public RuleCall getDirectionChannelDirectionEnumRuleCall_2_0_0_0() { return cDirectionChannelDirectionEnumRuleCall_2_0_0_0; }
		
		//'signal'
		public Keyword getSignalKeyword_2_0_1() { return cSignalKeyword_2_0_1; }
		
		//'signal'  ( direction=ChannelDirection )?
		public Group getGroup_2_1() { return cGroup_2_1; }
		
		//'signal'
		public Keyword getSignalKeyword_2_1_0() { return cSignalKeyword_2_1_0; }
		
		//( direction=ChannelDirection )?
		public Assignment getDirectionAssignment_2_1_1() { return cDirectionAssignment_2_1_1; }
		
		//ChannelDirection
		public RuleCall getDirectionChannelDirectionEnumRuleCall_2_1_1_0() { return cDirectionChannelDirectionEnumRuleCall_2_1_1_0; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
		
		//( '(' ( parameterSet=FormalParameterSet )? ')' )?
		public Group getGroup_5() { return cGroup_5; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_5_0() { return cLeftParenthesisKeyword_5_0; }
		
		//( parameterSet=FormalParameterSet )?
		public Assignment getParameterSetAssignment_5_1() { return cParameterSetAssignment_5_1; }
		
		//FormalParameterSet
		public RuleCall getParameterSetFormalParameterSetParserRuleCall_5_1_0() { return cParameterSetFormalParameterSetParserRuleCall_5_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_5_2() { return cRightParenthesisKeyword_5_2; }
		
		//';'
		public Keyword getSemicolonKeyword_6() { return cSemicolonKeyword_6; }
	}
	public class SignalImplElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.SignalImpl");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cSignalAction_0 = (Action)cGroup.eContents().get(0);
		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
		private final Group cGroup_1_0 = (Group)cAlternatives_1.eContents().get(0);
		private final Assignment cDirectionAssignment_1_0_0 = (Assignment)cGroup_1_0.eContents().get(0);
		private final RuleCall cDirectionChannelDirectionEnumRuleCall_1_0_0_0 = (RuleCall)cDirectionAssignment_1_0_0.eContents().get(0);
		private final Keyword cSignalKeyword_1_0_1 = (Keyword)cGroup_1_0.eContents().get(1);
		private final Group cGroup_1_1 = (Group)cAlternatives_1.eContents().get(1);
		private final Keyword cSignalKeyword_1_1_0 = (Keyword)cGroup_1_1.eContents().get(0);
		private final Assignment cDirectionAssignment_1_1_1 = (Assignment)cGroup_1_1.eContents().get(1);
		private final RuleCall cDirectionChannelDirectionEnumRuleCall_1_1_1_0 = (RuleCall)cDirectionAssignment_1_1_1.eContents().get(0);
		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cNameESIdentifierParserRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_3_0 = (RuleCall)cUnrestrictedNameAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftParenthesisKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Assignment cParameterSetAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
		private final RuleCall cParameterSetFormalParameterSetParserRuleCall_4_1_0 = (RuleCall)cParameterSetAssignment_4_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_4_2 = (Keyword)cGroup_4.eContents().get(2);
		private final Keyword cSemicolonKeyword_5 = (Keyword)cGroup.eContents().get(5);
		
		//SignalImpl returns fmlInfra::Signal
		//    : {fmlInfra::Signal}
		//        ( direction=ChannelDirection  'signal'
		//        | 'signal'  ( direction=ChannelDirection )?
		//        )
		//        name=ESIdentifier  ( unrestrictedName=UnrestrictedName )?
		//        ( '(' ( parameterSet=FormalParameterSet )? ')' )?
		//        ';'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlInfra::Signal}
		//       ( direction=ChannelDirection  'signal'
		//       | 'signal'  ( direction=ChannelDirection )?
		//       )
		//       name=ESIdentifier  ( unrestrictedName=UnrestrictedName )?
		//       ( '(' ( parameterSet=FormalParameterSet )? ')' )?
		//       ';'
		public Group getGroup() { return cGroup; }
		
		//{fmlInfra::Signal}
		public Action getSignalAction_0() { return cSignalAction_0; }
		
		//( direction=ChannelDirection  'signal'
		//| 'signal'  ( direction=ChannelDirection )?
		//)
		public Alternatives getAlternatives_1() { return cAlternatives_1; }
		
		//direction=ChannelDirection  'signal'
		public Group getGroup_1_0() { return cGroup_1_0; }
		
		//direction=ChannelDirection
		public Assignment getDirectionAssignment_1_0_0() { return cDirectionAssignment_1_0_0; }
		
		//ChannelDirection
		public RuleCall getDirectionChannelDirectionEnumRuleCall_1_0_0_0() { return cDirectionChannelDirectionEnumRuleCall_1_0_0_0; }
		
		//'signal'
		public Keyword getSignalKeyword_1_0_1() { return cSignalKeyword_1_0_1; }
		
		//'signal'  ( direction=ChannelDirection )?
		public Group getGroup_1_1() { return cGroup_1_1; }
		
		//'signal'
		public Keyword getSignalKeyword_1_1_0() { return cSignalKeyword_1_1_0; }
		
		//( direction=ChannelDirection )?
		public Assignment getDirectionAssignment_1_1_1() { return cDirectionAssignment_1_1_1; }
		
		//ChannelDirection
		public RuleCall getDirectionChannelDirectionEnumRuleCall_1_1_1_0() { return cDirectionChannelDirectionEnumRuleCall_1_1_1_0; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_2_0() { return cNameESIdentifierParserRuleCall_2_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_3() { return cUnrestrictedNameAssignment_3; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_3_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_3_0; }
		
		//( '(' ( parameterSet=FormalParameterSet )? ')' )?
		public Group getGroup_4() { return cGroup_4; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_4_0() { return cLeftParenthesisKeyword_4_0; }
		
		//( parameterSet=FormalParameterSet )?
		public Assignment getParameterSetAssignment_4_1() { return cParameterSetAssignment_4_1; }
		
		//FormalParameterSet
		public RuleCall getParameterSetFormalParameterSetParserRuleCall_4_1_0() { return cParameterSetFormalParameterSetParserRuleCall_4_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_4_2() { return cRightParenthesisKeyword_4_2; }
		
		//';'
		public Keyword getSemicolonKeyword_5() { return cSemicolonKeyword_5; }
	}
	public class SignalPublicElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.SignalPublic");
		private final RuleCall cSignalImplParserRuleCall = (RuleCall)rule.eContents().get(1);
		
		//SignalPublic returns fmlInfra::Signal
		//    : SignalImpl
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//SignalImpl
		public RuleCall getSignalImplParserRuleCall() { return cSignalImplParserRuleCall; }
	}
	public class SignalProtectedElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.SignalProtected");
		private final RuleCall cSignalImplParserRuleCall = (RuleCall)rule.eContents().get(1);
		
		//SignalProtected returns fmlInfra::Signal
		//    : SignalImpl
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//SignalImpl
		public RuleCall getSignalImplParserRuleCall() { return cSignalImplParserRuleCall; }
	}
	public class SignalPrivateElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.SignalPrivate");
		private final RuleCall cSignalImplParserRuleCall = (RuleCall)rule.eContents().get(1);
		
		//SignalPrivate returns fmlInfra::Signal
		//    : SignalImpl
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//SignalImpl
		public RuleCall getSignalImplParserRuleCall() { return cSignalImplParserRuleCall; }
	}
	public class ChannelElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.Channel");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cChannelAction_0 = (Action)cGroup.eContents().get(0);
		private final UnorderedGroup cUnorderedGroup_1 = (UnorderedGroup)cGroup.eContents().get(1);
		private final Assignment cVisibilityAssignment_1_0 = (Assignment)cUnorderedGroup_1.eContents().get(0);
		private final RuleCall cVisibilityVisibilityKindEnumRuleCall_1_0_0 = (RuleCall)cVisibilityAssignment_1_0.eContents().get(0);
		private final Assignment cModifierAssignment_1_1 = (Assignment)cUnorderedGroup_1.eContents().get(1);
		private final RuleCall cModifierModifierParserRuleCall_1_1_0 = (RuleCall)cModifierAssignment_1_1.eContents().get(0);
		private final Keyword cChannelKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_5 = (Keyword)cGroup.eContents().get(5);
		private final Group cGroup_6 = (Group)cGroup.eContents().get(6);
		private final Assignment cSignalAssignment_6_0 = (Assignment)cGroup_6.eContents().get(0);
		private final RuleCall cSignalSignalReferenceParserRuleCall_6_0_0 = (RuleCall)cSignalAssignment_6_0.eContents().get(0);
		private final Keyword cSemicolonKeyword_6_1 = (Keyword)cGroup_6.eContents().get(1);
		private final Keyword cRightCurlyBracketKeyword_7 = (Keyword)cGroup.eContents().get(7);
		
		//Channel returns fmlInfra::Channel
		//    : {fmlInfra::Channel}
		//        ( visibility=VisibilityKind
		//          & modifier=Modifier
		//        )?
		//        'channel' name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//        '{'
		//            ( signal+=SignalReference ';' )+
		//        '}'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlInfra::Channel}
		//       ( visibility=VisibilityKind
		//         & modifier=Modifier
		//       )?
		//       'channel' name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//       '{'
		//           ( signal+=SignalReference ';' )+
		//       '}'
		public Group getGroup() { return cGroup; }
		
		//{fmlInfra::Channel}
		public Action getChannelAction_0() { return cChannelAction_0; }
		
		//( visibility=VisibilityKind
		//  & modifier=Modifier
		//)?
		public UnorderedGroup getUnorderedGroup_1() { return cUnorderedGroup_1; }
		
		//visibility=VisibilityKind
		public Assignment getVisibilityAssignment_1_0() { return cVisibilityAssignment_1_0; }
		
		//VisibilityKind
		public RuleCall getVisibilityVisibilityKindEnumRuleCall_1_0_0() { return cVisibilityVisibilityKindEnumRuleCall_1_0_0; }
		
		//modifier=Modifier
		public Assignment getModifierAssignment_1_1() { return cModifierAssignment_1_1; }
		
		//Modifier
		public RuleCall getModifierModifierParserRuleCall_1_1_0() { return cModifierModifierParserRuleCall_1_1_0; }
		
		//'channel'
		public Keyword getChannelKeyword_2() { return cChannelKeyword_2; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_5() { return cLeftCurlyBracketKeyword_5; }
		
		//( signal+=SignalReference ';' )+
		public Group getGroup_6() { return cGroup_6; }
		
		//signal+=SignalReference
		public Assignment getSignalAssignment_6_0() { return cSignalAssignment_6_0; }
		
		//SignalReference
		public RuleCall getSignalSignalReferenceParserRuleCall_6_0_0() { return cSignalSignalReferenceParserRuleCall_6_0_0; }
		
		//';'
		public Keyword getSemicolonKeyword_6_1() { return cSemicolonKeyword_6_1; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_7() { return cRightCurlyBracketKeyword_7; }
	}
	public class SignalReferenceElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.SignalReference");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cDirectionAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cDirectionChannelDirectionEnumRuleCall_0_0 = (RuleCall)cDirectionAssignment_0.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameESIdentifierParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		
		//SignalReference returns fmlInfra::Signal
		//    : ( direction=ChannelDirection )? name=ESIdentifier
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//( direction=ChannelDirection )? name=ESIdentifier
		public Group getGroup() { return cGroup; }
		
		//( direction=ChannelDirection )?
		public Assignment getDirectionAssignment_0() { return cDirectionAssignment_0; }
		
		//ChannelDirection
		public RuleCall getDirectionChannelDirectionEnumRuleCall_0_0() { return cDirectionChannelDirectionEnumRuleCall_0_0; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_1_0() { return cNameESIdentifierParserRuleCall_1_0; }
	}
	public class ChannelimplElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.Channelimpl");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cChannelAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cModifierAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cModifierModifierParserRuleCall_1_0 = (RuleCall)cModifierAssignment_1.eContents().get(0);
		private final Keyword cChannelKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cNameAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cNameESIdentifierParserRuleCall_3_0 = (RuleCall)cNameAssignment_3.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0 = (RuleCall)cUnrestrictedNameAssignment_4.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_5 = (Keyword)cGroup.eContents().get(5);
		private final Group cGroup_6 = (Group)cGroup.eContents().get(6);
		private final Assignment cSignalAssignment_6_0 = (Assignment)cGroup_6.eContents().get(0);
		private final RuleCall cSignalSignalReferenceParserRuleCall_6_0_0 = (RuleCall)cSignalAssignment_6_0.eContents().get(0);
		private final Keyword cSemicolonKeyword_6_1 = (Keyword)cGroup_6.eContents().get(1);
		private final Keyword cRightCurlyBracketKeyword_7 = (Keyword)cGroup.eContents().get(7);
		
		//Channelimpl returns fmlInfra::Channel
		//    : {fmlInfra::Channel}
		//        ( modifier=Modifier )?
		//        'channel' name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//        '{'
		//            ( signal+=SignalReference ';' )+
		//        '}'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlInfra::Channel}
		//       ( modifier=Modifier )?
		//       'channel' name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
		//       '{'
		//           ( signal+=SignalReference ';' )+
		//       '}'
		public Group getGroup() { return cGroup; }
		
		//{fmlInfra::Channel}
		public Action getChannelAction_0() { return cChannelAction_0; }
		
		//( modifier=Modifier )?
		public Assignment getModifierAssignment_1() { return cModifierAssignment_1; }
		
		//Modifier
		public RuleCall getModifierModifierParserRuleCall_1_0() { return cModifierModifierParserRuleCall_1_0; }
		
		//'channel'
		public Keyword getChannelKeyword_2() { return cChannelKeyword_2; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_3() { return cNameAssignment_3; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_3_0() { return cNameESIdentifierParserRuleCall_3_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_4() { return cUnrestrictedNameAssignment_4; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_4_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_4_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_5() { return cLeftCurlyBracketKeyword_5; }
		
		//( signal+=SignalReference ';' )+
		public Group getGroup_6() { return cGroup_6; }
		
		//signal+=SignalReference
		public Assignment getSignalAssignment_6_0() { return cSignalAssignment_6_0; }
		
		//SignalReference
		public RuleCall getSignalSignalReferenceParserRuleCall_6_0_0() { return cSignalSignalReferenceParserRuleCall_6_0_0; }
		
		//';'
		public Keyword getSemicolonKeyword_6_1() { return cSemicolonKeyword_6_1; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_7() { return cRightCurlyBracketKeyword_7; }
	}
	public class ChannelPublicElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ChannelPublic");
		private final RuleCall cChannelimplParserRuleCall = (RuleCall)rule.eContents().get(1);
		
		//ChannelPublic returns fmlInfra::Channel
		//    : Channelimpl
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//Channelimpl
		public RuleCall getChannelimplParserRuleCall() { return cChannelimplParserRuleCall; }
	}
	public class ChannelProtectedElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ChannelProtected");
		private final RuleCall cChannelimplParserRuleCall = (RuleCall)rule.eContents().get(1);
		
		//ChannelProtected returns fmlInfra::Channel
		//    : Channelimpl
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//Channelimpl
		public RuleCall getChannelimplParserRuleCall() { return cChannelimplParserRuleCall; }
	}
	public class ChannelPrivateElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ChannelPrivate");
		private final RuleCall cChannelimplParserRuleCall = (RuleCall)rule.eContents().get(1);
		
		//ChannelPrivate returns fmlInfra::Channel
		//    : Channelimpl
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//Channelimpl
		public RuleCall getChannelimplParserRuleCall() { return cChannelimplParserRuleCall; }
	}
	public class TransitionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.Transition");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cTransitionAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cTransientAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final Keyword cTransientTransientKeyword_1_0 = (Keyword)cTransientAssignment_1.eContents().get(0);
		private final Keyword cTransitionKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cMoeAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cMoeTransitionMoeParserRuleCall_3_0 = (RuleCall)cMoeAssignment_3.eContents().get(0);
		private final Assignment cNameAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cNameESIdentifierParserRuleCall_4_0 = (RuleCall)cNameAssignment_4.eContents().get(0);
		private final Assignment cUnrestrictedNameAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cUnrestrictedNameUnrestrictedNameParserRuleCall_5_0 = (RuleCall)cUnrestrictedNameAssignment_5.eContents().get(0);
		private final Alternatives cAlternatives_6 = (Alternatives)cGroup.eContents().get(6);
		private final Group cGroup_6_0 = (Group)cAlternatives_6.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_6_0_0 = (Keyword)cGroup_6_0.eContents().get(0);
		private final Alternatives cAlternatives_6_0_1 = (Alternatives)cGroup_6_0.eContents().get(1);
		private final Group cGroup_6_0_1_0 = (Group)cAlternatives_6_0_1.eContents().get(0);
		private final Group cGroup_6_0_1_0_0 = (Group)cGroup_6_0_1_0.eContents().get(0);
		private final Keyword cTriggerKeyword_6_0_1_0_0_0 = (Keyword)cGroup_6_0_1_0_0.eContents().get(0);
		private final Assignment cTriggerAssignment_6_0_1_0_0_1 = (Assignment)cGroup_6_0_1_0_0.eContents().get(1);
		private final RuleCall cTriggerTransitionTriggerParserRuleCall_6_0_1_0_0_1_0 = (RuleCall)cTriggerAssignment_6_0_1_0_0_1.eContents().get(0);
		private final Alternatives cAlternatives_6_0_1_0_1 = (Alternatives)cGroup_6_0_1_0.eContents().get(1);
		private final Assignment cGuardAssignment_6_0_1_0_1_0 = (Assignment)cAlternatives_6_0_1_0_1.eContents().get(0);
		private final RuleCall cGuardTransitionGuardParserRuleCall_6_0_1_0_1_0_0 = (RuleCall)cGuardAssignment_6_0_1_0_1_0.eContents().get(0);
		private final Keyword cGuardKeyword_6_0_1_0_1_1 = (Keyword)cAlternatives_6_0_1_0_1.eContents().get(1);
		private final Alternatives cAlternatives_6_0_1_0_2 = (Alternatives)cGroup_6_0_1_0.eContents().get(2);
		private final Assignment cTguardAssignment_6_0_1_0_2_0 = (Assignment)cAlternatives_6_0_1_0_2.eContents().get(0);
		private final RuleCall cTguardTransitionTimedGuardParserRuleCall_6_0_1_0_2_0_0 = (RuleCall)cTguardAssignment_6_0_1_0_2_0.eContents().get(0);
		private final Keyword cTguardKeyword_6_0_1_0_2_1 = (Keyword)cAlternatives_6_0_1_0_2.eContents().get(1);
		private final Keyword cEffectKeyword_6_0_1_0_3 = (Keyword)cGroup_6_0_1_0.eContents().get(3);
		private final Assignment cEffectAssignment_6_0_1_0_4 = (Assignment)cGroup_6_0_1_0.eContents().get(4);
		private final RuleCall cEffectTransitionEffectParserRuleCall_6_0_1_0_4_0 = (RuleCall)cEffectAssignment_6_0_1_0_4.eContents().get(0);
		private final Assignment cBehaviorAssignment_6_0_1_1 = (Assignment)cAlternatives_6_0_1.eContents().get(1);
		private final RuleCall cBehaviorTransitionBehaviorParserRuleCall_6_0_1_1_0 = (RuleCall)cBehaviorAssignment_6_0_1_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_6_0_2 = (Keyword)cGroup_6_0.eContents().get(2);
		private final Group cGroup_6_0_3 = (Group)cGroup_6_0.eContents().get(3);
		private final Keyword cHyphenMinusHyphenMinusGreaterThanSignKeyword_6_0_3_0 = (Keyword)cGroup_6_0_3.eContents().get(0);
		private final Alternatives cAlternatives_6_0_3_1 = (Alternatives)cGroup_6_0_3.eContents().get(1);
		private final Assignment cTargetAssignment_6_0_3_1_0 = (Assignment)cAlternatives_6_0_3_1.eContents().get(0);
		private final CrossReference cTargetVertexCrossReference_6_0_3_1_0_0 = (CrossReference)cTargetAssignment_6_0_3_1_0.eContents().get(0);
		private final RuleCall cTargetVertexESUfidParserRuleCall_6_0_3_1_0_0_1 = (RuleCall)cTargetVertexCrossReference_6_0_3_1_0_0.eContents().get(1);
		private final Assignment cTargetExpressionAssignment_6_0_3_1_1 = (Assignment)cAlternatives_6_0_3_1.eContents().get(1);
		private final RuleCall cTargetExpressionValuePureNamedMachineExpressionParserRuleCall_6_0_3_1_1_0 = (RuleCall)cTargetExpressionAssignment_6_0_3_1_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_6_0_3_2 = (Keyword)cGroup_6_0_3.eContents().get(2);
		private final Group cGroup_6_1 = (Group)cAlternatives_6.eContents().get(1);
		private final Keyword cHyphenMinusHyphenMinusGreaterThanSignKeyword_6_1_0 = (Keyword)cGroup_6_1.eContents().get(0);
		private final Alternatives cAlternatives_6_1_1 = (Alternatives)cGroup_6_1.eContents().get(1);
		private final Assignment cTargetAssignment_6_1_1_0 = (Assignment)cAlternatives_6_1_1.eContents().get(0);
		private final CrossReference cTargetVertexCrossReference_6_1_1_0_0 = (CrossReference)cTargetAssignment_6_1_1_0.eContents().get(0);
		private final RuleCall cTargetVertexESUfidParserRuleCall_6_1_1_0_0_1 = (RuleCall)cTargetVertexCrossReference_6_1_1_0_0.eContents().get(1);
		private final Assignment cTargetExpressionAssignment_6_1_1_1 = (Assignment)cAlternatives_6_1_1.eContents().get(1);
		private final RuleCall cTargetExpressionValuePureNamedMachineExpressionParserRuleCall_6_1_1_1_0 = (RuleCall)cTargetExpressionAssignment_6_1_1_1.eContents().get(0);
		private final Alternatives cAlternatives_6_1_2 = (Alternatives)cGroup_6_1.eContents().get(2);
		private final Group cGroup_6_1_2_0 = (Group)cAlternatives_6_1_2.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_6_1_2_0_0 = (Keyword)cGroup_6_1_2_0.eContents().get(0);
		private final Alternatives cAlternatives_6_1_2_0_1 = (Alternatives)cGroup_6_1_2_0.eContents().get(1);
		private final Group cGroup_6_1_2_0_1_0 = (Group)cAlternatives_6_1_2_0_1.eContents().get(0);
		private final Group cGroup_6_1_2_0_1_0_0 = (Group)cGroup_6_1_2_0_1_0.eContents().get(0);
		private final Keyword cTriggerKeyword_6_1_2_0_1_0_0_0 = (Keyword)cGroup_6_1_2_0_1_0_0.eContents().get(0);
		private final Assignment cTriggerAssignment_6_1_2_0_1_0_0_1 = (Assignment)cGroup_6_1_2_0_1_0_0.eContents().get(1);
		private final RuleCall cTriggerTransitionTriggerParserRuleCall_6_1_2_0_1_0_0_1_0 = (RuleCall)cTriggerAssignment_6_1_2_0_1_0_0_1.eContents().get(0);
		private final Alternatives cAlternatives_6_1_2_0_1_0_1 = (Alternatives)cGroup_6_1_2_0_1_0.eContents().get(1);
		private final Assignment cGuardAssignment_6_1_2_0_1_0_1_0 = (Assignment)cAlternatives_6_1_2_0_1_0_1.eContents().get(0);
		private final RuleCall cGuardTransitionGuardParserRuleCall_6_1_2_0_1_0_1_0_0 = (RuleCall)cGuardAssignment_6_1_2_0_1_0_1_0.eContents().get(0);
		private final Keyword cGuardKeyword_6_1_2_0_1_0_1_1 = (Keyword)cAlternatives_6_1_2_0_1_0_1.eContents().get(1);
		private final Alternatives cAlternatives_6_1_2_0_1_0_2 = (Alternatives)cGroup_6_1_2_0_1_0.eContents().get(2);
		private final Assignment cTguardAssignment_6_1_2_0_1_0_2_0 = (Assignment)cAlternatives_6_1_2_0_1_0_2.eContents().get(0);
		private final RuleCall cTguardTransitionTimedGuardParserRuleCall_6_1_2_0_1_0_2_0_0 = (RuleCall)cTguardAssignment_6_1_2_0_1_0_2_0.eContents().get(0);
		private final Keyword cTguardKeyword_6_1_2_0_1_0_2_1 = (Keyword)cAlternatives_6_1_2_0_1_0_2.eContents().get(1);
		private final Keyword cEffectKeyword_6_1_2_0_1_0_3 = (Keyword)cGroup_6_1_2_0_1_0.eContents().get(3);
		private final Assignment cEffectAssignment_6_1_2_0_1_0_4 = (Assignment)cGroup_6_1_2_0_1_0.eContents().get(4);
		private final RuleCall cEffectTransitionEffectParserRuleCall_6_1_2_0_1_0_4_0 = (RuleCall)cEffectAssignment_6_1_2_0_1_0_4.eContents().get(0);
		private final Assignment cBehaviorAssignment_6_1_2_0_1_1 = (Assignment)cAlternatives_6_1_2_0_1.eContents().get(1);
		private final RuleCall cBehaviorTransitionBehaviorParserRuleCall_6_1_2_0_1_1_0 = (RuleCall)cBehaviorAssignment_6_1_2_0_1_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_6_1_2_0_2 = (Keyword)cGroup_6_1_2_0.eContents().get(2);
		private final Keyword cSemicolonKeyword_6_1_2_1 = (Keyword)cAlternatives_6_1_2.eContents().get(1);
		
		//////////////////////////////////////////////////////////////////////////////////
		//// Section Transition Rules
		//////////////////////////////////////////////////////////////////////////////////
		//Transition returns fmlStmchn::Transition
		//    : {fmlStmchn::Transition} (transient?='transient')? 'transition'
		//        ( moe=TransitionMoe )?
		//        ( name=ESIdentifier )?  ( unrestrictedName=UnrestrictedName )?
		////        ( ( behavior=BlockStatement '-->' target=[fmlStmchn::Vertex|ESUfid] ';' )
		////        | ( '-->' target=[fmlStmchn::Vertex|ESUfid] (behavior=BlockStatement | ';') )
		////        )
		//        ( ( '{'
		//            ( ( ( '@trigger:' ( trigger+= TransitionTrigger )* )?
		//                ( guard  = TransitionGuard      | '@guard:' )?
		//                ( tguard = TransitionTimedGuard | '@tguard:')?
		//                '@effect:'  ( effect = TransitionEffect  )?
		//              )
		//            | behavior=TransitionBehavior
		//            )?
		//            '}'
		//            ( '-->'
		//                ( target=[fmlStmchn::Vertex|ESUfid]
		//                | targetExpression=ValuePureNamedMachineExpression
		//                ) ';'
		//            )?
		//          )
		//        | ( '-->'
		//            ( target=[fmlStmchn::Vertex|ESUfid]
		//            | targetExpression=ValuePureNamedMachineExpression
		//            )
		//            ( ( '{'
		//                ( ( ( '@trigger:' ( trigger+= TransitionTrigger )* )?
		//                    ( guard  = TransitionGuard      | '@guard:' )?
		//                    ( tguard = TransitionTimedGuard | '@tguard:')?
		//                    '@effect:'  ( effect = TransitionEffect  )?
		//                  )
		//                | behavior=TransitionBehavior
		//                )?
		//                '}' )
		//            | ';'
		//            )
		//          )
		//        )
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		// {fmlStmchn::Transition} (transient?='transient')? 'transition'
		//        ( moe=TransitionMoe )?
		//        ( name=ESIdentifier )?  ( unrestrictedName=UnrestrictedName )?
		////        ( ( behavior=BlockStatement '-->' target=[fmlStmchn::Vertex|ESUfid] ';' )
		////        | ( '-->' target=[fmlStmchn::Vertex|ESUfid] (behavior=BlockStatement | ';') )
		////        )
		//        ( ( '{'
		//            ( ( ( '@trigger:' ( trigger+= TransitionTrigger )* )?
		//                ( guard  = TransitionGuard      | '@guard:' )?
		//                ( tguard = TransitionTimedGuard | '@tguard:')?
		//                '@effect:'  ( effect = TransitionEffect  )?
		//              )
		//            | behavior=TransitionBehavior
		//            )?
		//            '}'
		//            ( '-->'
		//                ( target=[fmlStmchn::Vertex|ESUfid]
		//                | targetExpression=ValuePureNamedMachineExpression
		//                ) ';'
		//            )?
		//          )
		//        | ( '-->'
		//            ( target=[fmlStmchn::Vertex|ESUfid]
		//            | targetExpression=ValuePureNamedMachineExpression
		//            )
		//            ( ( '{'
		//                ( ( ( '@trigger:' ( trigger+= TransitionTrigger )* )?
		//                    ( guard  = TransitionGuard      | '@guard:' )?
		//                    ( tguard = TransitionTimedGuard | '@tguard:')?
		//                    '@effect:'  ( effect = TransitionEffect  )?
		//                  )
		//                | behavior=TransitionBehavior
		//                )?
		//                '}' )
		//            | ';'
		//            )
		//          )
		//        )
		public Group getGroup() { return cGroup; }
		
		//{fmlStmchn::Transition}
		public Action getTransitionAction_0() { return cTransitionAction_0; }
		
		//(transient?='transient')?
		public Assignment getTransientAssignment_1() { return cTransientAssignment_1; }
		
		//'transient'
		public Keyword getTransientTransientKeyword_1_0() { return cTransientTransientKeyword_1_0; }
		
		//'transition'
		public Keyword getTransitionKeyword_2() { return cTransitionKeyword_2; }
		
		//( moe=TransitionMoe )?
		public Assignment getMoeAssignment_3() { return cMoeAssignment_3; }
		
		//TransitionMoe
		public RuleCall getMoeTransitionMoeParserRuleCall_3_0() { return cMoeTransitionMoeParserRuleCall_3_0; }
		
		//( name=ESIdentifier )?
		public Assignment getNameAssignment_4() { return cNameAssignment_4; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_4_0() { return cNameESIdentifierParserRuleCall_4_0; }
		
		//( unrestrictedName=UnrestrictedName )?
		public Assignment getUnrestrictedNameAssignment_5() { return cUnrestrictedNameAssignment_5; }
		
		//UnrestrictedName
		public RuleCall getUnrestrictedNameUnrestrictedNameParserRuleCall_5_0() { return cUnrestrictedNameUnrestrictedNameParserRuleCall_5_0; }
		
		////        ( ( behavior=BlockStatement '-->' target=[fmlStmchn::Vertex|ESUfid] ';' )
		////        | ( '-->' target=[fmlStmchn::Vertex|ESUfid] (behavior=BlockStatement | ';') )
		////        )
		//        ( ( '{'
		//            ( ( ( '@trigger:' ( trigger+= TransitionTrigger )* )?
		//                ( guard  = TransitionGuard      | '@guard:' )?
		//                ( tguard = TransitionTimedGuard | '@tguard:')?
		//                '@effect:'  ( effect = TransitionEffect  )?
		//              )
		//            | behavior=TransitionBehavior
		//            )?
		//            '}'
		//            ( '-->'
		//                ( target=[fmlStmchn::Vertex|ESUfid]
		//                | targetExpression=ValuePureNamedMachineExpression
		//                ) ';'
		//            )?
		//          )
		//        | ( '-->'
		//            ( target=[fmlStmchn::Vertex|ESUfid]
		//            | targetExpression=ValuePureNamedMachineExpression
		//            )
		//            ( ( '{'
		//                ( ( ( '@trigger:' ( trigger+= TransitionTrigger )* )?
		//                    ( guard  = TransitionGuard      | '@guard:' )?
		//                    ( tguard = TransitionTimedGuard | '@tguard:')?
		//                    '@effect:'  ( effect = TransitionEffect  )?
		//                  )
		//                | behavior=TransitionBehavior
		//                )?
		//                '}' )
		//            | ';'
		//            )
		//          )
		//        )
		public Alternatives getAlternatives_6() { return cAlternatives_6; }
		
		//( '{'
		//           ( ( ( '@trigger:' ( trigger+= TransitionTrigger )* )?
		//               ( guard  = TransitionGuard      | '@guard:' )?
		//               ( tguard = TransitionTimedGuard | '@tguard:')?
		//               '@effect:'  ( effect = TransitionEffect  )?
		//             )
		//           | behavior=TransitionBehavior
		//           )?
		//           '}'
		//           ( '-->'
		//               ( target=[fmlStmchn::Vertex|ESUfid]
		//               | targetExpression=ValuePureNamedMachineExpression
		//               ) ';'
		//           )?
		//         )
		public Group getGroup_6_0() { return cGroup_6_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_6_0_0() { return cLeftCurlyBracketKeyword_6_0_0; }
		
		//( ( ( '@trigger:' ( trigger+= TransitionTrigger )* )?
		//    ( guard  = TransitionGuard      | '@guard:' )?
		//    ( tguard = TransitionTimedGuard | '@tguard:')?
		//    '@effect:'  ( effect = TransitionEffect  )?
		//  )
		//| behavior=TransitionBehavior
		//)?
		public Alternatives getAlternatives_6_0_1() { return cAlternatives_6_0_1; }
		
		//( ( '@trigger:' ( trigger+= TransitionTrigger )* )?
		//               ( guard  = TransitionGuard      | '@guard:' )?
		//               ( tguard = TransitionTimedGuard | '@tguard:')?
		//               '@effect:'  ( effect = TransitionEffect  )?
		//             )
		public Group getGroup_6_0_1_0() { return cGroup_6_0_1_0; }
		
		//( '@trigger:' ( trigger+= TransitionTrigger )* )?
		public Group getGroup_6_0_1_0_0() { return cGroup_6_0_1_0_0; }
		
		//'@trigger:'
		public Keyword getTriggerKeyword_6_0_1_0_0_0() { return cTriggerKeyword_6_0_1_0_0_0; }
		
		//( trigger+= TransitionTrigger )*
		public Assignment getTriggerAssignment_6_0_1_0_0_1() { return cTriggerAssignment_6_0_1_0_0_1; }
		
		//TransitionTrigger
		public RuleCall getTriggerTransitionTriggerParserRuleCall_6_0_1_0_0_1_0() { return cTriggerTransitionTriggerParserRuleCall_6_0_1_0_0_1_0; }
		
		//( guard  = TransitionGuard      | '@guard:' )?
		public Alternatives getAlternatives_6_0_1_0_1() { return cAlternatives_6_0_1_0_1; }
		
		//guard  = TransitionGuard
		public Assignment getGuardAssignment_6_0_1_0_1_0() { return cGuardAssignment_6_0_1_0_1_0; }
		
		//TransitionGuard
		public RuleCall getGuardTransitionGuardParserRuleCall_6_0_1_0_1_0_0() { return cGuardTransitionGuardParserRuleCall_6_0_1_0_1_0_0; }
		
		//'@guard:'
		public Keyword getGuardKeyword_6_0_1_0_1_1() { return cGuardKeyword_6_0_1_0_1_1; }
		
		//( tguard = TransitionTimedGuard | '@tguard:')?
		public Alternatives getAlternatives_6_0_1_0_2() { return cAlternatives_6_0_1_0_2; }
		
		//tguard = TransitionTimedGuard
		public Assignment getTguardAssignment_6_0_1_0_2_0() { return cTguardAssignment_6_0_1_0_2_0; }
		
		//TransitionTimedGuard
		public RuleCall getTguardTransitionTimedGuardParserRuleCall_6_0_1_0_2_0_0() { return cTguardTransitionTimedGuardParserRuleCall_6_0_1_0_2_0_0; }
		
		//'@tguard:'
		public Keyword getTguardKeyword_6_0_1_0_2_1() { return cTguardKeyword_6_0_1_0_2_1; }
		
		//'@effect:'
		public Keyword getEffectKeyword_6_0_1_0_3() { return cEffectKeyword_6_0_1_0_3; }
		
		//( effect = TransitionEffect  )?
		public Assignment getEffectAssignment_6_0_1_0_4() { return cEffectAssignment_6_0_1_0_4; }
		
		//TransitionEffect
		public RuleCall getEffectTransitionEffectParserRuleCall_6_0_1_0_4_0() { return cEffectTransitionEffectParserRuleCall_6_0_1_0_4_0; }
		
		//behavior=TransitionBehavior
		public Assignment getBehaviorAssignment_6_0_1_1() { return cBehaviorAssignment_6_0_1_1; }
		
		//TransitionBehavior
		public RuleCall getBehaviorTransitionBehaviorParserRuleCall_6_0_1_1_0() { return cBehaviorTransitionBehaviorParserRuleCall_6_0_1_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_6_0_2() { return cRightCurlyBracketKeyword_6_0_2; }
		
		//( '-->'
		//    ( target=[fmlStmchn::Vertex|ESUfid]
		//    | targetExpression=ValuePureNamedMachineExpression
		//    ) ';'
		//)?
		public Group getGroup_6_0_3() { return cGroup_6_0_3; }
		
		//'-->'
		public Keyword getHyphenMinusHyphenMinusGreaterThanSignKeyword_6_0_3_0() { return cHyphenMinusHyphenMinusGreaterThanSignKeyword_6_0_3_0; }
		
		//( target=[fmlStmchn::Vertex|ESUfid]
		//| targetExpression=ValuePureNamedMachineExpression
		//)
		public Alternatives getAlternatives_6_0_3_1() { return cAlternatives_6_0_3_1; }
		
		//target=[fmlStmchn::Vertex|ESUfid]
		public Assignment getTargetAssignment_6_0_3_1_0() { return cTargetAssignment_6_0_3_1_0; }
		
		//[fmlStmchn::Vertex|ESUfid]
		public CrossReference getTargetVertexCrossReference_6_0_3_1_0_0() { return cTargetVertexCrossReference_6_0_3_1_0_0; }
		
		//ESUfid
		public RuleCall getTargetVertexESUfidParserRuleCall_6_0_3_1_0_0_1() { return cTargetVertexESUfidParserRuleCall_6_0_3_1_0_0_1; }
		
		//targetExpression=ValuePureNamedMachineExpression
		public Assignment getTargetExpressionAssignment_6_0_3_1_1() { return cTargetExpressionAssignment_6_0_3_1_1; }
		
		//ValuePureNamedMachineExpression
		public RuleCall getTargetExpressionValuePureNamedMachineExpressionParserRuleCall_6_0_3_1_1_0() { return cTargetExpressionValuePureNamedMachineExpressionParserRuleCall_6_0_3_1_1_0; }
		
		//';'
		public Keyword getSemicolonKeyword_6_0_3_2() { return cSemicolonKeyword_6_0_3_2; }
		
		//( '-->'
		//           ( target=[fmlStmchn::Vertex|ESUfid]
		//           | targetExpression=ValuePureNamedMachineExpression
		//           )
		//           ( ( '{'
		//               ( ( ( '@trigger:' ( trigger+= TransitionTrigger )* )?
		//                   ( guard  = TransitionGuard      | '@guard:' )?
		//                   ( tguard = TransitionTimedGuard | '@tguard:')?
		//                   '@effect:'  ( effect = TransitionEffect  )?
		//                 )
		//               | behavior=TransitionBehavior
		//               )?
		//               '}' )
		//           | ';'
		//           )
		//         )
		public Group getGroup_6_1() { return cGroup_6_1; }
		
		//'-->'
		public Keyword getHyphenMinusHyphenMinusGreaterThanSignKeyword_6_1_0() { return cHyphenMinusHyphenMinusGreaterThanSignKeyword_6_1_0; }
		
		//( target=[fmlStmchn::Vertex|ESUfid]
		//| targetExpression=ValuePureNamedMachineExpression
		//)
		public Alternatives getAlternatives_6_1_1() { return cAlternatives_6_1_1; }
		
		//target=[fmlStmchn::Vertex|ESUfid]
		public Assignment getTargetAssignment_6_1_1_0() { return cTargetAssignment_6_1_1_0; }
		
		//[fmlStmchn::Vertex|ESUfid]
		public CrossReference getTargetVertexCrossReference_6_1_1_0_0() { return cTargetVertexCrossReference_6_1_1_0_0; }
		
		//ESUfid
		public RuleCall getTargetVertexESUfidParserRuleCall_6_1_1_0_0_1() { return cTargetVertexESUfidParserRuleCall_6_1_1_0_0_1; }
		
		//targetExpression=ValuePureNamedMachineExpression
		public Assignment getTargetExpressionAssignment_6_1_1_1() { return cTargetExpressionAssignment_6_1_1_1; }
		
		//ValuePureNamedMachineExpression
		public RuleCall getTargetExpressionValuePureNamedMachineExpressionParserRuleCall_6_1_1_1_0() { return cTargetExpressionValuePureNamedMachineExpressionParserRuleCall_6_1_1_1_0; }
		
		//( ( '{'
		//    ( ( ( '@trigger:' ( trigger+= TransitionTrigger )* )?
		//        ( guard  = TransitionGuard      | '@guard:' )?
		//        ( tguard = TransitionTimedGuard | '@tguard:')?
		//        '@effect:'  ( effect = TransitionEffect  )?
		//      )
		//    | behavior=TransitionBehavior
		//    )?
		//    '}' )
		//| ';'
		//)
		public Alternatives getAlternatives_6_1_2() { return cAlternatives_6_1_2; }
		
		//( '{'
		//               ( ( ( '@trigger:' ( trigger+= TransitionTrigger )* )?
		//                   ( guard  = TransitionGuard      | '@guard:' )?
		//                   ( tguard = TransitionTimedGuard | '@tguard:')?
		//                   '@effect:'  ( effect = TransitionEffect  )?
		//                 )
		//               | behavior=TransitionBehavior
		//               )?
		//               '}' )
		public Group getGroup_6_1_2_0() { return cGroup_6_1_2_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_6_1_2_0_0() { return cLeftCurlyBracketKeyword_6_1_2_0_0; }
		
		//( ( ( '@trigger:' ( trigger+= TransitionTrigger )* )?
		//    ( guard  = TransitionGuard      | '@guard:' )?
		//    ( tguard = TransitionTimedGuard | '@tguard:')?
		//    '@effect:'  ( effect = TransitionEffect  )?
		//  )
		//| behavior=TransitionBehavior
		//)?
		public Alternatives getAlternatives_6_1_2_0_1() { return cAlternatives_6_1_2_0_1; }
		
		//( ( '@trigger:' ( trigger+= TransitionTrigger )* )?
		//                   ( guard  = TransitionGuard      | '@guard:' )?
		//                   ( tguard = TransitionTimedGuard | '@tguard:')?
		//                   '@effect:'  ( effect = TransitionEffect  )?
		//                 )
		public Group getGroup_6_1_2_0_1_0() { return cGroup_6_1_2_0_1_0; }
		
		//( '@trigger:' ( trigger+= TransitionTrigger )* )?
		public Group getGroup_6_1_2_0_1_0_0() { return cGroup_6_1_2_0_1_0_0; }
		
		//'@trigger:'
		public Keyword getTriggerKeyword_6_1_2_0_1_0_0_0() { return cTriggerKeyword_6_1_2_0_1_0_0_0; }
		
		//( trigger+= TransitionTrigger )*
		public Assignment getTriggerAssignment_6_1_2_0_1_0_0_1() { return cTriggerAssignment_6_1_2_0_1_0_0_1; }
		
		//TransitionTrigger
		public RuleCall getTriggerTransitionTriggerParserRuleCall_6_1_2_0_1_0_0_1_0() { return cTriggerTransitionTriggerParserRuleCall_6_1_2_0_1_0_0_1_0; }
		
		//( guard  = TransitionGuard      | '@guard:' )?
		public Alternatives getAlternatives_6_1_2_0_1_0_1() { return cAlternatives_6_1_2_0_1_0_1; }
		
		//guard  = TransitionGuard
		public Assignment getGuardAssignment_6_1_2_0_1_0_1_0() { return cGuardAssignment_6_1_2_0_1_0_1_0; }
		
		//TransitionGuard
		public RuleCall getGuardTransitionGuardParserRuleCall_6_1_2_0_1_0_1_0_0() { return cGuardTransitionGuardParserRuleCall_6_1_2_0_1_0_1_0_0; }
		
		//'@guard:'
		public Keyword getGuardKeyword_6_1_2_0_1_0_1_1() { return cGuardKeyword_6_1_2_0_1_0_1_1; }
		
		//( tguard = TransitionTimedGuard | '@tguard:')?
		public Alternatives getAlternatives_6_1_2_0_1_0_2() { return cAlternatives_6_1_2_0_1_0_2; }
		
		//tguard = TransitionTimedGuard
		public Assignment getTguardAssignment_6_1_2_0_1_0_2_0() { return cTguardAssignment_6_1_2_0_1_0_2_0; }
		
		//TransitionTimedGuard
		public RuleCall getTguardTransitionTimedGuardParserRuleCall_6_1_2_0_1_0_2_0_0() { return cTguardTransitionTimedGuardParserRuleCall_6_1_2_0_1_0_2_0_0; }
		
		//'@tguard:'
		public Keyword getTguardKeyword_6_1_2_0_1_0_2_1() { return cTguardKeyword_6_1_2_0_1_0_2_1; }
		
		//'@effect:'
		public Keyword getEffectKeyword_6_1_2_0_1_0_3() { return cEffectKeyword_6_1_2_0_1_0_3; }
		
		//( effect = TransitionEffect  )?
		public Assignment getEffectAssignment_6_1_2_0_1_0_4() { return cEffectAssignment_6_1_2_0_1_0_4; }
		
		//TransitionEffect
		public RuleCall getEffectTransitionEffectParserRuleCall_6_1_2_0_1_0_4_0() { return cEffectTransitionEffectParserRuleCall_6_1_2_0_1_0_4_0; }
		
		//behavior=TransitionBehavior
		public Assignment getBehaviorAssignment_6_1_2_0_1_1() { return cBehaviorAssignment_6_1_2_0_1_1; }
		
		//TransitionBehavior
		public RuleCall getBehaviorTransitionBehaviorParserRuleCall_6_1_2_0_1_1_0() { return cBehaviorTransitionBehaviorParserRuleCall_6_1_2_0_1_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_6_1_2_0_2() { return cRightCurlyBracketKeyword_6_1_2_0_2; }
		
		//';'
		public Keyword getSemicolonKeyword_6_1_2_1() { return cSemicolonKeyword_6_1_2_1; }
	}
	public class TransitionMoeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.TransitionMoe");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cLessThanSignKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
		private final Group cGroup_1_0 = (Group)cAlternatives_1.eContents().get(0);
		private final Keyword cMocKeyword_1_0_0 = (Keyword)cGroup_1_0.eContents().get(0);
		private final Alternatives cAlternatives_1_0_1 = (Alternatives)cGroup_1_0.eContents().get(1);
		private final Group cGroup_1_0_1_0 = (Group)cAlternatives_1_0_1.eContents().get(0);
		private final Assignment cMocAssignment_1_0_1_0_0 = (Assignment)cGroup_1_0_1_0.eContents().get(0);
		private final RuleCall cMocTransitionMocEnumRuleCall_1_0_1_0_0_0 = (RuleCall)cMocAssignment_1_0_1_0_0.eContents().get(0);
		private final Group cGroup_1_0_1_0_1 = (Group)cGroup_1_0_1_0.eContents().get(1);
		private final Keyword cAmpersandKeyword_1_0_1_0_1_0 = (Keyword)cGroup_1_0_1_0_1.eContents().get(0);
		private final Assignment cIsElseAssignment_1_0_1_0_1_1 = (Assignment)cGroup_1_0_1_0_1.eContents().get(1);
		private final Keyword cIsElseElseKeyword_1_0_1_0_1_1_0 = (Keyword)cIsElseAssignment_1_0_1_0_1_1.eContents().get(0);
		private final Assignment cIsElseAssignment_1_0_1_1 = (Assignment)cAlternatives_1_0_1.eContents().get(1);
		private final Keyword cIsElseElseKeyword_1_0_1_1_0 = (Keyword)cIsElseAssignment_1_0_1_1.eContents().get(0);
		private final Group cGroup_1_0_2 = (Group)cGroup_1_0.eContents().get(2);
		private final Keyword cCommaKeyword_1_0_2_0 = (Keyword)cGroup_1_0_2.eContents().get(0);
		private final Keyword cPriorKeyword_1_0_2_1 = (Keyword)cGroup_1_0_2.eContents().get(1);
		private final Assignment cPriorityAssignment_1_0_2_2 = (Assignment)cGroup_1_0_2.eContents().get(2);
		private final RuleCall cPriorityEIntParserRuleCall_1_0_2_2_0 = (RuleCall)cPriorityAssignment_1_0_2_2.eContents().get(0);
		private final Group cGroup_1_1 = (Group)cAlternatives_1.eContents().get(1);
		private final Keyword cPriorKeyword_1_1_0 = (Keyword)cGroup_1_1.eContents().get(0);
		private final Assignment cPriorityAssignment_1_1_1 = (Assignment)cGroup_1_1.eContents().get(1);
		private final RuleCall cPriorityEIntParserRuleCall_1_1_1_0 = (RuleCall)cPriorityAssignment_1_1_1.eContents().get(0);
		private final Keyword cGreaterThanSignKeyword_2 = (Keyword)cGroup.eContents().get(2);
		
		//TransitionMoe returns fmlStmchn::TransitionMoe
		//    : '<'
		//        ( ('moc:')?
		//            ( moc=TransitionMoc  ( '&' isElse?='else' )?
		//            | isElse?='else'
		//            ) ( ',' ( 'prior:' )? priority=EInt )?
		//        | ( 'prior:' )? priority=EInt
		//        )
		//      '>'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//'<'
		//       ( ('moc:')?
		//           ( moc=TransitionMoc  ( '&' isElse?='else' )?
		//           | isElse?='else'
		//           ) ( ',' ( 'prior:' )? priority=EInt )?
		//       | ( 'prior:' )? priority=EInt
		//       )
		//     '>'
		public Group getGroup() { return cGroup; }
		
		//'<'
		public Keyword getLessThanSignKeyword_0() { return cLessThanSignKeyword_0; }
		
		//( ('moc:')?
		//    ( moc=TransitionMoc  ( '&' isElse?='else' )?
		//    | isElse?='else'
		//    ) ( ',' ( 'prior:' )? priority=EInt )?
		//| ( 'prior:' )? priority=EInt
		//)
		public Alternatives getAlternatives_1() { return cAlternatives_1; }
		
		//('moc:')?
		//           ( moc=TransitionMoc  ( '&' isElse?='else' )?
		//           | isElse?='else'
		//           ) ( ',' ( 'prior:' )? priority=EInt )?
		public Group getGroup_1_0() { return cGroup_1_0; }
		
		//('moc:')?
		public Keyword getMocKeyword_1_0_0() { return cMocKeyword_1_0_0; }
		
		//( moc=TransitionMoc  ( '&' isElse?='else' )?
		//| isElse?='else'
		//)
		public Alternatives getAlternatives_1_0_1() { return cAlternatives_1_0_1; }
		
		//moc=TransitionMoc  ( '&' isElse?='else' )?
		public Group getGroup_1_0_1_0() { return cGroup_1_0_1_0; }
		
		//moc=TransitionMoc
		public Assignment getMocAssignment_1_0_1_0_0() { return cMocAssignment_1_0_1_0_0; }
		
		//TransitionMoc
		public RuleCall getMocTransitionMocEnumRuleCall_1_0_1_0_0_0() { return cMocTransitionMocEnumRuleCall_1_0_1_0_0_0; }
		
		//( '&' isElse?='else' )?
		public Group getGroup_1_0_1_0_1() { return cGroup_1_0_1_0_1; }
		
		//'&'
		public Keyword getAmpersandKeyword_1_0_1_0_1_0() { return cAmpersandKeyword_1_0_1_0_1_0; }
		
		//isElse?='else'
		public Assignment getIsElseAssignment_1_0_1_0_1_1() { return cIsElseAssignment_1_0_1_0_1_1; }
		
		//'else'
		public Keyword getIsElseElseKeyword_1_0_1_0_1_1_0() { return cIsElseElseKeyword_1_0_1_0_1_1_0; }
		
		//isElse?='else'
		public Assignment getIsElseAssignment_1_0_1_1() { return cIsElseAssignment_1_0_1_1; }
		
		//'else'
		public Keyword getIsElseElseKeyword_1_0_1_1_0() { return cIsElseElseKeyword_1_0_1_1_0; }
		
		//( ',' ( 'prior:' )? priority=EInt )?
		public Group getGroup_1_0_2() { return cGroup_1_0_2; }
		
		//','
		public Keyword getCommaKeyword_1_0_2_0() { return cCommaKeyword_1_0_2_0; }
		
		//( 'prior:' )?
		public Keyword getPriorKeyword_1_0_2_1() { return cPriorKeyword_1_0_2_1; }
		
		//priority=EInt
		public Assignment getPriorityAssignment_1_0_2_2() { return cPriorityAssignment_1_0_2_2; }
		
		//EInt
		public RuleCall getPriorityEIntParserRuleCall_1_0_2_2_0() { return cPriorityEIntParserRuleCall_1_0_2_2_0; }
		
		//( 'prior:' )? priority=EInt
		public Group getGroup_1_1() { return cGroup_1_1; }
		
		//( 'prior:' )?
		public Keyword getPriorKeyword_1_1_0() { return cPriorKeyword_1_1_0; }
		
		//priority=EInt
		public Assignment getPriorityAssignment_1_1_1() { return cPriorityAssignment_1_1_1; }
		
		//EInt
		public RuleCall getPriorityEIntParserRuleCall_1_1_1_0() { return cPriorityEIntParserRuleCall_1_1_1_0; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_2() { return cGreaterThanSignKeyword_2; }
	}
	public class TransitionBehaviorElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.TransitionBehavior");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cBlockStatementAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cOpAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cOpBlockStatementSchedulerParserRuleCall_1_0 = (RuleCall)cOpAssignment_1.eContents().get(0);
		private final Assignment cStatementAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cStatementStatementParserRuleCall_2_0 = (RuleCall)cStatementAssignment_2.eContents().get(0);
		
		//TransitionBehavior returns fmlStmnt::BlockStatement
		//    : {fmlStmnt::BlockStatement}
		//        ( op=BlockStatementScheduler )?
		//         ( statement+=Statement )*
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlStmnt::BlockStatement}
		//       ( op=BlockStatementScheduler )?
		//        ( statement+=Statement )*
		public Group getGroup() { return cGroup; }
		
		//{fmlStmnt::BlockStatement}
		public Action getBlockStatementAction_0() { return cBlockStatementAction_0; }
		
		//( op=BlockStatementScheduler )?
		public Assignment getOpAssignment_1() { return cOpAssignment_1; }
		
		//BlockStatementScheduler
		public RuleCall getOpBlockStatementSchedulerParserRuleCall_1_0() { return cOpBlockStatementSchedulerParserRuleCall_1_0; }
		
		//( statement+=Statement )*
		public Assignment getStatementAssignment_2() { return cStatementAssignment_2; }
		
		//Statement
		public RuleCall getStatementStatementParserRuleCall_2_0() { return cStatementStatementParserRuleCall_2_0; }
	}
	public class TransitionTriggerElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.TransitionTrigger");
		private final RuleCall cInputComStatementParserRuleCall = (RuleCall)rule.eContents().get(1);
		
		//TransitionTrigger returns fmlStmnt::InputComStatement
		//    : InputComStatement
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//InputComStatement
		public RuleCall getInputComStatementParserRuleCall() { return cInputComStatementParserRuleCall; }
	}
	public class TransitionGuardElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.TransitionGuard");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final Group cGroup_0 = (Group)cAlternatives.eContents().get(0);
		private final Action cGuardStatementAction_0_0 = (Action)cGroup_0.eContents().get(0);
		private final Keyword cGuardKeyword_0_1 = (Keyword)cGroup_0.eContents().get(1);
		private final Assignment cConditionAssignment_0_2 = (Assignment)cGroup_0.eContents().get(2);
		private final RuleCall cConditionTransitionGuardExpressionParserRuleCall_0_2_0 = (RuleCall)cConditionAssignment_0_2.eContents().get(0);
		private final Group cGroup_1 = (Group)cAlternatives.eContents().get(1);
		private final Keyword cGuardKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final Alternatives cAlternatives_1_1 = (Alternatives)cGroup_1.eContents().get(1);
		private final Group cGroup_1_1_0 = (Group)cAlternatives_1_1.eContents().get(0);
		private final Action cGuardStatementAction_1_1_0_0 = (Action)cGroup_1_1_0.eContents().get(0);
		private final Alternatives cAlternatives_1_1_0_1 = (Alternatives)cGroup_1_1_0.eContents().get(1);
		private final Group cGroup_1_1_0_1_0 = (Group)cAlternatives_1_1_0_1.eContents().get(0);
		private final Keyword cLeftSquareBracketKeyword_1_1_0_1_0_0 = (Keyword)cGroup_1_1_0_1_0.eContents().get(0);
		private final Assignment cConditionAssignment_1_1_0_1_0_1 = (Assignment)cGroup_1_1_0_1_0.eContents().get(1);
		private final RuleCall cConditionExpressionParserRuleCall_1_1_0_1_0_1_0 = (RuleCall)cConditionAssignment_1_1_0_1_0_1.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_1_1_0_1_0_2 = (Keyword)cGroup_1_1_0_1_0.eContents().get(2);
		private final Assignment cConditionAssignment_1_1_0_1_1 = (Assignment)cAlternatives_1_1_0_1.eContents().get(1);
		private final RuleCall cConditionExpressionParserRuleCall_1_1_0_1_1_0 = (RuleCall)cConditionAssignment_1_1_0_1_1.eContents().get(0);
		private final RuleCall cGuardStatementParserRuleCall_1_1_1 = (RuleCall)cAlternatives_1_1.eContents().get(1);
		private final RuleCall cEventGuardStatementParserRuleCall_1_1_2 = (RuleCall)cAlternatives_1_1.eContents().get(2);
		private final RuleCall cCheckSatGuardStatementParserRuleCall_1_1_3 = (RuleCall)cAlternatives_1_1.eContents().get(3);
		
		//TransitionGuard returns fmlStmnt::AbstractGuardStatement
		//    : {fmlStmnt::GuardStatement}
		//        '@guard<' condition=TransitionGuardExpression
		//    | '@guard:'
		//        ( {fmlStmnt::GuardStatement}
		//            ( '[' condition=Expression ']'
		//            | condition=Expression
		//            )
		//        | GuardStatement
		//        | EventGuardStatement
		//        | CheckSatGuardStatement
		//        )
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlStmnt::GuardStatement}
		//       '@guard<' condition=TransitionGuardExpression
		//   | '@guard:'
		//       ( {fmlStmnt::GuardStatement}
		//           ( '[' condition=Expression ']'
		//           | condition=Expression
		//           )
		//       | GuardStatement
		//       | EventGuardStatement
		//       | CheckSatGuardStatement
		//       )
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//{fmlStmnt::GuardStatement}
		//       '@guard<' condition=TransitionGuardExpression
		public Group getGroup_0() { return cGroup_0; }
		
		//{fmlStmnt::GuardStatement}
		public Action getGuardStatementAction_0_0() { return cGuardStatementAction_0_0; }
		
		//'@guard<'
		public Keyword getGuardKeyword_0_1() { return cGuardKeyword_0_1; }
		
		//condition=TransitionGuardExpression
		public Assignment getConditionAssignment_0_2() { return cConditionAssignment_0_2; }
		
		//TransitionGuardExpression
		public RuleCall getConditionTransitionGuardExpressionParserRuleCall_0_2_0() { return cConditionTransitionGuardExpressionParserRuleCall_0_2_0; }
		
		//'@guard:'
		//       ( {fmlStmnt::GuardStatement}
		//           ( '[' condition=Expression ']'
		//           | condition=Expression
		//           )
		//       | GuardStatement
		//       | EventGuardStatement
		//       | CheckSatGuardStatement
		//       )
		public Group getGroup_1() { return cGroup_1; }
		
		//'@guard:'
		public Keyword getGuardKeyword_1_0() { return cGuardKeyword_1_0; }
		
		//( {fmlStmnt::GuardStatement}
		//    ( '[' condition=Expression ']'
		//    | condition=Expression
		//    )
		//| GuardStatement
		//| EventGuardStatement
		//| CheckSatGuardStatement
		//)
		public Alternatives getAlternatives_1_1() { return cAlternatives_1_1; }
		
		//{fmlStmnt::GuardStatement}
		//           ( '[' condition=Expression ']'
		//           | condition=Expression
		//           )
		public Group getGroup_1_1_0() { return cGroup_1_1_0; }
		
		//{fmlStmnt::GuardStatement}
		public Action getGuardStatementAction_1_1_0_0() { return cGuardStatementAction_1_1_0_0; }
		
		//( '[' condition=Expression ']'
		//| condition=Expression
		//)
		public Alternatives getAlternatives_1_1_0_1() { return cAlternatives_1_1_0_1; }
		
		//'[' condition=Expression ']'
		public Group getGroup_1_1_0_1_0() { return cGroup_1_1_0_1_0; }
		
		//'['
		public Keyword getLeftSquareBracketKeyword_1_1_0_1_0_0() { return cLeftSquareBracketKeyword_1_1_0_1_0_0; }
		
		//condition=Expression
		public Assignment getConditionAssignment_1_1_0_1_0_1() { return cConditionAssignment_1_1_0_1_0_1; }
		
		//Expression
		public RuleCall getConditionExpressionParserRuleCall_1_1_0_1_0_1_0() { return cConditionExpressionParserRuleCall_1_1_0_1_0_1_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_1_1_0_1_0_2() { return cRightSquareBracketKeyword_1_1_0_1_0_2; }
		
		//condition=Expression
		public Assignment getConditionAssignment_1_1_0_1_1() { return cConditionAssignment_1_1_0_1_1; }
		
		//Expression
		public RuleCall getConditionExpressionParserRuleCall_1_1_0_1_1_0() { return cConditionExpressionParserRuleCall_1_1_0_1_1_0; }
		
		//GuardStatement
		public RuleCall getGuardStatementParserRuleCall_1_1_1() { return cGuardStatementParserRuleCall_1_1_1; }
		
		//EventGuardStatement
		public RuleCall getEventGuardStatementParserRuleCall_1_1_2() { return cEventGuardStatementParserRuleCall_1_1_2; }
		
		//CheckSatGuardStatement
		public RuleCall getCheckSatGuardStatementParserRuleCall_1_1_3() { return cCheckSatGuardStatementParserRuleCall_1_1_3; }
	}
	public class TransitionGuardExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.TransitionGuardExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLogicalAssociativeExpressionAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cOperatorAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final Alternatives cOperatorAlternatives_1_0 = (Alternatives)cOperatorAssignment_1.eContents().get(0);
		private final Keyword cOperatorAmpersandAmpersandKeyword_1_0_0 = (Keyword)cOperatorAlternatives_1_0.eContents().get(0);
		private final Keyword cOperatorAndKeyword_1_0_1 = (Keyword)cOperatorAlternatives_1_0.eContents().get(1);
		private final Keyword cOperatorVerticalLineVerticalLineKeyword_1_0_2 = (Keyword)cOperatorAlternatives_1_0.eContents().get(2);
		private final Keyword cOperatorOrKeyword_1_0_3 = (Keyword)cOperatorAlternatives_1_0.eContents().get(3);
		private final Keyword cGreaterThanSignColonKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cOperandAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cOperandBitwiseOrExpressionParserRuleCall_3_0 = (RuleCall)cOperandAssignment_3.eContents().get(0);
		
		//TransitionGuardExpression returns fmlExpr::Expression
		//    : {fmlExpr::LogicalAssociativeExpression}
		//        operator=( '&&' | 'and' | '||' | 'or' ) '>:'
		//        ( operand+=BitwiseOrExpression )+
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlExpr::LogicalAssociativeExpression}
		//       operator=( '&&' | 'and' | '||' | 'or' ) '>:'
		//       ( operand+=BitwiseOrExpression )+
		public Group getGroup() { return cGroup; }
		
		//{fmlExpr::LogicalAssociativeExpression}
		public Action getLogicalAssociativeExpressionAction_0() { return cLogicalAssociativeExpressionAction_0; }
		
		//operator=( '&&' | 'and' | '||' | 'or' )
		public Assignment getOperatorAssignment_1() { return cOperatorAssignment_1; }
		
		//( '&&' | 'and' | '||' | 'or' )
		public Alternatives getOperatorAlternatives_1_0() { return cOperatorAlternatives_1_0; }
		
		//'&&'
		public Keyword getOperatorAmpersandAmpersandKeyword_1_0_0() { return cOperatorAmpersandAmpersandKeyword_1_0_0; }
		
		//'and'
		public Keyword getOperatorAndKeyword_1_0_1() { return cOperatorAndKeyword_1_0_1; }
		
		//'||'
		public Keyword getOperatorVerticalLineVerticalLineKeyword_1_0_2() { return cOperatorVerticalLineVerticalLineKeyword_1_0_2; }
		
		//'or'
		public Keyword getOperatorOrKeyword_1_0_3() { return cOperatorOrKeyword_1_0_3; }
		
		//'>:'
		public Keyword getGreaterThanSignColonKeyword_2() { return cGreaterThanSignColonKeyword_2; }
		
		//( operand+=BitwiseOrExpression )+
		public Assignment getOperandAssignment_3() { return cOperandAssignment_3; }
		
		//BitwiseOrExpression
		public RuleCall getOperandBitwiseOrExpressionParserRuleCall_3_0() { return cOperandBitwiseOrExpressionParserRuleCall_3_0; }
	}
	public class TransitionTimedGuardElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.TransitionTimedGuard");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final Group cGroup_0 = (Group)cAlternatives.eContents().get(0);
		private final Action cTimedGuardStatementAction_0_0 = (Action)cGroup_0.eContents().get(0);
		private final Keyword cTguardKeyword_0_1 = (Keyword)cGroup_0.eContents().get(1);
		private final Assignment cConditionAssignment_0_2 = (Assignment)cGroup_0.eContents().get(2);
		private final RuleCall cConditionTransitionGuardExpressionParserRuleCall_0_2_0 = (RuleCall)cConditionAssignment_0_2.eContents().get(0);
		private final Group cGroup_1 = (Group)cAlternatives.eContents().get(1);
		private final Keyword cTguardKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final Alternatives cAlternatives_1_1 = (Alternatives)cGroup_1.eContents().get(1);
		private final Group cGroup_1_1_0 = (Group)cAlternatives_1_1.eContents().get(0);
		private final Action cTimedGuardStatementAction_1_1_0_0 = (Action)cGroup_1_1_0.eContents().get(0);
		private final Alternatives cAlternatives_1_1_0_1 = (Alternatives)cGroup_1_1_0.eContents().get(1);
		private final Group cGroup_1_1_0_1_0 = (Group)cAlternatives_1_1_0_1.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_1_1_0_1_0_0 = (Keyword)cGroup_1_1_0_1_0.eContents().get(0);
		private final Assignment cConditionAssignment_1_1_0_1_0_1 = (Assignment)cGroup_1_1_0_1_0.eContents().get(1);
		private final RuleCall cConditionExpressionParserRuleCall_1_1_0_1_0_1_0 = (RuleCall)cConditionAssignment_1_1_0_1_0_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_1_1_0_1_0_2 = (Keyword)cGroup_1_1_0_1_0.eContents().get(2);
		private final Assignment cConditionAssignment_1_1_0_1_1 = (Assignment)cAlternatives_1_1_0_1.eContents().get(1);
		private final RuleCall cConditionExpressionParserRuleCall_1_1_0_1_1_0 = (RuleCall)cConditionAssignment_1_1_0_1_1.eContents().get(0);
		private final RuleCall cTimedGuardStatementParserRuleCall_1_1_1 = (RuleCall)cAlternatives_1_1.eContents().get(1);
		
		//TransitionTimedGuard returns fmlStmnt::TimedGuardStatement
		//    : {fmlStmnt::TimedGuardStatement}
		//        '@tguard<' condition=TransitionGuardExpression
		//    | '@tguard:'
		//        ( {fmlStmnt::TimedGuardStatement}
		//            ( '{' condition=Expression '}'
		//            | condition=Expression
		//            )
		//        | TimedGuardStatement
		//        )
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlStmnt::TimedGuardStatement}
		//       '@tguard<' condition=TransitionGuardExpression
		//   | '@tguard:'
		//       ( {fmlStmnt::TimedGuardStatement}
		//           ( '{' condition=Expression '}'
		//           | condition=Expression
		//           )
		//       | TimedGuardStatement
		//       )
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//{fmlStmnt::TimedGuardStatement}
		//       '@tguard<' condition=TransitionGuardExpression
		public Group getGroup_0() { return cGroup_0; }
		
		//{fmlStmnt::TimedGuardStatement}
		public Action getTimedGuardStatementAction_0_0() { return cTimedGuardStatementAction_0_0; }
		
		//'@tguard<'
		public Keyword getTguardKeyword_0_1() { return cTguardKeyword_0_1; }
		
		//condition=TransitionGuardExpression
		public Assignment getConditionAssignment_0_2() { return cConditionAssignment_0_2; }
		
		//TransitionGuardExpression
		public RuleCall getConditionTransitionGuardExpressionParserRuleCall_0_2_0() { return cConditionTransitionGuardExpressionParserRuleCall_0_2_0; }
		
		//'@tguard:'
		//       ( {fmlStmnt::TimedGuardStatement}
		//           ( '{' condition=Expression '}'
		//           | condition=Expression
		//           )
		//       | TimedGuardStatement
		//       )
		public Group getGroup_1() { return cGroup_1; }
		
		//'@tguard:'
		public Keyword getTguardKeyword_1_0() { return cTguardKeyword_1_0; }
		
		//( {fmlStmnt::TimedGuardStatement}
		//    ( '{' condition=Expression '}'
		//    | condition=Expression
		//    )
		//| TimedGuardStatement
		//)
		public Alternatives getAlternatives_1_1() { return cAlternatives_1_1; }
		
		//{fmlStmnt::TimedGuardStatement}
		//           ( '{' condition=Expression '}'
		//           | condition=Expression
		//           )
		public Group getGroup_1_1_0() { return cGroup_1_1_0; }
		
		//{fmlStmnt::TimedGuardStatement}
		public Action getTimedGuardStatementAction_1_1_0_0() { return cTimedGuardStatementAction_1_1_0_0; }
		
		//( '{' condition=Expression '}'
		//| condition=Expression
		//)
		public Alternatives getAlternatives_1_1_0_1() { return cAlternatives_1_1_0_1; }
		
		//'{' condition=Expression '}'
		public Group getGroup_1_1_0_1_0() { return cGroup_1_1_0_1_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_1_1_0_1_0_0() { return cLeftCurlyBracketKeyword_1_1_0_1_0_0; }
		
		//condition=Expression
		public Assignment getConditionAssignment_1_1_0_1_0_1() { return cConditionAssignment_1_1_0_1_0_1; }
		
		//Expression
		public RuleCall getConditionExpressionParserRuleCall_1_1_0_1_0_1_0() { return cConditionExpressionParserRuleCall_1_1_0_1_0_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_1_1_0_1_0_2() { return cRightCurlyBracketKeyword_1_1_0_1_0_2; }
		
		//condition=Expression
		public Assignment getConditionAssignment_1_1_0_1_1() { return cConditionAssignment_1_1_0_1_1; }
		
		//Expression
		public RuleCall getConditionExpressionParserRuleCall_1_1_0_1_1_0() { return cConditionExpressionParserRuleCall_1_1_0_1_1_0; }
		
		//TimedGuardStatement
		public RuleCall getTimedGuardStatementParserRuleCall_1_1_1() { return cTimedGuardStatementParserRuleCall_1_1_1; }
	}
	public class TransitionEffectElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.TransitionEffect");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final RuleCall cTransitionEffectStatementParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Action cBlockStatementStatementAction_1_0 = (Action)cGroup_1.eContents().get(0);
		private final Assignment cStatementAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final RuleCall cStatementTransitionEffectStatementParserRuleCall_1_1_0 = (RuleCall)cStatementAssignment_1_1.eContents().get(0);
		
		//TransitionEffect returns fmlStmnt::Statement
		//    : TransitionEffectStatement
		//        ( {fmlStmnt::BlockStatement.statement+=current}
		//            statement+=TransitionEffectStatement
		//        )*
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//TransitionEffectStatement
		//       ( {fmlStmnt::BlockStatement.statement+=current}
		//           statement+=TransitionEffectStatement
		//       )*
		public Group getGroup() { return cGroup; }
		
		//TransitionEffectStatement
		public RuleCall getTransitionEffectStatementParserRuleCall_0() { return cTransitionEffectStatementParserRuleCall_0; }
		
		//( {fmlStmnt::BlockStatement.statement+=current}
		//    statement+=TransitionEffectStatement
		//)*
		public Group getGroup_1() { return cGroup_1; }
		
		//{fmlStmnt::BlockStatement.statement+=current}
		public Action getBlockStatementStatementAction_1_0() { return cBlockStatementStatementAction_1_0; }
		
		//statement+=TransitionEffectStatement
		public Assignment getStatementAssignment_1_1() { return cStatementAssignment_1_1; }
		
		//TransitionEffectStatement
		public RuleCall getStatementTransitionEffectStatementParserRuleCall_1_1_0() { return cStatementTransitionEffectStatementParserRuleCall_1_1_0; }
	}
	public class TransitionEffectStatementElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.TransitionEffectStatement");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cExpressionStatementParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cOutputComStatementParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cIfStatementParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		private final RuleCall cWhileDoStatementParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		private final RuleCall cDoWhileStatementParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
		private final RuleCall cForStatementParserRuleCall_5 = (RuleCall)cAlternatives.eContents().get(5);
		private final RuleCall cForEachStatementParserRuleCall_6 = (RuleCall)cAlternatives.eContents().get(6);
		private final RuleCall cInterruptStatementParserRuleCall_7 = (RuleCall)cAlternatives.eContents().get(7);
		private final RuleCall cActivityStatementParserRuleCall_8 = (RuleCall)cAlternatives.eContents().get(8);
		private final RuleCall cInvokeStatementParserRuleCall_9 = (RuleCall)cAlternatives.eContents().get(9);
		
		//TransitionEffectStatement returns fmlStmnt::Statement
		//    : ExpressionStatement
		//    | OutputComStatement
		//    | IfStatement
		//    | WhileDoStatement
		//    | DoWhileStatement
		//    | ForStatement
		//    | ForEachStatement
		//    | InterruptStatement
		//    | ActivityStatement
		//    | InvokeStatement
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//ExpressionStatement
		//   | OutputComStatement
		//   | IfStatement
		//   | WhileDoStatement
		//   | DoWhileStatement
		//   | ForStatement
		//   | ForEachStatement
		//   | InterruptStatement
		//   | ActivityStatement
		//   | InvokeStatement
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//ExpressionStatement
		public RuleCall getExpressionStatementParserRuleCall_0() { return cExpressionStatementParserRuleCall_0; }
		
		//OutputComStatement
		public RuleCall getOutputComStatementParserRuleCall_1() { return cOutputComStatementParserRuleCall_1; }
		
		//IfStatement
		public RuleCall getIfStatementParserRuleCall_2() { return cIfStatementParserRuleCall_2; }
		
		//WhileDoStatement
		public RuleCall getWhileDoStatementParserRuleCall_3() { return cWhileDoStatementParserRuleCall_3; }
		
		//DoWhileStatement
		public RuleCall getDoWhileStatementParserRuleCall_4() { return cDoWhileStatementParserRuleCall_4; }
		
		//ForStatement
		public RuleCall getForStatementParserRuleCall_5() { return cForStatementParserRuleCall_5; }
		
		//ForEachStatement
		public RuleCall getForEachStatementParserRuleCall_6() { return cForEachStatementParserRuleCall_6; }
		
		//InterruptStatement
		public RuleCall getInterruptStatementParserRuleCall_7() { return cInterruptStatementParserRuleCall_7; }
		
		//ActivityStatement
		public RuleCall getActivityStatementParserRuleCall_8() { return cActivityStatementParserRuleCall_8; }
		
		//InvokeStatement
		public RuleCall getInvokeStatementParserRuleCall_9() { return cInvokeStatementParserRuleCall_9; }
	}
	public class StatementElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.Statement");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cBlockStatementParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cExpressionStatementParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cGuardStatementParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		private final RuleCall cTimedGuardStatementParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		private final RuleCall cEventGuardStatementParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
		private final RuleCall cCheckSatGuardStatementParserRuleCall_5 = (RuleCall)cAlternatives.eContents().get(5);
		private final RuleCall cInputComStatementParserRuleCall_6 = (RuleCall)cAlternatives.eContents().get(6);
		private final RuleCall cOutputComStatementParserRuleCall_7 = (RuleCall)cAlternatives.eContents().get(7);
		private final RuleCall cIfStatementParserRuleCall_8 = (RuleCall)cAlternatives.eContents().get(8);
		private final RuleCall cWhileDoStatementParserRuleCall_9 = (RuleCall)cAlternatives.eContents().get(9);
		private final RuleCall cDoWhileStatementParserRuleCall_10 = (RuleCall)cAlternatives.eContents().get(10);
		private final RuleCall cForStatementParserRuleCall_11 = (RuleCall)cAlternatives.eContents().get(11);
		private final RuleCall cForEachStatementParserRuleCall_12 = (RuleCall)cAlternatives.eContents().get(12);
		private final RuleCall cInterruptStatementParserRuleCall_13 = (RuleCall)cAlternatives.eContents().get(13);
		private final RuleCall cActivityStatementParserRuleCall_14 = (RuleCall)cAlternatives.eContents().get(14);
		private final RuleCall cInvokeStatementParserRuleCall_15 = (RuleCall)cAlternatives.eContents().get(15);
		private final RuleCall cMetaStatementParserRuleCall_16 = (RuleCall)cAlternatives.eContents().get(16);
		
		//////////////////////////////////////////////////////////////////////////////////
		//// Statement Rules
		//////////////////////////////////////////////////////////////////////////////////
		//Statement returns fmlStmnt::Statement
		//     : BlockStatement
		//     | ExpressionStatement
		//    | GuardStatement
		//    | TimedGuardStatement
		//    | EventGuardStatement
		//    | CheckSatGuardStatement
		//    | InputComStatement
		//    | OutputComStatement
		//    | IfStatement
		//    | WhileDoStatement
		//    | DoWhileStatement
		//    | ForStatement
		//    | ForEachStatement
		//    | InterruptStatement
		//    | ActivityStatement
		//    | InvokeStatement
		////    | ObserverStatement
		//    | MetaStatement
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		// BlockStatement
		//     | ExpressionStatement
		//    | GuardStatement
		//    | TimedGuardStatement
		//    | EventGuardStatement
		//    | CheckSatGuardStatement
		//    | InputComStatement
		//    | OutputComStatement
		//    | IfStatement
		//    | WhileDoStatement
		//    | DoWhileStatement
		//    | ForStatement
		//    | ForEachStatement
		//    | InterruptStatement
		//    | ActivityStatement
		//    | InvokeStatement
		////    | ObserverStatement
		//    | MetaStatement
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//BlockStatement
		public RuleCall getBlockStatementParserRuleCall_0() { return cBlockStatementParserRuleCall_0; }
		
		//ExpressionStatement
		public RuleCall getExpressionStatementParserRuleCall_1() { return cExpressionStatementParserRuleCall_1; }
		
		//GuardStatement
		public RuleCall getGuardStatementParserRuleCall_2() { return cGuardStatementParserRuleCall_2; }
		
		//TimedGuardStatement
		public RuleCall getTimedGuardStatementParserRuleCall_3() { return cTimedGuardStatementParserRuleCall_3; }
		
		//EventGuardStatement
		public RuleCall getEventGuardStatementParserRuleCall_4() { return cEventGuardStatementParserRuleCall_4; }
		
		//CheckSatGuardStatement
		public RuleCall getCheckSatGuardStatementParserRuleCall_5() { return cCheckSatGuardStatementParserRuleCall_5; }
		
		//InputComStatement
		public RuleCall getInputComStatementParserRuleCall_6() { return cInputComStatementParserRuleCall_6; }
		
		//OutputComStatement
		public RuleCall getOutputComStatementParserRuleCall_7() { return cOutputComStatementParserRuleCall_7; }
		
		//IfStatement
		public RuleCall getIfStatementParserRuleCall_8() { return cIfStatementParserRuleCall_8; }
		
		//WhileDoStatement
		public RuleCall getWhileDoStatementParserRuleCall_9() { return cWhileDoStatementParserRuleCall_9; }
		
		//DoWhileStatement
		public RuleCall getDoWhileStatementParserRuleCall_10() { return cDoWhileStatementParserRuleCall_10; }
		
		//ForStatement
		public RuleCall getForStatementParserRuleCall_11() { return cForStatementParserRuleCall_11; }
		
		//ForEachStatement
		public RuleCall getForEachStatementParserRuleCall_12() { return cForEachStatementParserRuleCall_12; }
		
		//InterruptStatement
		public RuleCall getInterruptStatementParserRuleCall_13() { return cInterruptStatementParserRuleCall_13; }
		
		//ActivityStatement
		public RuleCall getActivityStatementParserRuleCall_14() { return cActivityStatementParserRuleCall_14; }
		
		//InvokeStatement
		public RuleCall getInvokeStatementParserRuleCall_15() { return cInvokeStatementParserRuleCall_15; }
		
		//MetaStatement
		public RuleCall getMetaStatementParserRuleCall_16() { return cMetaStatementParserRuleCall_16; }
	}
	public class BlockStatementElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.BlockStatement");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cBlockStatementAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cOpAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cOpBlockStatementSchedulerParserRuleCall_2_0 = (RuleCall)cOpAssignment_2.eContents().get(0);
		private final Assignment cStatementAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cStatementStatementParserRuleCall_3_0 = (RuleCall)cStatementAssignment_3.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		
		//BlockStatement returns fmlStmnt::BlockStatement
		//    : {fmlStmnt::BlockStatement}
		//        '{'
		//            ( op=BlockStatementScheduler )?
		//             ( statement+=Statement )*
		//         '}'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlStmnt::BlockStatement}
		//       '{'
		//           ( op=BlockStatementScheduler )?
		//            ( statement+=Statement )*
		//        '}'
		public Group getGroup() { return cGroup; }
		
		//{fmlStmnt::BlockStatement}
		public Action getBlockStatementAction_0() { return cBlockStatementAction_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_1() { return cLeftCurlyBracketKeyword_1; }
		
		//( op=BlockStatementScheduler )?
		public Assignment getOpAssignment_2() { return cOpAssignment_2; }
		
		//BlockStatementScheduler
		public RuleCall getOpBlockStatementSchedulerParserRuleCall_2_0() { return cOpBlockStatementSchedulerParserRuleCall_2_0; }
		
		//( statement+=Statement )*
		public Assignment getStatementAssignment_3() { return cStatementAssignment_3; }
		
		//Statement
		public RuleCall getStatementStatementParserRuleCall_3_0() { return cStatementStatementParserRuleCall_3_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_4() { return cRightCurlyBracketKeyword_4; }
	}
	public class BlockStatementSchedulerElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.BlockStatementScheduler");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final Keyword cVerticalLineSemicolonVerticalLineKeyword_0 = (Keyword)cAlternatives.eContents().get(0);
		private final Keyword cVerticalLineSectionSignVerticalLineKeyword_1 = (Keyword)cAlternatives.eContents().get(1);
		private final Keyword cVerticalLineSemicolonSemicolonVerticalLineKeyword_2 = (Keyword)cAlternatives.eContents().get(2);
		private final Keyword cVerticalLineFullStopVerticalLineKeyword_3 = (Keyword)cAlternatives.eContents().get(3);
		private final Keyword cVerticalLineSolidusSemicolonVerticalLineKeyword_4 = (Keyword)cAlternatives.eContents().get(4);
		private final Keyword cIKeyword_5 = (Keyword)cAlternatives.eContents().get(5);
		private final Keyword cInterleavingKeyword_6 = (Keyword)cAlternatives.eContents().get(6);
		private final Keyword cVerticalLineTildeVerticalLineKeyword_7 = (Keyword)cAlternatives.eContents().get(7);
		private final Keyword cPartialOrderKeyword_8 = (Keyword)cAlternatives.eContents().get(8);
		private final Keyword cVerticalLineCommaVerticalLineKeyword_9 = (Keyword)cAlternatives.eContents().get(9);
		private final Keyword cParallelKeyword_10 = (Keyword)cAlternatives.eContents().get(10);
		private final Keyword cAKeyword_11 = (Keyword)cAlternatives.eContents().get(11);
		private final Keyword cAsyncKeyword_12 = (Keyword)cAlternatives.eContents().get(12);
		private final Keyword cPartialOrderKeyword_13 = (Keyword)cAlternatives.eContents().get(13);
		private final Keyword cAndKeyword_14 = (Keyword)cAlternatives.eContents().get(14);
		private final Keyword cOrKeyword_15 = (Keyword)cAlternatives.eContents().get(15);
		private final Keyword cAndThenKeyword_16 = (Keyword)cAlternatives.eContents().get(16);
		private final Keyword cOrElseKeyword_17 = (Keyword)cAlternatives.eContents().get(17);
		private final Keyword cIndetKeyword_18 = (Keyword)cAlternatives.eContents().get(18);
		private final Keyword cVerticalLineSolidusReverseSolidusVerticalLineKeyword_19 = (Keyword)cAlternatives.eContents().get(19);
		private final Keyword cForkKeyword_20 = (Keyword)cAlternatives.eContents().get(20);
		private final Keyword cJoinKeyword_21 = (Keyword)cAlternatives.eContents().get(21);
		
		//BlockStatementScheduler
		//    : '|;|' | '|§|' | '|;;|' | '|.|' | '|/;|'
		//    | '|i|' | '|interleaving|'
		//    | '|~|' | '|partial-order|'
		//    | '|,|' | '|parallel|'
		//    | '|a|' | '|async|'
		//    | '|partial-order|'
		//    | '|and|' | '|or|'
		//    | '|and#then|' | '|or#else|'
		//    | '|indet|' | '|/\\|'
		//    | '|fork|' | '|join|'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//'|;|' | '|§|' | '|;;|' | '|.|' | '|/;|'
		//   | '|i|' | '|interleaving|'
		//   | '|~|' | '|partial-order|'
		//   | '|,|' | '|parallel|'
		//   | '|a|' | '|async|'
		//   | '|partial-order|'
		//   | '|and|' | '|or|'
		//   | '|and#then|' | '|or#else|'
		//   | '|indet|' | '|/\\|'
		//   | '|fork|' | '|join|'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//'|;|'
		public Keyword getVerticalLineSemicolonVerticalLineKeyword_0() { return cVerticalLineSemicolonVerticalLineKeyword_0; }
		
		//'|§|'
		public Keyword getVerticalLineSectionSignVerticalLineKeyword_1() { return cVerticalLineSectionSignVerticalLineKeyword_1; }
		
		//'|;;|'
		public Keyword getVerticalLineSemicolonSemicolonVerticalLineKeyword_2() { return cVerticalLineSemicolonSemicolonVerticalLineKeyword_2; }
		
		//'|.|'
		public Keyword getVerticalLineFullStopVerticalLineKeyword_3() { return cVerticalLineFullStopVerticalLineKeyword_3; }
		
		//'|/;|'
		public Keyword getVerticalLineSolidusSemicolonVerticalLineKeyword_4() { return cVerticalLineSolidusSemicolonVerticalLineKeyword_4; }
		
		//'|i|'
		public Keyword getIKeyword_5() { return cIKeyword_5; }
		
		//'|interleaving|'
		public Keyword getInterleavingKeyword_6() { return cInterleavingKeyword_6; }
		
		//'|~|'
		public Keyword getVerticalLineTildeVerticalLineKeyword_7() { return cVerticalLineTildeVerticalLineKeyword_7; }
		
		//'|partial-order|'
		public Keyword getPartialOrderKeyword_8() { return cPartialOrderKeyword_8; }
		
		//'|,|'
		public Keyword getVerticalLineCommaVerticalLineKeyword_9() { return cVerticalLineCommaVerticalLineKeyword_9; }
		
		//'|parallel|'
		public Keyword getParallelKeyword_10() { return cParallelKeyword_10; }
		
		//'|a|'
		public Keyword getAKeyword_11() { return cAKeyword_11; }
		
		//'|async|'
		public Keyword getAsyncKeyword_12() { return cAsyncKeyword_12; }
		
		//'|partial-order|'
		public Keyword getPartialOrderKeyword_13() { return cPartialOrderKeyword_13; }
		
		//'|and|'
		public Keyword getAndKeyword_14() { return cAndKeyword_14; }
		
		//'|or|'
		public Keyword getOrKeyword_15() { return cOrKeyword_15; }
		
		//'|and#then|'
		public Keyword getAndThenKeyword_16() { return cAndThenKeyword_16; }
		
		//'|or#else|'
		public Keyword getOrElseKeyword_17() { return cOrElseKeyword_17; }
		
		//'|indet|'
		public Keyword getIndetKeyword_18() { return cIndetKeyword_18; }
		
		//'|/\\|'
		public Keyword getVerticalLineSolidusReverseSolidusVerticalLineKeyword_19() { return cVerticalLineSolidusReverseSolidusVerticalLineKeyword_19; }
		
		//'|fork|'
		public Keyword getForkKeyword_20() { return cForkKeyword_20; }
		
		//'|join|'
		public Keyword getJoinKeyword_21() { return cJoinKeyword_21; }
	}
	public class ExpressionStatementElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ExpressionStatement");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final Group cGroup_0 = (Group)cAlternatives.eContents().get(0);
		private final Assignment cExpressionAssignment_0_0 = (Assignment)cGroup_0.eContents().get(0);
		private final RuleCall cExpressionAssignmentExpressionParserRuleCall_0_0_0 = (RuleCall)cExpressionAssignment_0_0.eContents().get(0);
		private final Keyword cSemicolonKeyword_0_1 = (Keyword)cGroup_0.eContents().get(1);
		private final Group cGroup_1 = (Group)cAlternatives.eContents().get(1);
		private final Assignment cExpressionAssignment_1_0 = (Assignment)cGroup_1.eContents().get(0);
		private final RuleCall cExpressionNewfreshExpressionParserRuleCall_1_0_0 = (RuleCall)cExpressionAssignment_1_0.eContents().get(0);
		private final Keyword cSemicolonKeyword_1_1 = (Keyword)cGroup_1.eContents().get(1);
		private final Group cGroup_2 = (Group)cAlternatives.eContents().get(2);
		private final Assignment cExpressionAssignment_2_0 = (Assignment)cGroup_2.eContents().get(0);
		private final RuleCall cExpressionIncrementOrDecrementPrefixExpressionParserRuleCall_2_0_0 = (RuleCall)cExpressionAssignment_2_0.eContents().get(0);
		private final Keyword cSemicolonKeyword_2_1 = (Keyword)cGroup_2.eContents().get(1);
		private final Group cGroup_3 = (Group)cAlternatives.eContents().get(3);
		private final Assignment cExpressionAssignment_3_0 = (Assignment)cGroup_3.eContents().get(0);
		private final RuleCall cExpressionIncrementOrDecrementPostfixExpressionParserRuleCall_3_0_0 = (RuleCall)cExpressionAssignment_3_0.eContents().get(0);
		private final Keyword cSemicolonKeyword_3_1 = (Keyword)cGroup_3.eContents().get(1);
		
		///////////////////////////////////////////
		//// Assignment Rules as Expression Statement
		//// lv = rv
		//// newfresh lv
		//// ++lv --lv
		//// lv++  lv--
		///////////////////////////////////////////
		//ExpressionStatement returns fmlStmnt::ExpressionStatement
		//    : expression=AssignmentExpression ';'
		//    | expression=NewfreshExpression ';'
		//    | expression=IncrementOrDecrementPrefixExpression  ';'
		//    | expression=IncrementOrDecrementPostfixExpression ';'
		////    | expression=DynamicInstantiationExpression ';'
		////    | expression=InvokeExpression ';'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//expression=AssignmentExpression ';'
		//   | expression=NewfreshExpression ';'
		//   | expression=IncrementOrDecrementPrefixExpression  ';'
		//   | expression=IncrementOrDecrementPostfixExpression ';'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//expression=AssignmentExpression ';'
		public Group getGroup_0() { return cGroup_0; }
		
		//expression=AssignmentExpression
		public Assignment getExpressionAssignment_0_0() { return cExpressionAssignment_0_0; }
		
		//AssignmentExpression
		public RuleCall getExpressionAssignmentExpressionParserRuleCall_0_0_0() { return cExpressionAssignmentExpressionParserRuleCall_0_0_0; }
		
		//';'
		public Keyword getSemicolonKeyword_0_1() { return cSemicolonKeyword_0_1; }
		
		//expression=NewfreshExpression ';'
		public Group getGroup_1() { return cGroup_1; }
		
		//expression=NewfreshExpression
		public Assignment getExpressionAssignment_1_0() { return cExpressionAssignment_1_0; }
		
		//NewfreshExpression
		public RuleCall getExpressionNewfreshExpressionParserRuleCall_1_0_0() { return cExpressionNewfreshExpressionParserRuleCall_1_0_0; }
		
		//';'
		public Keyword getSemicolonKeyword_1_1() { return cSemicolonKeyword_1_1; }
		
		//expression=IncrementOrDecrementPrefixExpression  ';'
		public Group getGroup_2() { return cGroup_2; }
		
		//expression=IncrementOrDecrementPrefixExpression
		public Assignment getExpressionAssignment_2_0() { return cExpressionAssignment_2_0; }
		
		//IncrementOrDecrementPrefixExpression
		public RuleCall getExpressionIncrementOrDecrementPrefixExpressionParserRuleCall_2_0_0() { return cExpressionIncrementOrDecrementPrefixExpressionParserRuleCall_2_0_0; }
		
		//';'
		public Keyword getSemicolonKeyword_2_1() { return cSemicolonKeyword_2_1; }
		
		//expression=IncrementOrDecrementPostfixExpression ';'
		public Group getGroup_3() { return cGroup_3; }
		
		//expression=IncrementOrDecrementPostfixExpression
		public Assignment getExpressionAssignment_3_0() { return cExpressionAssignment_3_0; }
		
		//IncrementOrDecrementPostfixExpression
		public RuleCall getExpressionIncrementOrDecrementPostfixExpressionParserRuleCall_3_0_0() { return cExpressionIncrementOrDecrementPostfixExpressionParserRuleCall_3_0_0; }
		
		//';'
		public Keyword getSemicolonKeyword_3_1() { return cSemicolonKeyword_3_1; }
	}
	public class GuardStatementElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.GuardStatement");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cGuardKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cConditionAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cConditionExpressionParserRuleCall_1_0 = (RuleCall)cConditionAssignment_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_2 = (Keyword)cGroup.eContents().get(2);
		
		/////////////////////////////////////////////
		////// Guard Rules
		/////////////////////////////////////////////
		//GuardStatement returns fmlStmnt::GuardStatement
		//    : 'guard' condition=Expression ';'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//'guard' condition=Expression ';'
		public Group getGroup() { return cGroup; }
		
		//'guard'
		public Keyword getGuardKeyword_0() { return cGuardKeyword_0; }
		
		//condition=Expression
		public Assignment getConditionAssignment_1() { return cConditionAssignment_1; }
		
		//Expression
		public RuleCall getConditionExpressionParserRuleCall_1_0() { return cConditionExpressionParserRuleCall_1_0; }
		
		//';'
		public Keyword getSemicolonKeyword_2() { return cSemicolonKeyword_2; }
	}
	public class TimedGuardStatementElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.TimedGuardStatement");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cTguardKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cConditionAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cConditionExpressionParserRuleCall_1_0 = (RuleCall)cConditionAssignment_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_2 = (Keyword)cGroup.eContents().get(2);
		
		//TimedGuardStatement returns fmlStmnt::TimedGuardStatement
		//    : 'tguard' condition=Expression ';'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//'tguard' condition=Expression ';'
		public Group getGroup() { return cGroup; }
		
		//'tguard'
		public Keyword getTguardKeyword_0() { return cTguardKeyword_0; }
		
		//condition=Expression
		public Assignment getConditionAssignment_1() { return cConditionAssignment_1; }
		
		//Expression
		public RuleCall getConditionExpressionParserRuleCall_1_0() { return cConditionExpressionParserRuleCall_1_0; }
		
		//';'
		public Keyword getSemicolonKeyword_2() { return cSemicolonKeyword_2; }
	}
	public class EventGuardStatementElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.EventGuardStatement");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cEventKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cConditionAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cConditionExpressionParserRuleCall_1_0 = (RuleCall)cConditionAssignment_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_2 = (Keyword)cGroup.eContents().get(2);
		
		//EventGuardStatement returns fmlStmnt::EventGuardStatement
		//    : 'event' condition=Expression ';'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//'event' condition=Expression ';'
		public Group getGroup() { return cGroup; }
		
		//'event'
		public Keyword getEventKeyword_0() { return cEventKeyword_0; }
		
		//condition=Expression
		public Assignment getConditionAssignment_1() { return cConditionAssignment_1; }
		
		//Expression
		public RuleCall getConditionExpressionParserRuleCall_1_0() { return cConditionExpressionParserRuleCall_1_0; }
		
		//';'
		public Keyword getSemicolonKeyword_2() { return cSemicolonKeyword_2; }
	}
	public class CheckSatGuardStatementElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.CheckSatGuardStatement");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cChecksatKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Keyword cLessThanSignKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cSolverAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cSolverESIdentifierParserRuleCall_2_0 = (RuleCall)cSolverAssignment_2.eContents().get(0);
		private final Keyword cGreaterThanSignKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Assignment cConditionAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cConditionExpressionParserRuleCall_4_0 = (RuleCall)cConditionAssignment_4.eContents().get(0);
		private final Keyword cSemicolonKeyword_5 = (Keyword)cGroup.eContents().get(5);
		
		//CheckSatGuardStatement returns fmlStmnt::CheckSatGuardStatement
		//    : 'checksat' '<' solver=ESIdentifier '>' condition=Expression ';'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//'checksat' '<' solver=ESIdentifier '>' condition=Expression ';'
		public Group getGroup() { return cGroup; }
		
		//'checksat'
		public Keyword getChecksatKeyword_0() { return cChecksatKeyword_0; }
		
		//'<'
		public Keyword getLessThanSignKeyword_1() { return cLessThanSignKeyword_1; }
		
		//solver=ESIdentifier
		public Assignment getSolverAssignment_2() { return cSolverAssignment_2; }
		
		//ESIdentifier
		public RuleCall getSolverESIdentifierParserRuleCall_2_0() { return cSolverESIdentifierParserRuleCall_2_0; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_3() { return cGreaterThanSignKeyword_3; }
		
		//condition=Expression
		public Assignment getConditionAssignment_4() { return cConditionAssignment_4; }
		
		//Expression
		public RuleCall getConditionExpressionParserRuleCall_4_0() { return cConditionExpressionParserRuleCall_4_0; }
		
		//';'
		public Keyword getSemicolonKeyword_5() { return cSemicolonKeyword_5; }
	}
	public class InputComStatementElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.InputComStatement");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cInputKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cPortAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cPortLitteralComElementParserRuleCall_1_0 = (RuleCall)cPortAssignment_1.eContents().get(0);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final Assignment cLeftValueAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
		private final RuleCall cLeftValueExpressionParserRuleCall_2_1_0 = (RuleCall)cLeftValueAssignment_2_1.eContents().get(0);
		private final Group cGroup_2_2 = (Group)cGroup_2.eContents().get(2);
		private final Keyword cCommaKeyword_2_2_0 = (Keyword)cGroup_2_2.eContents().get(0);
		private final Assignment cLeftValueAssignment_2_2_1 = (Assignment)cGroup_2_2.eContents().get(1);
		private final RuleCall cLeftValueExpressionParserRuleCall_2_2_1_0 = (RuleCall)cLeftValueAssignment_2_2_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_3 = (Keyword)cGroup_2.eContents().get(3);
		private final UnorderedGroup cUnorderedGroup_3 = (UnorderedGroup)cGroup.eContents().get(3);
		private final Group cGroup_3_0 = (Group)cUnorderedGroup_3.eContents().get(0);
		private final Keyword cLessThanSignHyphenMinusHyphenMinusKeyword_3_0_0 = (Keyword)cGroup_3_0.eContents().get(0);
		private final Assignment cTargetAssignment_3_0_1 = (Assignment)cGroup_3_0.eContents().get(1);
		private final RuleCall cTargetLiteralPureReferenceExpressionParserRuleCall_3_0_1_0 = (RuleCall)cTargetAssignment_3_0_1.eContents().get(0);
		private final Group cGroup_3_1 = (Group)cUnorderedGroup_3.eContents().get(1);
		private final Alternatives cAlternatives_3_1_0 = (Alternatives)cGroup_3_1.eContents().get(0);
		private final Keyword cLessThanSignEqualsSignEqualsSignKeyword_3_1_0_0 = (Keyword)cAlternatives_3_1_0.eContents().get(0);
		private final Keyword cViaKeyword_3_1_0_1 = (Keyword)cAlternatives_3_1_0.eContents().get(1);
		private final Assignment cRouteAssignment_3_1_1 = (Assignment)cGroup_3_1.eContents().get(1);
		private final CrossReference cRouteChannelCrossReference_3_1_1_0 = (CrossReference)cRouteAssignment_3_1_1.eContents().get(0);
		private final RuleCall cRouteChannelESUfidParserRuleCall_3_1_1_0_1 = (RuleCall)cRouteChannelCrossReference_3_1_1_0.eContents().get(1);
		private final Keyword cSemicolonKeyword_4 = (Keyword)cGroup.eContents().get(4);
		
		/////////////////////////////////////////////
		////
		////// Communication Rules
		/////////////////////////////////////////////
		//InputComStatement returns fmlStmnt::InputComStatement
		//    : 'input' port=LitteralComElement //ExpressionAsPort
		//        ( '(' leftValue+=Expression ( ',' leftValue+= Expression )* ')' )?
		////        ( ( '<--' target=ValuePureNamedMachineExpression )?
		//        ( ( '<--' target=LiteralPureReferenceExpression )?
		//        & ( ( '<==' | 'via' ) route=[fmlInfra::Channel|ESUfid]/*ExpressionAsChannel*/ )?
		//        ) ';'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		// 'input' port=LitteralComElement //ExpressionAsPort
		//        ( '(' leftValue+=Expression ( ',' leftValue+= Expression )* ')' )?
		////        ( ( '<--' target=ValuePureNamedMachineExpression )?
		//        ( ( '<--' target=LiteralPureReferenceExpression )?
		//        & ( ( '<==' | 'via' ) route=[fmlInfra::Channel|ESUfid]/*ExpressionAsChannel*/ )?
		//        ) ';'
		public Group getGroup() { return cGroup; }
		
		//'input'
		public Keyword getInputKeyword_0() { return cInputKeyword_0; }
		
		//port=LitteralComElement
		public Assignment getPortAssignment_1() { return cPortAssignment_1; }
		
		//LitteralComElement
		public RuleCall getPortLitteralComElementParserRuleCall_1_0() { return cPortLitteralComElementParserRuleCall_1_0; }
		
		////ExpressionAsPort
		//       ( '(' leftValue+=Expression ( ',' leftValue+= Expression )* ')' )?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//leftValue+=Expression
		public Assignment getLeftValueAssignment_2_1() { return cLeftValueAssignment_2_1; }
		
		//Expression
		public RuleCall getLeftValueExpressionParserRuleCall_2_1_0() { return cLeftValueExpressionParserRuleCall_2_1_0; }
		
		//( ',' leftValue+= Expression )*
		public Group getGroup_2_2() { return cGroup_2_2; }
		
		//','
		public Keyword getCommaKeyword_2_2_0() { return cCommaKeyword_2_2_0; }
		
		//leftValue+= Expression
		public Assignment getLeftValueAssignment_2_2_1() { return cLeftValueAssignment_2_2_1; }
		
		//Expression
		public RuleCall getLeftValueExpressionParserRuleCall_2_2_1_0() { return cLeftValueExpressionParserRuleCall_2_2_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_3() { return cRightParenthesisKeyword_2_3; }
		
		////        ( ( '<--' target=ValuePureNamedMachineExpression )?
		//        ( ( '<--' target=LiteralPureReferenceExpression )?
		//        & ( ( '<==' | 'via' ) route=[fmlInfra::Channel|ESUfid]/*ExpressionAsChannel*/ )?
		//        )
		public UnorderedGroup getUnorderedGroup_3() { return cUnorderedGroup_3; }
		
		//( '<--' target=LiteralPureReferenceExpression )?
		public Group getGroup_3_0() { return cGroup_3_0; }
		
		//'<--'
		public Keyword getLessThanSignHyphenMinusHyphenMinusKeyword_3_0_0() { return cLessThanSignHyphenMinusHyphenMinusKeyword_3_0_0; }
		
		//target=LiteralPureReferenceExpression
		public Assignment getTargetAssignment_3_0_1() { return cTargetAssignment_3_0_1; }
		
		//LiteralPureReferenceExpression
		public RuleCall getTargetLiteralPureReferenceExpressionParserRuleCall_3_0_1_0() { return cTargetLiteralPureReferenceExpressionParserRuleCall_3_0_1_0; }
		
		//( ( '<==' | 'via' ) route=[fmlInfra::Channel|ESUfid]/*ExpressionAsChannel*/ )?
		public Group getGroup_3_1() { return cGroup_3_1; }
		
		//( '<==' | 'via' )
		public Alternatives getAlternatives_3_1_0() { return cAlternatives_3_1_0; }
		
		//'<=='
		public Keyword getLessThanSignEqualsSignEqualsSignKeyword_3_1_0_0() { return cLessThanSignEqualsSignEqualsSignKeyword_3_1_0_0; }
		
		//'via'
		public Keyword getViaKeyword_3_1_0_1() { return cViaKeyword_3_1_0_1; }
		
		//route=[fmlInfra::Channel|ESUfid]
		public Assignment getRouteAssignment_3_1_1() { return cRouteAssignment_3_1_1; }
		
		//[fmlInfra::Channel|ESUfid]
		public CrossReference getRouteChannelCrossReference_3_1_1_0() { return cRouteChannelCrossReference_3_1_1_0; }
		
		//ESUfid
		public RuleCall getRouteChannelESUfidParserRuleCall_3_1_1_0_1() { return cRouteChannelESUfidParserRuleCall_3_1_1_0_1; }
		
		//';'
		public Keyword getSemicolonKeyword_4() { return cSemicolonKeyword_4; }
	}
	public class OutputComStatementElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.OutputComStatement");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cOutputKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cPortAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cPortLitteralComElementParserRuleCall_1_0 = (RuleCall)cPortAssignment_1.eContents().get(0);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final Assignment cRightValueAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
		private final RuleCall cRightValueExpressionParserRuleCall_2_1_0 = (RuleCall)cRightValueAssignment_2_1.eContents().get(0);
		private final Group cGroup_2_2 = (Group)cGroup_2.eContents().get(2);
		private final Keyword cCommaKeyword_2_2_0 = (Keyword)cGroup_2_2.eContents().get(0);
		private final Assignment cRightValueAssignment_2_2_1 = (Assignment)cGroup_2_2.eContents().get(1);
		private final RuleCall cRightValueExpressionParserRuleCall_2_2_1_0 = (RuleCall)cRightValueAssignment_2_2_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_3 = (Keyword)cGroup_2.eContents().get(3);
		private final UnorderedGroup cUnorderedGroup_3 = (UnorderedGroup)cGroup.eContents().get(3);
		private final Group cGroup_3_0 = (Group)cUnorderedGroup_3.eContents().get(0);
		private final Keyword cHyphenMinusHyphenMinusGreaterThanSignKeyword_3_0_0 = (Keyword)cGroup_3_0.eContents().get(0);
		private final Assignment cTargetAssignment_3_0_1 = (Assignment)cGroup_3_0.eContents().get(1);
		private final RuleCall cTargetLiteralPureReferenceExpressionParserRuleCall_3_0_1_0 = (RuleCall)cTargetAssignment_3_0_1.eContents().get(0);
		private final Group cGroup_3_1 = (Group)cUnorderedGroup_3.eContents().get(1);
		private final Alternatives cAlternatives_3_1_0 = (Alternatives)cGroup_3_1.eContents().get(0);
		private final Keyword cEqualsSignEqualsSignGreaterThanSignKeyword_3_1_0_0 = (Keyword)cAlternatives_3_1_0.eContents().get(0);
		private final Keyword cViaKeyword_3_1_0_1 = (Keyword)cAlternatives_3_1_0.eContents().get(1);
		private final Assignment cRouteAssignment_3_1_1 = (Assignment)cGroup_3_1.eContents().get(1);
		private final CrossReference cRouteChannelCrossReference_3_1_1_0 = (CrossReference)cRouteAssignment_3_1_1.eContents().get(0);
		private final RuleCall cRouteChannelESUfidParserRuleCall_3_1_1_0_1 = (RuleCall)cRouteChannelCrossReference_3_1_1_0.eContents().get(1);
		private final Keyword cSemicolonKeyword_4 = (Keyword)cGroup.eContents().get(4);
		
		//OutputComStatement returns fmlStmnt::OutputComStatement
		//    : 'output' port=LitteralComElement //port=ExpressionAsPort
		//        ( '(' rightValue+=Expression ( ',' rightValue+=Expression )* ')' )?
		////        ( ( '-->' target=ValuePureNamedMachineExpression )?
		//        ( ( '-->' target=LiteralPureReferenceExpression )?
		//        & ( ( '==>' | 'via' ) route=[fmlInfra::Channel|ESUfid]/*ExpressionAsChannel*/ )?
		//        ) ';'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		// 'output' port=LitteralComElement //port=ExpressionAsPort
		//        ( '(' rightValue+=Expression ( ',' rightValue+=Expression )* ')' )?
		////        ( ( '-->' target=ValuePureNamedMachineExpression )?
		//        ( ( '-->' target=LiteralPureReferenceExpression )?
		//        & ( ( '==>' | 'via' ) route=[fmlInfra::Channel|ESUfid]/*ExpressionAsChannel*/ )?
		//        ) ';'
		public Group getGroup() { return cGroup; }
		
		//'output'
		public Keyword getOutputKeyword_0() { return cOutputKeyword_0; }
		
		//port=LitteralComElement
		public Assignment getPortAssignment_1() { return cPortAssignment_1; }
		
		//LitteralComElement
		public RuleCall getPortLitteralComElementParserRuleCall_1_0() { return cPortLitteralComElementParserRuleCall_1_0; }
		
		////port=ExpressionAsPort
		//       ( '(' rightValue+=Expression ( ',' rightValue+=Expression )* ')' )?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//rightValue+=Expression
		public Assignment getRightValueAssignment_2_1() { return cRightValueAssignment_2_1; }
		
		//Expression
		public RuleCall getRightValueExpressionParserRuleCall_2_1_0() { return cRightValueExpressionParserRuleCall_2_1_0; }
		
		//( ',' rightValue+=Expression )*
		public Group getGroup_2_2() { return cGroup_2_2; }
		
		//','
		public Keyword getCommaKeyword_2_2_0() { return cCommaKeyword_2_2_0; }
		
		//rightValue+=Expression
		public Assignment getRightValueAssignment_2_2_1() { return cRightValueAssignment_2_2_1; }
		
		//Expression
		public RuleCall getRightValueExpressionParserRuleCall_2_2_1_0() { return cRightValueExpressionParserRuleCall_2_2_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_3() { return cRightParenthesisKeyword_2_3; }
		
		////        ( ( '-->' target=ValuePureNamedMachineExpression )?
		//        ( ( '-->' target=LiteralPureReferenceExpression )?
		//        & ( ( '==>' | 'via' ) route=[fmlInfra::Channel|ESUfid]/*ExpressionAsChannel*/ )?
		//        )
		public UnorderedGroup getUnorderedGroup_3() { return cUnorderedGroup_3; }
		
		//( '-->' target=LiteralPureReferenceExpression )?
		public Group getGroup_3_0() { return cGroup_3_0; }
		
		//'-->'
		public Keyword getHyphenMinusHyphenMinusGreaterThanSignKeyword_3_0_0() { return cHyphenMinusHyphenMinusGreaterThanSignKeyword_3_0_0; }
		
		//target=LiteralPureReferenceExpression
		public Assignment getTargetAssignment_3_0_1() { return cTargetAssignment_3_0_1; }
		
		//LiteralPureReferenceExpression
		public RuleCall getTargetLiteralPureReferenceExpressionParserRuleCall_3_0_1_0() { return cTargetLiteralPureReferenceExpressionParserRuleCall_3_0_1_0; }
		
		//( ( '==>' | 'via' ) route=[fmlInfra::Channel|ESUfid]/*ExpressionAsChannel*/ )?
		public Group getGroup_3_1() { return cGroup_3_1; }
		
		//( '==>' | 'via' )
		public Alternatives getAlternatives_3_1_0() { return cAlternatives_3_1_0; }
		
		//'==>'
		public Keyword getEqualsSignEqualsSignGreaterThanSignKeyword_3_1_0_0() { return cEqualsSignEqualsSignGreaterThanSignKeyword_3_1_0_0; }
		
		//'via'
		public Keyword getViaKeyword_3_1_0_1() { return cViaKeyword_3_1_0_1; }
		
		//route=[fmlInfra::Channel|ESUfid]
		public Assignment getRouteAssignment_3_1_1() { return cRouteAssignment_3_1_1; }
		
		//[fmlInfra::Channel|ESUfid]
		public CrossReference getRouteChannelCrossReference_3_1_1_0() { return cRouteChannelCrossReference_3_1_1_0; }
		
		//ESUfid
		public RuleCall getRouteChannelESUfidParserRuleCall_3_1_1_0_1() { return cRouteChannelESUfidParserRuleCall_3_1_1_0_1; }
		
		//';'
		public Keyword getSemicolonKeyword_4() { return cSemicolonKeyword_4; }
	}
	public class LitteralComElementElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LitteralComElement");
		private final Assignment cElementAssignment = (Assignment)rule.eContents().get(1);
		private final CrossReference cElementNamedElementCrossReference_0 = (CrossReference)cElementAssignment.eContents().get(0);
		private final RuleCall cElementNamedElementESIdentifierParserRuleCall_0_1 = (RuleCall)cElementNamedElementCrossReference_0.eContents().get(1);
		
		//LitteralComElement returns fmlExpr::LiteralReferenceElement
		//    : element=[fmlCommon::NamedElement|ESIdentifier]
		////    | element=[fmlInfra::Port|ESIdentifier]
		////    | element=[fmlInfra::Signal|ESIdentifier]
		////    | element=[fmlInfra::Message|ESIdentifier]
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//element=[fmlCommon::NamedElement|ESIdentifier]
		public Assignment getElementAssignment() { return cElementAssignment; }
		
		//[fmlCommon::NamedElement|ESIdentifier]
		public CrossReference getElementNamedElementCrossReference_0() { return cElementNamedElementCrossReference_0; }
		
		//ESIdentifier
		public RuleCall getElementNamedElementESIdentifierParserRuleCall_0_1() { return cElementNamedElementESIdentifierParserRuleCall_0_1; }
	}
	public class IfStatementElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.IfStatement");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cIfKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cConditionAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cConditionExpressionParserRuleCall_1_0 = (RuleCall)cConditionAssignment_1.eContents().get(0);
		private final Assignment cBodyBlockAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cBodyBlockBlockStatementParserRuleCall_2_0 = (RuleCall)cBodyBlockAssignment_2.eContents().get(0);
		private final Assignment cElseifStatementAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cElseifStatementElseIfStatementParserRuleCall_3_0 = (RuleCall)cElseifStatementAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cElseKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Assignment cElseBlockAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
		private final RuleCall cElseBlockBlockStatementParserRuleCall_4_1_0 = (RuleCall)cElseBlockAssignment_4_1.eContents().get(0);
		
		/////////////////////////////////////////////
		////// If - Conditional Rules
		/////////////////////////////////////////////
		//IfStatement returns fmlStmnt::IfStatement
		//    : 'if' condition=Expression
		//        bodyBlock=BlockStatement
		//        ( elseifStatement+=ElseIfStatement )*
		//        ( 'else' elseBlock=BlockStatement )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//'if' condition=Expression
		//       bodyBlock=BlockStatement
		//       ( elseifStatement+=ElseIfStatement )*
		//       ( 'else' elseBlock=BlockStatement )?
		public Group getGroup() { return cGroup; }
		
		//'if'
		public Keyword getIfKeyword_0() { return cIfKeyword_0; }
		
		//condition=Expression
		public Assignment getConditionAssignment_1() { return cConditionAssignment_1; }
		
		//Expression
		public RuleCall getConditionExpressionParserRuleCall_1_0() { return cConditionExpressionParserRuleCall_1_0; }
		
		//bodyBlock=BlockStatement
		public Assignment getBodyBlockAssignment_2() { return cBodyBlockAssignment_2; }
		
		//BlockStatement
		public RuleCall getBodyBlockBlockStatementParserRuleCall_2_0() { return cBodyBlockBlockStatementParserRuleCall_2_0; }
		
		//( elseifStatement+=ElseIfStatement )*
		public Assignment getElseifStatementAssignment_3() { return cElseifStatementAssignment_3; }
		
		//ElseIfStatement
		public RuleCall getElseifStatementElseIfStatementParserRuleCall_3_0() { return cElseifStatementElseIfStatementParserRuleCall_3_0; }
		
		//( 'else' elseBlock=BlockStatement )?
		public Group getGroup_4() { return cGroup_4; }
		
		//'else'
		public Keyword getElseKeyword_4_0() { return cElseKeyword_4_0; }
		
		//elseBlock=BlockStatement
		public Assignment getElseBlockAssignment_4_1() { return cElseBlockAssignment_4_1; }
		
		//BlockStatement
		public RuleCall getElseBlockBlockStatementParserRuleCall_4_1_0() { return cElseBlockBlockStatementParserRuleCall_4_1_0; }
	}
	public class ElseIfStatementElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ElseIfStatement");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Alternatives cAlternatives_0 = (Alternatives)cGroup.eContents().get(0);
		private final Keyword cElseifKeyword_0_0 = (Keyword)cAlternatives_0.eContents().get(0);
		private final Group cGroup_0_1 = (Group)cAlternatives_0.eContents().get(1);
		private final Keyword cElseKeyword_0_1_0 = (Keyword)cGroup_0_1.eContents().get(0);
		private final Keyword cIfKeyword_0_1_1 = (Keyword)cGroup_0_1.eContents().get(1);
		private final Assignment cConditionAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cConditionExpressionParserRuleCall_1_0 = (RuleCall)cConditionAssignment_1.eContents().get(0);
		private final Assignment cBodyBlockAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cBodyBlockBlockStatementParserRuleCall_2_0 = (RuleCall)cBodyBlockAssignment_2.eContents().get(0);
		
		//ElseIfStatement returns fmlStmnt::ConditionalBlockStatement
		//    : ( 'elseif' | 'else' 'if' ) condition=Expression
		//        bodyBlock=BlockStatement
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//( 'elseif' | 'else' 'if' ) condition=Expression
		//       bodyBlock=BlockStatement
		public Group getGroup() { return cGroup; }
		
		//( 'elseif' | 'else' 'if' )
		public Alternatives getAlternatives_0() { return cAlternatives_0; }
		
		//'elseif'
		public Keyword getElseifKeyword_0_0() { return cElseifKeyword_0_0; }
		
		//'else' 'if'
		public Group getGroup_0_1() { return cGroup_0_1; }
		
		//'else'
		public Keyword getElseKeyword_0_1_0() { return cElseKeyword_0_1_0; }
		
		//'if'
		public Keyword getIfKeyword_0_1_1() { return cIfKeyword_0_1_1; }
		
		//condition=Expression
		public Assignment getConditionAssignment_1() { return cConditionAssignment_1; }
		
		//Expression
		public RuleCall getConditionExpressionParserRuleCall_1_0() { return cConditionExpressionParserRuleCall_1_0; }
		
		//bodyBlock=BlockStatement
		public Assignment getBodyBlockAssignment_2() { return cBodyBlockAssignment_2; }
		
		//BlockStatement
		public RuleCall getBodyBlockBlockStatementParserRuleCall_2_0() { return cBodyBlockBlockStatementParserRuleCall_2_0; }
	}
	public class WhileDoStatementElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.WhileDoStatement");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cWhileKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cConditionAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cConditionExpressionParserRuleCall_1_0 = (RuleCall)cConditionAssignment_1.eContents().get(0);
		private final Assignment cBodyBlockAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cBodyBlockBlockStatementParserRuleCall_2_0 = (RuleCall)cBodyBlockAssignment_2.eContents().get(0);
		
		///////////////////////////////////////////
		//// Loop - Iteration Rules
		///////////////////////////////////////////
		//WhileDoStatement returns fmlStmnt::WhileDoStatement
		//    : 'while' condition=Expression  bodyBlock=BlockStatement
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//'while' condition=Expression  bodyBlock=BlockStatement
		public Group getGroup() { return cGroup; }
		
		//'while'
		public Keyword getWhileKeyword_0() { return cWhileKeyword_0; }
		
		//condition=Expression
		public Assignment getConditionAssignment_1() { return cConditionAssignment_1; }
		
		//Expression
		public RuleCall getConditionExpressionParserRuleCall_1_0() { return cConditionExpressionParserRuleCall_1_0; }
		
		//bodyBlock=BlockStatement
		public Assignment getBodyBlockAssignment_2() { return cBodyBlockAssignment_2; }
		
		//BlockStatement
		public RuleCall getBodyBlockBlockStatementParserRuleCall_2_0() { return cBodyBlockBlockStatementParserRuleCall_2_0; }
	}
	public class DoWhileStatementElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.DoWhileStatement");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cDoKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cBodyBlockAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cBodyBlockBlockStatementParserRuleCall_1_0 = (RuleCall)cBodyBlockAssignment_1.eContents().get(0);
		private final Keyword cWhileKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cConditionAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cConditionExpressionParserRuleCall_3_0 = (RuleCall)cConditionAssignment_3.eContents().get(0);
		private final Keyword cSemicolonKeyword_4 = (Keyword)cGroup.eContents().get(4);
		
		//DoWhileStatement returns fmlStmnt::DoWhileStatement
		//    : 'do' bodyBlock=BlockStatement  'while' condition=Expression ';'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//'do' bodyBlock=BlockStatement  'while' condition=Expression ';'
		public Group getGroup() { return cGroup; }
		
		//'do'
		public Keyword getDoKeyword_0() { return cDoKeyword_0; }
		
		//bodyBlock=BlockStatement
		public Assignment getBodyBlockAssignment_1() { return cBodyBlockAssignment_1; }
		
		//BlockStatement
		public RuleCall getBodyBlockBlockStatementParserRuleCall_1_0() { return cBodyBlockBlockStatementParserRuleCall_1_0; }
		
		//'while'
		public Keyword getWhileKeyword_2() { return cWhileKeyword_2; }
		
		//condition=Expression
		public Assignment getConditionAssignment_3() { return cConditionAssignment_3; }
		
		//Expression
		public RuleCall getConditionExpressionParserRuleCall_3_0() { return cConditionExpressionParserRuleCall_3_0; }
		
		//';'
		public Keyword getSemicolonKeyword_4() { return cSemicolonKeyword_4; }
	}
	public class ForStatementElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ForStatement");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final Group cGroup_0 = (Group)cAlternatives.eContents().get(0);
		private final Keyword cForKeyword_0_0 = (Keyword)cGroup_0.eContents().get(0);
		private final Assignment cInitAssignment_0_1 = (Assignment)cGroup_0.eContents().get(1);
		private final RuleCall cInitForAssignmentExpressionParserRuleCall_0_1_0 = (RuleCall)cInitAssignment_0_1.eContents().get(0);
		private final Keyword cSemicolonKeyword_0_2 = (Keyword)cGroup_0.eContents().get(2);
		private final Assignment cConditionAssignment_0_3 = (Assignment)cGroup_0.eContents().get(3);
		private final RuleCall cConditionExpressionParserRuleCall_0_3_0 = (RuleCall)cConditionAssignment_0_3.eContents().get(0);
		private final Keyword cSemicolonKeyword_0_4 = (Keyword)cGroup_0.eContents().get(4);
		private final Assignment cIterateAssignment_0_5 = (Assignment)cGroup_0.eContents().get(5);
		private final RuleCall cIterateForAssignmentExpressionParserRuleCall_0_5_0 = (RuleCall)cIterateAssignment_0_5.eContents().get(0);
		private final Assignment cBodyBlockAssignment_0_6 = (Assignment)cGroup_0.eContents().get(6);
		private final RuleCall cBodyBlockBlockStatementParserRuleCall_0_6_0 = (RuleCall)cBodyBlockAssignment_0_6.eContents().get(0);
		private final Group cGroup_1 = (Group)cAlternatives.eContents().get(1);
		private final Keyword cForKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_1_1 = (Keyword)cGroup_1.eContents().get(1);
		private final Assignment cInitAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
		private final RuleCall cInitForAssignmentExpressionParserRuleCall_1_2_0 = (RuleCall)cInitAssignment_1_2.eContents().get(0);
		private final Keyword cSemicolonKeyword_1_3 = (Keyword)cGroup_1.eContents().get(3);
		private final Assignment cConditionAssignment_1_4 = (Assignment)cGroup_1.eContents().get(4);
		private final RuleCall cConditionExpressionParserRuleCall_1_4_0 = (RuleCall)cConditionAssignment_1_4.eContents().get(0);
		private final Keyword cSemicolonKeyword_1_5 = (Keyword)cGroup_1.eContents().get(5);
		private final Assignment cIterateAssignment_1_6 = (Assignment)cGroup_1.eContents().get(6);
		private final RuleCall cIterateForAssignmentExpressionParserRuleCall_1_6_0 = (RuleCall)cIterateAssignment_1_6.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_1_7 = (Keyword)cGroup_1.eContents().get(7);
		private final Assignment cBodyBlockAssignment_1_8 = (Assignment)cGroup_1.eContents().get(8);
		private final RuleCall cBodyBlockBlockStatementParserRuleCall_1_8_0 = (RuleCall)cBodyBlockAssignment_1_8.eContents().get(0);
		
		//ForStatement returns fmlStmnt::ForStatement
		//    : 'for' ( init=ForAssignmentExpression ) ? ';'
		//        condition=Expression ';' ( iterate=ForAssignmentExpression )?
		//        bodyBlock=BlockStatement
		//    | 'for' '(' ( init=ForAssignmentExpression ) ? ';'
		//        condition=Expression ';' ( iterate=ForAssignmentExpression )? ')'
		//        bodyBlock=BlockStatement
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//'for' ( init=ForAssignmentExpression ) ? ';'
		//       condition=Expression ';' ( iterate=ForAssignmentExpression )?
		//       bodyBlock=BlockStatement
		//   | 'for' '(' ( init=ForAssignmentExpression ) ? ';'
		//       condition=Expression ';' ( iterate=ForAssignmentExpression )? ')'
		//       bodyBlock=BlockStatement
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//'for' ( init=ForAssignmentExpression ) ? ';'
		//       condition=Expression ';' ( iterate=ForAssignmentExpression )?
		//       bodyBlock=BlockStatement
		public Group getGroup_0() { return cGroup_0; }
		
		//'for'
		public Keyword getForKeyword_0_0() { return cForKeyword_0_0; }
		
		//( init=ForAssignmentExpression ) ?
		public Assignment getInitAssignment_0_1() { return cInitAssignment_0_1; }
		
		//ForAssignmentExpression
		public RuleCall getInitForAssignmentExpressionParserRuleCall_0_1_0() { return cInitForAssignmentExpressionParserRuleCall_0_1_0; }
		
		//';'
		public Keyword getSemicolonKeyword_0_2() { return cSemicolonKeyword_0_2; }
		
		//condition=Expression
		public Assignment getConditionAssignment_0_3() { return cConditionAssignment_0_3; }
		
		//Expression
		public RuleCall getConditionExpressionParserRuleCall_0_3_0() { return cConditionExpressionParserRuleCall_0_3_0; }
		
		//';'
		public Keyword getSemicolonKeyword_0_4() { return cSemicolonKeyword_0_4; }
		
		//( iterate=ForAssignmentExpression )?
		public Assignment getIterateAssignment_0_5() { return cIterateAssignment_0_5; }
		
		//ForAssignmentExpression
		public RuleCall getIterateForAssignmentExpressionParserRuleCall_0_5_0() { return cIterateForAssignmentExpressionParserRuleCall_0_5_0; }
		
		//bodyBlock=BlockStatement
		public Assignment getBodyBlockAssignment_0_6() { return cBodyBlockAssignment_0_6; }
		
		//BlockStatement
		public RuleCall getBodyBlockBlockStatementParserRuleCall_0_6_0() { return cBodyBlockBlockStatementParserRuleCall_0_6_0; }
		
		//'for' '(' ( init=ForAssignmentExpression ) ? ';'
		//       condition=Expression ';' ( iterate=ForAssignmentExpression )? ')'
		//       bodyBlock=BlockStatement
		public Group getGroup_1() { return cGroup_1; }
		
		//'for'
		public Keyword getForKeyword_1_0() { return cForKeyword_1_0; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_1_1() { return cLeftParenthesisKeyword_1_1; }
		
		//( init=ForAssignmentExpression ) ?
		public Assignment getInitAssignment_1_2() { return cInitAssignment_1_2; }
		
		//ForAssignmentExpression
		public RuleCall getInitForAssignmentExpressionParserRuleCall_1_2_0() { return cInitForAssignmentExpressionParserRuleCall_1_2_0; }
		
		//';'
		public Keyword getSemicolonKeyword_1_3() { return cSemicolonKeyword_1_3; }
		
		//condition=Expression
		public Assignment getConditionAssignment_1_4() { return cConditionAssignment_1_4; }
		
		//Expression
		public RuleCall getConditionExpressionParserRuleCall_1_4_0() { return cConditionExpressionParserRuleCall_1_4_0; }
		
		//';'
		public Keyword getSemicolonKeyword_1_5() { return cSemicolonKeyword_1_5; }
		
		//( iterate=ForAssignmentExpression )?
		public Assignment getIterateAssignment_1_6() { return cIterateAssignment_1_6; }
		
		//ForAssignmentExpression
		public RuleCall getIterateForAssignmentExpressionParserRuleCall_1_6_0() { return cIterateForAssignmentExpressionParserRuleCall_1_6_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_1_7() { return cRightParenthesisKeyword_1_7; }
		
		//bodyBlock=BlockStatement
		public Assignment getBodyBlockAssignment_1_8() { return cBodyBlockAssignment_1_8; }
		
		//BlockStatement
		public RuleCall getBodyBlockBlockStatementParserRuleCall_1_8_0() { return cBodyBlockBlockStatementParserRuleCall_1_8_0; }
	}
	public class ForAssignmentExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ForAssignmentExpression");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cAssignmentExpressionParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cIncrementOrDecrementPrefixExpressionParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cIncrementOrDecrementPostfixExpressionParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		
		//ForAssignmentExpression returns fmlExpr::Expression
		//    : AssignmentExpression
		//    | IncrementOrDecrementPrefixExpression
		//    | IncrementOrDecrementPostfixExpression
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//AssignmentExpression
		//   | IncrementOrDecrementPrefixExpression
		//   | IncrementOrDecrementPostfixExpression
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//AssignmentExpression
		public RuleCall getAssignmentExpressionParserRuleCall_0() { return cAssignmentExpressionParserRuleCall_0; }
		
		//IncrementOrDecrementPrefixExpression
		public RuleCall getIncrementOrDecrementPrefixExpressionParserRuleCall_1() { return cIncrementOrDecrementPrefixExpressionParserRuleCall_1; }
		
		//IncrementOrDecrementPostfixExpression
		public RuleCall getIncrementOrDecrementPostfixExpressionParserRuleCall_2() { return cIncrementOrDecrementPostfixExpressionParserRuleCall_2; }
	}
	public class ForEachStatementElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ForEachStatement");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final Group cGroup_0 = (Group)cAlternatives.eContents().get(0);
		private final Keyword cForKeyword_0_0 = (Keyword)cGroup_0.eContents().get(0);
		private final Assignment cIteratorAssignment_0_1 = (Assignment)cGroup_0.eContents().get(1);
		private final RuleCall cIteratorLeftHandSideExpressionParserRuleCall_0_1_0 = (RuleCall)cIteratorAssignment_0_1.eContents().get(0);
		private final Keyword cColonKeyword_0_2 = (Keyword)cGroup_0.eContents().get(2);
		private final Assignment cEnumerationAssignment_0_3 = (Assignment)cGroup_0.eContents().get(3);
		private final RuleCall cEnumerationExpressionParserRuleCall_0_3_0 = (RuleCall)cEnumerationAssignment_0_3.eContents().get(0);
		private final Assignment cBodyBlockAssignment_0_4 = (Assignment)cGroup_0.eContents().get(4);
		private final RuleCall cBodyBlockBlockStatementParserRuleCall_0_4_0 = (RuleCall)cBodyBlockAssignment_0_4.eContents().get(0);
		private final Group cGroup_1 = (Group)cAlternatives.eContents().get(1);
		private final Keyword cForKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final Keyword cLeftParenthesisKeyword_1_1 = (Keyword)cGroup_1.eContents().get(1);
		private final Assignment cIteratorAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
		private final RuleCall cIteratorLeftHandSideExpressionParserRuleCall_1_2_0 = (RuleCall)cIteratorAssignment_1_2.eContents().get(0);
		private final Keyword cColonKeyword_1_3 = (Keyword)cGroup_1.eContents().get(3);
		private final Assignment cEnumerationAssignment_1_4 = (Assignment)cGroup_1.eContents().get(4);
		private final RuleCall cEnumerationExpressionParserRuleCall_1_4_0 = (RuleCall)cEnumerationAssignment_1_4.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_1_5 = (Keyword)cGroup_1.eContents().get(5);
		private final Assignment cBodyBlockAssignment_1_6 = (Assignment)cGroup_1.eContents().get(6);
		private final RuleCall cBodyBlockBlockStatementParserRuleCall_1_6_0 = (RuleCall)cBodyBlockAssignment_1_6.eContents().get(0);
		
		//ForEachStatement returns fmlStmnt::ForEachStatement
		//    : 'for' iterator=LeftHandSideExpression ':' enumeration=Expression
		//        bodyBlock=BlockStatement
		//    | 'for' '(' iterator=LeftHandSideExpression ':' enumeration=Expression ')'
		//        bodyBlock=BlockStatement
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//'for' iterator=LeftHandSideExpression ':' enumeration=Expression
		//       bodyBlock=BlockStatement
		//   | 'for' '(' iterator=LeftHandSideExpression ':' enumeration=Expression ')'
		//       bodyBlock=BlockStatement
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//'for' iterator=LeftHandSideExpression ':' enumeration=Expression
		//       bodyBlock=BlockStatement
		public Group getGroup_0() { return cGroup_0; }
		
		//'for'
		public Keyword getForKeyword_0_0() { return cForKeyword_0_0; }
		
		//iterator=LeftHandSideExpression
		public Assignment getIteratorAssignment_0_1() { return cIteratorAssignment_0_1; }
		
		//LeftHandSideExpression
		public RuleCall getIteratorLeftHandSideExpressionParserRuleCall_0_1_0() { return cIteratorLeftHandSideExpressionParserRuleCall_0_1_0; }
		
		//':'
		public Keyword getColonKeyword_0_2() { return cColonKeyword_0_2; }
		
		//enumeration=Expression
		public Assignment getEnumerationAssignment_0_3() { return cEnumerationAssignment_0_3; }
		
		//Expression
		public RuleCall getEnumerationExpressionParserRuleCall_0_3_0() { return cEnumerationExpressionParserRuleCall_0_3_0; }
		
		//bodyBlock=BlockStatement
		public Assignment getBodyBlockAssignment_0_4() { return cBodyBlockAssignment_0_4; }
		
		//BlockStatement
		public RuleCall getBodyBlockBlockStatementParserRuleCall_0_4_0() { return cBodyBlockBlockStatementParserRuleCall_0_4_0; }
		
		//'for' '(' iterator=LeftHandSideExpression ':' enumeration=Expression ')'
		//       bodyBlock=BlockStatement
		public Group getGroup_1() { return cGroup_1; }
		
		//'for'
		public Keyword getForKeyword_1_0() { return cForKeyword_1_0; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_1_1() { return cLeftParenthesisKeyword_1_1; }
		
		//iterator=LeftHandSideExpression
		public Assignment getIteratorAssignment_1_2() { return cIteratorAssignment_1_2; }
		
		//LeftHandSideExpression
		public RuleCall getIteratorLeftHandSideExpressionParserRuleCall_1_2_0() { return cIteratorLeftHandSideExpressionParserRuleCall_1_2_0; }
		
		//':'
		public Keyword getColonKeyword_1_3() { return cColonKeyword_1_3; }
		
		//enumeration=Expression
		public Assignment getEnumerationAssignment_1_4() { return cEnumerationAssignment_1_4; }
		
		//Expression
		public RuleCall getEnumerationExpressionParserRuleCall_1_4_0() { return cEnumerationExpressionParserRuleCall_1_4_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_1_5() { return cRightParenthesisKeyword_1_5; }
		
		//bodyBlock=BlockStatement
		public Assignment getBodyBlockAssignment_1_6() { return cBodyBlockAssignment_1_6; }
		
		//BlockStatement
		public RuleCall getBodyBlockBlockStatementParserRuleCall_1_6_0() { return cBodyBlockBlockStatementParserRuleCall_1_6_0; }
	}
	public class InterruptStatementElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.InterruptStatement");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cKindAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cKindInterruptStatementKindEnumRuleCall_0_0 = (RuleCall)cKindAssignment_0.eContents().get(0);
		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
		private final Assignment cExprAssignment_1_0 = (Assignment)cAlternatives_1.eContents().get(0);
		private final RuleCall cExprExpressionParserRuleCall_1_0_0 = (RuleCall)cExprAssignment_1_0.eContents().get(0);
		private final Group cGroup_1_1 = (Group)cAlternatives_1.eContents().get(1);
		private final Keyword cLeftParenthesisKeyword_1_1_0 = (Keyword)cGroup_1_1.eContents().get(0);
		private final Assignment cExprAssignment_1_1_1 = (Assignment)cGroup_1_1.eContents().get(1);
		private final RuleCall cExprExpressionParserRuleCall_1_1_1_0 = (RuleCall)cExprAssignment_1_1_1.eContents().get(0);
		private final Group cGroup_1_1_2 = (Group)cGroup_1_1.eContents().get(2);
		private final Keyword cCommaKeyword_1_1_2_0 = (Keyword)cGroup_1_1_2.eContents().get(0);
		private final Assignment cExprAssignment_1_1_2_1 = (Assignment)cGroup_1_1_2.eContents().get(1);
		private final RuleCall cExprExpressionParserRuleCall_1_1_2_1_0 = (RuleCall)cExprAssignment_1_1_2_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_1_1_3 = (Keyword)cGroup_1_1.eContents().get(3);
		private final Keyword cSemicolonKeyword_2 = (Keyword)cGroup.eContents().get(2);
		
		///////////////////////////////////////////
		//// Interrupt Rules
		///////////////////////////////////////////
		//InterruptStatement returns fmlStmnt::InterruptStatement
		//    : kind=InterruptStatementKind
		//        ( expr+=Expression
		//        | '(' expr+=Expression ( ',' expr+=Expression )* ')'
		//        )? ';'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//kind=InterruptStatementKind
		//       ( expr+=Expression
		//       | '(' expr+=Expression ( ',' expr+=Expression )* ')'
		//       )? ';'
		public Group getGroup() { return cGroup; }
		
		//kind=InterruptStatementKind
		public Assignment getKindAssignment_0() { return cKindAssignment_0; }
		
		//InterruptStatementKind
		public RuleCall getKindInterruptStatementKindEnumRuleCall_0_0() { return cKindInterruptStatementKindEnumRuleCall_0_0; }
		
		//( expr+=Expression
		//| '(' expr+=Expression ( ',' expr+=Expression )* ')'
		//)?
		public Alternatives getAlternatives_1() { return cAlternatives_1; }
		
		//expr+=Expression
		public Assignment getExprAssignment_1_0() { return cExprAssignment_1_0; }
		
		//Expression
		public RuleCall getExprExpressionParserRuleCall_1_0_0() { return cExprExpressionParserRuleCall_1_0_0; }
		
		//'(' expr+=Expression ( ',' expr+=Expression )* ')'
		public Group getGroup_1_1() { return cGroup_1_1; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_1_1_0() { return cLeftParenthesisKeyword_1_1_0; }
		
		//expr+=Expression
		public Assignment getExprAssignment_1_1_1() { return cExprAssignment_1_1_1; }
		
		//Expression
		public RuleCall getExprExpressionParserRuleCall_1_1_1_0() { return cExprExpressionParserRuleCall_1_1_1_0; }
		
		//( ',' expr+=Expression )*
		public Group getGroup_1_1_2() { return cGroup_1_1_2; }
		
		//','
		public Keyword getCommaKeyword_1_1_2_0() { return cCommaKeyword_1_1_2_0; }
		
		//expr+=Expression
		public Assignment getExprAssignment_1_1_2_1() { return cExprAssignment_1_1_2_1; }
		
		//Expression
		public RuleCall getExprExpressionParserRuleCall_1_1_2_1_0() { return cExprExpressionParserRuleCall_1_1_2_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_1_1_3() { return cRightParenthesisKeyword_1_1_3; }
		
		//';'
		public Keyword getSemicolonKeyword_2() { return cSemicolonKeyword_2; }
	}
	public class ActivityStatementElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ActivityStatement");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cActivityStatementAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cOpAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cOpOPERATOR_ACTIVITYEnumRuleCall_1_0 = (RuleCall)cOpAssignment_1.eContents().get(0);
		private final Alternatives cAlternatives_2 = (Alternatives)cGroup.eContents().get(2);
		private final Group cGroup_2_0 = (Group)cAlternatives_2.eContents().get(0);
		private final Assignment cMachineAssignment_2_0_0 = (Assignment)cGroup_2_0.eContents().get(0);
		private final RuleCall cMachineValuePureNamedMachineExpressionParserRuleCall_2_0_0_0 = (RuleCall)cMachineAssignment_2_0_0.eContents().get(0);
		private final Alternatives cAlternatives_2_0_1 = (Alternatives)cGroup_2_0.eContents().get(1);
		private final Group cGroup_2_0_1_0 = (Group)cAlternatives_2_0_1.eContents().get(0);
		private final Assignment cTupleAssignment_2_0_1_0_0 = (Assignment)cGroup_2_0_1_0.eContents().get(0);
		private final RuleCall cTupleTupleParameterExpressionParserRuleCall_2_0_1_0_0_0 = (RuleCall)cTupleAssignment_2_0_1_0_0.eContents().get(0);
		private final Keyword cSemicolonKeyword_2_0_1_0_1 = (Keyword)cGroup_2_0_1_0.eContents().get(1);
		private final Group cGroup_2_0_1_1 = (Group)cAlternatives_2_0_1.eContents().get(1);
		private final Keyword cLeftCurlyBracketKeyword_2_0_1_1_0 = (Keyword)cGroup_2_0_1_1.eContents().get(0);
		private final Group cGroup_2_0_1_1_1 = (Group)cGroup_2_0_1_1.eContents().get(1);
		private final Assignment cSlotAssignment_2_0_1_1_1_0 = (Assignment)cGroup_2_0_1_1_1.eContents().get(0);
		private final RuleCall cSlotSlotPropertyParserRuleCall_2_0_1_1_1_0_0 = (RuleCall)cSlotAssignment_2_0_1_1_1_0.eContents().get(0);
		private final Keyword cSemicolonKeyword_2_0_1_1_1_1 = (Keyword)cGroup_2_0_1_1_1.eContents().get(1);
		private final Keyword cRightCurlyBracketKeyword_2_0_1_1_2 = (Keyword)cGroup_2_0_1_1.eContents().get(2);
		private final Keyword cSemicolonKeyword_2_1 = (Keyword)cAlternatives_2.eContents().get(1);
		
		/////////////////////////////////////////////
		////// Activity Rules
		/////////////////////////////////////////////
		//ActivityStatement returns fmlStmnt::ActivityStatement
		//    : {fmlStmnt::ActivityStatement}
		//        op=OPERATOR_ACTIVITY
		//        ( machine=ValuePureNamedMachineExpression
		//            ( ( tuple=TupleParameterExpression )? ';'
		////            | '(' ( slot+=SlotParameter ( ',' slot+=SlotParameter )* )? ')'  ';'
		//            | '{' ( slot+=SlotProperty ';' )*  '}'
		//            )
		//        | ';'
		//        )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		// {fmlStmnt::ActivityStatement}
		//        op=OPERATOR_ACTIVITY
		//        ( machine=ValuePureNamedMachineExpression
		//            ( ( tuple=TupleParameterExpression )? ';'
		////            | '(' ( slot+=SlotParameter ( ',' slot+=SlotParameter )* )? ')'  ';'
		//            | '{' ( slot+=SlotProperty ';' )*  '}'
		//            )
		//        | ';'
		//        )?
		public Group getGroup() { return cGroup; }
		
		//{fmlStmnt::ActivityStatement}
		public Action getActivityStatementAction_0() { return cActivityStatementAction_0; }
		
		//op=OPERATOR_ACTIVITY
		public Assignment getOpAssignment_1() { return cOpAssignment_1; }
		
		//OPERATOR_ACTIVITY
		public RuleCall getOpOPERATOR_ACTIVITYEnumRuleCall_1_0() { return cOpOPERATOR_ACTIVITYEnumRuleCall_1_0; }
		
		//        ( machine=ValuePureNamedMachineExpression
		//            ( ( tuple=TupleParameterExpression )? ';'
		////            | '(' ( slot+=SlotParameter ( ',' slot+=SlotParameter )* )? ')'  ';'
		//            | '{' ( slot+=SlotProperty ';' )*  '}'
		//            )
		//        | ';'
		//        )?
		public Alternatives getAlternatives_2() { return cAlternatives_2; }
		
		// machine=ValuePureNamedMachineExpression
		//            ( ( tuple=TupleParameterExpression )? ';'
		////            | '(' ( slot+=SlotParameter ( ',' slot+=SlotParameter )* )? ')'  ';'
		//            | '{' ( slot+=SlotProperty ';' )*  '}'
		//            )
		public Group getGroup_2_0() { return cGroup_2_0; }
		
		//machine=ValuePureNamedMachineExpression
		public Assignment getMachineAssignment_2_0_0() { return cMachineAssignment_2_0_0; }
		
		//ValuePureNamedMachineExpression
		public RuleCall getMachineValuePureNamedMachineExpressionParserRuleCall_2_0_0_0() { return cMachineValuePureNamedMachineExpressionParserRuleCall_2_0_0_0; }
		
		//            ( ( tuple=TupleParameterExpression )? ';'
		////            | '(' ( slot+=SlotParameter ( ',' slot+=SlotParameter )* )? ')'  ';'
		//            | '{' ( slot+=SlotProperty ';' )*  '}'
		//            )
		public Alternatives getAlternatives_2_0_1() { return cAlternatives_2_0_1; }
		
		//( tuple=TupleParameterExpression )? ';'
		public Group getGroup_2_0_1_0() { return cGroup_2_0_1_0; }
		
		//( tuple=TupleParameterExpression )?
		public Assignment getTupleAssignment_2_0_1_0_0() { return cTupleAssignment_2_0_1_0_0; }
		
		//TupleParameterExpression
		public RuleCall getTupleTupleParameterExpressionParserRuleCall_2_0_1_0_0_0() { return cTupleTupleParameterExpressionParserRuleCall_2_0_1_0_0_0; }
		
		//';'
		public Keyword getSemicolonKeyword_2_0_1_0_1() { return cSemicolonKeyword_2_0_1_0_1; }
		
		//'{' ( slot+=SlotProperty ';' )*  '}'
		public Group getGroup_2_0_1_1() { return cGroup_2_0_1_1; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_2_0_1_1_0() { return cLeftCurlyBracketKeyword_2_0_1_1_0; }
		
		//( slot+=SlotProperty ';' )*
		public Group getGroup_2_0_1_1_1() { return cGroup_2_0_1_1_1; }
		
		//slot+=SlotProperty
		public Assignment getSlotAssignment_2_0_1_1_1_0() { return cSlotAssignment_2_0_1_1_1_0; }
		
		//SlotProperty
		public RuleCall getSlotSlotPropertyParserRuleCall_2_0_1_1_1_0_0() { return cSlotSlotPropertyParserRuleCall_2_0_1_1_1_0_0; }
		
		//';'
		public Keyword getSemicolonKeyword_2_0_1_1_1_1() { return cSemicolonKeyword_2_0_1_1_1_1; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_2_0_1_1_2() { return cRightCurlyBracketKeyword_2_0_1_1_2; }
		
		//';'
		public Keyword getSemicolonKeyword_2_1() { return cSemicolonKeyword_2_1; }
	}
	public class InvokeStatementElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.InvokeStatement");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final Group cGroup_0 = (Group)cAlternatives.eContents().get(0);
		private final Assignment cExpressionAssignment_0_0 = (Assignment)cGroup_0.eContents().get(0);
		private final RuleCall cExpressionInvokeExpressionDeprecatedParserRuleCall_0_0_0 = (RuleCall)cExpressionAssignment_0_0.eContents().get(0);
		private final Keyword cSemicolonKeyword_0_1 = (Keyword)cGroup_0.eContents().get(1);
		private final Group cGroup_1 = (Group)cAlternatives.eContents().get(1);
		private final Assignment cInvokableAssignment_1_0 = (Assignment)cGroup_1.eContents().get(0);
		private final CrossReference cInvokableNamedElementCrossReference_1_0_0 = (CrossReference)cInvokableAssignment_1_0.eContents().get(0);
		private final RuleCall cInvokableNamedElementESUfidParserRuleCall_1_0_0_1 = (RuleCall)cInvokableNamedElementCrossReference_1_0_0.eContents().get(1);
		private final Assignment cExecRoutineAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final Keyword cExecRoutineLeftParenthesisKeyword_1_1_0 = (Keyword)cExecRoutineAssignment_1_1.eContents().get(0);
		private final Assignment cArgsAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
		private final RuleCall cArgsMixTupleExpressionListParserRuleCall_1_2_0 = (RuleCall)cArgsAssignment_1_2.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_1_3 = (Keyword)cGroup_1.eContents().get(3);
		private final Group cGroup_1_4 = (Group)cGroup_1.eContents().get(4);
		private final Keyword cHyphenMinusHyphenMinusGreaterThanSignKeyword_1_4_0 = (Keyword)cGroup_1_4.eContents().get(0);
		private final Alternatives cAlternatives_1_4_1 = (Alternatives)cGroup_1_4.eContents().get(1);
		private final Group cGroup_1_4_1_0 = (Group)cAlternatives_1_4_1.eContents().get(0);
		private final Assignment cRetsAssignment_1_4_1_0_0 = (Assignment)cGroup_1_4_1_0.eContents().get(0);
		private final CrossReference cRetsVariableCrossReference_1_4_1_0_0_0 = (CrossReference)cRetsAssignment_1_4_1_0_0.eContents().get(0);
		private final RuleCall cRetsVariableIDTerminalRuleCall_1_4_1_0_0_0_1 = (RuleCall)cRetsVariableCrossReference_1_4_1_0_0_0.eContents().get(1);
		private final Group cGroup_1_4_1_0_1 = (Group)cGroup_1_4_1_0.eContents().get(1);
		private final Keyword cCommaKeyword_1_4_1_0_1_0 = (Keyword)cGroup_1_4_1_0_1.eContents().get(0);
		private final Assignment cRetsAssignment_1_4_1_0_1_1 = (Assignment)cGroup_1_4_1_0_1.eContents().get(1);
		private final CrossReference cRetsVariableCrossReference_1_4_1_0_1_1_0 = (CrossReference)cRetsAssignment_1_4_1_0_1_1.eContents().get(0);
		private final RuleCall cRetsVariableIDTerminalRuleCall_1_4_1_0_1_1_0_1 = (RuleCall)cRetsVariableCrossReference_1_4_1_0_1_1_0.eContents().get(1);
		private final Group cGroup_1_4_1_1 = (Group)cAlternatives_1_4_1.eContents().get(1);
		private final Keyword cLeftParenthesisKeyword_1_4_1_1_0 = (Keyword)cGroup_1_4_1_1.eContents().get(0);
		private final Assignment cRetsAssignment_1_4_1_1_1 = (Assignment)cGroup_1_4_1_1.eContents().get(1);
		private final CrossReference cRetsVariableCrossReference_1_4_1_1_1_0 = (CrossReference)cRetsAssignment_1_4_1_1_1.eContents().get(0);
		private final RuleCall cRetsVariableIDTerminalRuleCall_1_4_1_1_1_0_1 = (RuleCall)cRetsVariableCrossReference_1_4_1_1_1_0.eContents().get(1);
		private final Group cGroup_1_4_1_1_2 = (Group)cGroup_1_4_1_1.eContents().get(2);
		private final Keyword cCommaKeyword_1_4_1_1_2_0 = (Keyword)cGroup_1_4_1_1_2.eContents().get(0);
		private final Assignment cRetsAssignment_1_4_1_1_2_1 = (Assignment)cGroup_1_4_1_1_2.eContents().get(1);
		private final CrossReference cRetsVariableCrossReference_1_4_1_1_2_1_0 = (CrossReference)cRetsAssignment_1_4_1_1_2_1.eContents().get(0);
		private final RuleCall cRetsVariableIDTerminalRuleCall_1_4_1_1_2_1_0_1 = (RuleCall)cRetsVariableCrossReference_1_4_1_1_2_1_0.eContents().get(1);
		private final Keyword cRightParenthesisKeyword_1_4_1_1_3 = (Keyword)cGroup_1_4_1_1.eContents().get(3);
		private final Keyword cSemicolonKeyword_1_5 = (Keyword)cGroup_1.eContents().get(5);
		private final Group cGroup_2 = (Group)cAlternatives.eContents().get(2);
		private final Assignment cExecRoutineAssignment_2_0 = (Assignment)cGroup_2.eContents().get(0);
		private final Keyword cExecRoutineExecKeyword_2_0_0 = (Keyword)cExecRoutineAssignment_2_0.eContents().get(0);
		private final Assignment cInvokableAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
		private final CrossReference cInvokableNamedElementCrossReference_2_1_0 = (CrossReference)cInvokableAssignment_2_1.eContents().get(0);
		private final RuleCall cInvokableNamedElementESUfidParserRuleCall_2_1_0_1 = (RuleCall)cInvokableNamedElementCrossReference_2_1_0.eContents().get(1);
		private final Keyword cLeftParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Assignment cArgsAssignment_2_3 = (Assignment)cGroup_2.eContents().get(3);
		private final RuleCall cArgsMixTupleExpressionListParserRuleCall_2_3_0 = (RuleCall)cArgsAssignment_2_3.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_4 = (Keyword)cGroup_2.eContents().get(4);
		private final Group cGroup_2_5 = (Group)cGroup_2.eContents().get(5);
		private final Keyword cHyphenMinusHyphenMinusGreaterThanSignKeyword_2_5_0 = (Keyword)cGroup_2_5.eContents().get(0);
		private final Alternatives cAlternatives_2_5_1 = (Alternatives)cGroup_2_5.eContents().get(1);
		private final Group cGroup_2_5_1_0 = (Group)cAlternatives_2_5_1.eContents().get(0);
		private final Assignment cRetsAssignment_2_5_1_0_0 = (Assignment)cGroup_2_5_1_0.eContents().get(0);
		private final CrossReference cRetsVariableCrossReference_2_5_1_0_0_0 = (CrossReference)cRetsAssignment_2_5_1_0_0.eContents().get(0);
		private final RuleCall cRetsVariableIDTerminalRuleCall_2_5_1_0_0_0_1 = (RuleCall)cRetsVariableCrossReference_2_5_1_0_0_0.eContents().get(1);
		private final Group cGroup_2_5_1_0_1 = (Group)cGroup_2_5_1_0.eContents().get(1);
		private final Keyword cCommaKeyword_2_5_1_0_1_0 = (Keyword)cGroup_2_5_1_0_1.eContents().get(0);
		private final Assignment cRetsAssignment_2_5_1_0_1_1 = (Assignment)cGroup_2_5_1_0_1.eContents().get(1);
		private final CrossReference cRetsVariableCrossReference_2_5_1_0_1_1_0 = (CrossReference)cRetsAssignment_2_5_1_0_1_1.eContents().get(0);
		private final RuleCall cRetsVariableIDTerminalRuleCall_2_5_1_0_1_1_0_1 = (RuleCall)cRetsVariableCrossReference_2_5_1_0_1_1_0.eContents().get(1);
		private final Group cGroup_2_5_1_1 = (Group)cAlternatives_2_5_1.eContents().get(1);
		private final Keyword cLeftParenthesisKeyword_2_5_1_1_0 = (Keyword)cGroup_2_5_1_1.eContents().get(0);
		private final Assignment cRetsAssignment_2_5_1_1_1 = (Assignment)cGroup_2_5_1_1.eContents().get(1);
		private final CrossReference cRetsVariableCrossReference_2_5_1_1_1_0 = (CrossReference)cRetsAssignment_2_5_1_1_1.eContents().get(0);
		private final RuleCall cRetsVariableIDTerminalRuleCall_2_5_1_1_1_0_1 = (RuleCall)cRetsVariableCrossReference_2_5_1_1_1_0.eContents().get(1);
		private final Group cGroup_2_5_1_1_2 = (Group)cGroup_2_5_1_1.eContents().get(2);
		private final Keyword cCommaKeyword_2_5_1_1_2_0 = (Keyword)cGroup_2_5_1_1_2.eContents().get(0);
		private final Assignment cRetsAssignment_2_5_1_1_2_1 = (Assignment)cGroup_2_5_1_1_2.eContents().get(1);
		private final CrossReference cRetsVariableCrossReference_2_5_1_1_2_1_0 = (CrossReference)cRetsAssignment_2_5_1_1_2_1.eContents().get(0);
		private final RuleCall cRetsVariableIDTerminalRuleCall_2_5_1_1_2_1_0_1 = (RuleCall)cRetsVariableCrossReference_2_5_1_1_2_1_0.eContents().get(1);
		private final Keyword cRightParenthesisKeyword_2_5_1_1_3 = (Keyword)cGroup_2_5_1_1.eContents().get(3);
		private final Keyword cSemicolonKeyword_2_6 = (Keyword)cGroup_2.eContents().get(6);
		private final Group cGroup_3 = (Group)cAlternatives.eContents().get(3);
		private final Assignment cCallProcedureAssignment_3_0 = (Assignment)cGroup_3.eContents().get(0);
		private final Keyword cCallProcedureCallKeyword_3_0_0 = (Keyword)cCallProcedureAssignment_3_0.eContents().get(0);
		private final Assignment cInvokableAssignment_3_1 = (Assignment)cGroup_3.eContents().get(1);
		private final CrossReference cInvokableNamedElementCrossReference_3_1_0 = (CrossReference)cInvokableAssignment_3_1.eContents().get(0);
		private final RuleCall cInvokableNamedElementESUfidParserRuleCall_3_1_0_1 = (RuleCall)cInvokableNamedElementCrossReference_3_1_0.eContents().get(1);
		private final Assignment cArgsAssignment_3_2 = (Assignment)cGroup_3.eContents().get(2);
		private final RuleCall cArgsMixTupleExpressionListParserRuleCall_3_2_0 = (RuleCall)cArgsAssignment_3_2.eContents().get(0);
		private final Group cGroup_3_3 = (Group)cGroup_3.eContents().get(3);
		private final Keyword cHyphenMinusHyphenMinusGreaterThanSignKeyword_3_3_0 = (Keyword)cGroup_3_3.eContents().get(0);
		private final Alternatives cAlternatives_3_3_1 = (Alternatives)cGroup_3_3.eContents().get(1);
		private final Group cGroup_3_3_1_0 = (Group)cAlternatives_3_3_1.eContents().get(0);
		private final Assignment cRetsAssignment_3_3_1_0_0 = (Assignment)cGroup_3_3_1_0.eContents().get(0);
		private final CrossReference cRetsVariableCrossReference_3_3_1_0_0_0 = (CrossReference)cRetsAssignment_3_3_1_0_0.eContents().get(0);
		private final RuleCall cRetsVariableIDTerminalRuleCall_3_3_1_0_0_0_1 = (RuleCall)cRetsVariableCrossReference_3_3_1_0_0_0.eContents().get(1);
		private final Group cGroup_3_3_1_0_1 = (Group)cGroup_3_3_1_0.eContents().get(1);
		private final Keyword cCommaKeyword_3_3_1_0_1_0 = (Keyword)cGroup_3_3_1_0_1.eContents().get(0);
		private final Assignment cRetsAssignment_3_3_1_0_1_1 = (Assignment)cGroup_3_3_1_0_1.eContents().get(1);
		private final CrossReference cRetsVariableCrossReference_3_3_1_0_1_1_0 = (CrossReference)cRetsAssignment_3_3_1_0_1_1.eContents().get(0);
		private final RuleCall cRetsVariableIDTerminalRuleCall_3_3_1_0_1_1_0_1 = (RuleCall)cRetsVariableCrossReference_3_3_1_0_1_1_0.eContents().get(1);
		private final Group cGroup_3_3_1_1 = (Group)cAlternatives_3_3_1.eContents().get(1);
		private final Keyword cLeftParenthesisKeyword_3_3_1_1_0 = (Keyword)cGroup_3_3_1_1.eContents().get(0);
		private final Assignment cRetsAssignment_3_3_1_1_1 = (Assignment)cGroup_3_3_1_1.eContents().get(1);
		private final CrossReference cRetsVariableCrossReference_3_3_1_1_1_0 = (CrossReference)cRetsAssignment_3_3_1_1_1.eContents().get(0);
		private final RuleCall cRetsVariableIDTerminalRuleCall_3_3_1_1_1_0_1 = (RuleCall)cRetsVariableCrossReference_3_3_1_1_1_0.eContents().get(1);
		private final Group cGroup_3_3_1_1_2 = (Group)cGroup_3_3_1_1.eContents().get(2);
		private final Keyword cCommaKeyword_3_3_1_1_2_0 = (Keyword)cGroup_3_3_1_1_2.eContents().get(0);
		private final Assignment cRetsAssignment_3_3_1_1_2_1 = (Assignment)cGroup_3_3_1_1_2.eContents().get(1);
		private final CrossReference cRetsVariableCrossReference_3_3_1_1_2_1_0 = (CrossReference)cRetsAssignment_3_3_1_1_2_1.eContents().get(0);
		private final RuleCall cRetsVariableIDTerminalRuleCall_3_3_1_1_2_1_0_1 = (RuleCall)cRetsVariableCrossReference_3_3_1_1_2_1_0.eContents().get(1);
		private final Keyword cRightParenthesisKeyword_3_3_1_1_3 = (Keyword)cGroup_3_3_1_1.eContents().get(3);
		private final Keyword cSemicolonKeyword_3_4 = (Keyword)cGroup_3.eContents().get(4);
		
		//InvokeStatement returns fmlStmnt::InvokeStatement
		//    : expression=InvokeExpressionDeprecated ';'
		//    // Exec Routine
		//    |  invokable=[fmlCommon::NamedElement|ESUfid]
		//        execRoutine?='(' ( args=MixTupleExpressionList )? ')'
		//        ( '-->'
		//            ( rets+=[fmlInfra::Variable] ( ',' rets+=[fmlInfra::Variable] )*
		//            | '(' rets+=[fmlInfra::Variable]
		//                ( ',' rets+=[fmlInfra::Variable] )* ')'
		//            )
		//        )? ';'
		//    // Exec Routine
		//    | execRoutine?='exec' invokable=[fmlCommon::NamedElement|ESUfid]
		//        '(' ( args=MixTupleExpressionList )? ')'
		//        ( '-->'
		//            ( rets+=[fmlInfra::Variable] ( ',' rets+=[fmlInfra::Variable] )*
		//            | '(' rets+=[fmlInfra::Variable]
		//                ( ',' rets+=[fmlInfra::Variable] )* ')'
		//            )
		//        )? ';'
		//    // Call Procedure
		//    | callProcedure?='call' invokable=[fmlCommon::NamedElement|ESUfid]
		//        ( args=MixTupleExpressionList )?
		//        ( '-->'
		//            ( rets+=[fmlInfra::Variable] ( ',' rets+=[fmlInfra::Variable] )*
		//            | '(' rets+=[fmlInfra::Variable]
		//                ( ',' rets+=[fmlInfra::Variable] )* ')'
		//            )
		//        )? ';'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//expression=InvokeExpressionDeprecated ';'
		//   // Exec Routine
		//   |  invokable=[fmlCommon::NamedElement|ESUfid]
		//       execRoutine?='(' ( args=MixTupleExpressionList )? ')'
		//       ( '-->'
		//           ( rets+=[fmlInfra::Variable] ( ',' rets+=[fmlInfra::Variable] )*
		//           | '(' rets+=[fmlInfra::Variable]
		//               ( ',' rets+=[fmlInfra::Variable] )* ')'
		//           )
		//       )? ';'
		//   // Exec Routine
		//   | execRoutine?='exec' invokable=[fmlCommon::NamedElement|ESUfid]
		//       '(' ( args=MixTupleExpressionList )? ')'
		//       ( '-->'
		//           ( rets+=[fmlInfra::Variable] ( ',' rets+=[fmlInfra::Variable] )*
		//           | '(' rets+=[fmlInfra::Variable]
		//               ( ',' rets+=[fmlInfra::Variable] )* ')'
		//           )
		//       )? ';'
		//   // Call Procedure
		//   | callProcedure?='call' invokable=[fmlCommon::NamedElement|ESUfid]
		//       ( args=MixTupleExpressionList )?
		//       ( '-->'
		//           ( rets+=[fmlInfra::Variable] ( ',' rets+=[fmlInfra::Variable] )*
		//           | '(' rets+=[fmlInfra::Variable]
		//               ( ',' rets+=[fmlInfra::Variable] )* ')'
		//           )
		//       )? ';'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//expression=InvokeExpressionDeprecated ';'
		public Group getGroup_0() { return cGroup_0; }
		
		//expression=InvokeExpressionDeprecated
		public Assignment getExpressionAssignment_0_0() { return cExpressionAssignment_0_0; }
		
		//InvokeExpressionDeprecated
		public RuleCall getExpressionInvokeExpressionDeprecatedParserRuleCall_0_0_0() { return cExpressionInvokeExpressionDeprecatedParserRuleCall_0_0_0; }
		
		//';'
		public Keyword getSemicolonKeyword_0_1() { return cSemicolonKeyword_0_1; }
		
		//invokable=[fmlCommon::NamedElement|ESUfid]
		//      execRoutine?='(' ( args=MixTupleExpressionList )? ')'
		//      ( '-->'
		//          ( rets+=[fmlInfra::Variable] ( ',' rets+=[fmlInfra::Variable] )*
		//          | '(' rets+=[fmlInfra::Variable]
		//              ( ',' rets+=[fmlInfra::Variable] )* ')'
		//          )
		//      )? ';'
		public Group getGroup_1() { return cGroup_1; }
		
		//invokable=[fmlCommon::NamedElement|ESUfid]
		public Assignment getInvokableAssignment_1_0() { return cInvokableAssignment_1_0; }
		
		//[fmlCommon::NamedElement|ESUfid]
		public CrossReference getInvokableNamedElementCrossReference_1_0_0() { return cInvokableNamedElementCrossReference_1_0_0; }
		
		//ESUfid
		public RuleCall getInvokableNamedElementESUfidParserRuleCall_1_0_0_1() { return cInvokableNamedElementESUfidParserRuleCall_1_0_0_1; }
		
		//execRoutine?='('
		public Assignment getExecRoutineAssignment_1_1() { return cExecRoutineAssignment_1_1; }
		
		//'('
		public Keyword getExecRoutineLeftParenthesisKeyword_1_1_0() { return cExecRoutineLeftParenthesisKeyword_1_1_0; }
		
		//( args=MixTupleExpressionList )?
		public Assignment getArgsAssignment_1_2() { return cArgsAssignment_1_2; }
		
		//MixTupleExpressionList
		public RuleCall getArgsMixTupleExpressionListParserRuleCall_1_2_0() { return cArgsMixTupleExpressionListParserRuleCall_1_2_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_1_3() { return cRightParenthesisKeyword_1_3; }
		
		//( '-->'
		//    ( rets+=[fmlInfra::Variable] ( ',' rets+=[fmlInfra::Variable] )*
		//    | '(' rets+=[fmlInfra::Variable]
		//        ( ',' rets+=[fmlInfra::Variable] )* ')'
		//    )
		//)?
		public Group getGroup_1_4() { return cGroup_1_4; }
		
		//'-->'
		public Keyword getHyphenMinusHyphenMinusGreaterThanSignKeyword_1_4_0() { return cHyphenMinusHyphenMinusGreaterThanSignKeyword_1_4_0; }
		
		//( rets+=[fmlInfra::Variable] ( ',' rets+=[fmlInfra::Variable] )*
		//| '(' rets+=[fmlInfra::Variable]
		//    ( ',' rets+=[fmlInfra::Variable] )* ')'
		//)
		public Alternatives getAlternatives_1_4_1() { return cAlternatives_1_4_1; }
		
		//rets+=[fmlInfra::Variable] ( ',' rets+=[fmlInfra::Variable] )*
		public Group getGroup_1_4_1_0() { return cGroup_1_4_1_0; }
		
		//rets+=[fmlInfra::Variable]
		public Assignment getRetsAssignment_1_4_1_0_0() { return cRetsAssignment_1_4_1_0_0; }
		
		//[fmlInfra::Variable]
		public CrossReference getRetsVariableCrossReference_1_4_1_0_0_0() { return cRetsVariableCrossReference_1_4_1_0_0_0; }
		
		//ID
		public RuleCall getRetsVariableIDTerminalRuleCall_1_4_1_0_0_0_1() { return cRetsVariableIDTerminalRuleCall_1_4_1_0_0_0_1; }
		
		//( ',' rets+=[fmlInfra::Variable] )*
		public Group getGroup_1_4_1_0_1() { return cGroup_1_4_1_0_1; }
		
		//','
		public Keyword getCommaKeyword_1_4_1_0_1_0() { return cCommaKeyword_1_4_1_0_1_0; }
		
		//rets+=[fmlInfra::Variable]
		public Assignment getRetsAssignment_1_4_1_0_1_1() { return cRetsAssignment_1_4_1_0_1_1; }
		
		//[fmlInfra::Variable]
		public CrossReference getRetsVariableCrossReference_1_4_1_0_1_1_0() { return cRetsVariableCrossReference_1_4_1_0_1_1_0; }
		
		//ID
		public RuleCall getRetsVariableIDTerminalRuleCall_1_4_1_0_1_1_0_1() { return cRetsVariableIDTerminalRuleCall_1_4_1_0_1_1_0_1; }
		
		//'(' rets+=[fmlInfra::Variable]
		//               ( ',' rets+=[fmlInfra::Variable] )* ')'
		public Group getGroup_1_4_1_1() { return cGroup_1_4_1_1; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_1_4_1_1_0() { return cLeftParenthesisKeyword_1_4_1_1_0; }
		
		//rets+=[fmlInfra::Variable]
		public Assignment getRetsAssignment_1_4_1_1_1() { return cRetsAssignment_1_4_1_1_1; }
		
		//[fmlInfra::Variable]
		public CrossReference getRetsVariableCrossReference_1_4_1_1_1_0() { return cRetsVariableCrossReference_1_4_1_1_1_0; }
		
		//ID
		public RuleCall getRetsVariableIDTerminalRuleCall_1_4_1_1_1_0_1() { return cRetsVariableIDTerminalRuleCall_1_4_1_1_1_0_1; }
		
		//( ',' rets+=[fmlInfra::Variable] )*
		public Group getGroup_1_4_1_1_2() { return cGroup_1_4_1_1_2; }
		
		//','
		public Keyword getCommaKeyword_1_4_1_1_2_0() { return cCommaKeyword_1_4_1_1_2_0; }
		
		//rets+=[fmlInfra::Variable]
		public Assignment getRetsAssignment_1_4_1_1_2_1() { return cRetsAssignment_1_4_1_1_2_1; }
		
		//[fmlInfra::Variable]
		public CrossReference getRetsVariableCrossReference_1_4_1_1_2_1_0() { return cRetsVariableCrossReference_1_4_1_1_2_1_0; }
		
		//ID
		public RuleCall getRetsVariableIDTerminalRuleCall_1_4_1_1_2_1_0_1() { return cRetsVariableIDTerminalRuleCall_1_4_1_1_2_1_0_1; }
		
		//')'
		public Keyword getRightParenthesisKeyword_1_4_1_1_3() { return cRightParenthesisKeyword_1_4_1_1_3; }
		
		//';'
		public Keyword getSemicolonKeyword_1_5() { return cSemicolonKeyword_1_5; }
		
		//execRoutine?='exec' invokable=[fmlCommon::NamedElement|ESUfid]
		//       '(' ( args=MixTupleExpressionList )? ')'
		//       ( '-->'
		//           ( rets+=[fmlInfra::Variable] ( ',' rets+=[fmlInfra::Variable] )*
		//           | '(' rets+=[fmlInfra::Variable]
		//               ( ',' rets+=[fmlInfra::Variable] )* ')'
		//           )
		//       )? ';'
		public Group getGroup_2() { return cGroup_2; }
		
		//execRoutine?='exec'
		public Assignment getExecRoutineAssignment_2_0() { return cExecRoutineAssignment_2_0; }
		
		//'exec'
		public Keyword getExecRoutineExecKeyword_2_0_0() { return cExecRoutineExecKeyword_2_0_0; }
		
		//invokable=[fmlCommon::NamedElement|ESUfid]
		public Assignment getInvokableAssignment_2_1() { return cInvokableAssignment_2_1; }
		
		//[fmlCommon::NamedElement|ESUfid]
		public CrossReference getInvokableNamedElementCrossReference_2_1_0() { return cInvokableNamedElementCrossReference_2_1_0; }
		
		//ESUfid
		public RuleCall getInvokableNamedElementESUfidParserRuleCall_2_1_0_1() { return cInvokableNamedElementESUfidParserRuleCall_2_1_0_1; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_2() { return cLeftParenthesisKeyword_2_2; }
		
		//( args=MixTupleExpressionList )?
		public Assignment getArgsAssignment_2_3() { return cArgsAssignment_2_3; }
		
		//MixTupleExpressionList
		public RuleCall getArgsMixTupleExpressionListParserRuleCall_2_3_0() { return cArgsMixTupleExpressionListParserRuleCall_2_3_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_4() { return cRightParenthesisKeyword_2_4; }
		
		//( '-->'
		//    ( rets+=[fmlInfra::Variable] ( ',' rets+=[fmlInfra::Variable] )*
		//    | '(' rets+=[fmlInfra::Variable]
		//        ( ',' rets+=[fmlInfra::Variable] )* ')'
		//    )
		//)?
		public Group getGroup_2_5() { return cGroup_2_5; }
		
		//'-->'
		public Keyword getHyphenMinusHyphenMinusGreaterThanSignKeyword_2_5_0() { return cHyphenMinusHyphenMinusGreaterThanSignKeyword_2_5_0; }
		
		//( rets+=[fmlInfra::Variable] ( ',' rets+=[fmlInfra::Variable] )*
		//| '(' rets+=[fmlInfra::Variable]
		//    ( ',' rets+=[fmlInfra::Variable] )* ')'
		//)
		public Alternatives getAlternatives_2_5_1() { return cAlternatives_2_5_1; }
		
		//rets+=[fmlInfra::Variable] ( ',' rets+=[fmlInfra::Variable] )*
		public Group getGroup_2_5_1_0() { return cGroup_2_5_1_0; }
		
		//rets+=[fmlInfra::Variable]
		public Assignment getRetsAssignment_2_5_1_0_0() { return cRetsAssignment_2_5_1_0_0; }
		
		//[fmlInfra::Variable]
		public CrossReference getRetsVariableCrossReference_2_5_1_0_0_0() { return cRetsVariableCrossReference_2_5_1_0_0_0; }
		
		//ID
		public RuleCall getRetsVariableIDTerminalRuleCall_2_5_1_0_0_0_1() { return cRetsVariableIDTerminalRuleCall_2_5_1_0_0_0_1; }
		
		//( ',' rets+=[fmlInfra::Variable] )*
		public Group getGroup_2_5_1_0_1() { return cGroup_2_5_1_0_1; }
		
		//','
		public Keyword getCommaKeyword_2_5_1_0_1_0() { return cCommaKeyword_2_5_1_0_1_0; }
		
		//rets+=[fmlInfra::Variable]
		public Assignment getRetsAssignment_2_5_1_0_1_1() { return cRetsAssignment_2_5_1_0_1_1; }
		
		//[fmlInfra::Variable]
		public CrossReference getRetsVariableCrossReference_2_5_1_0_1_1_0() { return cRetsVariableCrossReference_2_5_1_0_1_1_0; }
		
		//ID
		public RuleCall getRetsVariableIDTerminalRuleCall_2_5_1_0_1_1_0_1() { return cRetsVariableIDTerminalRuleCall_2_5_1_0_1_1_0_1; }
		
		//'(' rets+=[fmlInfra::Variable]
		//               ( ',' rets+=[fmlInfra::Variable] )* ')'
		public Group getGroup_2_5_1_1() { return cGroup_2_5_1_1; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_5_1_1_0() { return cLeftParenthesisKeyword_2_5_1_1_0; }
		
		//rets+=[fmlInfra::Variable]
		public Assignment getRetsAssignment_2_5_1_1_1() { return cRetsAssignment_2_5_1_1_1; }
		
		//[fmlInfra::Variable]
		public CrossReference getRetsVariableCrossReference_2_5_1_1_1_0() { return cRetsVariableCrossReference_2_5_1_1_1_0; }
		
		//ID
		public RuleCall getRetsVariableIDTerminalRuleCall_2_5_1_1_1_0_1() { return cRetsVariableIDTerminalRuleCall_2_5_1_1_1_0_1; }
		
		//( ',' rets+=[fmlInfra::Variable] )*
		public Group getGroup_2_5_1_1_2() { return cGroup_2_5_1_1_2; }
		
		//','
		public Keyword getCommaKeyword_2_5_1_1_2_0() { return cCommaKeyword_2_5_1_1_2_0; }
		
		//rets+=[fmlInfra::Variable]
		public Assignment getRetsAssignment_2_5_1_1_2_1() { return cRetsAssignment_2_5_1_1_2_1; }
		
		//[fmlInfra::Variable]
		public CrossReference getRetsVariableCrossReference_2_5_1_1_2_1_0() { return cRetsVariableCrossReference_2_5_1_1_2_1_0; }
		
		//ID
		public RuleCall getRetsVariableIDTerminalRuleCall_2_5_1_1_2_1_0_1() { return cRetsVariableIDTerminalRuleCall_2_5_1_1_2_1_0_1; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_5_1_1_3() { return cRightParenthesisKeyword_2_5_1_1_3; }
		
		//';'
		public Keyword getSemicolonKeyword_2_6() { return cSemicolonKeyword_2_6; }
		
		//callProcedure?='call' invokable=[fmlCommon::NamedElement|ESUfid]
		//       ( args=MixTupleExpressionList )?
		//       ( '-->'
		//           ( rets+=[fmlInfra::Variable] ( ',' rets+=[fmlInfra::Variable] )*
		//           | '(' rets+=[fmlInfra::Variable]
		//               ( ',' rets+=[fmlInfra::Variable] )* ')'
		//           )
		//       )? ';'
		public Group getGroup_3() { return cGroup_3; }
		
		//callProcedure?='call'
		public Assignment getCallProcedureAssignment_3_0() { return cCallProcedureAssignment_3_0; }
		
		//'call'
		public Keyword getCallProcedureCallKeyword_3_0_0() { return cCallProcedureCallKeyword_3_0_0; }
		
		//invokable=[fmlCommon::NamedElement|ESUfid]
		public Assignment getInvokableAssignment_3_1() { return cInvokableAssignment_3_1; }
		
		//[fmlCommon::NamedElement|ESUfid]
		public CrossReference getInvokableNamedElementCrossReference_3_1_0() { return cInvokableNamedElementCrossReference_3_1_0; }
		
		//ESUfid
		public RuleCall getInvokableNamedElementESUfidParserRuleCall_3_1_0_1() { return cInvokableNamedElementESUfidParserRuleCall_3_1_0_1; }
		
		//( args=MixTupleExpressionList )?
		public Assignment getArgsAssignment_3_2() { return cArgsAssignment_3_2; }
		
		//MixTupleExpressionList
		public RuleCall getArgsMixTupleExpressionListParserRuleCall_3_2_0() { return cArgsMixTupleExpressionListParserRuleCall_3_2_0; }
		
		//( '-->'
		//    ( rets+=[fmlInfra::Variable] ( ',' rets+=[fmlInfra::Variable] )*
		//    | '(' rets+=[fmlInfra::Variable]
		//        ( ',' rets+=[fmlInfra::Variable] )* ')'
		//    )
		//)?
		public Group getGroup_3_3() { return cGroup_3_3; }
		
		//'-->'
		public Keyword getHyphenMinusHyphenMinusGreaterThanSignKeyword_3_3_0() { return cHyphenMinusHyphenMinusGreaterThanSignKeyword_3_3_0; }
		
		//( rets+=[fmlInfra::Variable] ( ',' rets+=[fmlInfra::Variable] )*
		//| '(' rets+=[fmlInfra::Variable]
		//    ( ',' rets+=[fmlInfra::Variable] )* ')'
		//)
		public Alternatives getAlternatives_3_3_1() { return cAlternatives_3_3_1; }
		
		//rets+=[fmlInfra::Variable] ( ',' rets+=[fmlInfra::Variable] )*
		public Group getGroup_3_3_1_0() { return cGroup_3_3_1_0; }
		
		//rets+=[fmlInfra::Variable]
		public Assignment getRetsAssignment_3_3_1_0_0() { return cRetsAssignment_3_3_1_0_0; }
		
		//[fmlInfra::Variable]
		public CrossReference getRetsVariableCrossReference_3_3_1_0_0_0() { return cRetsVariableCrossReference_3_3_1_0_0_0; }
		
		//ID
		public RuleCall getRetsVariableIDTerminalRuleCall_3_3_1_0_0_0_1() { return cRetsVariableIDTerminalRuleCall_3_3_1_0_0_0_1; }
		
		//( ',' rets+=[fmlInfra::Variable] )*
		public Group getGroup_3_3_1_0_1() { return cGroup_3_3_1_0_1; }
		
		//','
		public Keyword getCommaKeyword_3_3_1_0_1_0() { return cCommaKeyword_3_3_1_0_1_0; }
		
		//rets+=[fmlInfra::Variable]
		public Assignment getRetsAssignment_3_3_1_0_1_1() { return cRetsAssignment_3_3_1_0_1_1; }
		
		//[fmlInfra::Variable]
		public CrossReference getRetsVariableCrossReference_3_3_1_0_1_1_0() { return cRetsVariableCrossReference_3_3_1_0_1_1_0; }
		
		//ID
		public RuleCall getRetsVariableIDTerminalRuleCall_3_3_1_0_1_1_0_1() { return cRetsVariableIDTerminalRuleCall_3_3_1_0_1_1_0_1; }
		
		//'(' rets+=[fmlInfra::Variable]
		//               ( ',' rets+=[fmlInfra::Variable] )* ')'
		public Group getGroup_3_3_1_1() { return cGroup_3_3_1_1; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_3_3_1_1_0() { return cLeftParenthesisKeyword_3_3_1_1_0; }
		
		//rets+=[fmlInfra::Variable]
		public Assignment getRetsAssignment_3_3_1_1_1() { return cRetsAssignment_3_3_1_1_1; }
		
		//[fmlInfra::Variable]
		public CrossReference getRetsVariableCrossReference_3_3_1_1_1_0() { return cRetsVariableCrossReference_3_3_1_1_1_0; }
		
		//ID
		public RuleCall getRetsVariableIDTerminalRuleCall_3_3_1_1_1_0_1() { return cRetsVariableIDTerminalRuleCall_3_3_1_1_1_0_1; }
		
		//( ',' rets+=[fmlInfra::Variable] )*
		public Group getGroup_3_3_1_1_2() { return cGroup_3_3_1_1_2; }
		
		//','
		public Keyword getCommaKeyword_3_3_1_1_2_0() { return cCommaKeyword_3_3_1_1_2_0; }
		
		//rets+=[fmlInfra::Variable]
		public Assignment getRetsAssignment_3_3_1_1_2_1() { return cRetsAssignment_3_3_1_1_2_1; }
		
		//[fmlInfra::Variable]
		public CrossReference getRetsVariableCrossReference_3_3_1_1_2_1_0() { return cRetsVariableCrossReference_3_3_1_1_2_1_0; }
		
		//ID
		public RuleCall getRetsVariableIDTerminalRuleCall_3_3_1_1_2_1_0_1() { return cRetsVariableIDTerminalRuleCall_3_3_1_1_2_1_0_1; }
		
		//')'
		public Keyword getRightParenthesisKeyword_3_3_1_1_3() { return cRightParenthesisKeyword_3_3_1_1_3; }
		
		//';'
		public Keyword getSemicolonKeyword_3_4() { return cSemicolonKeyword_3_4; }
	}
	public class ObserverStatementElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ObserverStatement");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cObserverStatementAction_0 = (Action)cGroup.eContents().get(0);
		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
		private final Keyword cObserveKeyword_1_0 = (Keyword)cAlternatives_1.eContents().get(0);
		private final Keyword cObsKeyword_1_1 = (Keyword)cAlternatives_1.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final Keyword cCtxKeyword_2_1 = (Keyword)cGroup_2.eContents().get(1);
		private final Assignment cContextAssignment_2_2 = (Assignment)cGroup_2.eContents().get(2);
		private final RuleCall cContextValuePureNamedMachineExpressionParserRuleCall_2_2_0 = (RuleCall)cContextAssignment_2_2.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_3 = (Keyword)cGroup_2.eContents().get(3);
		private final Keyword cLeftCurlyBracketKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Assignment cStatementAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cStatementObservableStatementParserRuleCall_4_0 = (RuleCall)cStatementAssignment_4.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_5 = (Keyword)cGroup.eContents().get(5);
		private final Group cGroup_6 = (Group)cGroup.eContents().get(6);
		private final Alternatives cAlternatives_6_0 = (Alternatives)cGroup_6.eContents().get(0);
		private final Group cGroup_6_0_0 = (Group)cAlternatives_6_0.eContents().get(0);
		private final Keyword cProvidedKeyword_6_0_0_0 = (Keyword)cGroup_6_0_0.eContents().get(0);
		private final Assignment cPostConditionAssignment_6_0_0_1 = (Assignment)cGroup_6_0_0.eContents().get(1);
		private final RuleCall cPostConditionExpressionParserRuleCall_6_0_0_1_0 = (RuleCall)cPostConditionAssignment_6_0_0_1.eContents().get(0);
		private final Group cGroup_6_0_1 = (Group)cAlternatives_6_0.eContents().get(1);
		private final Keyword cLeftSquareBracketKeyword_6_0_1_0 = (Keyword)cGroup_6_0_1.eContents().get(0);
		private final Assignment cPostConditionAssignment_6_0_1_1 = (Assignment)cGroup_6_0_1.eContents().get(1);
		private final RuleCall cPostConditionExpressionParserRuleCall_6_0_1_1_0 = (RuleCall)cPostConditionAssignment_6_0_1_1.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_6_0_1_2 = (Keyword)cGroup_6_0_1.eContents().get(2);
		private final Keyword cSemicolonKeyword_6_1 = (Keyword)cGroup_6.eContents().get(1);
		
		/////////////////////////////////////////////
		////// ObsStatement Rules
		/////////////////////////////////////////////
		//ObserverStatement returns fmlStmnt::ObserverStatement
		//    : {fmlStmnt::ObserverStatement}
		//        ( '@observe' | '@obs' )
		//        ( '('  'ctx:'  context=ValuePureNamedMachineExpression  ')'  )?
		//          '{'
		//               statement=ObservableStatement
		//          '}'
		//        (
		//        ( 'provided:' postCondition=Expression
		//         | '[' postCondition=Expression ']'
		//         )
		//        ';'
		//        )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlStmnt::ObserverStatement}
		//       ( '@observe' | '@obs' )
		//       ( '('  'ctx:'  context=ValuePureNamedMachineExpression  ')'  )?
		//         '{'
		//              statement=ObservableStatement
		//         '}'
		//       (
		//       ( 'provided:' postCondition=Expression
		//        | '[' postCondition=Expression ']'
		//        )
		//       ';'
		//       )?
		public Group getGroup() { return cGroup; }
		
		//{fmlStmnt::ObserverStatement}
		public Action getObserverStatementAction_0() { return cObserverStatementAction_0; }
		
		//( '@observe' | '@obs' )
		public Alternatives getAlternatives_1() { return cAlternatives_1; }
		
		//'@observe'
		public Keyword getObserveKeyword_1_0() { return cObserveKeyword_1_0; }
		
		//'@obs'
		public Keyword getObsKeyword_1_1() { return cObsKeyword_1_1; }
		
		//( '('  'ctx:'  context=ValuePureNamedMachineExpression  ')'  )?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//'ctx:'
		public Keyword getCtxKeyword_2_1() { return cCtxKeyword_2_1; }
		
		//context=ValuePureNamedMachineExpression
		public Assignment getContextAssignment_2_2() { return cContextAssignment_2_2; }
		
		//ValuePureNamedMachineExpression
		public RuleCall getContextValuePureNamedMachineExpressionParserRuleCall_2_2_0() { return cContextValuePureNamedMachineExpressionParserRuleCall_2_2_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_3() { return cRightParenthesisKeyword_2_3; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_3() { return cLeftCurlyBracketKeyword_3; }
		
		//statement=ObservableStatement
		public Assignment getStatementAssignment_4() { return cStatementAssignment_4; }
		
		//ObservableStatement
		public RuleCall getStatementObservableStatementParserRuleCall_4_0() { return cStatementObservableStatementParserRuleCall_4_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_5() { return cRightCurlyBracketKeyword_5; }
		
		//(
		//( 'provided:' postCondition=Expression
		// | '[' postCondition=Expression ']'
		// )
		//';'
		//)?
		public Group getGroup_6() { return cGroup_6; }
		
		//( 'provided:' postCondition=Expression
		// | '[' postCondition=Expression ']'
		// )
		public Alternatives getAlternatives_6_0() { return cAlternatives_6_0; }
		
		//'provided:' postCondition=Expression
		public Group getGroup_6_0_0() { return cGroup_6_0_0; }
		
		//'provided:'
		public Keyword getProvidedKeyword_6_0_0_0() { return cProvidedKeyword_6_0_0_0; }
		
		//postCondition=Expression
		public Assignment getPostConditionAssignment_6_0_0_1() { return cPostConditionAssignment_6_0_0_1; }
		
		//Expression
		public RuleCall getPostConditionExpressionParserRuleCall_6_0_0_1_0() { return cPostConditionExpressionParserRuleCall_6_0_0_1_0; }
		
		//'[' postCondition=Expression ']'
		public Group getGroup_6_0_1() { return cGroup_6_0_1; }
		
		//'['
		public Keyword getLeftSquareBracketKeyword_6_0_1_0() { return cLeftSquareBracketKeyword_6_0_1_0; }
		
		//postCondition=Expression
		public Assignment getPostConditionAssignment_6_0_1_1() { return cPostConditionAssignment_6_0_1_1; }
		
		//Expression
		public RuleCall getPostConditionExpressionParserRuleCall_6_0_1_1_0() { return cPostConditionExpressionParserRuleCall_6_0_1_1_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_6_0_1_2() { return cRightSquareBracketKeyword_6_0_1_2; }
		
		//';'
		public Keyword getSemicolonKeyword_6_1() { return cSemicolonKeyword_6_1; }
	}
	public class ObservableStatementElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ObservableStatement");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cObsInputComStatementParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cObsOutputComStatementParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		
		//ObservableStatement returns fmlStmnt::Statement
		//    : ObsInputComStatement
		//    | ObsOutputComStatement
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//ObsInputComStatement
		//   | ObsOutputComStatement
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//ObsInputComStatement
		public RuleCall getObsInputComStatementParserRuleCall_0() { return cObsInputComStatementParserRuleCall_0; }
		
		//ObsOutputComStatement
		public RuleCall getObsOutputComStatementParserRuleCall_1() { return cObsOutputComStatementParserRuleCall_1; }
	}
	public class ObsInputComStatementElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ObsInputComStatement");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cInputKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cPortAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cPortObsComElementParserRuleCall_1_0 = (RuleCall)cPortAssignment_1.eContents().get(0);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final Assignment cLeftValueAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
		private final RuleCall cLeftValueExpressionParserRuleCall_2_1_0 = (RuleCall)cLeftValueAssignment_2_1.eContents().get(0);
		private final Group cGroup_2_2 = (Group)cGroup_2.eContents().get(2);
		private final Keyword cCommaKeyword_2_2_0 = (Keyword)cGroup_2_2.eContents().get(0);
		private final Assignment cLeftValueAssignment_2_2_1 = (Assignment)cGroup_2_2.eContents().get(1);
		private final RuleCall cLeftValueExpressionParserRuleCall_2_2_1_0 = (RuleCall)cLeftValueAssignment_2_2_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_3 = (Keyword)cGroup_2.eContents().get(3);
		private final UnorderedGroup cUnorderedGroup_3 = (UnorderedGroup)cGroup.eContents().get(3);
		private final Group cGroup_3_0 = (Group)cUnorderedGroup_3.eContents().get(0);
		private final Keyword cLessThanSignHyphenMinusHyphenMinusKeyword_3_0_0 = (Keyword)cGroup_3_0.eContents().get(0);
		private final Assignment cTargetAssignment_3_0_1 = (Assignment)cGroup_3_0.eContents().get(1);
		private final RuleCall cTargetValuePureNamedMachineExpressionParserRuleCall_3_0_1_0 = (RuleCall)cTargetAssignment_3_0_1.eContents().get(0);
		private final Group cGroup_3_1 = (Group)cUnorderedGroup_3.eContents().get(1);
		private final Alternatives cAlternatives_3_1_0 = (Alternatives)cGroup_3_1.eContents().get(0);
		private final Keyword cLessThanSignEqualsSignEqualsSignKeyword_3_1_0_0 = (Keyword)cAlternatives_3_1_0.eContents().get(0);
		private final Keyword cViaKeyword_3_1_0_1 = (Keyword)cAlternatives_3_1_0.eContents().get(1);
		private final Assignment cRouteAssignment_3_1_1 = (Assignment)cGroup_3_1.eContents().get(1);
		private final CrossReference cRouteChannelCrossReference_3_1_1_0 = (CrossReference)cRouteAssignment_3_1_1.eContents().get(0);
		private final RuleCall cRouteChannelESUfidParserRuleCall_3_1_1_0_1 = (RuleCall)cRouteChannelCrossReference_3_1_1_0.eContents().get(1);
		private final Keyword cSemicolonKeyword_4 = (Keyword)cGroup.eContents().get(4);
		
		//ObsInputComStatement returns fmlStmnt::InputComStatement
		//    : 'input' port=ObsComElement
		//        ( '(' leftValue+=Expression ( ',' leftValue+= Expression )* ')' )?
		//        ( ( '<--' target=ValuePureNamedMachineExpression )?
		//        & ( ( '<==' | 'via' ) route=[fmlInfra::Channel|ESUfid]/*ExpressionAsChannel*/ )?
		//        ) ';'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//'input' port=ObsComElement
		//       ( '(' leftValue+=Expression ( ',' leftValue+= Expression )* ')' )?
		//       ( ( '<--' target=ValuePureNamedMachineExpression )?
		//       & ( ( '<==' | 'via' ) route=[fmlInfra::Channel|ESUfid]/*ExpressionAsChannel*/ )?
		//       ) ';'
		public Group getGroup() { return cGroup; }
		
		//'input'
		public Keyword getInputKeyword_0() { return cInputKeyword_0; }
		
		//port=ObsComElement
		public Assignment getPortAssignment_1() { return cPortAssignment_1; }
		
		//ObsComElement
		public RuleCall getPortObsComElementParserRuleCall_1_0() { return cPortObsComElementParserRuleCall_1_0; }
		
		//( '(' leftValue+=Expression ( ',' leftValue+= Expression )* ')' )?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//leftValue+=Expression
		public Assignment getLeftValueAssignment_2_1() { return cLeftValueAssignment_2_1; }
		
		//Expression
		public RuleCall getLeftValueExpressionParserRuleCall_2_1_0() { return cLeftValueExpressionParserRuleCall_2_1_0; }
		
		//( ',' leftValue+= Expression )*
		public Group getGroup_2_2() { return cGroup_2_2; }
		
		//','
		public Keyword getCommaKeyword_2_2_0() { return cCommaKeyword_2_2_0; }
		
		//leftValue+= Expression
		public Assignment getLeftValueAssignment_2_2_1() { return cLeftValueAssignment_2_2_1; }
		
		//Expression
		public RuleCall getLeftValueExpressionParserRuleCall_2_2_1_0() { return cLeftValueExpressionParserRuleCall_2_2_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_3() { return cRightParenthesisKeyword_2_3; }
		
		//( ( '<--' target=ValuePureNamedMachineExpression )?
		//& ( ( '<==' | 'via' ) route=[fmlInfra::Channel|ESUfid]/*ExpressionAsChannel*/ )?
		//)
		public UnorderedGroup getUnorderedGroup_3() { return cUnorderedGroup_3; }
		
		//( '<--' target=ValuePureNamedMachineExpression )?
		public Group getGroup_3_0() { return cGroup_3_0; }
		
		//'<--'
		public Keyword getLessThanSignHyphenMinusHyphenMinusKeyword_3_0_0() { return cLessThanSignHyphenMinusHyphenMinusKeyword_3_0_0; }
		
		//target=ValuePureNamedMachineExpression
		public Assignment getTargetAssignment_3_0_1() { return cTargetAssignment_3_0_1; }
		
		//ValuePureNamedMachineExpression
		public RuleCall getTargetValuePureNamedMachineExpressionParserRuleCall_3_0_1_0() { return cTargetValuePureNamedMachineExpressionParserRuleCall_3_0_1_0; }
		
		//( ( '<==' | 'via' ) route=[fmlInfra::Channel|ESUfid]/*ExpressionAsChannel*/ )?
		public Group getGroup_3_1() { return cGroup_3_1; }
		
		//( '<==' | 'via' )
		public Alternatives getAlternatives_3_1_0() { return cAlternatives_3_1_0; }
		
		//'<=='
		public Keyword getLessThanSignEqualsSignEqualsSignKeyword_3_1_0_0() { return cLessThanSignEqualsSignEqualsSignKeyword_3_1_0_0; }
		
		//'via'
		public Keyword getViaKeyword_3_1_0_1() { return cViaKeyword_3_1_0_1; }
		
		//route=[fmlInfra::Channel|ESUfid]
		public Assignment getRouteAssignment_3_1_1() { return cRouteAssignment_3_1_1; }
		
		//[fmlInfra::Channel|ESUfid]
		public CrossReference getRouteChannelCrossReference_3_1_1_0() { return cRouteChannelCrossReference_3_1_1_0; }
		
		//ESUfid
		public RuleCall getRouteChannelESUfidParserRuleCall_3_1_1_0_1() { return cRouteChannelESUfidParserRuleCall_3_1_1_0_1; }
		
		//';'
		public Keyword getSemicolonKeyword_4() { return cSemicolonKeyword_4; }
	}
	public class ObsOutputComStatementElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ObsOutputComStatement");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cOutputKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cPortAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cPortObsComElementParserRuleCall_1_0 = (RuleCall)cPortAssignment_1.eContents().get(0);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final Assignment cRightValueAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
		private final RuleCall cRightValueExpressionParserRuleCall_2_1_0 = (RuleCall)cRightValueAssignment_2_1.eContents().get(0);
		private final Group cGroup_2_2 = (Group)cGroup_2.eContents().get(2);
		private final Keyword cCommaKeyword_2_2_0 = (Keyword)cGroup_2_2.eContents().get(0);
		private final Assignment cRightValueAssignment_2_2_1 = (Assignment)cGroup_2_2.eContents().get(1);
		private final RuleCall cRightValueExpressionParserRuleCall_2_2_1_0 = (RuleCall)cRightValueAssignment_2_2_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_3 = (Keyword)cGroup_2.eContents().get(3);
		private final UnorderedGroup cUnorderedGroup_3 = (UnorderedGroup)cGroup.eContents().get(3);
		private final Group cGroup_3_0 = (Group)cUnorderedGroup_3.eContents().get(0);
		private final Keyword cHyphenMinusHyphenMinusGreaterThanSignKeyword_3_0_0 = (Keyword)cGroup_3_0.eContents().get(0);
		private final Assignment cTargetAssignment_3_0_1 = (Assignment)cGroup_3_0.eContents().get(1);
		private final RuleCall cTargetValuePureNamedMachineExpressionParserRuleCall_3_0_1_0 = (RuleCall)cTargetAssignment_3_0_1.eContents().get(0);
		private final Group cGroup_3_1 = (Group)cUnorderedGroup_3.eContents().get(1);
		private final Alternatives cAlternatives_3_1_0 = (Alternatives)cGroup_3_1.eContents().get(0);
		private final Keyword cEqualsSignEqualsSignGreaterThanSignKeyword_3_1_0_0 = (Keyword)cAlternatives_3_1_0.eContents().get(0);
		private final Keyword cViaKeyword_3_1_0_1 = (Keyword)cAlternatives_3_1_0.eContents().get(1);
		private final Assignment cRouteAssignment_3_1_1 = (Assignment)cGroup_3_1.eContents().get(1);
		private final CrossReference cRouteChannelCrossReference_3_1_1_0 = (CrossReference)cRouteAssignment_3_1_1.eContents().get(0);
		private final RuleCall cRouteChannelESUfidParserRuleCall_3_1_1_0_1 = (RuleCall)cRouteChannelCrossReference_3_1_1_0.eContents().get(1);
		private final Keyword cSemicolonKeyword_4 = (Keyword)cGroup.eContents().get(4);
		
		//ObsOutputComStatement returns fmlStmnt::OutputComStatement
		//    : 'output' port=ObsComElement
		//        ( '(' rightValue+=Expression ( ',' rightValue+=Expression )* ')' )?
		//        ( ( '-->' target=ValuePureNamedMachineExpression )?
		//        & ( ( '==>' | 'via' ) route=[fmlInfra::Channel|ESUfid]/*ExpressionAsChannel*/ )?
		//        ) ';'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//'output' port=ObsComElement
		//       ( '(' rightValue+=Expression ( ',' rightValue+=Expression )* ')' )?
		//       ( ( '-->' target=ValuePureNamedMachineExpression )?
		//       & ( ( '==>' | 'via' ) route=[fmlInfra::Channel|ESUfid]/*ExpressionAsChannel*/ )?
		//       ) ';'
		public Group getGroup() { return cGroup; }
		
		//'output'
		public Keyword getOutputKeyword_0() { return cOutputKeyword_0; }
		
		//port=ObsComElement
		public Assignment getPortAssignment_1() { return cPortAssignment_1; }
		
		//ObsComElement
		public RuleCall getPortObsComElementParserRuleCall_1_0() { return cPortObsComElementParserRuleCall_1_0; }
		
		//( '(' rightValue+=Expression ( ',' rightValue+=Expression )* ')' )?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//rightValue+=Expression
		public Assignment getRightValueAssignment_2_1() { return cRightValueAssignment_2_1; }
		
		//Expression
		public RuleCall getRightValueExpressionParserRuleCall_2_1_0() { return cRightValueExpressionParserRuleCall_2_1_0; }
		
		//( ',' rightValue+=Expression )*
		public Group getGroup_2_2() { return cGroup_2_2; }
		
		//','
		public Keyword getCommaKeyword_2_2_0() { return cCommaKeyword_2_2_0; }
		
		//rightValue+=Expression
		public Assignment getRightValueAssignment_2_2_1() { return cRightValueAssignment_2_2_1; }
		
		//Expression
		public RuleCall getRightValueExpressionParserRuleCall_2_2_1_0() { return cRightValueExpressionParserRuleCall_2_2_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_3() { return cRightParenthesisKeyword_2_3; }
		
		//( ( '-->' target=ValuePureNamedMachineExpression )?
		//& ( ( '==>' | 'via' ) route=[fmlInfra::Channel|ESUfid]/*ExpressionAsChannel*/ )?
		//)
		public UnorderedGroup getUnorderedGroup_3() { return cUnorderedGroup_3; }
		
		//( '-->' target=ValuePureNamedMachineExpression )?
		public Group getGroup_3_0() { return cGroup_3_0; }
		
		//'-->'
		public Keyword getHyphenMinusHyphenMinusGreaterThanSignKeyword_3_0_0() { return cHyphenMinusHyphenMinusGreaterThanSignKeyword_3_0_0; }
		
		//target=ValuePureNamedMachineExpression
		public Assignment getTargetAssignment_3_0_1() { return cTargetAssignment_3_0_1; }
		
		//ValuePureNamedMachineExpression
		public RuleCall getTargetValuePureNamedMachineExpressionParserRuleCall_3_0_1_0() { return cTargetValuePureNamedMachineExpressionParserRuleCall_3_0_1_0; }
		
		//( ( '==>' | 'via' ) route=[fmlInfra::Channel|ESUfid]/*ExpressionAsChannel*/ )?
		public Group getGroup_3_1() { return cGroup_3_1; }
		
		//( '==>' | 'via' )
		public Alternatives getAlternatives_3_1_0() { return cAlternatives_3_1_0; }
		
		//'==>'
		public Keyword getEqualsSignEqualsSignGreaterThanSignKeyword_3_1_0_0() { return cEqualsSignEqualsSignGreaterThanSignKeyword_3_1_0_0; }
		
		//'via'
		public Keyword getViaKeyword_3_1_0_1() { return cViaKeyword_3_1_0_1; }
		
		//route=[fmlInfra::Channel|ESUfid]
		public Assignment getRouteAssignment_3_1_1() { return cRouteAssignment_3_1_1; }
		
		//[fmlInfra::Channel|ESUfid]
		public CrossReference getRouteChannelCrossReference_3_1_1_0() { return cRouteChannelCrossReference_3_1_1_0; }
		
		//ESUfid
		public RuleCall getRouteChannelESUfidParserRuleCall_3_1_1_0_1() { return cRouteChannelESUfidParserRuleCall_3_1_1_0_1; }
		
		//';'
		public Keyword getSemicolonKeyword_4() { return cSemicolonKeyword_4; }
	}
	public class ObsComElementElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ObsComElement");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cParentAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cParentLiteralPureReferenceExpressionParserRuleCall_0_0 = (RuleCall)cParentAssignment_0.eContents().get(0);
		private final Assignment cElementAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final CrossReference cElementNamedElementCrossReference_1_0 = (CrossReference)cElementAssignment_1.eContents().get(0);
		private final RuleCall cElementNamedElementESIdentifierParserRuleCall_1_0_1 = (RuleCall)cElementNamedElementCrossReference_1_0.eContents().get(1);
		
		//ObsComElement returns fmlExpr::ValueElementSpecification
		//    : ( parent=LiteralPureReferenceExpression
		////    : ( parent=ValuePureNamedInstanceExpression
		////        // ( '.' | '->' ) element
		////        kind=( ValueDotFieldExpressionKind | ValueArrowFieldExpressionKind )
		//      )?
		//      element=[fmlCommon::NamedElement|ESIdentifier]
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		// ( parent=LiteralPureReferenceExpression
		////    : ( parent=ValuePureNamedInstanceExpression
		////        // ( '.' | '->' ) element
		////        kind=( ValueDotFieldExpressionKind | ValueArrowFieldExpressionKind )
		//      )?
		//      element=[fmlCommon::NamedElement|ESIdentifier]
		public Group getGroup() { return cGroup; }
		
		// ( parent=LiteralPureReferenceExpression
		////    : ( parent=ValuePureNamedInstanceExpression
		////        // ( '.' | '->' ) element
		////        kind=( ValueDotFieldExpressionKind | ValueArrowFieldExpressionKind )
		//      )?
		public Assignment getParentAssignment_0() { return cParentAssignment_0; }
		
		//LiteralPureReferenceExpression
		public RuleCall getParentLiteralPureReferenceExpressionParserRuleCall_0_0() { return cParentLiteralPureReferenceExpressionParserRuleCall_0_0; }
		
		//element=[fmlCommon::NamedElement|ESIdentifier]
		public Assignment getElementAssignment_1() { return cElementAssignment_1; }
		
		//[fmlCommon::NamedElement|ESIdentifier]
		public CrossReference getElementNamedElementCrossReference_1_0() { return cElementNamedElementCrossReference_1_0; }
		
		//ESIdentifier
		public RuleCall getElementNamedElementESIdentifierParserRuleCall_1_0_1() { return cElementNamedElementESIdentifierParserRuleCall_1_0_1; }
	}
	public class MetaStatementElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.MetaStatement");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cMetaStatementAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cOpAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cOpOPERATOR_METAEnumRuleCall_1_0 = (RuleCall)cOpAssignment_1.eContents().get(0);
		private final Alternatives cAlternatives_2 = (Alternatives)cGroup.eContents().get(2);
		private final Group cGroup_2_0 = (Group)cAlternatives_2.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_2_0_0 = (Keyword)cGroup_2_0.eContents().get(0);
		private final Alternatives cAlternatives_2_0_1 = (Alternatives)cGroup_2_0.eContents().get(1);
		private final Assignment cOperandAssignment_2_0_1_0 = (Assignment)cAlternatives_2_0_1.eContents().get(0);
		private final RuleCall cOperandStatementParserRuleCall_2_0_1_0_0 = (RuleCall)cOperandAssignment_2_0_1_0.eContents().get(0);
		private final Assignment cOperandAssignment_2_0_1_1 = (Assignment)cAlternatives_2_0_1.eContents().get(1);
		private final RuleCall cOperandExpressionParserRuleCall_2_0_1_1_0 = (RuleCall)cOperandAssignment_2_0_1_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_2_0_2 = (Keyword)cGroup_2_0.eContents().get(2);
		private final Group cGroup_2_1 = (Group)cAlternatives_2.eContents().get(1);
		private final Assignment cOperandAssignment_2_1_0 = (Assignment)cGroup_2_1.eContents().get(0);
		private final RuleCall cOperandExpressionParserRuleCall_2_1_0_0 = (RuleCall)cOperandAssignment_2_1_0.eContents().get(0);
		private final Keyword cSemicolonKeyword_2_1_1 = (Keyword)cGroup_2_1.eContents().get(1);
		
		////ValuePureNamedInstanceExpression returns fmlExpr::Expression
		////    : LiteralPureReferenceExpression
		////
		////        // ( '.' | '->' ) element
		////        ( { fmlExpr::ValueElementSpecification.parent=current }
		//////            kind=(ValueDotFieldExpressionKind | ValueArrowFieldExpressionKind )
		////            kind=ValueDotFieldExpressionKind
		////            element=[fmlCommon::NamedElement|ESIdentifier]
		////        )*
		////    ;
		/////////////////////////////////////////////
		////// MetaStatement Rules
		/////////////////////////////////////////////
		//MetaStatement returns fmlStmnt::MetaStatement
		//    : {fmlStmnt::MetaStatement}
		//        op=OPERATOR_META
		//        ( '{'
		//            ( ( operand+=Statement  )+
		//            | ( operand+=Expression )+
		//            )
		//            '}'
		//        | ( operand+=Expression )+  ';'
		//          )
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlStmnt::MetaStatement}
		//       op=OPERATOR_META
		//       ( '{'
		//           ( ( operand+=Statement  )+
		//           | ( operand+=Expression )+
		//           )
		//           '}'
		//       | ( operand+=Expression )+  ';'
		//         )
		public Group getGroup() { return cGroup; }
		
		//{fmlStmnt::MetaStatement}
		public Action getMetaStatementAction_0() { return cMetaStatementAction_0; }
		
		//op=OPERATOR_META
		public Assignment getOpAssignment_1() { return cOpAssignment_1; }
		
		//OPERATOR_META
		public RuleCall getOpOPERATOR_METAEnumRuleCall_1_0() { return cOpOPERATOR_METAEnumRuleCall_1_0; }
		
		//( '{'
		//    ( ( operand+=Statement  )+
		//    | ( operand+=Expression )+
		//    )
		//    '}'
		//| ( operand+=Expression )+  ';'
		//  )
		public Alternatives getAlternatives_2() { return cAlternatives_2; }
		
		//'{'
		//           ( ( operand+=Statement  )+
		//           | ( operand+=Expression )+
		//           )
		//           '}'
		public Group getGroup_2_0() { return cGroup_2_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_2_0_0() { return cLeftCurlyBracketKeyword_2_0_0; }
		
		//( ( operand+=Statement  )+
		//| ( operand+=Expression )+
		//)
		public Alternatives getAlternatives_2_0_1() { return cAlternatives_2_0_1; }
		
		//( operand+=Statement  )+
		public Assignment getOperandAssignment_2_0_1_0() { return cOperandAssignment_2_0_1_0; }
		
		//Statement
		public RuleCall getOperandStatementParserRuleCall_2_0_1_0_0() { return cOperandStatementParserRuleCall_2_0_1_0_0; }
		
		//( operand+=Expression )+
		public Assignment getOperandAssignment_2_0_1_1() { return cOperandAssignment_2_0_1_1; }
		
		//Expression
		public RuleCall getOperandExpressionParserRuleCall_2_0_1_1_0() { return cOperandExpressionParserRuleCall_2_0_1_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_2_0_2() { return cRightCurlyBracketKeyword_2_0_2; }
		
		//( operand+=Expression )+  ';'
		public Group getGroup_2_1() { return cGroup_2_1; }
		
		//( operand+=Expression )+
		public Assignment getOperandAssignment_2_1_0() { return cOperandAssignment_2_1_0; }
		
		//Expression
		public RuleCall getOperandExpressionParserRuleCall_2_1_0_0() { return cOperandExpressionParserRuleCall_2_1_0_0; }
		
		//';'
		public Keyword getSemicolonKeyword_2_1_1() { return cSemicolonKeyword_2_1_1; }
	}
	public class ExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.Expression");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cAssignmentExpressionParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cConditionalTestExpressionParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		
		//////////////////////////////////////////////////////////////////////////////////
		//// Expression Rules
		//////////////////////////////////////////////////////////////////////////////////
		//Expression returns fmlExpr::Expression
		//    : AssignmentExpression
		//    | ConditionalTestExpression
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//AssignmentExpression
		//   | ConditionalTestExpression
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//AssignmentExpression
		public RuleCall getAssignmentExpressionParserRuleCall_0() { return cAssignmentExpressionParserRuleCall_0; }
		
		//ConditionalTestExpression
		public RuleCall getConditionalTestExpressionParserRuleCall_1() { return cConditionalTestExpressionParserRuleCall_1; }
	}
	public class AssignmentExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.AssignmentExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cLeftHandSideAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cLeftHandSideLeftHandSideExpressionParserRuleCall_0_0 = (RuleCall)cLeftHandSideAssignment_0.eContents().get(0);
		private final Assignment cOperatorAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cOperatorAssignmentOperatorParserRuleCall_1_0 = (RuleCall)cOperatorAssignment_1.eContents().get(0);
		private final Assignment cRightHandSideAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cRightHandSideExpressionParserRuleCall_2_0 = (RuleCall)cRightHandSideAssignment_2.eContents().get(0);
		
		//// Assignment Expression
		//AssignmentExpression returns fmlExpr::AssignmentExpression
		//    : leftHandSide=LeftHandSideExpression
		//        operator=AssignmentOperator rightHandSide=Expression
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//leftHandSide=LeftHandSideExpression
		//       operator=AssignmentOperator rightHandSide=Expression
		public Group getGroup() { return cGroup; }
		
		//leftHandSide=LeftHandSideExpression
		public Assignment getLeftHandSideAssignment_0() { return cLeftHandSideAssignment_0; }
		
		//LeftHandSideExpression
		public RuleCall getLeftHandSideLeftHandSideExpressionParserRuleCall_0_0() { return cLeftHandSideLeftHandSideExpressionParserRuleCall_0_0; }
		
		//operator=AssignmentOperator
		public Assignment getOperatorAssignment_1() { return cOperatorAssignment_1; }
		
		//AssignmentOperator
		public RuleCall getOperatorAssignmentOperatorParserRuleCall_1_0() { return cOperatorAssignmentOperatorParserRuleCall_1_0; }
		
		//rightHandSide=Expression
		public Assignment getRightHandSideAssignment_2() { return cRightHandSideAssignment_2; }
		
		//Expression
		public RuleCall getRightHandSideExpressionParserRuleCall_2_0() { return cRightHandSideExpressionParserRuleCall_2_0; }
	}
	public class AssignmentOperatorElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.AssignmentOperator");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final Keyword cEqualsSignKeyword_0 = (Keyword)cAlternatives.eContents().get(0);
		private final Keyword cColonEqualsSignKeyword_1 = (Keyword)cAlternatives.eContents().get(1);
		private final Keyword cColonColonEqualsSignKeyword_2 = (Keyword)cAlternatives.eContents().get(2);
		private final Keyword cPlusSignEqualsSignKeyword_3 = (Keyword)cAlternatives.eContents().get(3);
		private final Keyword cHyphenMinusEqualsSignKeyword_4 = (Keyword)cAlternatives.eContents().get(4);
		private final Keyword cAsteriskEqualsSignKeyword_5 = (Keyword)cAlternatives.eContents().get(5);
		private final Keyword cSolidusEqualsSignKeyword_6 = (Keyword)cAlternatives.eContents().get(6);
		private final Keyword cPercentSignEqualsSignKeyword_7 = (Keyword)cAlternatives.eContents().get(7);
		private final Keyword cAmpersandAmpersandEqualsSignKeyword_8 = (Keyword)cAlternatives.eContents().get(8);
		private final Keyword cVerticalLineVerticalLineEqualsSignKeyword_9 = (Keyword)cAlternatives.eContents().get(9);
		private final Keyword cAmpersandEqualsSignKeyword_10 = (Keyword)cAlternatives.eContents().get(10);
		private final Keyword cVerticalLineEqualsSignKeyword_11 = (Keyword)cAlternatives.eContents().get(11);
		private final Keyword cCircumflexAccentEqualsSignKeyword_12 = (Keyword)cAlternatives.eContents().get(12);
		private final Keyword cLessThanSignLessThanSignEqualsSignKeyword_13 = (Keyword)cAlternatives.eContents().get(13);
		private final Keyword cGreaterThanSignGreaterThanSignEqualsSignKeyword_14 = (Keyword)cAlternatives.eContents().get(14);
		private final Keyword cGreaterThanSignGreaterThanSignGreaterThanSignEqualsSignKeyword_15 = (Keyword)cAlternatives.eContents().get(15);
		private final Keyword cLessThanSignEqualsSignLessThanSignKeyword_16 = (Keyword)cAlternatives.eContents().get(16);
		private final Keyword cCircumflexAccentEqualsSignLessThanSignKeyword_17 = (Keyword)cAlternatives.eContents().get(17);
		private final Keyword cCircumflexAccentEqualsSignGreaterThanSignKeyword_18 = (Keyword)cAlternatives.eContents().get(18);
		private final Keyword cGreaterThanSignEqualsSignGreaterThanSignKeyword_19 = (Keyword)cAlternatives.eContents().get(19);
		
		//AssignmentOperator
		//    : '='   | ':='  | '::='
		//    | '+='  | '-='
		//    | '*='  | '/='  | '%='
		//    | '&&=' | '||='
		//    | '&='  | '|='    | '^='
		//    | '<<=' | '>>=' | '>>>='
		//// queue operation: push, assign_top, top, pop
		//    | '<=<'
		//    | '^=<'
		//    | '^=>'
		//    | '>=>'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		// '='   | ':='  | '::='
		//    | '+='  | '-='
		//    | '*='  | '/='  | '%='
		//    | '&&=' | '||='
		//    | '&='  | '|='    | '^='
		//    | '<<=' | '>>=' | '>>>='
		//// queue operation: push, assign_top, top, pop
		//    | '<=<'
		//    | '^=<'
		//    | '^=>'
		//    | '>=>'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//'='
		public Keyword getEqualsSignKeyword_0() { return cEqualsSignKeyword_0; }
		
		//':='
		public Keyword getColonEqualsSignKeyword_1() { return cColonEqualsSignKeyword_1; }
		
		//'::='
		public Keyword getColonColonEqualsSignKeyword_2() { return cColonColonEqualsSignKeyword_2; }
		
		//'+='
		public Keyword getPlusSignEqualsSignKeyword_3() { return cPlusSignEqualsSignKeyword_3; }
		
		//'-='
		public Keyword getHyphenMinusEqualsSignKeyword_4() { return cHyphenMinusEqualsSignKeyword_4; }
		
		//'*='
		public Keyword getAsteriskEqualsSignKeyword_5() { return cAsteriskEqualsSignKeyword_5; }
		
		//'/='
		public Keyword getSolidusEqualsSignKeyword_6() { return cSolidusEqualsSignKeyword_6; }
		
		//'%='
		public Keyword getPercentSignEqualsSignKeyword_7() { return cPercentSignEqualsSignKeyword_7; }
		
		//'&&='
		public Keyword getAmpersandAmpersandEqualsSignKeyword_8() { return cAmpersandAmpersandEqualsSignKeyword_8; }
		
		//'||='
		public Keyword getVerticalLineVerticalLineEqualsSignKeyword_9() { return cVerticalLineVerticalLineEqualsSignKeyword_9; }
		
		//'&='
		public Keyword getAmpersandEqualsSignKeyword_10() { return cAmpersandEqualsSignKeyword_10; }
		
		//'|='
		public Keyword getVerticalLineEqualsSignKeyword_11() { return cVerticalLineEqualsSignKeyword_11; }
		
		//'^='
		public Keyword getCircumflexAccentEqualsSignKeyword_12() { return cCircumflexAccentEqualsSignKeyword_12; }
		
		//'<<='
		public Keyword getLessThanSignLessThanSignEqualsSignKeyword_13() { return cLessThanSignLessThanSignEqualsSignKeyword_13; }
		
		//'>>='
		public Keyword getGreaterThanSignGreaterThanSignEqualsSignKeyword_14() { return cGreaterThanSignGreaterThanSignEqualsSignKeyword_14; }
		
		//'>>>='
		public Keyword getGreaterThanSignGreaterThanSignGreaterThanSignEqualsSignKeyword_15() { return cGreaterThanSignGreaterThanSignGreaterThanSignEqualsSignKeyword_15; }
		
		//'<=<'
		public Keyword getLessThanSignEqualsSignLessThanSignKeyword_16() { return cLessThanSignEqualsSignLessThanSignKeyword_16; }
		
		//'^=<'
		public Keyword getCircumflexAccentEqualsSignLessThanSignKeyword_17() { return cCircumflexAccentEqualsSignLessThanSignKeyword_17; }
		
		//'^=>'
		public Keyword getCircumflexAccentEqualsSignGreaterThanSignKeyword_18() { return cCircumflexAccentEqualsSignGreaterThanSignKeyword_18; }
		
		//'>=>'
		public Keyword getGreaterThanSignEqualsSignGreaterThanSignKeyword_19() { return cGreaterThanSignEqualsSignGreaterThanSignKeyword_19; }
	}
	public class LeftHandSideExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LeftHandSideExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLeftHandSideExpressionAction_0 = (Action)cGroup.eContents().get(0);
		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
		private final Assignment cLvalueAssignment_1_0 = (Assignment)cAlternatives_1.eContents().get(0);
		private final RuleCall cLvalueValueSelectionExpressionParserRuleCall_1_0_0 = (RuleCall)cLvalueAssignment_1_0.eContents().get(0);
		private final Group cGroup_1_1 = (Group)cAlternatives_1.eContents().get(1);
		private final Keyword cLeftParenthesisKeyword_1_1_0 = (Keyword)cGroup_1_1.eContents().get(0);
		private final Assignment cLvalueAssignment_1_1_1 = (Assignment)cGroup_1_1.eContents().get(1);
		private final RuleCall cLvalueValueSelectionExpressionParserRuleCall_1_1_1_0 = (RuleCall)cLvalueAssignment_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_1_1_2 = (Keyword)cGroup_1_1.eContents().get(2);
		
		//LeftHandSideExpression returns fmlExpr::LeftHandSideExpression
		//    : { fmlExpr::LeftHandSideExpression }
		////        lvalue=PrimaryExpression
		//        ( lvalue=ValueSelectionExpression
		//        | '(' lvalue=ValueSelectionExpression ')'
		//        )
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		// { fmlExpr::LeftHandSideExpression }
		////        lvalue=PrimaryExpression
		//        ( lvalue=ValueSelectionExpression
		//        | '(' lvalue=ValueSelectionExpression ')'
		//        )
		public Group getGroup() { return cGroup; }
		
		//{ fmlExpr::LeftHandSideExpression }
		public Action getLeftHandSideExpressionAction_0() { return cLeftHandSideExpressionAction_0; }
		
		////        lvalue=PrimaryExpression
		//        ( lvalue=ValueSelectionExpression
		//        | '(' lvalue=ValueSelectionExpression ')'
		//        )
		public Alternatives getAlternatives_1() { return cAlternatives_1; }
		
		//lvalue=ValueSelectionExpression
		public Assignment getLvalueAssignment_1_0() { return cLvalueAssignment_1_0; }
		
		//ValueSelectionExpression
		public RuleCall getLvalueValueSelectionExpressionParserRuleCall_1_0_0() { return cLvalueValueSelectionExpressionParserRuleCall_1_0_0; }
		
		//'(' lvalue=ValueSelectionExpression ')'
		public Group getGroup_1_1() { return cGroup_1_1; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_1_1_0() { return cLeftParenthesisKeyword_1_1_0; }
		
		//lvalue=ValueSelectionExpression
		public Assignment getLvalueAssignment_1_1_1() { return cLvalueAssignment_1_1_1; }
		
		//ValueSelectionExpression
		public RuleCall getLvalueValueSelectionExpressionParserRuleCall_1_1_1_0() { return cLvalueValueSelectionExpressionParserRuleCall_1_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_1_1_2() { return cRightParenthesisKeyword_1_1_2; }
	}
	public class ConditionalTestExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ConditionalTestExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final RuleCall cLogicalOrExpressionParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Action cConditionalTestExpressionConditionAction_1_0 = (Action)cGroup_1.eContents().get(0);
		private final Assignment cOperatorAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final Keyword cOperatorQuestionMarkKeyword_1_1_0 = (Keyword)cOperatorAssignment_1_1.eContents().get(0);
		private final Assignment cThenOperandAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
		private final RuleCall cThenOperandExpressionParserRuleCall_1_2_0 = (RuleCall)cThenOperandAssignment_1_2.eContents().get(0);
		private final Assignment cElseSeparatorAssignment_1_3 = (Assignment)cGroup_1.eContents().get(3);
		private final Keyword cElseSeparatorColonKeyword_1_3_0 = (Keyword)cElseSeparatorAssignment_1_3.eContents().get(0);
		private final Assignment cElseOperandAssignment_1_4 = (Assignment)cGroup_1.eContents().get(4);
		private final RuleCall cElseOperandExpressionParserRuleCall_1_4_0 = (RuleCall)cElseOperandAssignment_1_4.eContents().get(0);
		
		//// Conditional Test Expression
		//ConditionalTestExpression returns fmlExpr::Expression
		//    : LogicalOrExpression
		//        ( {fmlExpr::ConditionalTestExpression.condition=current}
		//            operator='?' thenOperand=Expression elseSeparator=':'
		//            elseOperand=Expression
		//        )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//LogicalOrExpression
		//       ( {fmlExpr::ConditionalTestExpression.condition=current}
		//           operator='?' thenOperand=Expression elseSeparator=':'
		//           elseOperand=Expression
		//       )?
		public Group getGroup() { return cGroup; }
		
		//LogicalOrExpression
		public RuleCall getLogicalOrExpressionParserRuleCall_0() { return cLogicalOrExpressionParserRuleCall_0; }
		
		//( {fmlExpr::ConditionalTestExpression.condition=current}
		//    operator='?' thenOperand=Expression elseSeparator=':'
		//    elseOperand=Expression
		//)?
		public Group getGroup_1() { return cGroup_1; }
		
		//{fmlExpr::ConditionalTestExpression.condition=current}
		public Action getConditionalTestExpressionConditionAction_1_0() { return cConditionalTestExpressionConditionAction_1_0; }
		
		//operator='?'
		public Assignment getOperatorAssignment_1_1() { return cOperatorAssignment_1_1; }
		
		//'?'
		public Keyword getOperatorQuestionMarkKeyword_1_1_0() { return cOperatorQuestionMarkKeyword_1_1_0; }
		
		//thenOperand=Expression
		public Assignment getThenOperandAssignment_1_2() { return cThenOperandAssignment_1_2; }
		
		//Expression
		public RuleCall getThenOperandExpressionParserRuleCall_1_2_0() { return cThenOperandExpressionParserRuleCall_1_2_0; }
		
		//elseSeparator=':'
		public Assignment getElseSeparatorAssignment_1_3() { return cElseSeparatorAssignment_1_3; }
		
		//':'
		public Keyword getElseSeparatorColonKeyword_1_3_0() { return cElseSeparatorColonKeyword_1_3_0; }
		
		//elseOperand=Expression
		public Assignment getElseOperandAssignment_1_4() { return cElseOperandAssignment_1_4; }
		
		//Expression
		public RuleCall getElseOperandExpressionParserRuleCall_1_4_0() { return cElseOperandExpressionParserRuleCall_1_4_0; }
	}
	public class LogicalOrExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LogicalOrExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final RuleCall cLogicalAndExpressionParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Action cLogicalAssociativeExpressionOperandAction_1_0 = (Action)cGroup_1.eContents().get(0);
		private final Assignment cOperatorAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final Alternatives cOperatorAlternatives_1_1_0 = (Alternatives)cOperatorAssignment_1_1.eContents().get(0);
		private final Keyword cOperatorVerticalLineVerticalLineKeyword_1_1_0_0 = (Keyword)cOperatorAlternatives_1_1_0.eContents().get(0);
		private final Keyword cOperatorOrKeyword_1_1_0_1 = (Keyword)cOperatorAlternatives_1_1_0.eContents().get(1);
		private final Assignment cOperandAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
		private final RuleCall cOperandLogicalAndExpressionParserRuleCall_1_2_0 = (RuleCall)cOperandAssignment_1_2.eContents().get(0);
		private final Group cGroup_1_3 = (Group)cGroup_1.eContents().get(3);
		private final Alternatives cAlternatives_1_3_0 = (Alternatives)cGroup_1_3.eContents().get(0);
		private final Keyword cVerticalLineVerticalLineKeyword_1_3_0_0 = (Keyword)cAlternatives_1_3_0.eContents().get(0);
		private final Keyword cOrKeyword_1_3_0_1 = (Keyword)cAlternatives_1_3_0.eContents().get(1);
		private final Assignment cOperandAssignment_1_3_1 = (Assignment)cGroup_1_3.eContents().get(1);
		private final RuleCall cOperandLogicalAndExpressionParserRuleCall_1_3_1_0 = (RuleCall)cOperandAssignment_1_3_1.eContents().get(0);
		
		//// Logical Expression
		//LogicalOrExpression returns fmlExpr::Expression
		//    : LogicalAndExpression
		//        ( {fmlExpr::LogicalAssociativeExpression.operand+=current}
		//            operator=( '||' | 'or' ) operand+=LogicalAndExpression
		//            ( ( '||' | 'or' ) operand+=LogicalAndExpression )*
		//        )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//LogicalAndExpression
		//       ( {fmlExpr::LogicalAssociativeExpression.operand+=current}
		//           operator=( '||' | 'or' ) operand+=LogicalAndExpression
		//           ( ( '||' | 'or' ) operand+=LogicalAndExpression )*
		//       )?
		public Group getGroup() { return cGroup; }
		
		//LogicalAndExpression
		public RuleCall getLogicalAndExpressionParserRuleCall_0() { return cLogicalAndExpressionParserRuleCall_0; }
		
		//( {fmlExpr::LogicalAssociativeExpression.operand+=current}
		//    operator=( '||' | 'or' ) operand+=LogicalAndExpression
		//    ( ( '||' | 'or' ) operand+=LogicalAndExpression )*
		//)?
		public Group getGroup_1() { return cGroup_1; }
		
		//{fmlExpr::LogicalAssociativeExpression.operand+=current}
		public Action getLogicalAssociativeExpressionOperandAction_1_0() { return cLogicalAssociativeExpressionOperandAction_1_0; }
		
		//operator=( '||' | 'or' )
		public Assignment getOperatorAssignment_1_1() { return cOperatorAssignment_1_1; }
		
		//( '||' | 'or' )
		public Alternatives getOperatorAlternatives_1_1_0() { return cOperatorAlternatives_1_1_0; }
		
		//'||'
		public Keyword getOperatorVerticalLineVerticalLineKeyword_1_1_0_0() { return cOperatorVerticalLineVerticalLineKeyword_1_1_0_0; }
		
		//'or'
		public Keyword getOperatorOrKeyword_1_1_0_1() { return cOperatorOrKeyword_1_1_0_1; }
		
		//operand+=LogicalAndExpression
		public Assignment getOperandAssignment_1_2() { return cOperandAssignment_1_2; }
		
		//LogicalAndExpression
		public RuleCall getOperandLogicalAndExpressionParserRuleCall_1_2_0() { return cOperandLogicalAndExpressionParserRuleCall_1_2_0; }
		
		//( ( '||' | 'or' ) operand+=LogicalAndExpression )*
		public Group getGroup_1_3() { return cGroup_1_3; }
		
		//( '||' | 'or' )
		public Alternatives getAlternatives_1_3_0() { return cAlternatives_1_3_0; }
		
		//'||'
		public Keyword getVerticalLineVerticalLineKeyword_1_3_0_0() { return cVerticalLineVerticalLineKeyword_1_3_0_0; }
		
		//'or'
		public Keyword getOrKeyword_1_3_0_1() { return cOrKeyword_1_3_0_1; }
		
		//operand+=LogicalAndExpression
		public Assignment getOperandAssignment_1_3_1() { return cOperandAssignment_1_3_1; }
		
		//LogicalAndExpression
		public RuleCall getOperandLogicalAndExpressionParserRuleCall_1_3_1_0() { return cOperandLogicalAndExpressionParserRuleCall_1_3_1_0; }
	}
	public class LogicalAndExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LogicalAndExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final RuleCall cBitwiseOrExpressionParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Action cLogicalAssociativeExpressionOperandAction_1_0 = (Action)cGroup_1.eContents().get(0);
		private final Assignment cOperatorAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final Alternatives cOperatorAlternatives_1_1_0 = (Alternatives)cOperatorAssignment_1_1.eContents().get(0);
		private final Keyword cOperatorAmpersandAmpersandKeyword_1_1_0_0 = (Keyword)cOperatorAlternatives_1_1_0.eContents().get(0);
		private final Keyword cOperatorAndKeyword_1_1_0_1 = (Keyword)cOperatorAlternatives_1_1_0.eContents().get(1);
		private final Assignment cOperandAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
		private final RuleCall cOperandBitwiseOrExpressionParserRuleCall_1_2_0 = (RuleCall)cOperandAssignment_1_2.eContents().get(0);
		private final Group cGroup_1_3 = (Group)cGroup_1.eContents().get(3);
		private final Alternatives cAlternatives_1_3_0 = (Alternatives)cGroup_1_3.eContents().get(0);
		private final Keyword cAmpersandAmpersandKeyword_1_3_0_0 = (Keyword)cAlternatives_1_3_0.eContents().get(0);
		private final Keyword cAndKeyword_1_3_0_1 = (Keyword)cAlternatives_1_3_0.eContents().get(1);
		private final Assignment cOperandAssignment_1_3_1 = (Assignment)cGroup_1_3.eContents().get(1);
		private final RuleCall cOperandBitwiseOrExpressionParserRuleCall_1_3_1_0 = (RuleCall)cOperandAssignment_1_3_1.eContents().get(0);
		
		//LogicalAndExpression returns fmlExpr::Expression
		//    : BitwiseOrExpression
		//        ( {fmlExpr::LogicalAssociativeExpression.operand+=current}
		//            operator=( '&&' | 'and' ) operand+=BitwiseOrExpression
		//            ( ( '&&' | 'and' ) operand+=BitwiseOrExpression )*
		//        )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//BitwiseOrExpression
		//       ( {fmlExpr::LogicalAssociativeExpression.operand+=current}
		//           operator=( '&&' | 'and' ) operand+=BitwiseOrExpression
		//           ( ( '&&' | 'and' ) operand+=BitwiseOrExpression )*
		//       )?
		public Group getGroup() { return cGroup; }
		
		//BitwiseOrExpression
		public RuleCall getBitwiseOrExpressionParserRuleCall_0() { return cBitwiseOrExpressionParserRuleCall_0; }
		
		//( {fmlExpr::LogicalAssociativeExpression.operand+=current}
		//    operator=( '&&' | 'and' ) operand+=BitwiseOrExpression
		//    ( ( '&&' | 'and' ) operand+=BitwiseOrExpression )*
		//)?
		public Group getGroup_1() { return cGroup_1; }
		
		//{fmlExpr::LogicalAssociativeExpression.operand+=current}
		public Action getLogicalAssociativeExpressionOperandAction_1_0() { return cLogicalAssociativeExpressionOperandAction_1_0; }
		
		//operator=( '&&' | 'and' )
		public Assignment getOperatorAssignment_1_1() { return cOperatorAssignment_1_1; }
		
		//( '&&' | 'and' )
		public Alternatives getOperatorAlternatives_1_1_0() { return cOperatorAlternatives_1_1_0; }
		
		//'&&'
		public Keyword getOperatorAmpersandAmpersandKeyword_1_1_0_0() { return cOperatorAmpersandAmpersandKeyword_1_1_0_0; }
		
		//'and'
		public Keyword getOperatorAndKeyword_1_1_0_1() { return cOperatorAndKeyword_1_1_0_1; }
		
		//operand+=BitwiseOrExpression
		public Assignment getOperandAssignment_1_2() { return cOperandAssignment_1_2; }
		
		//BitwiseOrExpression
		public RuleCall getOperandBitwiseOrExpressionParserRuleCall_1_2_0() { return cOperandBitwiseOrExpressionParserRuleCall_1_2_0; }
		
		//( ( '&&' | 'and' ) operand+=BitwiseOrExpression )*
		public Group getGroup_1_3() { return cGroup_1_3; }
		
		//( '&&' | 'and' )
		public Alternatives getAlternatives_1_3_0() { return cAlternatives_1_3_0; }
		
		//'&&'
		public Keyword getAmpersandAmpersandKeyword_1_3_0_0() { return cAmpersandAmpersandKeyword_1_3_0_0; }
		
		//'and'
		public Keyword getAndKeyword_1_3_0_1() { return cAndKeyword_1_3_0_1; }
		
		//operand+=BitwiseOrExpression
		public Assignment getOperandAssignment_1_3_1() { return cOperandAssignment_1_3_1; }
		
		//BitwiseOrExpression
		public RuleCall getOperandBitwiseOrExpressionParserRuleCall_1_3_1_0() { return cOperandBitwiseOrExpressionParserRuleCall_1_3_1_0; }
	}
	public class BitwiseOrExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.BitwiseOrExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final RuleCall cBitwiseXorExpressionParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Action cBitwiseAssociativeExpressionOperandAction_1_0 = (Action)cGroup_1.eContents().get(0);
		private final Assignment cOperatorAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final Keyword cOperatorVerticalLineKeyword_1_1_0 = (Keyword)cOperatorAssignment_1_1.eContents().get(0);
		private final Assignment cOperandAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
		private final RuleCall cOperandBitwiseXorExpressionParserRuleCall_1_2_0 = (RuleCall)cOperandAssignment_1_2.eContents().get(0);
		private final Group cGroup_1_3 = (Group)cGroup_1.eContents().get(3);
		private final Keyword cVerticalLineKeyword_1_3_0 = (Keyword)cGroup_1_3.eContents().get(0);
		private final Assignment cOperandAssignment_1_3_1 = (Assignment)cGroup_1_3.eContents().get(1);
		private final RuleCall cOperandBitwiseXorExpressionParserRuleCall_1_3_1_0 = (RuleCall)cOperandAssignment_1_3_1.eContents().get(0);
		
		//// Bitwise Expression
		//BitwiseOrExpression returns fmlExpr::Expression
		//    : BitwiseXorExpression
		//        ( {fmlExpr::BitwiseAssociativeExpression.operand+=current}
		//            operator='|' operand+=BitwiseXorExpression
		//            ( '|' operand+=BitwiseXorExpression )*
		//        )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//BitwiseXorExpression
		//       ( {fmlExpr::BitwiseAssociativeExpression.operand+=current}
		//           operator='|' operand+=BitwiseXorExpression
		//           ( '|' operand+=BitwiseXorExpression )*
		//       )?
		public Group getGroup() { return cGroup; }
		
		//BitwiseXorExpression
		public RuleCall getBitwiseXorExpressionParserRuleCall_0() { return cBitwiseXorExpressionParserRuleCall_0; }
		
		//( {fmlExpr::BitwiseAssociativeExpression.operand+=current}
		//    operator='|' operand+=BitwiseXorExpression
		//    ( '|' operand+=BitwiseXorExpression )*
		//)?
		public Group getGroup_1() { return cGroup_1; }
		
		//{fmlExpr::BitwiseAssociativeExpression.operand+=current}
		public Action getBitwiseAssociativeExpressionOperandAction_1_0() { return cBitwiseAssociativeExpressionOperandAction_1_0; }
		
		//operator='|'
		public Assignment getOperatorAssignment_1_1() { return cOperatorAssignment_1_1; }
		
		//'|'
		public Keyword getOperatorVerticalLineKeyword_1_1_0() { return cOperatorVerticalLineKeyword_1_1_0; }
		
		//operand+=BitwiseXorExpression
		public Assignment getOperandAssignment_1_2() { return cOperandAssignment_1_2; }
		
		//BitwiseXorExpression
		public RuleCall getOperandBitwiseXorExpressionParserRuleCall_1_2_0() { return cOperandBitwiseXorExpressionParserRuleCall_1_2_0; }
		
		//( '|' operand+=BitwiseXorExpression )*
		public Group getGroup_1_3() { return cGroup_1_3; }
		
		//'|'
		public Keyword getVerticalLineKeyword_1_3_0() { return cVerticalLineKeyword_1_3_0; }
		
		//operand+=BitwiseXorExpression
		public Assignment getOperandAssignment_1_3_1() { return cOperandAssignment_1_3_1; }
		
		//BitwiseXorExpression
		public RuleCall getOperandBitwiseXorExpressionParserRuleCall_1_3_1_0() { return cOperandBitwiseXorExpressionParserRuleCall_1_3_1_0; }
	}
	public class BitwiseXorExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.BitwiseXorExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final RuleCall cBitwiseAndExpressionParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Action cBitwiseAssociativeExpressionOperandAction_1_0 = (Action)cGroup_1.eContents().get(0);
		private final Assignment cOperatorAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final Keyword cOperatorCircumflexAccentKeyword_1_1_0 = (Keyword)cOperatorAssignment_1_1.eContents().get(0);
		private final Assignment cOperandAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
		private final RuleCall cOperandBitwiseAndExpressionParserRuleCall_1_2_0 = (RuleCall)cOperandAssignment_1_2.eContents().get(0);
		private final Group cGroup_1_3 = (Group)cGroup_1.eContents().get(3);
		private final Keyword cCircumflexAccentKeyword_1_3_0 = (Keyword)cGroup_1_3.eContents().get(0);
		private final Assignment cOperandAssignment_1_3_1 = (Assignment)cGroup_1_3.eContents().get(1);
		private final RuleCall cOperandBitwiseAndExpressionParserRuleCall_1_3_1_0 = (RuleCall)cOperandAssignment_1_3_1.eContents().get(0);
		
		//BitwiseXorExpression returns fmlExpr::Expression
		//    : BitwiseAndExpression
		//        ( {fmlExpr::BitwiseAssociativeExpression.operand+=current}
		//            operator='^' operand+=BitwiseAndExpression
		//            ( '^' operand+=BitwiseAndExpression )*
		//        )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//BitwiseAndExpression
		//       ( {fmlExpr::BitwiseAssociativeExpression.operand+=current}
		//           operator='^' operand+=BitwiseAndExpression
		//           ( '^' operand+=BitwiseAndExpression )*
		//       )?
		public Group getGroup() { return cGroup; }
		
		//BitwiseAndExpression
		public RuleCall getBitwiseAndExpressionParserRuleCall_0() { return cBitwiseAndExpressionParserRuleCall_0; }
		
		//( {fmlExpr::BitwiseAssociativeExpression.operand+=current}
		//    operator='^' operand+=BitwiseAndExpression
		//    ( '^' operand+=BitwiseAndExpression )*
		//)?
		public Group getGroup_1() { return cGroup_1; }
		
		//{fmlExpr::BitwiseAssociativeExpression.operand+=current}
		public Action getBitwiseAssociativeExpressionOperandAction_1_0() { return cBitwiseAssociativeExpressionOperandAction_1_0; }
		
		//operator='^'
		public Assignment getOperatorAssignment_1_1() { return cOperatorAssignment_1_1; }
		
		//'^'
		public Keyword getOperatorCircumflexAccentKeyword_1_1_0() { return cOperatorCircumflexAccentKeyword_1_1_0; }
		
		//operand+=BitwiseAndExpression
		public Assignment getOperandAssignment_1_2() { return cOperandAssignment_1_2; }
		
		//BitwiseAndExpression
		public RuleCall getOperandBitwiseAndExpressionParserRuleCall_1_2_0() { return cOperandBitwiseAndExpressionParserRuleCall_1_2_0; }
		
		//( '^' operand+=BitwiseAndExpression )*
		public Group getGroup_1_3() { return cGroup_1_3; }
		
		//'^'
		public Keyword getCircumflexAccentKeyword_1_3_0() { return cCircumflexAccentKeyword_1_3_0; }
		
		//operand+=BitwiseAndExpression
		public Assignment getOperandAssignment_1_3_1() { return cOperandAssignment_1_3_1; }
		
		//BitwiseAndExpression
		public RuleCall getOperandBitwiseAndExpressionParserRuleCall_1_3_1_0() { return cOperandBitwiseAndExpressionParserRuleCall_1_3_1_0; }
	}
	public class BitwiseAndExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.BitwiseAndExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final RuleCall cEqualityExpressionParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Action cBitwiseAssociativeExpressionOperandAction_1_0 = (Action)cGroup_1.eContents().get(0);
		private final Assignment cOperatorAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final Keyword cOperatorAmpersandKeyword_1_1_0 = (Keyword)cOperatorAssignment_1_1.eContents().get(0);
		private final Assignment cOperandAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
		private final RuleCall cOperandEqualityExpressionParserRuleCall_1_2_0 = (RuleCall)cOperandAssignment_1_2.eContents().get(0);
		private final Group cGroup_1_3 = (Group)cGroup_1.eContents().get(3);
		private final Keyword cAmpersandKeyword_1_3_0 = (Keyword)cGroup_1_3.eContents().get(0);
		private final Assignment cOperandAssignment_1_3_1 = (Assignment)cGroup_1_3.eContents().get(1);
		private final RuleCall cOperandEqualityExpressionParserRuleCall_1_3_1_0 = (RuleCall)cOperandAssignment_1_3_1.eContents().get(0);
		
		//BitwiseAndExpression returns fmlExpr::Expression
		//    : EqualityExpression
		//        ( {fmlExpr::BitwiseAssociativeExpression.operand+=current}
		//            operator='&' operand+=EqualityExpression
		//            ( '&' operand+=EqualityExpression )*
		//        )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//EqualityExpression
		//       ( {fmlExpr::BitwiseAssociativeExpression.operand+=current}
		//           operator='&' operand+=EqualityExpression
		//           ( '&' operand+=EqualityExpression )*
		//       )?
		public Group getGroup() { return cGroup; }
		
		//EqualityExpression
		public RuleCall getEqualityExpressionParserRuleCall_0() { return cEqualityExpressionParserRuleCall_0; }
		
		//( {fmlExpr::BitwiseAssociativeExpression.operand+=current}
		//    operator='&' operand+=EqualityExpression
		//    ( '&' operand+=EqualityExpression )*
		//)?
		public Group getGroup_1() { return cGroup_1; }
		
		//{fmlExpr::BitwiseAssociativeExpression.operand+=current}
		public Action getBitwiseAssociativeExpressionOperandAction_1_0() { return cBitwiseAssociativeExpressionOperandAction_1_0; }
		
		//operator='&'
		public Assignment getOperatorAssignment_1_1() { return cOperatorAssignment_1_1; }
		
		//'&'
		public Keyword getOperatorAmpersandKeyword_1_1_0() { return cOperatorAmpersandKeyword_1_1_0; }
		
		//operand+=EqualityExpression
		public Assignment getOperandAssignment_1_2() { return cOperandAssignment_1_2; }
		
		//EqualityExpression
		public RuleCall getOperandEqualityExpressionParserRuleCall_1_2_0() { return cOperandEqualityExpressionParserRuleCall_1_2_0; }
		
		//( '&' operand+=EqualityExpression )*
		public Group getGroup_1_3() { return cGroup_1_3; }
		
		//'&'
		public Keyword getAmpersandKeyword_1_3_0() { return cAmpersandKeyword_1_3_0; }
		
		//operand+=EqualityExpression
		public Assignment getOperandAssignment_1_3_1() { return cOperandAssignment_1_3_1; }
		
		//EqualityExpression
		public RuleCall getOperandEqualityExpressionParserRuleCall_1_3_1_0() { return cOperandEqualityExpressionParserRuleCall_1_3_1_0; }
	}
	public class EqualityExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.EqualityExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final RuleCall cRelationalExpressionParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Action cEqualityBinaryExpressionLeftOperandAction_1_0 = (Action)cGroup_1.eContents().get(0);
		private final Assignment cOperatorAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final RuleCall cOperatorEqualityOperatorParserRuleCall_1_1_0 = (RuleCall)cOperatorAssignment_1_1.eContents().get(0);
		private final Assignment cRightOperandAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
		private final RuleCall cRightOperandRelationalExpressionParserRuleCall_1_2_0 = (RuleCall)cRightOperandAssignment_1_2.eContents().get(0);
		
		//// Equality Expression
		//EqualityExpression returns fmlExpr::Expression
		//    : RelationalExpression
		//        ( {fmlExpr::EqualityBinaryExpression.leftOperand=current}
		//            operator=EqualityOperator rightOperand=RelationalExpression
		//        )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//RelationalExpression
		//       ( {fmlExpr::EqualityBinaryExpression.leftOperand=current}
		//           operator=EqualityOperator rightOperand=RelationalExpression
		//       )?
		public Group getGroup() { return cGroup; }
		
		//RelationalExpression
		public RuleCall getRelationalExpressionParserRuleCall_0() { return cRelationalExpressionParserRuleCall_0; }
		
		//( {fmlExpr::EqualityBinaryExpression.leftOperand=current}
		//    operator=EqualityOperator rightOperand=RelationalExpression
		//)?
		public Group getGroup_1() { return cGroup_1; }
		
		//{fmlExpr::EqualityBinaryExpression.leftOperand=current}
		public Action getEqualityBinaryExpressionLeftOperandAction_1_0() { return cEqualityBinaryExpressionLeftOperandAction_1_0; }
		
		//operator=EqualityOperator
		public Assignment getOperatorAssignment_1_1() { return cOperatorAssignment_1_1; }
		
		//EqualityOperator
		public RuleCall getOperatorEqualityOperatorParserRuleCall_1_1_0() { return cOperatorEqualityOperatorParserRuleCall_1_1_0; }
		
		//rightOperand=RelationalExpression
		public Assignment getRightOperandAssignment_1_2() { return cRightOperandAssignment_1_2; }
		
		//RelationalExpression
		public RuleCall getRightOperandRelationalExpressionParserRuleCall_1_2_0() { return cRightOperandRelationalExpressionParserRuleCall_1_2_0; }
	}
	public class EqualityOperatorElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.EqualityOperator");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final Keyword cEqualsSignEqualsSignKeyword_0 = (Keyword)cAlternatives.eContents().get(0);
		private final Keyword cExclamationMarkEqualsSignKeyword_1 = (Keyword)cAlternatives.eContents().get(1);
		private final Keyword cEqualsSignEqualsSignEqualsSignKeyword_2 = (Keyword)cAlternatives.eContents().get(2);
		private final Keyword cExclamationMarkEqualsSignEqualsSignKeyword_3 = (Keyword)cAlternatives.eContents().get(3);
		private final Keyword cEqualsSignExclamationMarkEqualsSignKeyword_4 = (Keyword)cAlternatives.eContents().get(4);
		private final Keyword cEqualsSignSolidusEqualsSignKeyword_5 = (Keyword)cAlternatives.eContents().get(5);
		
		//EqualityOperator
		//    : '==' | '!=' | '===' | '!==' | '=!=' | '=/='
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//'==' | '!=' | '===' | '!==' | '=!=' | '=/='
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//'=='
		public Keyword getEqualsSignEqualsSignKeyword_0() { return cEqualsSignEqualsSignKeyword_0; }
		
		//'!='
		public Keyword getExclamationMarkEqualsSignKeyword_1() { return cExclamationMarkEqualsSignKeyword_1; }
		
		//'==='
		public Keyword getEqualsSignEqualsSignEqualsSignKeyword_2() { return cEqualsSignEqualsSignEqualsSignKeyword_2; }
		
		//'!=='
		public Keyword getExclamationMarkEqualsSignEqualsSignKeyword_3() { return cExclamationMarkEqualsSignEqualsSignKeyword_3; }
		
		//'=!='
		public Keyword getEqualsSignExclamationMarkEqualsSignKeyword_4() { return cEqualsSignExclamationMarkEqualsSignKeyword_4; }
		
		//'=/='
		public Keyword getEqualsSignSolidusEqualsSignKeyword_5() { return cEqualsSignSolidusEqualsSignKeyword_5; }
	}
	public class RelationalExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.RelationalExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final RuleCall cAdditiveExpressionParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Action cRelationalBinaryExpressionLeftOperandAction_1_0 = (Action)cGroup_1.eContents().get(0);
		private final Assignment cOperatorAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final RuleCall cOperatorRelationalOperatorParserRuleCall_1_1_0 = (RuleCall)cOperatorAssignment_1_1.eContents().get(0);
		private final Assignment cRightOperandAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
		private final RuleCall cRightOperandAdditiveExpressionParserRuleCall_1_2_0 = (RuleCall)cRightOperandAssignment_1_2.eContents().get(0);
		private final Group cGroup_1_3 = (Group)cGroup_1.eContents().get(3);
		private final Action cRelationalTernaryExpressionLeftRelationAction_1_3_0 = (Action)cGroup_1_3.eContents().get(0);
		private final Assignment cRightOperatorAssignment_1_3_1 = (Assignment)cGroup_1_3.eContents().get(1);
		private final RuleCall cRightOperatorRelationalOperatorParserRuleCall_1_3_1_0 = (RuleCall)cRightOperatorAssignment_1_3_1.eContents().get(0);
		private final Assignment cRightOperandAssignment_1_3_2 = (Assignment)cGroup_1_3.eContents().get(2);
		private final RuleCall cRightOperandAdditiveExpressionParserRuleCall_1_3_2_0 = (RuleCall)cRightOperandAssignment_1_3_2.eContents().get(0);
		
		//// Relational Binary Expression
		//RelationalExpression returns fmlExpr::Expression
		//    : AdditiveExpression
		//        ( {fmlExpr::RelationalBinaryExpression.leftOperand=current}
		//            operator=RelationalOperator rightOperand=AdditiveExpression
		//            ( {fmlExpr::RelationalTernaryExpression.leftRelation=current}
		//                rightOperator=RelationalOperator rightOperand=AdditiveExpression
		//            )?
		//        )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//AdditiveExpression
		//       ( {fmlExpr::RelationalBinaryExpression.leftOperand=current}
		//           operator=RelationalOperator rightOperand=AdditiveExpression
		//           ( {fmlExpr::RelationalTernaryExpression.leftRelation=current}
		//               rightOperator=RelationalOperator rightOperand=AdditiveExpression
		//           )?
		//       )?
		public Group getGroup() { return cGroup; }
		
		//AdditiveExpression
		public RuleCall getAdditiveExpressionParserRuleCall_0() { return cAdditiveExpressionParserRuleCall_0; }
		
		//( {fmlExpr::RelationalBinaryExpression.leftOperand=current}
		//    operator=RelationalOperator rightOperand=AdditiveExpression
		//    ( {fmlExpr::RelationalTernaryExpression.leftRelation=current}
		//        rightOperator=RelationalOperator rightOperand=AdditiveExpression
		//    )?
		//)?
		public Group getGroup_1() { return cGroup_1; }
		
		//{fmlExpr::RelationalBinaryExpression.leftOperand=current}
		public Action getRelationalBinaryExpressionLeftOperandAction_1_0() { return cRelationalBinaryExpressionLeftOperandAction_1_0; }
		
		//operator=RelationalOperator
		public Assignment getOperatorAssignment_1_1() { return cOperatorAssignment_1_1; }
		
		//RelationalOperator
		public RuleCall getOperatorRelationalOperatorParserRuleCall_1_1_0() { return cOperatorRelationalOperatorParserRuleCall_1_1_0; }
		
		//rightOperand=AdditiveExpression
		public Assignment getRightOperandAssignment_1_2() { return cRightOperandAssignment_1_2; }
		
		//AdditiveExpression
		public RuleCall getRightOperandAdditiveExpressionParserRuleCall_1_2_0() { return cRightOperandAdditiveExpressionParserRuleCall_1_2_0; }
		
		//( {fmlExpr::RelationalTernaryExpression.leftRelation=current}
		//    rightOperator=RelationalOperator rightOperand=AdditiveExpression
		//)?
		public Group getGroup_1_3() { return cGroup_1_3; }
		
		//{fmlExpr::RelationalTernaryExpression.leftRelation=current}
		public Action getRelationalTernaryExpressionLeftRelationAction_1_3_0() { return cRelationalTernaryExpressionLeftRelationAction_1_3_0; }
		
		//rightOperator=RelationalOperator
		public Assignment getRightOperatorAssignment_1_3_1() { return cRightOperatorAssignment_1_3_1; }
		
		//RelationalOperator
		public RuleCall getRightOperatorRelationalOperatorParserRuleCall_1_3_1_0() { return cRightOperatorRelationalOperatorParserRuleCall_1_3_1_0; }
		
		//rightOperand=AdditiveExpression
		public Assignment getRightOperandAssignment_1_3_2() { return cRightOperandAssignment_1_3_2; }
		
		//AdditiveExpression
		public RuleCall getRightOperandAdditiveExpressionParserRuleCall_1_3_2_0() { return cRightOperandAdditiveExpressionParserRuleCall_1_3_2_0; }
	}
	public class RelationalOperatorElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.RelationalOperator");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final Keyword cLessThanSignKeyword_0 = (Keyword)cAlternatives.eContents().get(0);
		private final Keyword cGreaterThanSignKeyword_1 = (Keyword)cAlternatives.eContents().get(1);
		private final Keyword cLessThanSignEqualsSignKeyword_2 = (Keyword)cAlternatives.eContents().get(2);
		private final Keyword cGreaterThanSignEqualsSignKeyword_3 = (Keyword)cAlternatives.eContents().get(3);
		private final Keyword cInKeyword_4 = (Keyword)cAlternatives.eContents().get(4);
		
		//RelationalOperator
		//    : '<' | '>' | '<=' | '>=' | 'in'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//'<' | '>' | '<=' | '>=' | 'in'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//'<'
		public Keyword getLessThanSignKeyword_0() { return cLessThanSignKeyword_0; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_1() { return cGreaterThanSignKeyword_1; }
		
		//'<='
		public Keyword getLessThanSignEqualsSignKeyword_2() { return cLessThanSignEqualsSignKeyword_2; }
		
		//'>='
		public Keyword getGreaterThanSignEqualsSignKeyword_3() { return cGreaterThanSignEqualsSignKeyword_3; }
		
		//'in'
		public Keyword getInKeyword_4() { return cInKeyword_4; }
	}
	public class AdditiveExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.AdditiveExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final RuleCall cMultiplicativeExpressionParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
		private final Group cGroup_1_0 = (Group)cAlternatives_1.eContents().get(0);
		private final Action cArithmeticAssociativeExpressionOperandAction_1_0_0 = (Action)cGroup_1_0.eContents().get(0);
		private final Assignment cOperatorAssignment_1_0_1 = (Assignment)cGroup_1_0.eContents().get(1);
		private final Keyword cOperatorPlusSignKeyword_1_0_1_0 = (Keyword)cOperatorAssignment_1_0_1.eContents().get(0);
		private final Assignment cOperandAssignment_1_0_2 = (Assignment)cGroup_1_0.eContents().get(2);
		private final RuleCall cOperandMultiplicativeExpressionParserRuleCall_1_0_2_0 = (RuleCall)cOperandAssignment_1_0_2.eContents().get(0);
		private final Group cGroup_1_0_3 = (Group)cGroup_1_0.eContents().get(3);
		private final Keyword cPlusSignKeyword_1_0_3_0 = (Keyword)cGroup_1_0_3.eContents().get(0);
		private final Assignment cOperandAssignment_1_0_3_1 = (Assignment)cGroup_1_0_3.eContents().get(1);
		private final RuleCall cOperandMultiplicativeExpressionParserRuleCall_1_0_3_1_0 = (RuleCall)cOperandAssignment_1_0_3_1.eContents().get(0);
		private final Group cGroup_1_1 = (Group)cAlternatives_1.eContents().get(1);
		private final Action cArithmeticAssociativeExpressionOperandAction_1_1_0 = (Action)cGroup_1_1.eContents().get(0);
		private final Assignment cOperatorAssignment_1_1_1 = (Assignment)cGroup_1_1.eContents().get(1);
		private final Keyword cOperatorHyphenMinusKeyword_1_1_1_0 = (Keyword)cOperatorAssignment_1_1_1.eContents().get(0);
		private final Assignment cOperandAssignment_1_1_2 = (Assignment)cGroup_1_1.eContents().get(2);
		private final RuleCall cOperandMultiplicativeExpressionParserRuleCall_1_1_2_0 = (RuleCall)cOperandAssignment_1_1_2.eContents().get(0);
		private final Group cGroup_1_1_3 = (Group)cGroup_1_1.eContents().get(3);
		private final Keyword cHyphenMinusKeyword_1_1_3_0 = (Keyword)cGroup_1_1_3.eContents().get(0);
		private final Assignment cOperandAssignment_1_1_3_1 = (Assignment)cGroup_1_1_3.eContents().get(1);
		private final RuleCall cOperandMultiplicativeExpressionParserRuleCall_1_1_3_1_0 = (RuleCall)cOperandAssignment_1_1_3_1.eContents().get(0);
		
		//// Arithmetic Associative (left) Expression
		//AdditiveExpression returns fmlExpr::Expression
		//    : MultiplicativeExpression
		//        ( ( {fmlExpr::ArithmeticAssociativeExpression.operand+=current}
		//            operator='+' operand+=MultiplicativeExpression
		//            ( '+' operand+=MultiplicativeExpression )* )
		//        | ( {fmlExpr::ArithmeticAssociativeExpression.operand+=current}
		//            operator='-' operand+=MultiplicativeExpression
		//            ( '-' operand+=MultiplicativeExpression )* )
		//        )*
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//MultiplicativeExpression
		//       ( ( {fmlExpr::ArithmeticAssociativeExpression.operand+=current}
		//           operator='+' operand+=MultiplicativeExpression
		//           ( '+' operand+=MultiplicativeExpression )* )
		//       | ( {fmlExpr::ArithmeticAssociativeExpression.operand+=current}
		//           operator='-' operand+=MultiplicativeExpression
		//           ( '-' operand+=MultiplicativeExpression )* )
		//       )*
		public Group getGroup() { return cGroup; }
		
		//MultiplicativeExpression
		public RuleCall getMultiplicativeExpressionParserRuleCall_0() { return cMultiplicativeExpressionParserRuleCall_0; }
		
		//( ( {fmlExpr::ArithmeticAssociativeExpression.operand+=current}
		//    operator='+' operand+=MultiplicativeExpression
		//    ( '+' operand+=MultiplicativeExpression )* )
		//| ( {fmlExpr::ArithmeticAssociativeExpression.operand+=current}
		//    operator='-' operand+=MultiplicativeExpression
		//    ( '-' operand+=MultiplicativeExpression )* )
		//)*
		public Alternatives getAlternatives_1() { return cAlternatives_1; }
		
		//( {fmlExpr::ArithmeticAssociativeExpression.operand+=current}
		//           operator='+' operand+=MultiplicativeExpression
		//           ( '+' operand+=MultiplicativeExpression )* )
		public Group getGroup_1_0() { return cGroup_1_0; }
		
		//{fmlExpr::ArithmeticAssociativeExpression.operand+=current}
		public Action getArithmeticAssociativeExpressionOperandAction_1_0_0() { return cArithmeticAssociativeExpressionOperandAction_1_0_0; }
		
		//operator='+'
		public Assignment getOperatorAssignment_1_0_1() { return cOperatorAssignment_1_0_1; }
		
		//'+'
		public Keyword getOperatorPlusSignKeyword_1_0_1_0() { return cOperatorPlusSignKeyword_1_0_1_0; }
		
		//operand+=MultiplicativeExpression
		public Assignment getOperandAssignment_1_0_2() { return cOperandAssignment_1_0_2; }
		
		//MultiplicativeExpression
		public RuleCall getOperandMultiplicativeExpressionParserRuleCall_1_0_2_0() { return cOperandMultiplicativeExpressionParserRuleCall_1_0_2_0; }
		
		//( '+' operand+=MultiplicativeExpression )*
		public Group getGroup_1_0_3() { return cGroup_1_0_3; }
		
		//'+'
		public Keyword getPlusSignKeyword_1_0_3_0() { return cPlusSignKeyword_1_0_3_0; }
		
		//operand+=MultiplicativeExpression
		public Assignment getOperandAssignment_1_0_3_1() { return cOperandAssignment_1_0_3_1; }
		
		//MultiplicativeExpression
		public RuleCall getOperandMultiplicativeExpressionParserRuleCall_1_0_3_1_0() { return cOperandMultiplicativeExpressionParserRuleCall_1_0_3_1_0; }
		
		//( {fmlExpr::ArithmeticAssociativeExpression.operand+=current}
		//           operator='-' operand+=MultiplicativeExpression
		//           ( '-' operand+=MultiplicativeExpression )* )
		public Group getGroup_1_1() { return cGroup_1_1; }
		
		//{fmlExpr::ArithmeticAssociativeExpression.operand+=current}
		public Action getArithmeticAssociativeExpressionOperandAction_1_1_0() { return cArithmeticAssociativeExpressionOperandAction_1_1_0; }
		
		//operator='-'
		public Assignment getOperatorAssignment_1_1_1() { return cOperatorAssignment_1_1_1; }
		
		//'-'
		public Keyword getOperatorHyphenMinusKeyword_1_1_1_0() { return cOperatorHyphenMinusKeyword_1_1_1_0; }
		
		//operand+=MultiplicativeExpression
		public Assignment getOperandAssignment_1_1_2() { return cOperandAssignment_1_1_2; }
		
		//MultiplicativeExpression
		public RuleCall getOperandMultiplicativeExpressionParserRuleCall_1_1_2_0() { return cOperandMultiplicativeExpressionParserRuleCall_1_1_2_0; }
		
		//( '-' operand+=MultiplicativeExpression )*
		public Group getGroup_1_1_3() { return cGroup_1_1_3; }
		
		//'-'
		public Keyword getHyphenMinusKeyword_1_1_3_0() { return cHyphenMinusKeyword_1_1_3_0; }
		
		//operand+=MultiplicativeExpression
		public Assignment getOperandAssignment_1_1_3_1() { return cOperandAssignment_1_1_3_1; }
		
		//MultiplicativeExpression
		public RuleCall getOperandMultiplicativeExpressionParserRuleCall_1_1_3_1_0() { return cOperandMultiplicativeExpressionParserRuleCall_1_1_3_1_0; }
	}
	public class MultiplicativeExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.MultiplicativeExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final RuleCall cUnaryExpressionParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
		private final Group cGroup_1_0 = (Group)cAlternatives_1.eContents().get(0);
		private final Action cArithmeticAssociativeExpressionOperandAction_1_0_0 = (Action)cGroup_1_0.eContents().get(0);
		private final Assignment cOperatorAssignment_1_0_1 = (Assignment)cGroup_1_0.eContents().get(1);
		private final Keyword cOperatorAsteriskKeyword_1_0_1_0 = (Keyword)cOperatorAssignment_1_0_1.eContents().get(0);
		private final Assignment cOperandAssignment_1_0_2 = (Assignment)cGroup_1_0.eContents().get(2);
		private final RuleCall cOperandUnaryExpressionParserRuleCall_1_0_2_0 = (RuleCall)cOperandAssignment_1_0_2.eContents().get(0);
		private final Group cGroup_1_0_3 = (Group)cGroup_1_0.eContents().get(3);
		private final Keyword cAsteriskKeyword_1_0_3_0 = (Keyword)cGroup_1_0_3.eContents().get(0);
		private final Assignment cOperandAssignment_1_0_3_1 = (Assignment)cGroup_1_0_3.eContents().get(1);
		private final RuleCall cOperandUnaryExpressionParserRuleCall_1_0_3_1_0 = (RuleCall)cOperandAssignment_1_0_3_1.eContents().get(0);
		private final Group cGroup_1_1 = (Group)cAlternatives_1.eContents().get(1);
		private final Action cArithmeticAssociativeExpressionOperandAction_1_1_0 = (Action)cGroup_1_1.eContents().get(0);
		private final Assignment cOperatorAssignment_1_1_1 = (Assignment)cGroup_1_1.eContents().get(1);
		private final Keyword cOperatorAsteriskAsteriskKeyword_1_1_1_0 = (Keyword)cOperatorAssignment_1_1_1.eContents().get(0);
		private final Assignment cOperandAssignment_1_1_2 = (Assignment)cGroup_1_1.eContents().get(2);
		private final RuleCall cOperandUnaryExpressionParserRuleCall_1_1_2_0 = (RuleCall)cOperandAssignment_1_1_2.eContents().get(0);
		private final Group cGroup_1_1_3 = (Group)cGroup_1_1.eContents().get(3);
		private final Keyword cAsteriskAsteriskKeyword_1_1_3_0 = (Keyword)cGroup_1_1_3.eContents().get(0);
		private final Assignment cOperandAssignment_1_1_3_1 = (Assignment)cGroup_1_1_3.eContents().get(1);
		private final RuleCall cOperandUnaryExpressionParserRuleCall_1_1_3_1_0 = (RuleCall)cOperandAssignment_1_1_3_1.eContents().get(0);
		private final Group cGroup_1_2 = (Group)cAlternatives_1.eContents().get(2);
		private final Action cArithmeticAssociativeExpressionOperandAction_1_2_0 = (Action)cGroup_1_2.eContents().get(0);
		private final Assignment cOperatorAssignment_1_2_1 = (Assignment)cGroup_1_2.eContents().get(1);
		private final Keyword cOperatorSolidusKeyword_1_2_1_0 = (Keyword)cOperatorAssignment_1_2_1.eContents().get(0);
		private final Assignment cOperandAssignment_1_2_2 = (Assignment)cGroup_1_2.eContents().get(2);
		private final RuleCall cOperandUnaryExpressionParserRuleCall_1_2_2_0 = (RuleCall)cOperandAssignment_1_2_2.eContents().get(0);
		private final Group cGroup_1_2_3 = (Group)cGroup_1_2.eContents().get(3);
		private final Keyword cSolidusKeyword_1_2_3_0 = (Keyword)cGroup_1_2_3.eContents().get(0);
		private final Assignment cOperandAssignment_1_2_3_1 = (Assignment)cGroup_1_2_3.eContents().get(1);
		private final RuleCall cOperandUnaryExpressionParserRuleCall_1_2_3_1_0 = (RuleCall)cOperandAssignment_1_2_3_1.eContents().get(0);
		private final Group cGroup_1_3 = (Group)cAlternatives_1.eContents().get(3);
		private final Action cArithmeticAssociativeExpressionOperandAction_1_3_0 = (Action)cGroup_1_3.eContents().get(0);
		private final Assignment cOperatorAssignment_1_3_1 = (Assignment)cGroup_1_3.eContents().get(1);
		private final Keyword cOperatorPercentSignKeyword_1_3_1_0 = (Keyword)cOperatorAssignment_1_3_1.eContents().get(0);
		private final Assignment cOperandAssignment_1_3_2 = (Assignment)cGroup_1_3.eContents().get(2);
		private final RuleCall cOperandUnaryExpressionParserRuleCall_1_3_2_0 = (RuleCall)cOperandAssignment_1_3_2.eContents().get(0);
		private final Group cGroup_1_3_3 = (Group)cGroup_1_3.eContents().get(3);
		private final Keyword cPercentSignKeyword_1_3_3_0 = (Keyword)cGroup_1_3_3.eContents().get(0);
		private final Assignment cOperandAssignment_1_3_3_1 = (Assignment)cGroup_1_3_3.eContents().get(1);
		private final RuleCall cOperandUnaryExpressionParserRuleCall_1_3_3_1_0 = (RuleCall)cOperandAssignment_1_3_3_1.eContents().get(0);
		
		//MultiplicativeExpression returns fmlExpr::Expression
		//    : UnaryExpression
		//        ( ( {fmlExpr::ArithmeticAssociativeExpression.operand+=current}
		//            operator='*' operand+=UnaryExpression
		//            ( '*' operand+=UnaryExpression )* )
		//        | ( {fmlExpr::ArithmeticAssociativeExpression.operand+=current}
		//            operator='**' operand+=UnaryExpression
		//            ( '**' operand+=UnaryExpression )* )
		//        | ( {fmlExpr::ArithmeticAssociativeExpression.operand+=current}
		//            operator='/' operand+=UnaryExpression
		//            ( '/' operand+=UnaryExpression )* )
		//        | ( {fmlExpr::ArithmeticAssociativeExpression.operand+=current}
		//            operator='%' operand+=UnaryExpression
		//            ( '%' operand+=UnaryExpression )* )
		//        )*
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//UnaryExpression
		//       ( ( {fmlExpr::ArithmeticAssociativeExpression.operand+=current}
		//           operator='*' operand+=UnaryExpression
		//           ( '*' operand+=UnaryExpression )* )
		//       | ( {fmlExpr::ArithmeticAssociativeExpression.operand+=current}
		//           operator='**' operand+=UnaryExpression
		//           ( '**' operand+=UnaryExpression )* )
		//       | ( {fmlExpr::ArithmeticAssociativeExpression.operand+=current}
		//           operator='/' operand+=UnaryExpression
		//           ( '/' operand+=UnaryExpression )* )
		//       | ( {fmlExpr::ArithmeticAssociativeExpression.operand+=current}
		//           operator='%' operand+=UnaryExpression
		//           ( '%' operand+=UnaryExpression )* )
		//       )*
		public Group getGroup() { return cGroup; }
		
		//UnaryExpression
		public RuleCall getUnaryExpressionParserRuleCall_0() { return cUnaryExpressionParserRuleCall_0; }
		
		//( ( {fmlExpr::ArithmeticAssociativeExpression.operand+=current}
		//    operator='*' operand+=UnaryExpression
		//    ( '*' operand+=UnaryExpression )* )
		//| ( {fmlExpr::ArithmeticAssociativeExpression.operand+=current}
		//    operator='**' operand+=UnaryExpression
		//    ( '**' operand+=UnaryExpression )* )
		//| ( {fmlExpr::ArithmeticAssociativeExpression.operand+=current}
		//    operator='/' operand+=UnaryExpression
		//    ( '/' operand+=UnaryExpression )* )
		//| ( {fmlExpr::ArithmeticAssociativeExpression.operand+=current}
		//    operator='%' operand+=UnaryExpression
		//    ( '%' operand+=UnaryExpression )* )
		//)*
		public Alternatives getAlternatives_1() { return cAlternatives_1; }
		
		//( {fmlExpr::ArithmeticAssociativeExpression.operand+=current}
		//           operator='*' operand+=UnaryExpression
		//           ( '*' operand+=UnaryExpression )* )
		public Group getGroup_1_0() { return cGroup_1_0; }
		
		//{fmlExpr::ArithmeticAssociativeExpression.operand+=current}
		public Action getArithmeticAssociativeExpressionOperandAction_1_0_0() { return cArithmeticAssociativeExpressionOperandAction_1_0_0; }
		
		//operator='*'
		public Assignment getOperatorAssignment_1_0_1() { return cOperatorAssignment_1_0_1; }
		
		//'*'
		public Keyword getOperatorAsteriskKeyword_1_0_1_0() { return cOperatorAsteriskKeyword_1_0_1_0; }
		
		//operand+=UnaryExpression
		public Assignment getOperandAssignment_1_0_2() { return cOperandAssignment_1_0_2; }
		
		//UnaryExpression
		public RuleCall getOperandUnaryExpressionParserRuleCall_1_0_2_0() { return cOperandUnaryExpressionParserRuleCall_1_0_2_0; }
		
		//( '*' operand+=UnaryExpression )*
		public Group getGroup_1_0_3() { return cGroup_1_0_3; }
		
		//'*'
		public Keyword getAsteriskKeyword_1_0_3_0() { return cAsteriskKeyword_1_0_3_0; }
		
		//operand+=UnaryExpression
		public Assignment getOperandAssignment_1_0_3_1() { return cOperandAssignment_1_0_3_1; }
		
		//UnaryExpression
		public RuleCall getOperandUnaryExpressionParserRuleCall_1_0_3_1_0() { return cOperandUnaryExpressionParserRuleCall_1_0_3_1_0; }
		
		//( {fmlExpr::ArithmeticAssociativeExpression.operand+=current}
		//           operator='**' operand+=UnaryExpression
		//           ( '**' operand+=UnaryExpression )* )
		public Group getGroup_1_1() { return cGroup_1_1; }
		
		//{fmlExpr::ArithmeticAssociativeExpression.operand+=current}
		public Action getArithmeticAssociativeExpressionOperandAction_1_1_0() { return cArithmeticAssociativeExpressionOperandAction_1_1_0; }
		
		//operator='**'
		public Assignment getOperatorAssignment_1_1_1() { return cOperatorAssignment_1_1_1; }
		
		//'**'
		public Keyword getOperatorAsteriskAsteriskKeyword_1_1_1_0() { return cOperatorAsteriskAsteriskKeyword_1_1_1_0; }
		
		//operand+=UnaryExpression
		public Assignment getOperandAssignment_1_1_2() { return cOperandAssignment_1_1_2; }
		
		//UnaryExpression
		public RuleCall getOperandUnaryExpressionParserRuleCall_1_1_2_0() { return cOperandUnaryExpressionParserRuleCall_1_1_2_0; }
		
		//( '**' operand+=UnaryExpression )*
		public Group getGroup_1_1_3() { return cGroup_1_1_3; }
		
		//'**'
		public Keyword getAsteriskAsteriskKeyword_1_1_3_0() { return cAsteriskAsteriskKeyword_1_1_3_0; }
		
		//operand+=UnaryExpression
		public Assignment getOperandAssignment_1_1_3_1() { return cOperandAssignment_1_1_3_1; }
		
		//UnaryExpression
		public RuleCall getOperandUnaryExpressionParserRuleCall_1_1_3_1_0() { return cOperandUnaryExpressionParserRuleCall_1_1_3_1_0; }
		
		//( {fmlExpr::ArithmeticAssociativeExpression.operand+=current}
		//           operator='/' operand+=UnaryExpression
		//           ( '/' operand+=UnaryExpression )* )
		public Group getGroup_1_2() { return cGroup_1_2; }
		
		//{fmlExpr::ArithmeticAssociativeExpression.operand+=current}
		public Action getArithmeticAssociativeExpressionOperandAction_1_2_0() { return cArithmeticAssociativeExpressionOperandAction_1_2_0; }
		
		//operator='/'
		public Assignment getOperatorAssignment_1_2_1() { return cOperatorAssignment_1_2_1; }
		
		//'/'
		public Keyword getOperatorSolidusKeyword_1_2_1_0() { return cOperatorSolidusKeyword_1_2_1_0; }
		
		//operand+=UnaryExpression
		public Assignment getOperandAssignment_1_2_2() { return cOperandAssignment_1_2_2; }
		
		//UnaryExpression
		public RuleCall getOperandUnaryExpressionParserRuleCall_1_2_2_0() { return cOperandUnaryExpressionParserRuleCall_1_2_2_0; }
		
		//( '/' operand+=UnaryExpression )*
		public Group getGroup_1_2_3() { return cGroup_1_2_3; }
		
		//'/'
		public Keyword getSolidusKeyword_1_2_3_0() { return cSolidusKeyword_1_2_3_0; }
		
		//operand+=UnaryExpression
		public Assignment getOperandAssignment_1_2_3_1() { return cOperandAssignment_1_2_3_1; }
		
		//UnaryExpression
		public RuleCall getOperandUnaryExpressionParserRuleCall_1_2_3_1_0() { return cOperandUnaryExpressionParserRuleCall_1_2_3_1_0; }
		
		//( {fmlExpr::ArithmeticAssociativeExpression.operand+=current}
		//           operator='%' operand+=UnaryExpression
		//           ( '%' operand+=UnaryExpression )* )
		public Group getGroup_1_3() { return cGroup_1_3; }
		
		//{fmlExpr::ArithmeticAssociativeExpression.operand+=current}
		public Action getArithmeticAssociativeExpressionOperandAction_1_3_0() { return cArithmeticAssociativeExpressionOperandAction_1_3_0; }
		
		//operator='%'
		public Assignment getOperatorAssignment_1_3_1() { return cOperatorAssignment_1_3_1; }
		
		//'%'
		public Keyword getOperatorPercentSignKeyword_1_3_1_0() { return cOperatorPercentSignKeyword_1_3_1_0; }
		
		//operand+=UnaryExpression
		public Assignment getOperandAssignment_1_3_2() { return cOperandAssignment_1_3_2; }
		
		//UnaryExpression
		public RuleCall getOperandUnaryExpressionParserRuleCall_1_3_2_0() { return cOperandUnaryExpressionParserRuleCall_1_3_2_0; }
		
		//( '%' operand+=UnaryExpression )*
		public Group getGroup_1_3_3() { return cGroup_1_3_3; }
		
		//'%'
		public Keyword getPercentSignKeyword_1_3_3_0() { return cPercentSignKeyword_1_3_3_0; }
		
		//operand+=UnaryExpression
		public Assignment getOperandAssignment_1_3_3_1() { return cOperandAssignment_1_3_3_1; }
		
		//UnaryExpression
		public RuleCall getOperandUnaryExpressionParserRuleCall_1_3_3_1_0() { return cOperandUnaryExpressionParserRuleCall_1_3_3_1_0; }
	}
	public class UnaryExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.UnaryExpression");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cLiteralTerminalExpressionParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cArithmeticUnaryExpressionParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cLogicalUnaryExpressionParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		private final RuleCall cQuantifiedLogicalExpressionParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		private final RuleCall cBitwiseUnaryExpressionParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
		private final RuleCall cNewfreshExpressionParserRuleCall_5 = (RuleCall)cAlternatives.eContents().get(5);
		private final RuleCall cCastExpressionParserRuleCall_6 = (RuleCall)cAlternatives.eContents().get(6);
		private final RuleCall cPrefixUnaryExpressionParserRuleCall_7 = (RuleCall)cAlternatives.eContents().get(7);
		private final RuleCall cPostfixUnaryExpressionParserRuleCall_8 = (RuleCall)cAlternatives.eContents().get(8);
		private final RuleCall cPrimaryExpressionParserRuleCall_9 = (RuleCall)cAlternatives.eContents().get(9);
		
		//// Unary Expression
		//UnaryExpression returns fmlExpr::Expression
		//    : LiteralTerminalExpression
		//    | ArithmeticUnaryExpression
		//    | LogicalUnaryExpression
		//    | QuantifiedLogicalExpression
		//    | BitwiseUnaryExpression
		//    | NewfreshExpression
		//    | CastExpression
		////    | CollectionFunctionExpression
		//    | PrefixUnaryExpression
		//    | PostfixUnaryExpression
		//    | PrimaryExpression
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		// LiteralTerminalExpression
		//    | ArithmeticUnaryExpression
		//    | LogicalUnaryExpression
		//    | QuantifiedLogicalExpression
		//    | BitwiseUnaryExpression
		//    | NewfreshExpression
		//    | CastExpression
		////    | CollectionFunctionExpression
		//    | PrefixUnaryExpression
		//    | PostfixUnaryExpression
		//    | PrimaryExpression
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//LiteralTerminalExpression
		public RuleCall getLiteralTerminalExpressionParserRuleCall_0() { return cLiteralTerminalExpressionParserRuleCall_0; }
		
		//ArithmeticUnaryExpression
		public RuleCall getArithmeticUnaryExpressionParserRuleCall_1() { return cArithmeticUnaryExpressionParserRuleCall_1; }
		
		//LogicalUnaryExpression
		public RuleCall getLogicalUnaryExpressionParserRuleCall_2() { return cLogicalUnaryExpressionParserRuleCall_2; }
		
		//QuantifiedLogicalExpression
		public RuleCall getQuantifiedLogicalExpressionParserRuleCall_3() { return cQuantifiedLogicalExpressionParserRuleCall_3; }
		
		//BitwiseUnaryExpression
		public RuleCall getBitwiseUnaryExpressionParserRuleCall_4() { return cBitwiseUnaryExpressionParserRuleCall_4; }
		
		//NewfreshExpression
		public RuleCall getNewfreshExpressionParserRuleCall_5() { return cNewfreshExpressionParserRuleCall_5; }
		
		//CastExpression
		public RuleCall getCastExpressionParserRuleCall_6() { return cCastExpressionParserRuleCall_6; }
		
		//PrefixUnaryExpression
		public RuleCall getPrefixUnaryExpressionParserRuleCall_7() { return cPrefixUnaryExpressionParserRuleCall_7; }
		
		//PostfixUnaryExpression
		public RuleCall getPostfixUnaryExpressionParserRuleCall_8() { return cPostfixUnaryExpressionParserRuleCall_8; }
		
		//PrimaryExpression
		public RuleCall getPrimaryExpressionParserRuleCall_9() { return cPrimaryExpressionParserRuleCall_9; }
	}
	public class PostfixUnaryExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PostfixUnaryExpression");
		private final RuleCall cIncrementOrDecrementPostfixExpressionParserRuleCall = (RuleCall)rule.eContents().get(1);
		
		//// Postfix Increment or Decrement Expression
		//PostfixUnaryExpression returns fmlExpr::Expression
		//    : IncrementOrDecrementPostfixExpression
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//IncrementOrDecrementPostfixExpression
		public RuleCall getIncrementOrDecrementPostfixExpressionParserRuleCall() { return cIncrementOrDecrementPostfixExpressionParserRuleCall; }
	}
	public class IncrementOrDecrementPostfixExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.IncrementOrDecrementPostfixExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cLeftHandSideAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cLeftHandSideLeftHandSideExpressionParserRuleCall_0_0 = (RuleCall)cLeftHandSideAssignment_0.eContents().get(0);
		private final Assignment cOperatorAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final Alternatives cOperatorAlternatives_1_0 = (Alternatives)cOperatorAssignment_1.eContents().get(0);
		private final RuleCall cOperatorAffixOperatorParserRuleCall_1_0_0 = (RuleCall)cOperatorAlternatives_1_0.eContents().get(0);
		private final Keyword cOperatorGreaterThanSignEqualsSignGreaterThanSignKeyword_1_0_1 = (Keyword)cOperatorAlternatives_1_0.eContents().get(1);
		
		//IncrementOrDecrementPostfixExpression returns fmlExpr::IncrementOrDecrementPostfixExpression
		//    : leftHandSide=LeftHandSideExpression operator=(AffixOperator  | '>=>')
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//leftHandSide=LeftHandSideExpression operator=(AffixOperator  | '>=>')
		public Group getGroup() { return cGroup; }
		
		//leftHandSide=LeftHandSideExpression
		public Assignment getLeftHandSideAssignment_0() { return cLeftHandSideAssignment_0; }
		
		//LeftHandSideExpression
		public RuleCall getLeftHandSideLeftHandSideExpressionParserRuleCall_0_0() { return cLeftHandSideLeftHandSideExpressionParserRuleCall_0_0; }
		
		//operator=(AffixOperator  | '>=>')
		public Assignment getOperatorAssignment_1() { return cOperatorAssignment_1; }
		
		//(AffixOperator  | '>=>')
		public Alternatives getOperatorAlternatives_1_0() { return cOperatorAlternatives_1_0; }
		
		//AffixOperator
		public RuleCall getOperatorAffixOperatorParserRuleCall_1_0_0() { return cOperatorAffixOperatorParserRuleCall_1_0_0; }
		
		//'>=>'
		public Keyword getOperatorGreaterThanSignEqualsSignGreaterThanSignKeyword_1_0_1() { return cOperatorGreaterThanSignEqualsSignGreaterThanSignKeyword_1_0_1; }
	}
	public class PrefixUnaryExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PrefixUnaryExpression");
		private final RuleCall cIncrementOrDecrementPrefixExpressionParserRuleCall = (RuleCall)rule.eContents().get(1);
		
		//// Prefix Increment or Decrement Expression
		//PrefixUnaryExpression returns fmlExpr::Expression
		//    : IncrementOrDecrementPrefixExpression
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//IncrementOrDecrementPrefixExpression
		public RuleCall getIncrementOrDecrementPrefixExpressionParserRuleCall() { return cIncrementOrDecrementPrefixExpressionParserRuleCall; }
	}
	public class IncrementOrDecrementPrefixExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.IncrementOrDecrementPrefixExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cOperatorAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cOperatorAffixOperatorParserRuleCall_0_0 = (RuleCall)cOperatorAssignment_0.eContents().get(0);
		private final Assignment cLeftHandSideAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cLeftHandSideLeftHandSideExpressionParserRuleCall_1_0 = (RuleCall)cLeftHandSideAssignment_1.eContents().get(0);
		
		//IncrementOrDecrementPrefixExpression returns fmlExpr::IncrementOrDecrementPrefixExpression
		//    : operator=AffixOperator leftHandSide=LeftHandSideExpression
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//operator=AffixOperator leftHandSide=LeftHandSideExpression
		public Group getGroup() { return cGroup; }
		
		//operator=AffixOperator
		public Assignment getOperatorAssignment_0() { return cOperatorAssignment_0; }
		
		//AffixOperator
		public RuleCall getOperatorAffixOperatorParserRuleCall_0_0() { return cOperatorAffixOperatorParserRuleCall_0_0; }
		
		//leftHandSide=LeftHandSideExpression
		public Assignment getLeftHandSideAssignment_1() { return cLeftHandSideAssignment_1; }
		
		//LeftHandSideExpression
		public RuleCall getLeftHandSideLeftHandSideExpressionParserRuleCall_1_0() { return cLeftHandSideLeftHandSideExpressionParserRuleCall_1_0; }
	}
	public class AffixOperatorElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.AffixOperator");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final Keyword cPlusSignPlusSignKeyword_0 = (Keyword)cAlternatives.eContents().get(0);
		private final Keyword cHyphenMinusHyphenMinusKeyword_1 = (Keyword)cAlternatives.eContents().get(1);
		
		//AffixOperator
		//    : '++' | '--'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//'++' | '--'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//'++'
		public Keyword getPlusSignPlusSignKeyword_0() { return cPlusSignPlusSignKeyword_0; }
		
		//'--'
		public Keyword getHyphenMinusHyphenMinusKeyword_1() { return cHyphenMinusHyphenMinusKeyword_1; }
	}
	public class NewfreshExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.NewfreshExpression");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final Group cGroup_0 = (Group)cAlternatives.eContents().get(0);
		private final Keyword cNewfreshKeyword_0_0 = (Keyword)cGroup_0.eContents().get(0);
		private final Assignment cLeftHandSideAssignment_0_1 = (Assignment)cGroup_0.eContents().get(1);
		private final RuleCall cLeftHandSideLeftHandSideExpressionParserRuleCall_0_1_0 = (RuleCall)cLeftHandSideAssignment_0_1.eContents().get(0);
		private final Group cGroup_1 = (Group)cAlternatives.eContents().get(1);
		private final Keyword cLeftParenthesisColonKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final Assignment cLeftHandSideAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final RuleCall cLeftHandSideLeftHandSideExpressionParserRuleCall_1_1_0 = (RuleCall)cLeftHandSideAssignment_1_1.eContents().get(0);
		private final Keyword cNewfreshKeyword_1_2 = (Keyword)cGroup_1.eContents().get(2);
		private final Keyword cRightParenthesisKeyword_1_3 = (Keyword)cGroup_1.eContents().get(3);
		
		//// Newfresh Unary Expression
		//NewfreshExpression returns fmlExpr::NewfreshExpression
		//    : 'newfresh' leftHandSide=LeftHandSideExpression
		//    | '(:' leftHandSide=LeftHandSideExpression 'newfresh' ')'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//'newfresh' leftHandSide=LeftHandSideExpression
		//   | '(:' leftHandSide=LeftHandSideExpression 'newfresh' ')'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//'newfresh' leftHandSide=LeftHandSideExpression
		public Group getGroup_0() { return cGroup_0; }
		
		//'newfresh'
		public Keyword getNewfreshKeyword_0_0() { return cNewfreshKeyword_0_0; }
		
		//leftHandSide=LeftHandSideExpression
		public Assignment getLeftHandSideAssignment_0_1() { return cLeftHandSideAssignment_0_1; }
		
		//LeftHandSideExpression
		public RuleCall getLeftHandSideLeftHandSideExpressionParserRuleCall_0_1_0() { return cLeftHandSideLeftHandSideExpressionParserRuleCall_0_1_0; }
		
		//'(:' leftHandSide=LeftHandSideExpression 'newfresh' ')'
		public Group getGroup_1() { return cGroup_1; }
		
		//'(:'
		public Keyword getLeftParenthesisColonKeyword_1_0() { return cLeftParenthesisColonKeyword_1_0; }
		
		//leftHandSide=LeftHandSideExpression
		public Assignment getLeftHandSideAssignment_1_1() { return cLeftHandSideAssignment_1_1; }
		
		//LeftHandSideExpression
		public RuleCall getLeftHandSideLeftHandSideExpressionParserRuleCall_1_1_0() { return cLeftHandSideLeftHandSideExpressionParserRuleCall_1_1_0; }
		
		//'newfresh'
		public Keyword getNewfreshKeyword_1_2() { return cNewfreshKeyword_1_2; }
		
		//')'
		public Keyword getRightParenthesisKeyword_1_3() { return cRightParenthesisKeyword_1_3; }
	}
	public class CastExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.CastExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cCtorKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Keyword cLessThanSignKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cDatatypeAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final CrossReference cDatatypeDataTypeCrossReference_2_0 = (CrossReference)cDatatypeAssignment_2.eContents().get(0);
		private final RuleCall cDatatypeDataTypeESUfidParserRuleCall_2_0_1 = (RuleCall)cDatatypeDataTypeCrossReference_2_0.eContents().get(1);
		private final Keyword cGreaterThanSignKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Keyword cLeftParenthesisKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Assignment cOperandAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cOperandExpressionParserRuleCall_5_0 = (RuleCall)cOperandAssignment_5.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_6 = (Keyword)cGroup.eContents().get(6);
		
		//// Cast Expression
		//CastExpression returns fmlExpr::CastExpression
		//    : 'ctor' '<' datatype=[fmlType::DataType|ESUfid] '>'
		//         '(' operand=Expression ')'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//'ctor' '<' datatype=[fmlType::DataType|ESUfid] '>'
		//        '(' operand=Expression ')'
		public Group getGroup() { return cGroup; }
		
		//'ctor'
		public Keyword getCtorKeyword_0() { return cCtorKeyword_0; }
		
		//'<'
		public Keyword getLessThanSignKeyword_1() { return cLessThanSignKeyword_1; }
		
		//datatype=[fmlType::DataType|ESUfid]
		public Assignment getDatatypeAssignment_2() { return cDatatypeAssignment_2; }
		
		//[fmlType::DataType|ESUfid]
		public CrossReference getDatatypeDataTypeCrossReference_2_0() { return cDatatypeDataTypeCrossReference_2_0; }
		
		//ESUfid
		public RuleCall getDatatypeDataTypeESUfidParserRuleCall_2_0_1() { return cDatatypeDataTypeESUfidParserRuleCall_2_0_1; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_3() { return cGreaterThanSignKeyword_3; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_4() { return cLeftParenthesisKeyword_4; }
		
		//operand=Expression
		public Assignment getOperandAssignment_5() { return cOperandAssignment_5; }
		
		//Expression
		public RuleCall getOperandExpressionParserRuleCall_5_0() { return cOperandExpressionParserRuleCall_5_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_6() { return cRightParenthesisKeyword_6; }
	}
	public class CollectionFunctionExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.CollectionFunctionExpression");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final Group cGroup_0 = (Group)cAlternatives.eContents().get(0);
		private final Keyword cEmptyKeyword_0_0 = (Keyword)cGroup_0.eContents().get(0);
		private final RuleCall cExpressionParserRuleCall_0_1 = (RuleCall)cGroup_0.eContents().get(1);
		private final Keyword cRightParenthesisKeyword_0_2 = (Keyword)cGroup_0.eContents().get(2);
		private final Group cGroup_1 = (Group)cAlternatives.eContents().get(1);
		private final Keyword cNonemptyKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final RuleCall cExpressionParserRuleCall_1_1 = (RuleCall)cGroup_1.eContents().get(1);
		private final Keyword cRightParenthesisKeyword_1_2 = (Keyword)cGroup_1.eContents().get(2);
		private final Group cGroup_2 = (Group)cAlternatives.eContents().get(2);
		private final Keyword cSizeKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final RuleCall cExpressionParserRuleCall_2_1 = (RuleCall)cGroup_2.eContents().get(1);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		
		////CollectionFunctionExpression  fmlExpr::MixTupleExpression
		//CollectionFunctionExpression returns fmlExpr::Expression
		//    : 'empty('    Expression ')'
		//    | 'nonempty(' Expression ')'
		//    | 'size('     Expression ')'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//'empty('    Expression ')'
		//   | 'nonempty(' Expression ')'
		//   | 'size('     Expression ')'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//'empty('    Expression ')'
		public Group getGroup_0() { return cGroup_0; }
		
		//'empty('
		public Keyword getEmptyKeyword_0_0() { return cEmptyKeyword_0_0; }
		
		//Expression
		public RuleCall getExpressionParserRuleCall_0_1() { return cExpressionParserRuleCall_0_1; }
		
		//')'
		public Keyword getRightParenthesisKeyword_0_2() { return cRightParenthesisKeyword_0_2; }
		
		//'nonempty(' Expression ')'
		public Group getGroup_1() { return cGroup_1; }
		
		//'nonempty('
		public Keyword getNonemptyKeyword_1_0() { return cNonemptyKeyword_1_0; }
		
		//Expression
		public RuleCall getExpressionParserRuleCall_1_1() { return cExpressionParserRuleCall_1_1; }
		
		//')'
		public Keyword getRightParenthesisKeyword_1_2() { return cRightParenthesisKeyword_1_2; }
		
		//'size('     Expression ')'
		public Group getGroup_2() { return cGroup_2; }
		
		//'size('
		public Keyword getSizeKeyword_2_0() { return cSizeKeyword_2_0; }
		
		//Expression
		public RuleCall getExpressionParserRuleCall_2_1() { return cExpressionParserRuleCall_2_1; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
	}
	public class ArithmeticUnaryExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ArithmeticUnaryExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cOperatorAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cOperatorArithmeticUnaryOperatorParserRuleCall_0_0 = (RuleCall)cOperatorAssignment_0.eContents().get(0);
		private final Assignment cOperandAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cOperandUnaryExpressionParserRuleCall_1_0 = (RuleCall)cOperandAssignment_1.eContents().get(0);
		
		//// Arithmetic Unary Expression
		//ArithmeticUnaryExpression returns fmlExpr::ArithmeticUnaryExpression
		//    : operator=ArithmeticUnaryOperator operand=UnaryExpression
		//;
		@Override public ParserRule getRule() { return rule; }
		
		//operator=ArithmeticUnaryOperator operand=UnaryExpression
		public Group getGroup() { return cGroup; }
		
		//operator=ArithmeticUnaryOperator
		public Assignment getOperatorAssignment_0() { return cOperatorAssignment_0; }
		
		//ArithmeticUnaryOperator
		public RuleCall getOperatorArithmeticUnaryOperatorParserRuleCall_0_0() { return cOperatorArithmeticUnaryOperatorParserRuleCall_0_0; }
		
		//operand=UnaryExpression
		public Assignment getOperandAssignment_1() { return cOperandAssignment_1; }
		
		//UnaryExpression
		public RuleCall getOperandUnaryExpressionParserRuleCall_1_0() { return cOperandUnaryExpressionParserRuleCall_1_0; }
	}
	public class ArithmeticUnaryOperatorElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ArithmeticUnaryOperator");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final Keyword cPlusSignKeyword_0 = (Keyword)cAlternatives.eContents().get(0);
		private final Keyword cHyphenMinusKeyword_1 = (Keyword)cAlternatives.eContents().get(1);
		
		//ArithmeticUnaryOperator
		//    : '+' | '-'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//'+' | '-'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//'+'
		public Keyword getPlusSignKeyword_0() { return cPlusSignKeyword_0; }
		
		//'-'
		public Keyword getHyphenMinusKeyword_1() { return cHyphenMinusKeyword_1; }
	}
	public class QuantifiedLogicalExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.QuantifiedLogicalExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cQuantifierAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final Alternatives cQuantifierAlternatives_0_0 = (Alternatives)cQuantifierAssignment_0.eContents().get(0);
		private final Keyword cQuantifierForallKeyword_0_0_0 = (Keyword)cQuantifierAlternatives_0_0.eContents().get(0);
		private final Keyword cQuantifierExistsKeyword_0_0_1 = (Keyword)cQuantifierAlternatives_0_0.eContents().get(1);
		private final Keyword cLessThanSignKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cVariableAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cVariableBoundVariableParserRuleCall_2_0 = (RuleCall)cVariableAssignment_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 cVariableAssignment_3_1 = (Assignment)cGroup_3.eContents().get(1);
		private final RuleCall cVariableBoundVariableParserRuleCall_3_1_0 = (RuleCall)cVariableAssignment_3_1.eContents().get(0);
		private final Keyword cGreaterThanSignKeyword_4 = (Keyword)cGroup.eContents().get(4);
		private final Keyword cLeftParenthesisKeyword_5 = (Keyword)cGroup.eContents().get(5);
		private final Assignment cPredicateAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cPredicateExpressionParserRuleCall_6_0 = (RuleCall)cPredicateAssignment_6.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_7 = (Keyword)cGroup.eContents().get(7);
		
		//// Logical Quantified Expression
		//QuantifiedLogicalExpression returns fmlExpr::QuantifiedLogicalExpression
		//    : quantifier=( 'forall' | 'exists' )
		//      '<'  variable+=BoundVariable  ( ',' variable+=BoundVariable )*  '>'
		//      '('  predicate=Expression  ')'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//quantifier=( 'forall' | 'exists' )
		//     '<'  variable+=BoundVariable  ( ',' variable+=BoundVariable )*  '>'
		//     '('  predicate=Expression  ')'
		public Group getGroup() { return cGroup; }
		
		//quantifier=( 'forall' | 'exists' )
		public Assignment getQuantifierAssignment_0() { return cQuantifierAssignment_0; }
		
		//( 'forall' | 'exists' )
		public Alternatives getQuantifierAlternatives_0_0() { return cQuantifierAlternatives_0_0; }
		
		//'forall'
		public Keyword getQuantifierForallKeyword_0_0_0() { return cQuantifierForallKeyword_0_0_0; }
		
		//'exists'
		public Keyword getQuantifierExistsKeyword_0_0_1() { return cQuantifierExistsKeyword_0_0_1; }
		
		//'<'
		public Keyword getLessThanSignKeyword_1() { return cLessThanSignKeyword_1; }
		
		//variable+=BoundVariable
		public Assignment getVariableAssignment_2() { return cVariableAssignment_2; }
		
		//BoundVariable
		public RuleCall getVariableBoundVariableParserRuleCall_2_0() { return cVariableBoundVariableParserRuleCall_2_0; }
		
		//( ',' variable+=BoundVariable )*
		public Group getGroup_3() { return cGroup_3; }
		
		//','
		public Keyword getCommaKeyword_3_0() { return cCommaKeyword_3_0; }
		
		//variable+=BoundVariable
		public Assignment getVariableAssignment_3_1() { return cVariableAssignment_3_1; }
		
		//BoundVariable
		public RuleCall getVariableBoundVariableParserRuleCall_3_1_0() { return cVariableBoundVariableParserRuleCall_3_1_0; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_4() { return cGreaterThanSignKeyword_4; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_5() { return cLeftParenthesisKeyword_5; }
		
		//predicate=Expression
		public Assignment getPredicateAssignment_6() { return cPredicateAssignment_6; }
		
		//Expression
		public RuleCall getPredicateExpressionParserRuleCall_6_0() { return cPredicateExpressionParserRuleCall_6_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_7() { return cRightParenthesisKeyword_7; }
	}
	public class BoundVariableElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.BoundVariable");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cNameAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cNameESIdentifierParserRuleCall_0_0 = (RuleCall)cNameAssignment_0.eContents().get(0);
		private final Keyword cColonKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cTypeAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cTypeDataTypeParserRuleCall_2_0 = (RuleCall)cTypeAssignment_2.eContents().get(0);
		
		//BoundVariable returns fmlInfra::Variable
		//    : name=ESIdentifier  ':'  type=DataType
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//name=ESIdentifier  ':'  type=DataType
		public Group getGroup() { return cGroup; }
		
		//name=ESIdentifier
		public Assignment getNameAssignment_0() { return cNameAssignment_0; }
		
		//ESIdentifier
		public RuleCall getNameESIdentifierParserRuleCall_0_0() { return cNameESIdentifierParserRuleCall_0_0; }
		
		//':'
		public Keyword getColonKeyword_1() { return cColonKeyword_1; }
		
		//type=DataType
		public Assignment getTypeAssignment_2() { return cTypeAssignment_2; }
		
		//DataType
		public RuleCall getTypeDataTypeParserRuleCall_2_0() { return cTypeDataTypeParserRuleCall_2_0; }
	}
	public class LogicalUnaryExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LogicalUnaryExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cOperatorAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final Alternatives cOperatorAlternatives_0_0 = (Alternatives)cOperatorAssignment_0.eContents().get(0);
		private final Keyword cOperatorExclamationMarkKeyword_0_0_0 = (Keyword)cOperatorAlternatives_0_0.eContents().get(0);
		private final Keyword cOperatorNotKeyword_0_0_1 = (Keyword)cOperatorAlternatives_0_0.eContents().get(1);
		private final Assignment cOperandAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cOperandUnaryExpressionParserRuleCall_1_0 = (RuleCall)cOperandAssignment_1.eContents().get(0);
		
		//// Logical Unary Expression
		//LogicalUnaryExpression returns fmlExpr::LogicalUnaryExpression
		//    : operator=('!' | 'not') operand=UnaryExpression
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//operator=('!' | 'not') operand=UnaryExpression
		public Group getGroup() { return cGroup; }
		
		//operator=('!' | 'not')
		public Assignment getOperatorAssignment_0() { return cOperatorAssignment_0; }
		
		//('!' | 'not')
		public Alternatives getOperatorAlternatives_0_0() { return cOperatorAlternatives_0_0; }
		
		//'!'
		public Keyword getOperatorExclamationMarkKeyword_0_0_0() { return cOperatorExclamationMarkKeyword_0_0_0; }
		
		//'not'
		public Keyword getOperatorNotKeyword_0_0_1() { return cOperatorNotKeyword_0_0_1; }
		
		//operand=UnaryExpression
		public Assignment getOperandAssignment_1() { return cOperandAssignment_1; }
		
		//UnaryExpression
		public RuleCall getOperandUnaryExpressionParserRuleCall_1_0() { return cOperandUnaryExpressionParserRuleCall_1_0; }
	}
	public class BitwiseUnaryExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.BitwiseUnaryExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cOperatorAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final Keyword cOperatorTildeKeyword_0_0 = (Keyword)cOperatorAssignment_0.eContents().get(0);
		private final Assignment cOperandAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cOperandUnaryExpressionParserRuleCall_1_0 = (RuleCall)cOperandAssignment_1.eContents().get(0);
		
		//// Logical Unary Expression
		//BitwiseUnaryExpression returns fmlExpr::BitwiseUnaryExpression
		//    :operator='~' operand=UnaryExpression
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//operator='~' operand=UnaryExpression
		public Group getGroup() { return cGroup; }
		
		//operator='~'
		public Assignment getOperatorAssignment_0() { return cOperatorAssignment_0; }
		
		//'~'
		public Keyword getOperatorTildeKeyword_0_0() { return cOperatorTildeKeyword_0_0; }
		
		//operand=UnaryExpression
		public Assignment getOperandAssignment_1() { return cOperandAssignment_1; }
		
		//UnaryExpression
		public RuleCall getOperandUnaryExpressionParserRuleCall_1_0() { return cOperandUnaryExpressionParserRuleCall_1_0; }
	}
	public class PrimaryExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PrimaryExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final RuleCall cBaseExpressionParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Action cValueElementSpecificationParentAction_1_0 = (Action)cGroup_1.eContents().get(0);
		private final Keyword cFullStopKeyword_1_1 = (Keyword)cGroup_1.eContents().get(1);
		private final Assignment cElementAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
		private final CrossReference cElementNamedElementCrossReference_1_2_0 = (CrossReference)cElementAssignment_1_2.eContents().get(0);
		private final RuleCall cElementNamedElementESIdentifierParserRuleCall_1_2_0_1 = (RuleCall)cElementNamedElementCrossReference_1_2_0.eContents().get(1);
		private final Alternatives cAlternatives_1_3 = (Alternatives)cGroup_1.eContents().get(3);
		private final Group cGroup_1_3_0 = (Group)cAlternatives_1_3.eContents().get(0);
		private final Assignment cKindAssignment_1_3_0_0 = (Assignment)cGroup_1_3_0.eContents().get(0);
		private final RuleCall cKindValueIndexExpressionKindEnumRuleCall_1_3_0_0_0 = (RuleCall)cKindAssignment_1_3_0_0.eContents().get(0);
		private final Assignment cArgAssignment_1_3_0_1 = (Assignment)cGroup_1_3_0.eContents().get(1);
		private final RuleCall cArgPositionalTupleExpressionListParserRuleCall_1_3_0_1_0 = (RuleCall)cArgAssignment_1_3_0_1.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_1_3_0_2 = (Keyword)cGroup_1_3_0.eContents().get(2);
		private final Group cGroup_1_3_1 = (Group)cAlternatives_1_3.eContents().get(1);
		private final Assignment cKindAssignment_1_3_1_0 = (Assignment)cGroup_1_3_1.eContents().get(0);
		private final RuleCall cKindValueParameterExpressionKindEnumRuleCall_1_3_1_0_0 = (RuleCall)cKindAssignment_1_3_1_0.eContents().get(0);
		private final Assignment cArgAssignment_1_3_1_1 = (Assignment)cGroup_1_3_1.eContents().get(1);
		private final RuleCall cArgMixTupleExpressionListParserRuleCall_1_3_1_1_0 = (RuleCall)cArgAssignment_1_3_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_1_3_1_2 = (Keyword)cGroup_1_3_1.eContents().get(2);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Action cValueElementSpecificationParentAction_2_0 = (Action)cGroup_2.eContents().get(0);
		private final Keyword cHyphenMinusGreaterThanSignKeyword_2_1 = (Keyword)cGroup_2.eContents().get(1);
		private final Assignment cElementAssignment_2_2 = (Assignment)cGroup_2.eContents().get(2);
		private final CrossReference cElementNamedElementCrossReference_2_2_0 = (CrossReference)cElementAssignment_2_2.eContents().get(0);
		private final RuleCall cElementNamedElementESIdentifierParserRuleCall_2_2_0_1 = (RuleCall)cElementNamedElementCrossReference_2_2_0.eContents().get(1);
		private final Alternatives cAlternatives_2_3 = (Alternatives)cGroup_2.eContents().get(3);
		private final Group cGroup_2_3_0 = (Group)cAlternatives_2_3.eContents().get(0);
		private final Assignment cKindAssignment_2_3_0_0 = (Assignment)cGroup_2_3_0.eContents().get(0);
		private final RuleCall cKindValueIndexExpressionKindEnumRuleCall_2_3_0_0_0 = (RuleCall)cKindAssignment_2_3_0_0.eContents().get(0);
		private final Assignment cArgAssignment_2_3_0_1 = (Assignment)cGroup_2_3_0.eContents().get(1);
		private final RuleCall cArgPositionalTupleExpressionListParserRuleCall_2_3_0_1_0 = (RuleCall)cArgAssignment_2_3_0_1.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_2_3_0_2 = (Keyword)cGroup_2_3_0.eContents().get(2);
		private final Group cGroup_2_3_1 = (Group)cAlternatives_2_3.eContents().get(1);
		private final Assignment cKindAssignment_2_3_1_0 = (Assignment)cGroup_2_3_1.eContents().get(0);
		private final RuleCall cKindValueParameterExpressionKindEnumRuleCall_2_3_1_0_0 = (RuleCall)cKindAssignment_2_3_1_0.eContents().get(0);
		private final Assignment cArgAssignment_2_3_1_1 = (Assignment)cGroup_2_3_1.eContents().get(1);
		private final RuleCall cArgMixTupleExpressionListParserRuleCall_2_3_1_1_0 = (RuleCall)cArgAssignment_2_3_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_3_1_2 = (Keyword)cGroup_2_3_1.eContents().get(2);
		private final Group cGroup_2_4 = (Group)cGroup_2.eContents().get(4);
		private final Action cValueElementSpecificationParentAction_2_4_0 = (Action)cGroup_2_4.eContents().get(0);
		private final Keyword cFullStopKeyword_2_4_1 = (Keyword)cGroup_2_4.eContents().get(1);
		private final Assignment cElementAssignment_2_4_2 = (Assignment)cGroup_2_4.eContents().get(2);
		private final CrossReference cElementNamedElementCrossReference_2_4_2_0 = (CrossReference)cElementAssignment_2_4_2.eContents().get(0);
		private final RuleCall cElementNamedElementESIdentifierParserRuleCall_2_4_2_0_1 = (RuleCall)cElementNamedElementCrossReference_2_4_2_0.eContents().get(1);
		private final Alternatives cAlternatives_2_4_3 = (Alternatives)cGroup_2_4.eContents().get(3);
		private final Group cGroup_2_4_3_0 = (Group)cAlternatives_2_4_3.eContents().get(0);
		private final Assignment cKindAssignment_2_4_3_0_0 = (Assignment)cGroup_2_4_3_0.eContents().get(0);
		private final RuleCall cKindValueIndexExpressionKindEnumRuleCall_2_4_3_0_0_0 = (RuleCall)cKindAssignment_2_4_3_0_0.eContents().get(0);
		private final Assignment cArgAssignment_2_4_3_0_1 = (Assignment)cGroup_2_4_3_0.eContents().get(1);
		private final RuleCall cArgPositionalTupleExpressionListParserRuleCall_2_4_3_0_1_0 = (RuleCall)cArgAssignment_2_4_3_0_1.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_2_4_3_0_2 = (Keyword)cGroup_2_4_3_0.eContents().get(2);
		private final Group cGroup_2_4_3_1 = (Group)cAlternatives_2_4_3.eContents().get(1);
		private final Assignment cKindAssignment_2_4_3_1_0 = (Assignment)cGroup_2_4_3_1.eContents().get(0);
		private final RuleCall cKindValueParameterExpressionKindEnumRuleCall_2_4_3_1_0_0 = (RuleCall)cKindAssignment_2_4_3_1_0.eContents().get(0);
		private final Assignment cArgAssignment_2_4_3_1_1 = (Assignment)cGroup_2_4_3_1.eContents().get(1);
		private final RuleCall cArgMixTupleExpressionListParserRuleCall_2_4_3_1_1_0 = (RuleCall)cArgAssignment_2_4_3_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_4_3_1_2 = (Keyword)cGroup_2_4_3_1.eContents().get(2);
		
		//PrimaryExpression returns fmlExpr::Expression
		//    : BaseExpression
		//        // '.' element
		//        ( { fmlExpr::ValueElementSpecification.parent=current }
		//            '.' //kind=ValueDotFieldExpressionKind
		//            element=[fmlCommon::NamedElement|ESIdentifier]
		//            // '[' index ',' ... ',' index ']'
		//            ( kind=ValueIndexExpressionKind
		//                arg=PositionalTupleExpressionList  ']'
		//            // '(' parameter ',' ... ',' parameter ')'
		//            | kind=ValueParameterExpressionKind
		//                arg=MixTupleExpressionList  ')'
		//            )?
		//        )*
		//        // '->' element
		//        ( { fmlExpr::ValueElementSpecification.parent=current }
		//            '->' //kind=ValueArrowFieldExpressionKind
		//            element=[fmlCommon::NamedElement|ESIdentifier]
		//            // '[' index ',' ... ',' index ']'
		//            ( kind=ValueIndexExpressionKind
		//                arg=PositionalTupleExpressionList  ']'
		//            // '(' parameter ',' ... ',' parameter ')'
		//            | kind=ValueParameterExpressionKind
		//                arg=MixTupleExpressionList  ')'
		//            )?
		//            // '.' element
		//            ( { fmlExpr::ValueElementSpecification.parent=current }
		//                 '.' //kind=ValueDotFieldExpressionKind
		//                element=[fmlCommon::NamedElement|ESIdentifier]
		//                // '[' index ',' ... ',' index ']'
		//                ( kind=ValueIndexExpressionKind
		//                    arg=PositionalTupleExpressionList  ']'
		//                // '(' parameter ',' ... ',' parameter ')'
		//                | kind=ValueParameterExpressionKind
		//                    arg=MixTupleExpressionList  ')'
		//                )?
		//            )*
		//        )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//BaseExpression
		//       // '.' element
		//       ( { fmlExpr::ValueElementSpecification.parent=current }
		//           '.' //kind=ValueDotFieldExpressionKind
		//           element=[fmlCommon::NamedElement|ESIdentifier]
		//           // '[' index ',' ... ',' index ']'
		//           ( kind=ValueIndexExpressionKind
		//               arg=PositionalTupleExpressionList  ']'
		//           // '(' parameter ',' ... ',' parameter ')'
		//           | kind=ValueParameterExpressionKind
		//               arg=MixTupleExpressionList  ')'
		//           )?
		//       )*
		//       // '->' element
		//       ( { fmlExpr::ValueElementSpecification.parent=current }
		//           '->' //kind=ValueArrowFieldExpressionKind
		//           element=[fmlCommon::NamedElement|ESIdentifier]
		//           // '[' index ',' ... ',' index ']'
		//           ( kind=ValueIndexExpressionKind
		//               arg=PositionalTupleExpressionList  ']'
		//           // '(' parameter ',' ... ',' parameter ')'
		//           | kind=ValueParameterExpressionKind
		//               arg=MixTupleExpressionList  ')'
		//           )?
		//           // '.' element
		//           ( { fmlExpr::ValueElementSpecification.parent=current }
		//                '.' //kind=ValueDotFieldExpressionKind
		//               element=[fmlCommon::NamedElement|ESIdentifier]
		//               // '[' index ',' ... ',' index ']'
		//               ( kind=ValueIndexExpressionKind
		//                   arg=PositionalTupleExpressionList  ']'
		//               // '(' parameter ',' ... ',' parameter ')'
		//               | kind=ValueParameterExpressionKind
		//                   arg=MixTupleExpressionList  ')'
		//               )?
		//           )*
		//       )?
		public Group getGroup() { return cGroup; }
		
		//BaseExpression
		public RuleCall getBaseExpressionParserRuleCall_0() { return cBaseExpressionParserRuleCall_0; }
		
		//// '.' element
		//( { fmlExpr::ValueElementSpecification.parent=current }
		//    '.' //kind=ValueDotFieldExpressionKind
		//    element=[fmlCommon::NamedElement|ESIdentifier]
		//    // '[' index ',' ... ',' index ']'
		//    ( kind=ValueIndexExpressionKind
		//        arg=PositionalTupleExpressionList  ']'
		//    // '(' parameter ',' ... ',' parameter ')'
		//    | kind=ValueParameterExpressionKind
		//        arg=MixTupleExpressionList  ')'
		//    )?
		//)*
		public Group getGroup_1() { return cGroup_1; }
		
		//{ fmlExpr::ValueElementSpecification.parent=current }
		public Action getValueElementSpecificationParentAction_1_0() { return cValueElementSpecificationParentAction_1_0; }
		
		//'.'
		public Keyword getFullStopKeyword_1_1() { return cFullStopKeyword_1_1; }
		
		////kind=ValueDotFieldExpressionKind
		//           element=[fmlCommon::NamedElement|ESIdentifier]
		public Assignment getElementAssignment_1_2() { return cElementAssignment_1_2; }
		
		//[fmlCommon::NamedElement|ESIdentifier]
		public CrossReference getElementNamedElementCrossReference_1_2_0() { return cElementNamedElementCrossReference_1_2_0; }
		
		//ESIdentifier
		public RuleCall getElementNamedElementESIdentifierParserRuleCall_1_2_0_1() { return cElementNamedElementESIdentifierParserRuleCall_1_2_0_1; }
		
		//// '[' index ',' ... ',' index ']'
		//( kind=ValueIndexExpressionKind
		//    arg=PositionalTupleExpressionList  ']'
		//// '(' parameter ',' ... ',' parameter ')'
		//| kind=ValueParameterExpressionKind
		//    arg=MixTupleExpressionList  ')'
		//)?
		public Alternatives getAlternatives_1_3() { return cAlternatives_1_3; }
		
		//kind=ValueIndexExpressionKind
		//               arg=PositionalTupleExpressionList  ']'
		public Group getGroup_1_3_0() { return cGroup_1_3_0; }
		
		//kind=ValueIndexExpressionKind
		public Assignment getKindAssignment_1_3_0_0() { return cKindAssignment_1_3_0_0; }
		
		//ValueIndexExpressionKind
		public RuleCall getKindValueIndexExpressionKindEnumRuleCall_1_3_0_0_0() { return cKindValueIndexExpressionKindEnumRuleCall_1_3_0_0_0; }
		
		//arg=PositionalTupleExpressionList
		public Assignment getArgAssignment_1_3_0_1() { return cArgAssignment_1_3_0_1; }
		
		//PositionalTupleExpressionList
		public RuleCall getArgPositionalTupleExpressionListParserRuleCall_1_3_0_1_0() { return cArgPositionalTupleExpressionListParserRuleCall_1_3_0_1_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_1_3_0_2() { return cRightSquareBracketKeyword_1_3_0_2; }
		
		//kind=ValueParameterExpressionKind
		//               arg=MixTupleExpressionList  ')'
		public Group getGroup_1_3_1() { return cGroup_1_3_1; }
		
		//kind=ValueParameterExpressionKind
		public Assignment getKindAssignment_1_3_1_0() { return cKindAssignment_1_3_1_0; }
		
		//ValueParameterExpressionKind
		public RuleCall getKindValueParameterExpressionKindEnumRuleCall_1_3_1_0_0() { return cKindValueParameterExpressionKindEnumRuleCall_1_3_1_0_0; }
		
		//arg=MixTupleExpressionList
		public Assignment getArgAssignment_1_3_1_1() { return cArgAssignment_1_3_1_1; }
		
		//MixTupleExpressionList
		public RuleCall getArgMixTupleExpressionListParserRuleCall_1_3_1_1_0() { return cArgMixTupleExpressionListParserRuleCall_1_3_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_1_3_1_2() { return cRightParenthesisKeyword_1_3_1_2; }
		
		//// '->' element
		//( { fmlExpr::ValueElementSpecification.parent=current }
		//    '->' //kind=ValueArrowFieldExpressionKind
		//    element=[fmlCommon::NamedElement|ESIdentifier]
		//    // '[' index ',' ... ',' index ']'
		//    ( kind=ValueIndexExpressionKind
		//        arg=PositionalTupleExpressionList  ']'
		//    // '(' parameter ',' ... ',' parameter ')'
		//    | kind=ValueParameterExpressionKind
		//        arg=MixTupleExpressionList  ')'
		//    )?
		//    // '.' element
		//    ( { fmlExpr::ValueElementSpecification.parent=current }
		//         '.' //kind=ValueDotFieldExpressionKind
		//        element=[fmlCommon::NamedElement|ESIdentifier]
		//        // '[' index ',' ... ',' index ']'
		//        ( kind=ValueIndexExpressionKind
		//            arg=PositionalTupleExpressionList  ']'
		//        // '(' parameter ',' ... ',' parameter ')'
		//        | kind=ValueParameterExpressionKind
		//            arg=MixTupleExpressionList  ')'
		//        )?
		//    )*
		//)?
		public Group getGroup_2() { return cGroup_2; }
		
		//{ fmlExpr::ValueElementSpecification.parent=current }
		public Action getValueElementSpecificationParentAction_2_0() { return cValueElementSpecificationParentAction_2_0; }
		
		//'->'
		public Keyword getHyphenMinusGreaterThanSignKeyword_2_1() { return cHyphenMinusGreaterThanSignKeyword_2_1; }
		
		////kind=ValueArrowFieldExpressionKind
		//           element=[fmlCommon::NamedElement|ESIdentifier]
		public Assignment getElementAssignment_2_2() { return cElementAssignment_2_2; }
		
		//[fmlCommon::NamedElement|ESIdentifier]
		public CrossReference getElementNamedElementCrossReference_2_2_0() { return cElementNamedElementCrossReference_2_2_0; }
		
		//ESIdentifier
		public RuleCall getElementNamedElementESIdentifierParserRuleCall_2_2_0_1() { return cElementNamedElementESIdentifierParserRuleCall_2_2_0_1; }
		
		//// '[' index ',' ... ',' index ']'
		//( kind=ValueIndexExpressionKind
		//    arg=PositionalTupleExpressionList  ']'
		//// '(' parameter ',' ... ',' parameter ')'
		//| kind=ValueParameterExpressionKind
		//    arg=MixTupleExpressionList  ')'
		//)?
		public Alternatives getAlternatives_2_3() { return cAlternatives_2_3; }
		
		//kind=ValueIndexExpressionKind
		//               arg=PositionalTupleExpressionList  ']'
		public Group getGroup_2_3_0() { return cGroup_2_3_0; }
		
		//kind=ValueIndexExpressionKind
		public Assignment getKindAssignment_2_3_0_0() { return cKindAssignment_2_3_0_0; }
		
		//ValueIndexExpressionKind
		public RuleCall getKindValueIndexExpressionKindEnumRuleCall_2_3_0_0_0() { return cKindValueIndexExpressionKindEnumRuleCall_2_3_0_0_0; }
		
		//arg=PositionalTupleExpressionList
		public Assignment getArgAssignment_2_3_0_1() { return cArgAssignment_2_3_0_1; }
		
		//PositionalTupleExpressionList
		public RuleCall getArgPositionalTupleExpressionListParserRuleCall_2_3_0_1_0() { return cArgPositionalTupleExpressionListParserRuleCall_2_3_0_1_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_2_3_0_2() { return cRightSquareBracketKeyword_2_3_0_2; }
		
		//kind=ValueParameterExpressionKind
		//               arg=MixTupleExpressionList  ')'
		public Group getGroup_2_3_1() { return cGroup_2_3_1; }
		
		//kind=ValueParameterExpressionKind
		public Assignment getKindAssignment_2_3_1_0() { return cKindAssignment_2_3_1_0; }
		
		//ValueParameterExpressionKind
		public RuleCall getKindValueParameterExpressionKindEnumRuleCall_2_3_1_0_0() { return cKindValueParameterExpressionKindEnumRuleCall_2_3_1_0_0; }
		
		//arg=MixTupleExpressionList
		public Assignment getArgAssignment_2_3_1_1() { return cArgAssignment_2_3_1_1; }
		
		//MixTupleExpressionList
		public RuleCall getArgMixTupleExpressionListParserRuleCall_2_3_1_1_0() { return cArgMixTupleExpressionListParserRuleCall_2_3_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_3_1_2() { return cRightParenthesisKeyword_2_3_1_2; }
		
		//// '.' element
		//( { fmlExpr::ValueElementSpecification.parent=current }
		//     '.' //kind=ValueDotFieldExpressionKind
		//    element=[fmlCommon::NamedElement|ESIdentifier]
		//    // '[' index ',' ... ',' index ']'
		//    ( kind=ValueIndexExpressionKind
		//        arg=PositionalTupleExpressionList  ']'
		//    // '(' parameter ',' ... ',' parameter ')'
		//    | kind=ValueParameterExpressionKind
		//        arg=MixTupleExpressionList  ')'
		//    )?
		//)*
		public Group getGroup_2_4() { return cGroup_2_4; }
		
		//{ fmlExpr::ValueElementSpecification.parent=current }
		public Action getValueElementSpecificationParentAction_2_4_0() { return cValueElementSpecificationParentAction_2_4_0; }
		
		//'.'
		public Keyword getFullStopKeyword_2_4_1() { return cFullStopKeyword_2_4_1; }
		
		////kind=ValueDotFieldExpressionKind
		//               element=[fmlCommon::NamedElement|ESIdentifier]
		public Assignment getElementAssignment_2_4_2() { return cElementAssignment_2_4_2; }
		
		//[fmlCommon::NamedElement|ESIdentifier]
		public CrossReference getElementNamedElementCrossReference_2_4_2_0() { return cElementNamedElementCrossReference_2_4_2_0; }
		
		//ESIdentifier
		public RuleCall getElementNamedElementESIdentifierParserRuleCall_2_4_2_0_1() { return cElementNamedElementESIdentifierParserRuleCall_2_4_2_0_1; }
		
		//// '[' index ',' ... ',' index ']'
		//( kind=ValueIndexExpressionKind
		//    arg=PositionalTupleExpressionList  ']'
		//// '(' parameter ',' ... ',' parameter ')'
		//| kind=ValueParameterExpressionKind
		//    arg=MixTupleExpressionList  ')'
		//)?
		public Alternatives getAlternatives_2_4_3() { return cAlternatives_2_4_3; }
		
		//kind=ValueIndexExpressionKind
		//                   arg=PositionalTupleExpressionList  ']'
		public Group getGroup_2_4_3_0() { return cGroup_2_4_3_0; }
		
		//kind=ValueIndexExpressionKind
		public Assignment getKindAssignment_2_4_3_0_0() { return cKindAssignment_2_4_3_0_0; }
		
		//ValueIndexExpressionKind
		public RuleCall getKindValueIndexExpressionKindEnumRuleCall_2_4_3_0_0_0() { return cKindValueIndexExpressionKindEnumRuleCall_2_4_3_0_0_0; }
		
		//arg=PositionalTupleExpressionList
		public Assignment getArgAssignment_2_4_3_0_1() { return cArgAssignment_2_4_3_0_1; }
		
		//PositionalTupleExpressionList
		public RuleCall getArgPositionalTupleExpressionListParserRuleCall_2_4_3_0_1_0() { return cArgPositionalTupleExpressionListParserRuleCall_2_4_3_0_1_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_2_4_3_0_2() { return cRightSquareBracketKeyword_2_4_3_0_2; }
		
		//kind=ValueParameterExpressionKind
		//                   arg=MixTupleExpressionList  ')'
		public Group getGroup_2_4_3_1() { return cGroup_2_4_3_1; }
		
		//kind=ValueParameterExpressionKind
		public Assignment getKindAssignment_2_4_3_1_0() { return cKindAssignment_2_4_3_1_0; }
		
		//ValueParameterExpressionKind
		public RuleCall getKindValueParameterExpressionKindEnumRuleCall_2_4_3_1_0_0() { return cKindValueParameterExpressionKindEnumRuleCall_2_4_3_1_0_0; }
		
		//arg=MixTupleExpressionList
		public Assignment getArgAssignment_2_4_3_1_1() { return cArgAssignment_2_4_3_1_1; }
		
		//MixTupleExpressionList
		public RuleCall getArgMixTupleExpressionListParserRuleCall_2_4_3_1_1_0() { return cArgMixTupleExpressionListParserRuleCall_2_4_3_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_4_3_1_2() { return cRightParenthesisKeyword_2_4_3_1_2; }
	}
	public class BaseExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.BaseExpression");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cLiteralReferenceableExpressionParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final Group cGroup_1 = (Group)cAlternatives.eContents().get(1);
		private final Keyword cLeftParenthesisKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final RuleCall cExpressionParserRuleCall_1_1 = (RuleCall)cGroup_1.eContents().get(1);
		private final Keyword cRightParenthesisKeyword_1_2 = (Keyword)cGroup_1.eContents().get(2);
		private final RuleCall cInvokeExpressionDeprecatedParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		private final RuleCall cDynamicInstantiationExpressionParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		
		//BaseExpression returns fmlExpr::Expression
		//    : LiteralReferenceableExpression
		//    | '(' Expression ')'
		//    | InvokeExpressionDeprecated
		//    | DynamicInstantiationExpression
		////    | NamedExpression
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//LiteralReferenceableExpression
		//   | '(' Expression ')'
		//   | InvokeExpressionDeprecated
		//   | DynamicInstantiationExpression
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//LiteralReferenceableExpression
		public RuleCall getLiteralReferenceableExpressionParserRuleCall_0() { return cLiteralReferenceableExpressionParserRuleCall_0; }
		
		//'(' Expression ')'
		public Group getGroup_1() { return cGroup_1; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_1_0() { return cLeftParenthesisKeyword_1_0; }
		
		//Expression
		public RuleCall getExpressionParserRuleCall_1_1() { return cExpressionParserRuleCall_1_1; }
		
		//')'
		public Keyword getRightParenthesisKeyword_1_2() { return cRightParenthesisKeyword_1_2; }
		
		//InvokeExpressionDeprecated
		public RuleCall getInvokeExpressionDeprecatedParserRuleCall_2() { return cInvokeExpressionDeprecatedParserRuleCall_2; }
		
		//DynamicInstantiationExpression
		public RuleCall getDynamicInstantiationExpressionParserRuleCall_3() { return cDynamicInstantiationExpressionParserRuleCall_3; }
	}
	public class InvokeExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.InvokeExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cInvokeExpressionAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cInvokableAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cInvokableValueSelectionExpressionParserRuleCall_1_0 = (RuleCall)cInvokableAssignment_1.eContents().get(0);
		
		//// Behavior Invoke Expression
		//InvokeExpression returns fmlExpr::InvokeExpression
		//    : {fmlExpr::InvokeExpression}
		//        invokable=ValueSelectionExpression
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlExpr::InvokeExpression}
		//       invokable=ValueSelectionExpression
		public Group getGroup() { return cGroup; }
		
		//{fmlExpr::InvokeExpression}
		public Action getInvokeExpressionAction_0() { return cInvokeExpressionAction_0; }
		
		//invokable=ValueSelectionExpression
		public Assignment getInvokableAssignment_1() { return cInvokableAssignment_1; }
		
		//ValueSelectionExpression
		public RuleCall getInvokableValueSelectionExpressionParserRuleCall_1_0() { return cInvokableValueSelectionExpressionParserRuleCall_1_0; }
	}
	public class InvokeExpressionDeprecatedElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.InvokeExpressionDeprecated");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cInvokeExpressionAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cLeftParenthesisColonKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cArgsAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cArgsExpressionParserRuleCall_2_0 = (RuleCall)cArgsAssignment_2.eContents().get(0);
		private final Assignment cInvokableAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cInvokableLiteralReferenceElementParserRuleCall_3_0 = (RuleCall)cInvokableAssignment_3.eContents().get(0);
		private final Assignment cArgsAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cArgsExpressionParserRuleCall_4_0 = (RuleCall)cArgsAssignment_4.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_5 = (Keyword)cGroup.eContents().get(5);
		
		//InvokeExpressionDeprecated returns fmlExpr::InvokeExpression
		//    : {fmlExpr::InvokeExpression}
		//        '(:' args+=Expression invokable=LiteralReferenceElement ( args+=Expression )* ')'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlExpr::InvokeExpression}
		//       '(:' args+=Expression invokable=LiteralReferenceElement ( args+=Expression )* ')'
		public Group getGroup() { return cGroup; }
		
		//{fmlExpr::InvokeExpression}
		public Action getInvokeExpressionAction_0() { return cInvokeExpressionAction_0; }
		
		//'(:'
		public Keyword getLeftParenthesisColonKeyword_1() { return cLeftParenthesisColonKeyword_1; }
		
		//args+=Expression
		public Assignment getArgsAssignment_2() { return cArgsAssignment_2; }
		
		//Expression
		public RuleCall getArgsExpressionParserRuleCall_2_0() { return cArgsExpressionParserRuleCall_2_0; }
		
		//invokable=LiteralReferenceElement
		public Assignment getInvokableAssignment_3() { return cInvokableAssignment_3; }
		
		//LiteralReferenceElement
		public RuleCall getInvokableLiteralReferenceElementParserRuleCall_3_0() { return cInvokableLiteralReferenceElementParserRuleCall_3_0; }
		
		//( args+=Expression )*
		public Assignment getArgsAssignment_4() { return cArgsAssignment_4; }
		
		//Expression
		public RuleCall getArgsExpressionParserRuleCall_4_0() { return cArgsExpressionParserRuleCall_4_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_5() { return cRightParenthesisKeyword_5; }
	}
	public class DynamicInstantiationExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.DynamicInstantiationExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cInstantiationExpressionAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cNewKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cInstanceAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cInstanceInstanceSpecificationParserRuleCall_2_0 = (RuleCall)cInstanceAssignment_2.eContents().get(0);
		
		//DynamicInstantiationExpression returns fmlExpr::InstantiationExpression
		//    : {fmlExpr::InstantiationExpression}
		//        'new' instance=InstanceSpecification
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlExpr::InstantiationExpression}
		//       'new' instance=InstanceSpecification
		public Group getGroup() { return cGroup; }
		
		//{fmlExpr::InstantiationExpression}
		public Action getInstantiationExpressionAction_0() { return cInstantiationExpressionAction_0; }
		
		//'new'
		public Keyword getNewKeyword_1() { return cNewKeyword_1; }
		
		//instance=InstanceSpecification
		public Assignment getInstanceAssignment_2() { return cInstanceAssignment_2; }
		
		//InstanceSpecification
		public RuleCall getInstanceInstanceSpecificationParserRuleCall_2_0() { return cInstanceInstanceSpecificationParserRuleCall_2_0; }
	}
	public class InstanceSpecificationElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.InstanceSpecification");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cInstanceMachineAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cModelAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final CrossReference cModelMachineCrossReference_1_0 = (CrossReference)cModelAssignment_1.eContents().get(0);
		private final RuleCall cModelMachineESIdentifierParserRuleCall_1_0_1 = (RuleCall)cModelMachineCrossReference_1_0.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLeftParenthesisKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final Group cGroup_2_1 = (Group)cGroup_2.eContents().get(1);
		private final Assignment cSlotAssignment_2_1_0 = (Assignment)cGroup_2_1.eContents().get(0);
		private final RuleCall cSlotSlotParameterParserRuleCall_2_1_0_0 = (RuleCall)cSlotAssignment_2_1_0.eContents().get(0);
		private final Group cGroup_2_1_1 = (Group)cGroup_2_1.eContents().get(1);
		private final Keyword cCommaKeyword_2_1_1_0 = (Keyword)cGroup_2_1_1.eContents().get(0);
		private final Assignment cSlotAssignment_2_1_1_1 = (Assignment)cGroup_2_1_1.eContents().get(1);
		private final RuleCall cSlotSlotParameterParserRuleCall_2_1_1_1_0 = (RuleCall)cSlotAssignment_2_1_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
		private final Keyword cLeftCurlyBracketKeyword_3_0 = (Keyword)cGroup_3.eContents().get(0);
		private final Group cGroup_3_1 = (Group)cGroup_3.eContents().get(1);
		private final Assignment cSlotAssignment_3_1_0 = (Assignment)cGroup_3_1.eContents().get(0);
		private final RuleCall cSlotSlotPropertyParserRuleCall_3_1_0_0 = (RuleCall)cSlotAssignment_3_1_0.eContents().get(0);
		private final Keyword cSemicolonKeyword_3_1_1 = (Keyword)cGroup_3_1.eContents().get(1);
		private final Keyword cRightCurlyBracketKeyword_3_2 = (Keyword)cGroup_3.eContents().get(2);
		
		//InstanceSpecification returns fmlInfra::InstanceMachine
		//    : {fmlInfra::InstanceMachine}
		//        model=[fmlInfra::Machine|ESIdentifier]
		////        ( '(' arg=MixTupleExpressionList ')'
		//        ( '(' ( slot+=SlotParameter ( ',' slot+=SlotParameter )* )? ')' )?
		//        ( '{' ( slot+=SlotProperty ';' )*  '}' )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		// {fmlInfra::InstanceMachine}
		//        model=[fmlInfra::Machine|ESIdentifier]
		////        ( '(' arg=MixTupleExpressionList ')'
		//        ( '(' ( slot+=SlotParameter ( ',' slot+=SlotParameter )* )? ')' )?
		//        ( '{' ( slot+=SlotProperty ';' )*  '}' )?
		public Group getGroup() { return cGroup; }
		
		//{fmlInfra::InstanceMachine}
		public Action getInstanceMachineAction_0() { return cInstanceMachineAction_0; }
		
		//model=[fmlInfra::Machine|ESIdentifier]
		public Assignment getModelAssignment_1() { return cModelAssignment_1; }
		
		//[fmlInfra::Machine|ESIdentifier]
		public CrossReference getModelMachineCrossReference_1_0() { return cModelMachineCrossReference_1_0; }
		
		//ESIdentifier
		public RuleCall getModelMachineESIdentifierParserRuleCall_1_0_1() { return cModelMachineESIdentifierParserRuleCall_1_0_1; }
		
		////        ( '(' arg=MixTupleExpressionList ')'
		//        ( '(' ( slot+=SlotParameter ( ',' slot+=SlotParameter )* )? ')' )?
		public Group getGroup_2() { return cGroup_2; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_2_0() { return cLeftParenthesisKeyword_2_0; }
		
		//( slot+=SlotParameter ( ',' slot+=SlotParameter )* )?
		public Group getGroup_2_1() { return cGroup_2_1; }
		
		//slot+=SlotParameter
		public Assignment getSlotAssignment_2_1_0() { return cSlotAssignment_2_1_0; }
		
		//SlotParameter
		public RuleCall getSlotSlotParameterParserRuleCall_2_1_0_0() { return cSlotSlotParameterParserRuleCall_2_1_0_0; }
		
		//( ',' slot+=SlotParameter )*
		public Group getGroup_2_1_1() { return cGroup_2_1_1; }
		
		//','
		public Keyword getCommaKeyword_2_1_1_0() { return cCommaKeyword_2_1_1_0; }
		
		//slot+=SlotParameter
		public Assignment getSlotAssignment_2_1_1_1() { return cSlotAssignment_2_1_1_1; }
		
		//SlotParameter
		public RuleCall getSlotSlotParameterParserRuleCall_2_1_1_1_0() { return cSlotSlotParameterParserRuleCall_2_1_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2_2() { return cRightParenthesisKeyword_2_2; }
		
		//( '{' ( slot+=SlotProperty ';' )*  '}' )?
		public Group getGroup_3() { return cGroup_3; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_3_0() { return cLeftCurlyBracketKeyword_3_0; }
		
		//( slot+=SlotProperty ';' )*
		public Group getGroup_3_1() { return cGroup_3_1; }
		
		//slot+=SlotProperty
		public Assignment getSlotAssignment_3_1_0() { return cSlotAssignment_3_1_0; }
		
		//SlotProperty
		public RuleCall getSlotSlotPropertyParserRuleCall_3_1_0_0() { return cSlotSlotPropertyParserRuleCall_3_1_0_0; }
		
		//';'
		public Keyword getSemicolonKeyword_3_1_1() { return cSemicolonKeyword_3_1_1; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_3_2() { return cRightCurlyBracketKeyword_3_2; }
	}
	public class TupleParameterExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.TupleParameterExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cLeftParenthesisKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final RuleCall cMixTupleExpressionListParserRuleCall_1 = (RuleCall)cGroup.eContents().get(1);
		private final Keyword cRightParenthesisKeyword_2 = (Keyword)cGroup.eContents().get(2);
		
		//// Tuple Expression
		//TupleParameterExpression returns fmlExpr::TupleExpression
		//    : '('  MixTupleExpressionList  ')'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//'('  MixTupleExpressionList  ')'
		public Group getGroup() { return cGroup; }
		
		//'('
		public Keyword getLeftParenthesisKeyword_0() { return cLeftParenthesisKeyword_0; }
		
		//MixTupleExpressionList
		public RuleCall getMixTupleExpressionListParserRuleCall_1() { return cMixTupleExpressionListParserRuleCall_1; }
		
		//')'
		public Keyword getRightParenthesisKeyword_2() { return cRightParenthesisKeyword_2; }
	}
	public class MixTupleExpressionListElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.MixTupleExpressionList");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cMixTupleExpressionAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cValueAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final Alternatives cValueAlternatives_1_0 = (Alternatives)cValueAssignment_1.eContents().get(0);
		private final RuleCall cValueExpressionParserRuleCall_1_0_0 = (RuleCall)cValueAlternatives_1_0.eContents().get(0);
		private final RuleCall cValueNamedExpressionParserRuleCall_1_0_1 = (RuleCall)cValueAlternatives_1_0.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cCommaKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final Assignment cValueAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
		private final Alternatives cValueAlternatives_2_1_0 = (Alternatives)cValueAssignment_2_1.eContents().get(0);
		private final RuleCall cValueExpressionParserRuleCall_2_1_0_0 = (RuleCall)cValueAlternatives_2_1_0.eContents().get(0);
		private final RuleCall cValueNamedExpressionParserRuleCall_2_1_0_1 = (RuleCall)cValueAlternatives_2_1_0.eContents().get(1);
		
		//MixTupleExpressionList returns fmlExpr::MixTupleExpression
		//    : {fmlExpr::MixTupleExpression}
		//        value+=( Expression | NamedExpression )
		//        ( ',' value+=( Expression | NamedExpression ) )*
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlExpr::MixTupleExpression}
		//       value+=( Expression | NamedExpression )
		//       ( ',' value+=( Expression | NamedExpression ) )*
		public Group getGroup() { return cGroup; }
		
		//{fmlExpr::MixTupleExpression}
		public Action getMixTupleExpressionAction_0() { return cMixTupleExpressionAction_0; }
		
		//value+=( Expression | NamedExpression )
		public Assignment getValueAssignment_1() { return cValueAssignment_1; }
		
		//( Expression | NamedExpression )
		public Alternatives getValueAlternatives_1_0() { return cValueAlternatives_1_0; }
		
		//Expression
		public RuleCall getValueExpressionParserRuleCall_1_0_0() { return cValueExpressionParserRuleCall_1_0_0; }
		
		//NamedExpression
		public RuleCall getValueNamedExpressionParserRuleCall_1_0_1() { return cValueNamedExpressionParserRuleCall_1_0_1; }
		
		//( ',' value+=( Expression | NamedExpression ) )*
		public Group getGroup_2() { return cGroup_2; }
		
		//','
		public Keyword getCommaKeyword_2_0() { return cCommaKeyword_2_0; }
		
		//value+=( Expression | NamedExpression )
		public Assignment getValueAssignment_2_1() { return cValueAssignment_2_1; }
		
		//( Expression | NamedExpression )
		public Alternatives getValueAlternatives_2_1_0() { return cValueAlternatives_2_1_0; }
		
		//Expression
		public RuleCall getValueExpressionParserRuleCall_2_1_0_0() { return cValueExpressionParserRuleCall_2_1_0_0; }
		
		//NamedExpression
		public RuleCall getValueNamedExpressionParserRuleCall_2_1_0_1() { return cValueNamedExpressionParserRuleCall_2_1_0_1; }
	}
	public class PositionalTupleExpressionListElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PositionalTupleExpressionList");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cValueAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cValueExpressionParserRuleCall_0_0 = (RuleCall)cValueAssignment_0.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Keyword cCommaKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final Assignment cValueAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final RuleCall cValueExpressionParserRuleCall_1_1_0 = (RuleCall)cValueAssignment_1_1.eContents().get(0);
		
		////// At least one NamedExpression
		////FormalMixTupleExpressionList returns fmlExpr::MixTupleExpression
		////    : {fmlExpr::MixTupleExpression}
		////        ( value+=Expression  ( ',' value+=Expression )*
		////            ( ',' value+=NamedExpression )
		////        | value+=NamedExpression
		////        )
		////        ( ',' value+=( Expression | NamedExpression ) )*
		////    ;
		////
		////// NamedExpression only at the end
		////EndingMixTupleExpressionList returns fmlExpr::MixTupleExpression
		////    : {fmlExpr::MixTupleExpression}
		////        ( value+=Expression  ( ',' value+=Expression )*
		////        | value+=NamedExpression
		////        )
		////        ( ',' value+=NamedExpression )*
		////    ;
		////
		////
		////NamedTupleExpressionList returns fmlExpr::NamedTupleExpression
		////    : value+=NamedExpression ( ',' value+=NamedExpression )*
		////    ;
		//PositionalTupleExpressionList returns fmlExpr::PositionalTupleExpression
		//    : value+=Expression ( ',' value+=Expression )*
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//value+=Expression ( ',' value+=Expression )*
		public Group getGroup() { return cGroup; }
		
		//value+=Expression
		public Assignment getValueAssignment_0() { return cValueAssignment_0; }
		
		//Expression
		public RuleCall getValueExpressionParserRuleCall_0_0() { return cValueExpressionParserRuleCall_0_0; }
		
		//( ',' value+=Expression )*
		public Group getGroup_1() { return cGroup_1; }
		
		//','
		public Keyword getCommaKeyword_1_0() { return cCommaKeyword_1_0; }
		
		//value+=Expression
		public Assignment getValueAssignment_1_1() { return cValueAssignment_1_1; }
		
		//Expression
		public RuleCall getValueExpressionParserRuleCall_1_1_0() { return cValueExpressionParserRuleCall_1_1_0; }
	}
	public class NamedExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.NamedExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cNameAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cNameXLIA_IDTerminalRuleCall_0_0 = (RuleCall)cNameAssignment_0.eContents().get(0);
		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
		private final Keyword cColonKeyword_1_0 = (Keyword)cAlternatives_1.eContents().get(0);
		private final Keyword cEqualsSignGreaterThanSignKeyword_1_1 = (Keyword)cAlternatives_1.eContents().get(1);
		private final Keyword cLessThanSignHyphenMinusKeyword_1_2 = (Keyword)cAlternatives_1.eContents().get(2);
		private final Assignment cExpressionAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cExpressionExpressionParserRuleCall_2_0 = (RuleCall)cExpressionAssignment_2.eContents().get(0);
		
		//NamedExpression returns fmlExpr::NamedExpression
		//    : //target=[fmlCommon::NamedElement|ESIdentifier]
		//        name=XLIA_ID
		//        ( ':' | '=>' | '<-' ) expression=Expression
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		////target=[fmlCommon::NamedElement|ESIdentifier]
		//       name=XLIA_ID
		//       ( ':' | '=>' | '<-' ) expression=Expression
		public Group getGroup() { return cGroup; }
		
		////target=[fmlCommon::NamedElement|ESIdentifier]
		//       name=XLIA_ID
		public Assignment getNameAssignment_0() { return cNameAssignment_0; }
		
		//XLIA_ID
		public RuleCall getNameXLIA_IDTerminalRuleCall_0_0() { return cNameXLIA_IDTerminalRuleCall_0_0; }
		
		//( ':' | '=>' | '<-' )
		public Alternatives getAlternatives_1() { return cAlternatives_1; }
		
		//':'
		public Keyword getColonKeyword_1_0() { return cColonKeyword_1_0; }
		
		//'=>'
		public Keyword getEqualsSignGreaterThanSignKeyword_1_1() { return cEqualsSignGreaterThanSignKeyword_1_1; }
		
		//'<-'
		public Keyword getLessThanSignHyphenMinusKeyword_1_2() { return cLessThanSignHyphenMinusKeyword_1_2; }
		
		//expression=Expression
		public Assignment getExpressionAssignment_2() { return cExpressionAssignment_2; }
		
		//Expression
		public RuleCall getExpressionExpressionParserRuleCall_2_0() { return cExpressionExpressionParserRuleCall_2_0; }
	}
	public class LiteralExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralExpression");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cLiteralTerminalExpressionParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cLiteralReferenceableExpressionParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		
		////NotificationComExpression returns fmlExpr::Expression
		////    : { fmlExpr::Expression }
		////        symbol=( 'present' | 'absent' )  operand+=Expression
		////    ;
		//////////////////////////////////////////////////////////////////////////////////
		//// Literal Expression Rules
		//////////////////////////////////////////////////////////////////////////////////
		//LiteralExpression returns fmlExpr::LiteralExpression
		//    : LiteralTerminalExpression
		//    | LiteralReferenceableExpression
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//LiteralTerminalExpression
		//   | LiteralReferenceableExpression
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//LiteralTerminalExpression
		public RuleCall getLiteralTerminalExpressionParserRuleCall_0() { return cLiteralTerminalExpressionParserRuleCall_0; }
		
		//LiteralReferenceableExpression
		public RuleCall getLiteralReferenceableExpressionParserRuleCall_1() { return cLiteralReferenceableExpressionParserRuleCall_1; }
	}
	public class LiteralReferenceableExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralReferenceableExpression");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cLiteralCollectionExpressionParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cLiteralReferenceExpressionParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		
		//LiteralReferenceableExpression returns fmlExpr::LiteralExpression
		//    : LiteralCollectionExpression
		//    | LiteralReferenceExpression
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//LiteralCollectionExpression
		//   | LiteralReferenceExpression
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//LiteralCollectionExpression
		public RuleCall getLiteralCollectionExpressionParserRuleCall_0() { return cLiteralCollectionExpressionParserRuleCall_0; }
		
		//LiteralReferenceExpression
		public RuleCall getLiteralReferenceExpressionParserRuleCall_1() { return cLiteralReferenceExpressionParserRuleCall_1; }
	}
	public class LiteralTerminalExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralTerminalExpression");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cLiteralBooleanExpressionParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cLiteralIntegerExpressionParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cLiteralRationalExpressionParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		private final RuleCall cLiteralFloatExpressionParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		private final RuleCall cLiteralCharacterExpressionParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
		private final RuleCall cLiteralStringExpressionParserRuleCall_5 = (RuleCall)cAlternatives.eContents().get(5);
		private final RuleCall cLiteralNullExpressionParserRuleCall_6 = (RuleCall)cAlternatives.eContents().get(6);
		private final RuleCall cLiteralAnyValueExpressionParserRuleCall_7 = (RuleCall)cAlternatives.eContents().get(7);
		private final RuleCall cLiteralOptionalValueExpressionParserRuleCall_8 = (RuleCall)cAlternatives.eContents().get(8);
		private final RuleCall cLiteralNoneValueExpressionParserRuleCall_9 = (RuleCall)cAlternatives.eContents().get(9);
		private final RuleCall cLiteralAnyOrNoneValueExpressionParserRuleCall_10 = (RuleCall)cAlternatives.eContents().get(10);
		
		//LiteralTerminalExpression returns fmlExpr::LiteralExpression
		//    : LiteralBooleanExpression
		//    | LiteralIntegerExpression
		//    | LiteralRationalExpression
		//    | LiteralFloatExpression
		//    | LiteralCharacterExpression
		//    | LiteralStringExpression
		//    | LiteralNullExpression
		//    | LiteralAnyValueExpression
		//    | LiteralOptionalValueExpression
		//    | LiteralNoneValueExpression
		//    | LiteralAnyOrNoneValueExpression
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//LiteralBooleanExpression
		//   | LiteralIntegerExpression
		//   | LiteralRationalExpression
		//   | LiteralFloatExpression
		//   | LiteralCharacterExpression
		//   | LiteralStringExpression
		//   | LiteralNullExpression
		//   | LiteralAnyValueExpression
		//   | LiteralOptionalValueExpression
		//   | LiteralNoneValueExpression
		//   | LiteralAnyOrNoneValueExpression
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//LiteralBooleanExpression
		public RuleCall getLiteralBooleanExpressionParserRuleCall_0() { return cLiteralBooleanExpressionParserRuleCall_0; }
		
		//LiteralIntegerExpression
		public RuleCall getLiteralIntegerExpressionParserRuleCall_1() { return cLiteralIntegerExpressionParserRuleCall_1; }
		
		//LiteralRationalExpression
		public RuleCall getLiteralRationalExpressionParserRuleCall_2() { return cLiteralRationalExpressionParserRuleCall_2; }
		
		//LiteralFloatExpression
		public RuleCall getLiteralFloatExpressionParserRuleCall_3() { return cLiteralFloatExpressionParserRuleCall_3; }
		
		//LiteralCharacterExpression
		public RuleCall getLiteralCharacterExpressionParserRuleCall_4() { return cLiteralCharacterExpressionParserRuleCall_4; }
		
		//LiteralStringExpression
		public RuleCall getLiteralStringExpressionParserRuleCall_5() { return cLiteralStringExpressionParserRuleCall_5; }
		
		//LiteralNullExpression
		public RuleCall getLiteralNullExpressionParserRuleCall_6() { return cLiteralNullExpressionParserRuleCall_6; }
		
		//LiteralAnyValueExpression
		public RuleCall getLiteralAnyValueExpressionParserRuleCall_7() { return cLiteralAnyValueExpressionParserRuleCall_7; }
		
		//LiteralOptionalValueExpression
		public RuleCall getLiteralOptionalValueExpressionParserRuleCall_8() { return cLiteralOptionalValueExpressionParserRuleCall_8; }
		
		//LiteralNoneValueExpression
		public RuleCall getLiteralNoneValueExpressionParserRuleCall_9() { return cLiteralNoneValueExpressionParserRuleCall_9; }
		
		//LiteralAnyOrNoneValueExpression
		public RuleCall getLiteralAnyOrNoneValueExpressionParserRuleCall_10() { return cLiteralAnyOrNoneValueExpressionParserRuleCall_10; }
	}
	public class LiteralBooleanExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralBooleanExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLiteralBooleanExpressionAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cValueAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cValueEBooleanParserRuleCall_1_0 = (RuleCall)cValueAssignment_1.eContents().get(0);
		
		//////////////////////////////////////////////////////////////////////////////////
		//// Literal Boolean / Numeric Expression Rules
		//////////////////////////////////////////////////////////////////////////////////
		//LiteralBooleanExpression returns fmlExpr::LiteralBooleanExpression
		//    : {fmlExpr::LiteralBooleanExpression}
		//        value=EBoolean
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlExpr::LiteralBooleanExpression}
		//       value=EBoolean
		public Group getGroup() { return cGroup; }
		
		//{fmlExpr::LiteralBooleanExpression}
		public Action getLiteralBooleanExpressionAction_0() { return cLiteralBooleanExpressionAction_0; }
		
		//value=EBoolean
		public Assignment getValueAssignment_1() { return cValueAssignment_1; }
		
		//EBoolean
		public RuleCall getValueEBooleanParserRuleCall_1_0() { return cValueEBooleanParserRuleCall_1_0; }
	}
	public class LiteralIntegerExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralIntegerExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLiteralIntegerExpressionAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cValueAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cValueEIntegerParserRuleCall_1_0 = (RuleCall)cValueAssignment_1.eContents().get(0);
		
		//LiteralIntegerExpression returns fmlExpr::LiteralIntegerExpression
		//    : {fmlExpr::LiteralIntegerExpression}
		//        value=EInteger
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlExpr::LiteralIntegerExpression}
		//       value=EInteger
		public Group getGroup() { return cGroup; }
		
		//{fmlExpr::LiteralIntegerExpression}
		public Action getLiteralIntegerExpressionAction_0() { return cLiteralIntegerExpressionAction_0; }
		
		//value=EInteger
		public Assignment getValueAssignment_1() { return cValueAssignment_1; }
		
		//EInteger
		public RuleCall getValueEIntegerParserRuleCall_1_0() { return cValueEIntegerParserRuleCall_1_0; }
	}
	public class LiteralRationalExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralRationalExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLiteralRationalExpressionAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cNumeratorAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNumeratorEIntegerParserRuleCall_1_0 = (RuleCall)cNumeratorAssignment_1.eContents().get(0);
		private final Keyword cSolidusKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cDenominatorAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cDenominatorEIntegerParserRuleCall_3_0 = (RuleCall)cDenominatorAssignment_3.eContents().get(0);
		
		//LiteralRationalExpression returns fmlExpr::LiteralRationalExpression
		//    : {fmlExpr::LiteralRationalExpression}
		//        numerator=EInteger '/' denominator=EInteger
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlExpr::LiteralRationalExpression}
		//       numerator=EInteger '/' denominator=EInteger
		public Group getGroup() { return cGroup; }
		
		//{fmlExpr::LiteralRationalExpression}
		public Action getLiteralRationalExpressionAction_0() { return cLiteralRationalExpressionAction_0; }
		
		//numerator=EInteger
		public Assignment getNumeratorAssignment_1() { return cNumeratorAssignment_1; }
		
		//EInteger
		public RuleCall getNumeratorEIntegerParserRuleCall_1_0() { return cNumeratorEIntegerParserRuleCall_1_0; }
		
		//'/'
		public Keyword getSolidusKeyword_2() { return cSolidusKeyword_2; }
		
		//denominator=EInteger
		public Assignment getDenominatorAssignment_3() { return cDenominatorAssignment_3; }
		
		//EInteger
		public RuleCall getDenominatorEIntegerParserRuleCall_3_0() { return cDenominatorEIntegerParserRuleCall_3_0; }
	}
	public class LiteralFloatExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralFloatExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLiteralFloatExpressionAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cValueAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cValueEDoubleParserRuleCall_1_0 = (RuleCall)cValueAssignment_1.eContents().get(0);
		
		//LiteralFloatExpression returns fmlExpr::LiteralFloatExpression
		//    : {fmlExpr::LiteralFloatExpression}
		//        value=EDouble
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlExpr::LiteralFloatExpression}
		//       value=EDouble
		public Group getGroup() { return cGroup; }
		
		//{fmlExpr::LiteralFloatExpression}
		public Action getLiteralFloatExpressionAction_0() { return cLiteralFloatExpressionAction_0; }
		
		//value=EDouble
		public Assignment getValueAssignment_1() { return cValueAssignment_1; }
		
		//EDouble
		public RuleCall getValueEDoubleParserRuleCall_1_0() { return cValueEDoubleParserRuleCall_1_0; }
	}
	public class LiteralCharacterExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralCharacterExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLiteralCharacterExpressionAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cValueAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cValueECharacterParserRuleCall_1_0 = (RuleCall)cValueAssignment_1.eContents().get(0);
		
		//////////////////////////////////////////////////////////////////////////////////
		//// Literal Character / String Expression Rules
		//////////////////////////////////////////////////////////////////////////////////
		//LiteralCharacterExpression returns fmlExpr::LiteralCharacterExpression
		//    : {fmlExpr::LiteralCharacterExpression}
		//        value=ECharacter
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlExpr::LiteralCharacterExpression}
		//       value=ECharacter
		public Group getGroup() { return cGroup; }
		
		//{fmlExpr::LiteralCharacterExpression}
		public Action getLiteralCharacterExpressionAction_0() { return cLiteralCharacterExpressionAction_0; }
		
		//value=ECharacter
		public Assignment getValueAssignment_1() { return cValueAssignment_1; }
		
		//ECharacter
		public RuleCall getValueECharacterParserRuleCall_1_0() { return cValueECharacterParserRuleCall_1_0; }
	}
	public class LiteralStringExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralStringExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLiteralStringExpressionAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cValueAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cValueEStringParserRuleCall_1_0 = (RuleCall)cValueAssignment_1.eContents().get(0);
		
		//LiteralStringExpression returns fmlExpr::LiteralStringExpression
		//    : {fmlExpr::LiteralStringExpression}
		//        value=EString
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlExpr::LiteralStringExpression}
		//       value=EString
		public Group getGroup() { return cGroup; }
		
		//{fmlExpr::LiteralStringExpression}
		public Action getLiteralStringExpressionAction_0() { return cLiteralStringExpressionAction_0; }
		
		//value=EString
		public Assignment getValueAssignment_1() { return cValueAssignment_1; }
		
		//EString
		public RuleCall getValueEStringParserRuleCall_1_0() { return cValueEStringParserRuleCall_1_0; }
	}
	public class LiteralNullExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralNullExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLiteralNullExpressionAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cNullKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLessThanSignKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final Assignment cTypeAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
		private final RuleCall cTypeNullPrimitiveInstanceTypeParserRuleCall_2_1_0 = (RuleCall)cTypeAssignment_2_1.eContents().get(0);
		private final Keyword cGreaterThanSignKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		
		//////////////////////////////////////////////////////////////////////////////////
		//// Literal Null Expression Rules
		//////////////////////////////////////////////////////////////////////////////////
		//LiteralNullExpression returns fmlExpr::LiteralNullExpression
		//    : {fmlExpr::LiteralNullExpression}
		//        '$null' //type=AnyNullPrimitiveInstanceType
		//        ( '<'  type=NullPrimitiveInstanceType  '>' )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlExpr::LiteralNullExpression}
		//       '$null' //type=AnyNullPrimitiveInstanceType
		//       ( '<'  type=NullPrimitiveInstanceType  '>' )?
		public Group getGroup() { return cGroup; }
		
		//{fmlExpr::LiteralNullExpression}
		public Action getLiteralNullExpressionAction_0() { return cLiteralNullExpressionAction_0; }
		
		//'$null'
		public Keyword getNullKeyword_1() { return cNullKeyword_1; }
		
		////type=AnyNullPrimitiveInstanceType
		//       ( '<'  type=NullPrimitiveInstanceType  '>' )?
		public Group getGroup_2() { return cGroup_2; }
		
		//'<'
		public Keyword getLessThanSignKeyword_2_0() { return cLessThanSignKeyword_2_0; }
		
		//type=NullPrimitiveInstanceType
		public Assignment getTypeAssignment_2_1() { return cTypeAssignment_2_1; }
		
		//NullPrimitiveInstanceType
		public RuleCall getTypeNullPrimitiveInstanceTypeParserRuleCall_2_1_0() { return cTypeNullPrimitiveInstanceTypeParserRuleCall_2_1_0; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_2_2() { return cGreaterThanSignKeyword_2_2; }
	}
	public class AnyNullPrimitiveInstanceTypeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.AnyNullPrimitiveInstanceType");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cPrimitiveInstanceTypeAction_0 = (Action)cGroup.eContents().get(0);
		private final Assignment cExpectedAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cExpectedAnyPrimitiveInstanceKindEnumRuleCall_1_0 = (RuleCall)cExpectedAssignment_1.eContents().get(0);
		
		//AnyNullPrimitiveInstanceType returns fmlType::PrimitiveInstanceType
		//    : { fmlType::PrimitiveInstanceType }
		//        expected=AnyPrimitiveInstanceKind
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{ fmlType::PrimitiveInstanceType }
		//       expected=AnyPrimitiveInstanceKind
		public Group getGroup() { return cGroup; }
		
		//{ fmlType::PrimitiveInstanceType }
		public Action getPrimitiveInstanceTypeAction_0() { return cPrimitiveInstanceTypeAction_0; }
		
		//expected=AnyPrimitiveInstanceKind
		public Assignment getExpectedAssignment_1() { return cExpectedAssignment_1; }
		
		//AnyPrimitiveInstanceKind
		public RuleCall getExpectedAnyPrimitiveInstanceKindEnumRuleCall_1_0() { return cExpectedAnyPrimitiveInstanceKindEnumRuleCall_1_0; }
	}
	public class NullPrimitiveInstanceTypeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.NullPrimitiveInstanceType");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final Group cGroup_0 = (Group)cAlternatives.eContents().get(0);
		private final Action cPrimitiveInstanceTypeAction_0_0 = (Action)cGroup_0.eContents().get(0);
		private final Assignment cExpectedAssignment_0_1 = (Assignment)cGroup_0.eContents().get(1);
		private final RuleCall cExpectedPrimitiveInstanceKindEnumRuleCall_0_1_0 = (RuleCall)cExpectedAssignment_0_1.eContents().get(0);
		private final Group cGroup_1 = (Group)cAlternatives.eContents().get(1);
		private final Action cPrimitiveInstanceTypeAction_1_0 = (Action)cGroup_1.eContents().get(0);
		private final Assignment cModelAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final CrossReference cModelNamedElementCrossReference_1_1_0 = (CrossReference)cModelAssignment_1_1.eContents().get(0);
		private final RuleCall cModelNamedElementESIdentifierParserRuleCall_1_1_0_1 = (RuleCall)cModelNamedElementCrossReference_1_1_0.eContents().get(1);
		
		//NullPrimitiveInstanceType returns fmlType::PrimitiveInstanceType
		//    : { fmlType::PrimitiveInstanceType }
		//        expected=PrimitiveInstanceKind
		//    | { fmlType::PrimitiveInstanceType }
		//        model=[fmlCommon::NamedElement|ESIdentifier]
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{ fmlType::PrimitiveInstanceType }
		//       expected=PrimitiveInstanceKind
		//   | { fmlType::PrimitiveInstanceType }
		//       model=[fmlCommon::NamedElement|ESIdentifier]
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//{ fmlType::PrimitiveInstanceType }
		//       expected=PrimitiveInstanceKind
		public Group getGroup_0() { return cGroup_0; }
		
		//{ fmlType::PrimitiveInstanceType }
		public Action getPrimitiveInstanceTypeAction_0_0() { return cPrimitiveInstanceTypeAction_0_0; }
		
		//expected=PrimitiveInstanceKind
		public Assignment getExpectedAssignment_0_1() { return cExpectedAssignment_0_1; }
		
		//PrimitiveInstanceKind
		public RuleCall getExpectedPrimitiveInstanceKindEnumRuleCall_0_1_0() { return cExpectedPrimitiveInstanceKindEnumRuleCall_0_1_0; }
		
		//{ fmlType::PrimitiveInstanceType }
		//       model=[fmlCommon::NamedElement|ESIdentifier]
		public Group getGroup_1() { return cGroup_1; }
		
		//{ fmlType::PrimitiveInstanceType }
		public Action getPrimitiveInstanceTypeAction_1_0() { return cPrimitiveInstanceTypeAction_1_0; }
		
		//model=[fmlCommon::NamedElement|ESIdentifier]
		public Assignment getModelAssignment_1_1() { return cModelAssignment_1_1; }
		
		//[fmlCommon::NamedElement|ESIdentifier]
		public CrossReference getModelNamedElementCrossReference_1_1_0() { return cModelNamedElementCrossReference_1_1_0; }
		
		//ESIdentifier
		public RuleCall getModelNamedElementESIdentifierParserRuleCall_1_1_0_1() { return cModelNamedElementESIdentifierParserRuleCall_1_1_0_1; }
	}
	public class AnyDataTypeReferenceElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.AnyDataTypeReference");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final Group cGroup_0 = (Group)cAlternatives.eContents().get(0);
		private final RuleCall cSimpleDataTypeParserRuleCall_0_0 = (RuleCall)cGroup_0.eContents().get(0);
		private final Group cGroup_0_1 = (Group)cGroup_0.eContents().get(1);
		private final Action cDataTypeReferenceSupportAction_0_1_0 = (Action)cGroup_0_1.eContents().get(0);
		private final Keyword cLeftSquareBracketKeyword_0_1_1 = (Keyword)cGroup_0_1.eContents().get(1);
		private final Assignment cMultiplicityAssignment_0_1_2 = (Assignment)cGroup_0_1.eContents().get(2);
		private final RuleCall cMultiplicityDataTypeMultiplicityParserRuleCall_0_1_2_0 = (RuleCall)cMultiplicityAssignment_0_1_2.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_0_1_3 = (Keyword)cGroup_0_1.eContents().get(3);
		private final Group cGroup_1 = (Group)cAlternatives.eContents().get(1);
		private final Action cDataTypeReferenceAction_1_0 = (Action)cGroup_1.eContents().get(0);
		private final Assignment cTyperefAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final CrossReference cTyperefDataTypeCrossReference_1_1_0 = (CrossReference)cTyperefAssignment_1_1.eContents().get(0);
		private final RuleCall cTyperefDataTypeESUfidParserRuleCall_1_1_0_1 = (RuleCall)cTyperefDataTypeCrossReference_1_1_0.eContents().get(1);
		private final Group cGroup_1_2 = (Group)cGroup_1.eContents().get(2);
		private final Keyword cLeftSquareBracketKeyword_1_2_0 = (Keyword)cGroup_1_2.eContents().get(0);
		private final Assignment cMultiplicityAssignment_1_2_1 = (Assignment)cGroup_1_2.eContents().get(1);
		private final RuleCall cMultiplicityDataTypeMultiplicityParserRuleCall_1_2_1_0 = (RuleCall)cMultiplicityAssignment_1_2_1.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_1_2_2 = (Keyword)cGroup_1_2.eContents().get(2);
		
		//////////////////////////////////////////////////////////////////////////////////
		//// Literal Predefined Constant Expression Rules
		//////////////////////////////////////////////////////////////////////////////////
		//AnyDataTypeReference returns fmlType::DataType
		//    : SimpleDataType
		//        ( {fmlType::DataTypeReference.support=current}
		//            '[' multiplicity=DataTypeMultiplicity ']'
		//        )?
		//    | {fmlType::DataTypeReference}
		//        typeref=[fmlType::DataType|ESUfid]
		//        ( '[' multiplicity=DataTypeMultiplicity ']' )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//SimpleDataType
		//       ( {fmlType::DataTypeReference.support=current}
		//           '[' multiplicity=DataTypeMultiplicity ']'
		//       )?
		//   | {fmlType::DataTypeReference}
		//       typeref=[fmlType::DataType|ESUfid]
		//       ( '[' multiplicity=DataTypeMultiplicity ']' )?
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//SimpleDataType
		//       ( {fmlType::DataTypeReference.support=current}
		//           '[' multiplicity=DataTypeMultiplicity ']'
		//       )?
		public Group getGroup_0() { return cGroup_0; }
		
		//SimpleDataType
		public RuleCall getSimpleDataTypeParserRuleCall_0_0() { return cSimpleDataTypeParserRuleCall_0_0; }
		
		//( {fmlType::DataTypeReference.support=current}
		//    '[' multiplicity=DataTypeMultiplicity ']'
		//)?
		public Group getGroup_0_1() { return cGroup_0_1; }
		
		//{fmlType::DataTypeReference.support=current}
		public Action getDataTypeReferenceSupportAction_0_1_0() { return cDataTypeReferenceSupportAction_0_1_0; }
		
		//'['
		public Keyword getLeftSquareBracketKeyword_0_1_1() { return cLeftSquareBracketKeyword_0_1_1; }
		
		//multiplicity=DataTypeMultiplicity
		public Assignment getMultiplicityAssignment_0_1_2() { return cMultiplicityAssignment_0_1_2; }
		
		//DataTypeMultiplicity
		public RuleCall getMultiplicityDataTypeMultiplicityParserRuleCall_0_1_2_0() { return cMultiplicityDataTypeMultiplicityParserRuleCall_0_1_2_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_0_1_3() { return cRightSquareBracketKeyword_0_1_3; }
		
		//{fmlType::DataTypeReference}
		//       typeref=[fmlType::DataType|ESUfid]
		//       ( '[' multiplicity=DataTypeMultiplicity ']' )?
		public Group getGroup_1() { return cGroup_1; }
		
		//{fmlType::DataTypeReference}
		public Action getDataTypeReferenceAction_1_0() { return cDataTypeReferenceAction_1_0; }
		
		//typeref=[fmlType::DataType|ESUfid]
		public Assignment getTyperefAssignment_1_1() { return cTyperefAssignment_1_1; }
		
		//[fmlType::DataType|ESUfid]
		public CrossReference getTyperefDataTypeCrossReference_1_1_0() { return cTyperefDataTypeCrossReference_1_1_0; }
		
		//ESUfid
		public RuleCall getTyperefDataTypeESUfidParserRuleCall_1_1_0_1() { return cTyperefDataTypeESUfidParserRuleCall_1_1_0_1; }
		
		//( '[' multiplicity=DataTypeMultiplicity ']' )?
		public Group getGroup_1_2() { return cGroup_1_2; }
		
		//'['
		public Keyword getLeftSquareBracketKeyword_1_2_0() { return cLeftSquareBracketKeyword_1_2_0; }
		
		//multiplicity=DataTypeMultiplicity
		public Assignment getMultiplicityAssignment_1_2_1() { return cMultiplicityAssignment_1_2_1; }
		
		//DataTypeMultiplicity
		public RuleCall getMultiplicityDataTypeMultiplicityParserRuleCall_1_2_1_0() { return cMultiplicityDataTypeMultiplicityParserRuleCall_1_2_1_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_1_2_2() { return cRightSquareBracketKeyword_1_2_2; }
	}
	public class LiteralAnyValueExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralAnyValueExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLiteralAnyValueExpressionAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cAnyKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLessThanSignKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final Assignment cTypeAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
		private final RuleCall cTypeAnyDataTypeReferenceParserRuleCall_2_1_0 = (RuleCall)cTypeAssignment_2_1.eContents().get(0);
		private final Keyword cGreaterThanSignKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		
		//LiteralAnyValueExpression returns fmlExpr::LiteralAnyValueExpression
		//    : {fmlExpr::LiteralAnyValueExpression}
		//        '$any'
		//        ( '<'  type=AnyDataTypeReference  '>' )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlExpr::LiteralAnyValueExpression}
		//       '$any'
		//       ( '<'  type=AnyDataTypeReference  '>' )?
		public Group getGroup() { return cGroup; }
		
		//{fmlExpr::LiteralAnyValueExpression}
		public Action getLiteralAnyValueExpressionAction_0() { return cLiteralAnyValueExpressionAction_0; }
		
		//'$any'
		public Keyword getAnyKeyword_1() { return cAnyKeyword_1; }
		
		//( '<'  type=AnyDataTypeReference  '>' )?
		public Group getGroup_2() { return cGroup_2; }
		
		//'<'
		public Keyword getLessThanSignKeyword_2_0() { return cLessThanSignKeyword_2_0; }
		
		//type=AnyDataTypeReference
		public Assignment getTypeAssignment_2_1() { return cTypeAssignment_2_1; }
		
		//AnyDataTypeReference
		public RuleCall getTypeAnyDataTypeReferenceParserRuleCall_2_1_0() { return cTypeAnyDataTypeReferenceParserRuleCall_2_1_0; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_2_2() { return cGreaterThanSignKeyword_2_2; }
	}
	public class LiteralOptionalValueExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralOptionalValueExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLiteralOptionalValueExpressionAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cOptionalKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLessThanSignKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final Assignment cTypeAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
		private final RuleCall cTypeAnyDataTypeReferenceParserRuleCall_2_1_0 = (RuleCall)cTypeAssignment_2_1.eContents().get(0);
		private final Keyword cGreaterThanSignKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		
		//LiteralOptionalValueExpression returns fmlExpr::LiteralOptionalValueExpression
		//    : {fmlExpr::LiteralOptionalValueExpression}
		//        '$optional'
		//        ( '<'  type=AnyDataTypeReference  '>' )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlExpr::LiteralOptionalValueExpression}
		//       '$optional'
		//       ( '<'  type=AnyDataTypeReference  '>' )?
		public Group getGroup() { return cGroup; }
		
		//{fmlExpr::LiteralOptionalValueExpression}
		public Action getLiteralOptionalValueExpressionAction_0() { return cLiteralOptionalValueExpressionAction_0; }
		
		//'$optional'
		public Keyword getOptionalKeyword_1() { return cOptionalKeyword_1; }
		
		//( '<'  type=AnyDataTypeReference  '>' )?
		public Group getGroup_2() { return cGroup_2; }
		
		//'<'
		public Keyword getLessThanSignKeyword_2_0() { return cLessThanSignKeyword_2_0; }
		
		//type=AnyDataTypeReference
		public Assignment getTypeAssignment_2_1() { return cTypeAssignment_2_1; }
		
		//AnyDataTypeReference
		public RuleCall getTypeAnyDataTypeReferenceParserRuleCall_2_1_0() { return cTypeAnyDataTypeReferenceParserRuleCall_2_1_0; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_2_2() { return cGreaterThanSignKeyword_2_2; }
	}
	public class LiteralNoneValueExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralNoneValueExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLiteralNoneValueExpressionAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cNoneKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLessThanSignKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final Assignment cTypeAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
		private final RuleCall cTypeAnyDataTypeReferenceParserRuleCall_2_1_0 = (RuleCall)cTypeAssignment_2_1.eContents().get(0);
		private final Keyword cGreaterThanSignKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		
		//LiteralNoneValueExpression returns fmlExpr::LiteralNoneValueExpression
		//    : {fmlExpr::LiteralNoneValueExpression}
		//        '$none'
		//        ( '<'  type=AnyDataTypeReference  '>' )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlExpr::LiteralNoneValueExpression}
		//       '$none'
		//       ( '<'  type=AnyDataTypeReference  '>' )?
		public Group getGroup() { return cGroup; }
		
		//{fmlExpr::LiteralNoneValueExpression}
		public Action getLiteralNoneValueExpressionAction_0() { return cLiteralNoneValueExpressionAction_0; }
		
		//'$none'
		public Keyword getNoneKeyword_1() { return cNoneKeyword_1; }
		
		//( '<'  type=AnyDataTypeReference  '>' )?
		public Group getGroup_2() { return cGroup_2; }
		
		//'<'
		public Keyword getLessThanSignKeyword_2_0() { return cLessThanSignKeyword_2_0; }
		
		//type=AnyDataTypeReference
		public Assignment getTypeAssignment_2_1() { return cTypeAssignment_2_1; }
		
		//AnyDataTypeReference
		public RuleCall getTypeAnyDataTypeReferenceParserRuleCall_2_1_0() { return cTypeAnyDataTypeReferenceParserRuleCall_2_1_0; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_2_2() { return cGreaterThanSignKeyword_2_2; }
	}
	public class LiteralAnyOrNoneValueExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralAnyOrNoneValueExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLiteralAnyOrNoneValueExpressionAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cAnyNoneKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLessThanSignKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final Assignment cTypeAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
		private final RuleCall cTypeAnyDataTypeReferenceParserRuleCall_2_1_0 = (RuleCall)cTypeAssignment_2_1.eContents().get(0);
		private final Keyword cGreaterThanSignKeyword_2_2 = (Keyword)cGroup_2.eContents().get(2);
		
		//LiteralAnyOrNoneValueExpression returns fmlExpr::LiteralAnyOrNoneValueExpression
		//    : {fmlExpr::LiteralAnyOrNoneValueExpression}
		//        '$any$none'
		//        ( '<'  type=AnyDataTypeReference  '>' )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlExpr::LiteralAnyOrNoneValueExpression}
		//       '$any$none'
		//       ( '<'  type=AnyDataTypeReference  '>' )?
		public Group getGroup() { return cGroup; }
		
		//{fmlExpr::LiteralAnyOrNoneValueExpression}
		public Action getLiteralAnyOrNoneValueExpressionAction_0() { return cLiteralAnyOrNoneValueExpressionAction_0; }
		
		//'$any$none'
		public Keyword getAnyNoneKeyword_1() { return cAnyNoneKeyword_1; }
		
		//( '<'  type=AnyDataTypeReference  '>' )?
		public Group getGroup_2() { return cGroup_2; }
		
		//'<'
		public Keyword getLessThanSignKeyword_2_0() { return cLessThanSignKeyword_2_0; }
		
		//type=AnyDataTypeReference
		public Assignment getTypeAssignment_2_1() { return cTypeAssignment_2_1; }
		
		//AnyDataTypeReference
		public RuleCall getTypeAnyDataTypeReferenceParserRuleCall_2_1_0() { return cTypeAnyDataTypeReferenceParserRuleCall_2_1_0; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_2_2() { return cGreaterThanSignKeyword_2_2; }
	}
	public class LiteralCollectionExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralCollectionExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLiteralCollectionExpressionAction_0 = (Action)cGroup.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Keyword cLessThanSignKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
		private final Assignment cDatatypeAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final RuleCall cDatatypeDataTypeParserRuleCall_1_1_0 = (RuleCall)cDatatypeAssignment_1_1.eContents().get(0);
		private final Keyword cGreaterThanSignKeyword_1_2 = (Keyword)cGroup_1.eContents().get(2);
		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
		private final Alternatives cAlternatives_3_0 = (Alternatives)cGroup_3.eContents().get(0);
		private final Assignment cValueAssignment_3_0_0 = (Assignment)cAlternatives_3_0.eContents().get(0);
		private final RuleCall cValueExpressionParserRuleCall_3_0_0_0 = (RuleCall)cValueAssignment_3_0_0.eContents().get(0);
		private final Assignment cValueAssignment_3_0_1 = (Assignment)cAlternatives_3_0.eContents().get(1);
		private final RuleCall cValueNamedExpressionParserRuleCall_3_0_1_0 = (RuleCall)cValueAssignment_3_0_1.eContents().get(0);
		private final Group cGroup_3_1 = (Group)cGroup_3.eContents().get(1);
		private final Keyword cCommaKeyword_3_1_0 = (Keyword)cGroup_3_1.eContents().get(0);
		private final Alternatives cAlternatives_3_1_1 = (Alternatives)cGroup_3_1.eContents().get(1);
		private final Assignment cValueAssignment_3_1_1_0 = (Assignment)cAlternatives_3_1_1.eContents().get(0);
		private final RuleCall cValueExpressionParserRuleCall_3_1_1_0_0 = (RuleCall)cValueAssignment_3_1_1_0.eContents().get(0);
		private final Assignment cValueAssignment_3_1_1_1 = (Assignment)cAlternatives_3_1_1.eContents().get(1);
		private final RuleCall cValueNamedExpressionParserRuleCall_3_1_1_1_0 = (RuleCall)cValueAssignment_3_1_1_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		
		//////////////////////////////////////////////////////////////////////////////////
		//// Literal Collection Expression Rules
		//////////////////////////////////////////////////////////////////////////////////
		//LiteralCollectionExpression returns fmlExpr::LiteralCollectionExpression
		//    : {fmlExpr::LiteralCollectionExpression}
		////        ( 'new' datatype=DataType )?
		//        ( '<' datatype=DataType '>')?
		//        '{' (
		//            ( value+=Expression | value+=NamedExpression )
		//            ( ',' ( value+=Expression | value+=NamedExpression ) )*
		//        )? '}'
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		// {fmlExpr::LiteralCollectionExpression}
		////        ( 'new' datatype=DataType )?
		//        ( '<' datatype=DataType '>')?
		//        '{' (
		//            ( value+=Expression | value+=NamedExpression )
		//            ( ',' ( value+=Expression | value+=NamedExpression ) )*
		//        )? '}'
		public Group getGroup() { return cGroup; }
		
		//{fmlExpr::LiteralCollectionExpression}
		public Action getLiteralCollectionExpressionAction_0() { return cLiteralCollectionExpressionAction_0; }
		
		////        ( 'new' datatype=DataType )?
		//        ( '<' datatype=DataType '>')?
		public Group getGroup_1() { return cGroup_1; }
		
		//'<'
		public Keyword getLessThanSignKeyword_1_0() { return cLessThanSignKeyword_1_0; }
		
		//datatype=DataType
		public Assignment getDatatypeAssignment_1_1() { return cDatatypeAssignment_1_1; }
		
		//DataType
		public RuleCall getDatatypeDataTypeParserRuleCall_1_1_0() { return cDatatypeDataTypeParserRuleCall_1_1_0; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_1_2() { return cGreaterThanSignKeyword_1_2; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
		
		//(
		//           ( value+=Expression | value+=NamedExpression )
		//           ( ',' ( value+=Expression | value+=NamedExpression ) )*
		//       )?
		public Group getGroup_3() { return cGroup_3; }
		
		//( value+=Expression | value+=NamedExpression )
		public Alternatives getAlternatives_3_0() { return cAlternatives_3_0; }
		
		//value+=Expression
		public Assignment getValueAssignment_3_0_0() { return cValueAssignment_3_0_0; }
		
		//Expression
		public RuleCall getValueExpressionParserRuleCall_3_0_0_0() { return cValueExpressionParserRuleCall_3_0_0_0; }
		
		//value+=NamedExpression
		public Assignment getValueAssignment_3_0_1() { return cValueAssignment_3_0_1; }
		
		//NamedExpression
		public RuleCall getValueNamedExpressionParserRuleCall_3_0_1_0() { return cValueNamedExpressionParserRuleCall_3_0_1_0; }
		
		//( ',' ( value+=Expression | value+=NamedExpression ) )*
		public Group getGroup_3_1() { return cGroup_3_1; }
		
		//','
		public Keyword getCommaKeyword_3_1_0() { return cCommaKeyword_3_1_0; }
		
		//( value+=Expression | value+=NamedExpression )
		public Alternatives getAlternatives_3_1_1() { return cAlternatives_3_1_1; }
		
		//value+=Expression
		public Assignment getValueAssignment_3_1_1_0() { return cValueAssignment_3_1_1_0; }
		
		//Expression
		public RuleCall getValueExpressionParserRuleCall_3_1_1_0_0() { return cValueExpressionParserRuleCall_3_1_1_0_0; }
		
		//value+=NamedExpression
		public Assignment getValueAssignment_3_1_1_1() { return cValueAssignment_3_1_1_1; }
		
		//NamedExpression
		public RuleCall getValueNamedExpressionParserRuleCall_3_1_1_1_0() { return cValueNamedExpressionParserRuleCall_3_1_1_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_4() { return cRightCurlyBracketKeyword_4; }
	}
	public class LiteralReferenceExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralReferenceExpression");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cLiteralReferenceElementParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cLiteralReferenceVariableContextParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cLiteralReferenceMachineContextParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		private final RuleCall cLiteralEnvExpressionParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		
		//////////////////////////////////////////////////////////////////////////////////
		//// Literal Reference Expression Rules
		//////////////////////////////////////////////////////////////////////////////////
		//LiteralReferenceExpression returns fmlExpr::LiteralReferenceExpression
		//    : LiteralReferenceElement
		//    | LiteralReferenceVariableContext
		//    | LiteralReferenceMachineContext
		//    | LiteralEnvExpression
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//LiteralReferenceElement
		//   | LiteralReferenceVariableContext
		//   | LiteralReferenceMachineContext
		//   | LiteralEnvExpression
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//LiteralReferenceElement
		public RuleCall getLiteralReferenceElementParserRuleCall_0() { return cLiteralReferenceElementParserRuleCall_0; }
		
		//LiteralReferenceVariableContext
		public RuleCall getLiteralReferenceVariableContextParserRuleCall_1() { return cLiteralReferenceVariableContextParserRuleCall_1; }
		
		//LiteralReferenceMachineContext
		public RuleCall getLiteralReferenceMachineContextParserRuleCall_2() { return cLiteralReferenceMachineContextParserRuleCall_2; }
		
		//LiteralEnvExpression
		public RuleCall getLiteralEnvExpressionParserRuleCall_3() { return cLiteralEnvExpressionParserRuleCall_3; }
	}
	public class LiteralReferenceElementElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralReferenceElement");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLiteralReferenceElementAction_0 = (Action)cGroup.eContents().get(0);
		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
		private final Keyword cSpecKeyword_1_0 = (Keyword)cAlternatives_1.eContents().get(0);
		private final Keyword cColonColonKeyword_1_1 = (Keyword)cAlternatives_1.eContents().get(1);
		private final Assignment cElementAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final CrossReference cElementNamedElementCrossReference_2_0 = (CrossReference)cElementAssignment_2.eContents().get(0);
		private final RuleCall cElementNamedElementESIdentifierParserRuleCall_2_0_1 = (RuleCall)cElementNamedElementCrossReference_2_0.eContents().get(1);
		private final Alternatives cAlternatives_3 = (Alternatives)cGroup.eContents().get(3);
		private final Group cGroup_3_0 = (Group)cAlternatives_3.eContents().get(0);
		private final Assignment cKindAssignment_3_0_0 = (Assignment)cGroup_3_0.eContents().get(0);
		private final RuleCall cKindValueIndexExpressionKindEnumRuleCall_3_0_0_0 = (RuleCall)cKindAssignment_3_0_0.eContents().get(0);
		private final Assignment cArgAssignment_3_0_1 = (Assignment)cGroup_3_0.eContents().get(1);
		private final RuleCall cArgPositionalTupleExpressionListParserRuleCall_3_0_1_0 = (RuleCall)cArgAssignment_3_0_1.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_3_0_2 = (Keyword)cGroup_3_0.eContents().get(2);
		private final Group cGroup_3_1 = (Group)cAlternatives_3.eContents().get(1);
		private final Assignment cKindAssignment_3_1_0 = (Assignment)cGroup_3_1.eContents().get(0);
		private final RuleCall cKindValueParameterExpressionKindEnumRuleCall_3_1_0_0 = (RuleCall)cKindAssignment_3_1_0.eContents().get(0);
		private final Assignment cArgAssignment_3_1_1 = (Assignment)cGroup_3_1.eContents().get(1);
		private final RuleCall cArgMixTupleExpressionListParserRuleCall_3_1_1_0 = (RuleCall)cArgAssignment_3_1_1.eContents().get(0);
		private final Keyword cRightParenthesisKeyword_3_1_2 = (Keyword)cGroup_3_1.eContents().get(2);
		
		//LiteralReferenceElement returns fmlExpr::LiteralReferenceElement
		//    : {fmlExpr::LiteralReferenceElement}
		//        ( 'spec::' | '::' )?  element=[fmlCommon::NamedElement|ESIdentifier]
		//        // '[' index ',' ... ',' index ']'
		//        ( kind=ValueIndexExpressionKind
		//            arg=PositionalTupleExpressionList  ']'
		//        // '(' parameter ',' ... ',' parameter ')'
		//        | kind=ValueParameterExpressionKind
		//            arg=MixTupleExpressionList  ')'
		//        )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlExpr::LiteralReferenceElement}
		//       ( 'spec::' | '::' )?  element=[fmlCommon::NamedElement|ESIdentifier]
		//       // '[' index ',' ... ',' index ']'
		//       ( kind=ValueIndexExpressionKind
		//           arg=PositionalTupleExpressionList  ']'
		//       // '(' parameter ',' ... ',' parameter ')'
		//       | kind=ValueParameterExpressionKind
		//           arg=MixTupleExpressionList  ')'
		//       )?
		public Group getGroup() { return cGroup; }
		
		//{fmlExpr::LiteralReferenceElement}
		public Action getLiteralReferenceElementAction_0() { return cLiteralReferenceElementAction_0; }
		
		//( 'spec::' | '::' )?
		public Alternatives getAlternatives_1() { return cAlternatives_1; }
		
		//'spec::'
		public Keyword getSpecKeyword_1_0() { return cSpecKeyword_1_0; }
		
		//'::'
		public Keyword getColonColonKeyword_1_1() { return cColonColonKeyword_1_1; }
		
		//element=[fmlCommon::NamedElement|ESIdentifier]
		public Assignment getElementAssignment_2() { return cElementAssignment_2; }
		
		//[fmlCommon::NamedElement|ESIdentifier]
		public CrossReference getElementNamedElementCrossReference_2_0() { return cElementNamedElementCrossReference_2_0; }
		
		//ESIdentifier
		public RuleCall getElementNamedElementESIdentifierParserRuleCall_2_0_1() { return cElementNamedElementESIdentifierParserRuleCall_2_0_1; }
		
		//// '[' index ',' ... ',' index ']'
		//( kind=ValueIndexExpressionKind
		//    arg=PositionalTupleExpressionList  ']'
		//// '(' parameter ',' ... ',' parameter ')'
		//| kind=ValueParameterExpressionKind
		//    arg=MixTupleExpressionList  ')'
		//)?
		public Alternatives getAlternatives_3() { return cAlternatives_3; }
		
		//kind=ValueIndexExpressionKind
		//           arg=PositionalTupleExpressionList  ']'
		public Group getGroup_3_0() { return cGroup_3_0; }
		
		//kind=ValueIndexExpressionKind
		public Assignment getKindAssignment_3_0_0() { return cKindAssignment_3_0_0; }
		
		//ValueIndexExpressionKind
		public RuleCall getKindValueIndexExpressionKindEnumRuleCall_3_0_0_0() { return cKindValueIndexExpressionKindEnumRuleCall_3_0_0_0; }
		
		//arg=PositionalTupleExpressionList
		public Assignment getArgAssignment_3_0_1() { return cArgAssignment_3_0_1; }
		
		//PositionalTupleExpressionList
		public RuleCall getArgPositionalTupleExpressionListParserRuleCall_3_0_1_0() { return cArgPositionalTupleExpressionListParserRuleCall_3_0_1_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_3_0_2() { return cRightSquareBracketKeyword_3_0_2; }
		
		//kind=ValueParameterExpressionKind
		//           arg=MixTupleExpressionList  ')'
		public Group getGroup_3_1() { return cGroup_3_1; }
		
		//kind=ValueParameterExpressionKind
		public Assignment getKindAssignment_3_1_0() { return cKindAssignment_3_1_0; }
		
		//ValueParameterExpressionKind
		public RuleCall getKindValueParameterExpressionKindEnumRuleCall_3_1_0_0() { return cKindValueParameterExpressionKindEnumRuleCall_3_1_0_0; }
		
		//arg=MixTupleExpressionList
		public Assignment getArgAssignment_3_1_1() { return cArgAssignment_3_1_1; }
		
		//MixTupleExpressionList
		public RuleCall getArgMixTupleExpressionListParserRuleCall_3_1_1_0() { return cArgMixTupleExpressionListParserRuleCall_3_1_1_0; }
		
		//')'
		public Keyword getRightParenthesisKeyword_3_1_2() { return cRightParenthesisKeyword_3_1_2; }
	}
	public class LiteralPureReferenceElementElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralPureReferenceElement");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLiteralReferenceElementAction_0 = (Action)cGroup.eContents().get(0);
		private final Alternatives cAlternatives_1 = (Alternatives)cGroup.eContents().get(1);
		private final Keyword cSpecKeyword_1_0 = (Keyword)cAlternatives_1.eContents().get(0);
		private final Keyword cColonColonKeyword_1_1 = (Keyword)cAlternatives_1.eContents().get(1);
		private final Assignment cElementAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final CrossReference cElementNamedElementCrossReference_2_0 = (CrossReference)cElementAssignment_2.eContents().get(0);
		private final RuleCall cElementNamedElementESIdentifierParserRuleCall_2_0_1 = (RuleCall)cElementNamedElementCrossReference_2_0.eContents().get(1);
		
		//LiteralPureReferenceElement returns fmlExpr::LiteralReferenceElement
		//    : {fmlExpr::LiteralReferenceElement}
		//        ( 'spec::' | '::' )?  element=[fmlCommon::NamedElement|ESIdentifier]
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlExpr::LiteralReferenceElement}
		//       ( 'spec::' | '::' )?  element=[fmlCommon::NamedElement|ESIdentifier]
		public Group getGroup() { return cGroup; }
		
		//{fmlExpr::LiteralReferenceElement}
		public Action getLiteralReferenceElementAction_0() { return cLiteralReferenceElementAction_0; }
		
		//( 'spec::' | '::' )?
		public Alternatives getAlternatives_1() { return cAlternatives_1; }
		
		//'spec::'
		public Keyword getSpecKeyword_1_0() { return cSpecKeyword_1_0; }
		
		//'::'
		public Keyword getColonColonKeyword_1_1() { return cColonColonKeyword_1_1; }
		
		//element=[fmlCommon::NamedElement|ESIdentifier]
		public Assignment getElementAssignment_2() { return cElementAssignment_2; }
		
		//[fmlCommon::NamedElement|ESIdentifier]
		public CrossReference getElementNamedElementCrossReference_2_0() { return cElementNamedElementCrossReference_2_0; }
		
		//ESIdentifier
		public RuleCall getElementNamedElementESIdentifierParserRuleCall_2_0_1() { return cElementNamedElementESIdentifierParserRuleCall_2_0_1; }
	}
	public class LiteralReferenceVariableContextElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralReferenceVariableContext");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cLiteralTimeExpressionParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cLiteralTimeDeltaExpressionParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cLiteralTimeInitialExpressionParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		private final RuleCall cLiteralTimeDeltaInitialExpressionParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		
		//LiteralReferenceVariableContext returns fmlExpr::LiteralReferenceExpression
		//    : LiteralTimeExpression
		//    | LiteralTimeDeltaExpression
		//    | LiteralTimeInitialExpression
		//    | LiteralTimeDeltaInitialExpression
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//LiteralTimeExpression
		//   | LiteralTimeDeltaExpression
		//   | LiteralTimeInitialExpression
		//   | LiteralTimeDeltaInitialExpression
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//LiteralTimeExpression
		public RuleCall getLiteralTimeExpressionParserRuleCall_0() { return cLiteralTimeExpressionParserRuleCall_0; }
		
		//LiteralTimeDeltaExpression
		public RuleCall getLiteralTimeDeltaExpressionParserRuleCall_1() { return cLiteralTimeDeltaExpressionParserRuleCall_1; }
		
		//LiteralTimeInitialExpression
		public RuleCall getLiteralTimeInitialExpressionParserRuleCall_2() { return cLiteralTimeInitialExpressionParserRuleCall_2; }
		
		//LiteralTimeDeltaInitialExpression
		public RuleCall getLiteralTimeDeltaInitialExpressionParserRuleCall_3() { return cLiteralTimeDeltaInitialExpressionParserRuleCall_3; }
	}
	public class LiteralTimeExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralTimeExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLiteralTimeExpressionAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cTimeKeyword_1 = (Keyword)cGroup.eContents().get(1);
		
		//LiteralTimeExpression returns fmlExpr::LiteralTimeExpression
		//    : {fmlExpr::LiteralTimeExpression} ( '$time' )
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlExpr::LiteralTimeExpression} ( '$time' )
		public Group getGroup() { return cGroup; }
		
		//{fmlExpr::LiteralTimeExpression}
		public Action getLiteralTimeExpressionAction_0() { return cLiteralTimeExpressionAction_0; }
		
		//( '$time' )
		public Keyword getTimeKeyword_1() { return cTimeKeyword_1; }
	}
	public class LiteralTimeInitialExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralTimeInitialExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLiteralTimeExpressionAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cTimeInitialKeyword_1 = (Keyword)cGroup.eContents().get(1);
		
		//LiteralTimeInitialExpression returns fmlExpr::LiteralTimeExpression
		//    : {fmlExpr::LiteralTimeExpression} ( '$time#initial' )
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlExpr::LiteralTimeExpression} ( '$time#initial' )
		public Group getGroup() { return cGroup; }
		
		//{fmlExpr::LiteralTimeExpression}
		public Action getLiteralTimeExpressionAction_0() { return cLiteralTimeExpressionAction_0; }
		
		//( '$time#initial' )
		public Keyword getTimeInitialKeyword_1() { return cTimeInitialKeyword_1; }
	}
	public class LiteralTimeDeltaExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralTimeDeltaExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLiteralTimeDeltaExpressionAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cDeltaKeyword_1 = (Keyword)cGroup.eContents().get(1);
		
		//LiteralTimeDeltaExpression returns fmlExpr::LiteralTimeDeltaExpression
		//    : {fmlExpr::LiteralTimeDeltaExpression} ( '$delta' )
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlExpr::LiteralTimeDeltaExpression} ( '$delta' )
		public Group getGroup() { return cGroup; }
		
		//{fmlExpr::LiteralTimeDeltaExpression}
		public Action getLiteralTimeDeltaExpressionAction_0() { return cLiteralTimeDeltaExpressionAction_0; }
		
		//( '$delta' )
		public Keyword getDeltaKeyword_1() { return cDeltaKeyword_1; }
	}
	public class LiteralTimeDeltaInitialExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralTimeDeltaInitialExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLiteralTimeDeltaExpressionAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cDeltaInitialKeyword_1 = (Keyword)cGroup.eContents().get(1);
		
		//LiteralTimeDeltaInitialExpression returns fmlExpr::LiteralTimeDeltaExpression
		//    : {fmlExpr::LiteralTimeDeltaExpression} ( '$delta#initial' )
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlExpr::LiteralTimeDeltaExpression} ( '$delta#initial' )
		public Group getGroup() { return cGroup; }
		
		//{fmlExpr::LiteralTimeDeltaExpression}
		public Action getLiteralTimeDeltaExpressionAction_0() { return cLiteralTimeDeltaExpressionAction_0; }
		
		//( '$delta#initial' )
		public Keyword getDeltaInitialKeyword_1() { return cDeltaInitialKeyword_1; }
	}
	public class LiteralReferenceMachineContextElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralReferenceMachineContext");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cLiteralThisExpressionParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cLiteralSelfExpressionParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cLiteralParentExpressionParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		private final RuleCall cLiteralSuperExpressionParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		private final RuleCall cLiteralSystemExpressionParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
		private final RuleCall cLiteralEnvExpressionParserRuleCall_5 = (RuleCall)cAlternatives.eContents().get(5);
		
		//LiteralReferenceMachineContext returns fmlExpr::LiteralReferenceExpression
		//    : LiteralThisExpression
		//    | LiteralSelfExpression
		//    | LiteralParentExpression
		//    | LiteralSuperExpression
		//    | LiteralSystemExpression
		//    | LiteralEnvExpression
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//LiteralThisExpression
		//   | LiteralSelfExpression
		//   | LiteralParentExpression
		//   | LiteralSuperExpression
		//   | LiteralSystemExpression
		//   | LiteralEnvExpression
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//LiteralThisExpression
		public RuleCall getLiteralThisExpressionParserRuleCall_0() { return cLiteralThisExpressionParserRuleCall_0; }
		
		//LiteralSelfExpression
		public RuleCall getLiteralSelfExpressionParserRuleCall_1() { return cLiteralSelfExpressionParserRuleCall_1; }
		
		//LiteralParentExpression
		public RuleCall getLiteralParentExpressionParserRuleCall_2() { return cLiteralParentExpressionParserRuleCall_2; }
		
		//LiteralSuperExpression
		public RuleCall getLiteralSuperExpressionParserRuleCall_3() { return cLiteralSuperExpressionParserRuleCall_3; }
		
		//LiteralSystemExpression
		public RuleCall getLiteralSystemExpressionParserRuleCall_4() { return cLiteralSystemExpressionParserRuleCall_4; }
		
		//LiteralEnvExpression
		public RuleCall getLiteralEnvExpressionParserRuleCall_5() { return cLiteralEnvExpressionParserRuleCall_5; }
	}
	public class LiteralThisExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralThisExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLiteralThisExpressionAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cThisKeyword_1 = (Keyword)cGroup.eContents().get(1);
		
		//LiteralThisExpression returns fmlExpr::LiteralThisExpression
		//    : {fmlExpr::LiteralThisExpression} ( '$this' )
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlExpr::LiteralThisExpression} ( '$this' )
		public Group getGroup() { return cGroup; }
		
		//{fmlExpr::LiteralThisExpression}
		public Action getLiteralThisExpressionAction_0() { return cLiteralThisExpressionAction_0; }
		
		//( '$this' )
		public Keyword getThisKeyword_1() { return cThisKeyword_1; }
	}
	public class LiteralSelfExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralSelfExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLiteralSelfExpressionAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cSelfKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLessThanSignKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final Keyword cModelKeyword_2_1 = (Keyword)cGroup_2.eContents().get(1);
		private final Assignment cModelAssignment_2_2 = (Assignment)cGroup_2.eContents().get(2);
		private final CrossReference cModelMachineCrossReference_2_2_0 = (CrossReference)cModelAssignment_2_2.eContents().get(0);
		private final RuleCall cModelMachineESUfidParserRuleCall_2_2_0_1 = (RuleCall)cModelMachineCrossReference_2_2_0.eContents().get(1);
		private final Keyword cGreaterThanSignKeyword_2_3 = (Keyword)cGroup_2.eContents().get(3);
		
		//LiteralSelfExpression returns fmlExpr::LiteralSelfExpression
		//    : {fmlExpr::LiteralSelfExpression} ( '$self' )
		//        ( '<' ( 'model:' )? model=[fmlInfra::Machine|ESUfid] '>' )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlExpr::LiteralSelfExpression} ( '$self' )
		//       ( '<' ( 'model:' )? model=[fmlInfra::Machine|ESUfid] '>' )?
		public Group getGroup() { return cGroup; }
		
		//{fmlExpr::LiteralSelfExpression}
		public Action getLiteralSelfExpressionAction_0() { return cLiteralSelfExpressionAction_0; }
		
		//( '$self' )
		public Keyword getSelfKeyword_1() { return cSelfKeyword_1; }
		
		//( '<' ( 'model:' )? model=[fmlInfra::Machine|ESUfid] '>' )?
		public Group getGroup_2() { return cGroup_2; }
		
		//'<'
		public Keyword getLessThanSignKeyword_2_0() { return cLessThanSignKeyword_2_0; }
		
		//( 'model:' )?
		public Keyword getModelKeyword_2_1() { return cModelKeyword_2_1; }
		
		//model=[fmlInfra::Machine|ESUfid]
		public Assignment getModelAssignment_2_2() { return cModelAssignment_2_2; }
		
		//[fmlInfra::Machine|ESUfid]
		public CrossReference getModelMachineCrossReference_2_2_0() { return cModelMachineCrossReference_2_2_0; }
		
		//ESUfid
		public RuleCall getModelMachineESUfidParserRuleCall_2_2_0_1() { return cModelMachineESUfidParserRuleCall_2_2_0_1; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_2_3() { return cGreaterThanSignKeyword_2_3; }
	}
	public class LiteralParentExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralParentExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLiteralParentExpressionAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cParentKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLessThanSignKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final Keyword cModelKeyword_2_1 = (Keyword)cGroup_2.eContents().get(1);
		private final Assignment cModelAssignment_2_2 = (Assignment)cGroup_2.eContents().get(2);
		private final CrossReference cModelMachineCrossReference_2_2_0 = (CrossReference)cModelAssignment_2_2.eContents().get(0);
		private final RuleCall cModelMachineESUfidParserRuleCall_2_2_0_1 = (RuleCall)cModelMachineCrossReference_2_2_0.eContents().get(1);
		private final Keyword cGreaterThanSignKeyword_2_3 = (Keyword)cGroup_2.eContents().get(3);
		
		//LiteralParentExpression returns fmlExpr::LiteralParentExpression
		//    : {fmlExpr::LiteralParentExpression} ( '$parent' )
		//        ( '<' ( 'model:' )? model=[fmlInfra::Machine|ESUfid] '>' )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlExpr::LiteralParentExpression} ( '$parent' )
		//       ( '<' ( 'model:' )? model=[fmlInfra::Machine|ESUfid] '>' )?
		public Group getGroup() { return cGroup; }
		
		//{fmlExpr::LiteralParentExpression}
		public Action getLiteralParentExpressionAction_0() { return cLiteralParentExpressionAction_0; }
		
		//( '$parent' )
		public Keyword getParentKeyword_1() { return cParentKeyword_1; }
		
		//( '<' ( 'model:' )? model=[fmlInfra::Machine|ESUfid] '>' )?
		public Group getGroup_2() { return cGroup_2; }
		
		//'<'
		public Keyword getLessThanSignKeyword_2_0() { return cLessThanSignKeyword_2_0; }
		
		//( 'model:' )?
		public Keyword getModelKeyword_2_1() { return cModelKeyword_2_1; }
		
		//model=[fmlInfra::Machine|ESUfid]
		public Assignment getModelAssignment_2_2() { return cModelAssignment_2_2; }
		
		//[fmlInfra::Machine|ESUfid]
		public CrossReference getModelMachineCrossReference_2_2_0() { return cModelMachineCrossReference_2_2_0; }
		
		//ESUfid
		public RuleCall getModelMachineESUfidParserRuleCall_2_2_0_1() { return cModelMachineESUfidParserRuleCall_2_2_0_1; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_2_3() { return cGreaterThanSignKeyword_2_3; }
	}
	public class LiteralSuperExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralSuperExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLiteralSuperExpressionAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cSuperKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Keyword cLessThanSignKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
		private final Keyword cModelKeyword_2_1 = (Keyword)cGroup_2.eContents().get(1);
		private final Assignment cModelAssignment_2_2 = (Assignment)cGroup_2.eContents().get(2);
		private final CrossReference cModelMachineCrossReference_2_2_0 = (CrossReference)cModelAssignment_2_2.eContents().get(0);
		private final RuleCall cModelMachineESUfidParserRuleCall_2_2_0_1 = (RuleCall)cModelMachineCrossReference_2_2_0.eContents().get(1);
		private final Keyword cGreaterThanSignKeyword_2_3 = (Keyword)cGroup_2.eContents().get(3);
		
		//LiteralSuperExpression returns fmlExpr::LiteralSuperExpression
		//    : {fmlExpr::LiteralSuperExpression} ( '$super' )
		//        ( '<' ( 'model:' )? model=[fmlInfra::Machine|ESUfid] '>' )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlExpr::LiteralSuperExpression} ( '$super' )
		//       ( '<' ( 'model:' )? model=[fmlInfra::Machine|ESUfid] '>' )?
		public Group getGroup() { return cGroup; }
		
		//{fmlExpr::LiteralSuperExpression}
		public Action getLiteralSuperExpressionAction_0() { return cLiteralSuperExpressionAction_0; }
		
		//( '$super' )
		public Keyword getSuperKeyword_1() { return cSuperKeyword_1; }
		
		//( '<' ( 'model:' )? model=[fmlInfra::Machine|ESUfid] '>' )?
		public Group getGroup_2() { return cGroup_2; }
		
		//'<'
		public Keyword getLessThanSignKeyword_2_0() { return cLessThanSignKeyword_2_0; }
		
		//( 'model:' )?
		public Keyword getModelKeyword_2_1() { return cModelKeyword_2_1; }
		
		//model=[fmlInfra::Machine|ESUfid]
		public Assignment getModelAssignment_2_2() { return cModelAssignment_2_2; }
		
		//[fmlInfra::Machine|ESUfid]
		public CrossReference getModelMachineCrossReference_2_2_0() { return cModelMachineCrossReference_2_2_0; }
		
		//ESUfid
		public RuleCall getModelMachineESUfidParserRuleCall_2_2_0_1() { return cModelMachineESUfidParserRuleCall_2_2_0_1; }
		
		//'>'
		public Keyword getGreaterThanSignKeyword_2_3() { return cGreaterThanSignKeyword_2_3; }
	}
	public class LiteralSystemExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralSystemExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLiteralSystemExpressionAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cSystemKeyword_1 = (Keyword)cGroup.eContents().get(1);
		
		//LiteralSystemExpression returns fmlExpr::LiteralSystemExpression
		//    : {fmlExpr::LiteralSystemExpression} ( '$system' )
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlExpr::LiteralSystemExpression} ( '$system' )
		public Group getGroup() { return cGroup; }
		
		//{fmlExpr::LiteralSystemExpression}
		public Action getLiteralSystemExpressionAction_0() { return cLiteralSystemExpressionAction_0; }
		
		//( '$system' )
		public Keyword getSystemKeyword_1() { return cSystemKeyword_1; }
	}
	public class LiteralEnvExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralEnvExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLiteralEnvExpressionAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cEnvKeyword_1 = (Keyword)cGroup.eContents().get(1);
		
		//LiteralEnvExpression returns fmlExpr::LiteralEnvExpression
		//    : {fmlExpr::LiteralEnvExpression} ( '$env' )
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{fmlExpr::LiteralEnvExpression} ( '$env' )
		public Group getGroup() { return cGroup; }
		
		//{fmlExpr::LiteralEnvExpression}
		public Action getLiteralEnvExpressionAction_0() { return cLiteralEnvExpressionAction_0; }
		
		//( '$env' )
		public Keyword getEnvKeyword_1() { return cEnvKeyword_1; }
	}
	public class LiteralPureReferenceExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralPureReferenceExpression");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cLiteralPureReferenceElementParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cLiteralReferenceMachineContextParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		
		//////////////////////////////////////////////////////////////////////////////////
		//// Value Element Specification Expression Rules
		//////////////////////////////////////////////////////////////////////////////////
		//LiteralPureReferenceExpression returns fmlExpr::LiteralReferenceExpression
		//    : LiteralPureReferenceElement
		//    | LiteralReferenceMachineContext
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//LiteralPureReferenceElement
		//   | LiteralReferenceMachineContext
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//LiteralPureReferenceElement
		public RuleCall getLiteralPureReferenceElementParserRuleCall_0() { return cLiteralPureReferenceElementParserRuleCall_0; }
		
		//LiteralReferenceMachineContext
		public RuleCall getLiteralReferenceMachineContextParserRuleCall_1() { return cLiteralReferenceMachineContextParserRuleCall_1; }
	}
	public class LiteralReferenceSpecificationElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.LiteralReferenceSpecification");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cLiteralReferenceSpecificationAction_0 = (Action)cGroup.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Assignment cParentAssignment_1_0 = (Assignment)cGroup_1.eContents().get(0);
		private final RuleCall cParentLiteralReferenceExpressionParserRuleCall_1_0_0 = (RuleCall)cParentAssignment_1_0.eContents().get(0);
		private final Alternatives cAlternatives_1_1 = (Alternatives)cGroup_1.eContents().get(1);
		private final Keyword cFullStopKeyword_1_1_0 = (Keyword)cAlternatives_1_1.eContents().get(0);
		private final Keyword cHyphenMinusGreaterThanSignKeyword_1_1_1 = (Keyword)cAlternatives_1_1.eContents().get(1);
		private final Assignment cElementAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cElementLiteralReferenceExpressionParserRuleCall_2_0 = (RuleCall)cElementAssignment_2.eContents().get(0);
		
		//LiteralReferenceSpecification returns fmlExpr::LiteralReferenceSpecification
		//    : { fmlExpr::LiteralReferenceSpecification }
		//        ( parent+=LiteralReferenceExpression ( '.'  |  '->' ) )*
		//        element=LiteralReferenceExpression
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//{ fmlExpr::LiteralReferenceSpecification }
		//       ( parent+=LiteralReferenceExpression ( '.'  |  '->' ) )*
		//       element=LiteralReferenceExpression
		public Group getGroup() { return cGroup; }
		
		//{ fmlExpr::LiteralReferenceSpecification }
		public Action getLiteralReferenceSpecificationAction_0() { return cLiteralReferenceSpecificationAction_0; }
		
		//( parent+=LiteralReferenceExpression ( '.'  |  '->' ) )*
		public Group getGroup_1() { return cGroup_1; }
		
		//parent+=LiteralReferenceExpression
		public Assignment getParentAssignment_1_0() { return cParentAssignment_1_0; }
		
		//LiteralReferenceExpression
		public RuleCall getParentLiteralReferenceExpressionParserRuleCall_1_0_0() { return cParentLiteralReferenceExpressionParserRuleCall_1_0_0; }
		
		//( '.'  |  '->' )
		public Alternatives getAlternatives_1_1() { return cAlternatives_1_1; }
		
		//'.'
		public Keyword getFullStopKeyword_1_1_0() { return cFullStopKeyword_1_1_0; }
		
		//'->'
		public Keyword getHyphenMinusGreaterThanSignKeyword_1_1_1() { return cHyphenMinusGreaterThanSignKeyword_1_1_1; }
		
		//element=LiteralReferenceExpression
		public Assignment getElementAssignment_2() { return cElementAssignment_2; }
		
		//LiteralReferenceExpression
		public RuleCall getElementLiteralReferenceExpressionParserRuleCall_2_0() { return cElementLiteralReferenceExpressionParserRuleCall_2_0; }
	}
	public class ValueSelectionExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ValueSelectionExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final RuleCall cLiteralReferenceExpressionParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Action cValueElementSpecificationParentAction_1_0 = (Action)cGroup_1.eContents().get(0);
		private final Keyword cFullStopKeyword_1_1 = (Keyword)cGroup_1.eContents().get(1);
		private final Assignment cElementAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
		private final CrossReference cElementNamedElementCrossReference_1_2_0 = (CrossReference)cElementAssignment_1_2.eContents().get(0);
		private final RuleCall cElementNamedElementESIdentifierParserRuleCall_1_2_0_1 = (RuleCall)cElementNamedElementCrossReference_1_2_0.eContents().get(1);
		private final Group cGroup_1_3 = (Group)cGroup_1.eContents().get(3);
		private final Assignment cKindAssignment_1_3_0 = (Assignment)cGroup_1_3.eContents().get(0);
		private final RuleCall cKindValueIndexExpressionKindEnumRuleCall_1_3_0_0 = (RuleCall)cKindAssignment_1_3_0.eContents().get(0);
		private final Assignment cArgAssignment_1_3_1 = (Assignment)cGroup_1_3.eContents().get(1);
		private final RuleCall cArgPositionalTupleExpressionListParserRuleCall_1_3_1_0 = (RuleCall)cArgAssignment_1_3_1.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_1_3_2 = (Keyword)cGroup_1_3.eContents().get(2);
		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
		private final Action cValueElementSpecificationParentAction_2_0 = (Action)cGroup_2.eContents().get(0);
		private final Keyword cHyphenMinusGreaterThanSignKeyword_2_1 = (Keyword)cGroup_2.eContents().get(1);
		private final Assignment cElementAssignment_2_2 = (Assignment)cGroup_2.eContents().get(2);
		private final CrossReference cElementNamedElementCrossReference_2_2_0 = (CrossReference)cElementAssignment_2_2.eContents().get(0);
		private final RuleCall cElementNamedElementESIdentifierParserRuleCall_2_2_0_1 = (RuleCall)cElementNamedElementCrossReference_2_2_0.eContents().get(1);
		private final Group cGroup_2_3 = (Group)cGroup_2.eContents().get(3);
		private final Assignment cKindAssignment_2_3_0 = (Assignment)cGroup_2_3.eContents().get(0);
		private final RuleCall cKindValueIndexExpressionKindEnumRuleCall_2_3_0_0 = (RuleCall)cKindAssignment_2_3_0.eContents().get(0);
		private final Assignment cArgAssignment_2_3_1 = (Assignment)cGroup_2_3.eContents().get(1);
		private final RuleCall cArgPositionalTupleExpressionListParserRuleCall_2_3_1_0 = (RuleCall)cArgAssignment_2_3_1.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_2_3_2 = (Keyword)cGroup_2_3.eContents().get(2);
		private final Group cGroup_2_4 = (Group)cGroup_2.eContents().get(4);
		private final Action cValueElementSpecificationParentAction_2_4_0 = (Action)cGroup_2_4.eContents().get(0);
		private final Keyword cFullStopKeyword_2_4_1 = (Keyword)cGroup_2_4.eContents().get(1);
		private final Assignment cElementAssignment_2_4_2 = (Assignment)cGroup_2_4.eContents().get(2);
		private final CrossReference cElementNamedElementCrossReference_2_4_2_0 = (CrossReference)cElementAssignment_2_4_2.eContents().get(0);
		private final RuleCall cElementNamedElementESIdentifierParserRuleCall_2_4_2_0_1 = (RuleCall)cElementNamedElementCrossReference_2_4_2_0.eContents().get(1);
		private final Group cGroup_2_4_3 = (Group)cGroup_2_4.eContents().get(3);
		private final Assignment cKindAssignment_2_4_3_0 = (Assignment)cGroup_2_4_3.eContents().get(0);
		private final RuleCall cKindValueIndexExpressionKindEnumRuleCall_2_4_3_0_0 = (RuleCall)cKindAssignment_2_4_3_0.eContents().get(0);
		private final Assignment cArgAssignment_2_4_3_1 = (Assignment)cGroup_2_4_3.eContents().get(1);
		private final RuleCall cArgPositionalTupleExpressionListParserRuleCall_2_4_3_1_0 = (RuleCall)cArgAssignment_2_4_3_1.eContents().get(0);
		private final Keyword cRightSquareBracketKeyword_2_4_3_2 = (Keyword)cGroup_2_4_3.eContents().get(2);
		
		//ValueSelectionExpression returns fmlExpr::Expression
		//    : LiteralReferenceExpression
		//        // '.' element
		//        ( { fmlExpr::ValueElementSpecification.parent=current }
		//            '.' //kind=ValueDotFieldExpressionKind
		//            element=[fmlCommon::NamedElement|ESIdentifier]
		//            // '[' index ',' ... ',' index ']'
		//            ( kind=ValueIndexExpressionKind
		//                arg=PositionalTupleExpressionList  ']'
		////            // TODO '(' parameter ',' ... ',' parameter ')'
		////            | kind=ValueParameterExpressionKind
		////                arg=MixTupleExpressionList  ')'
		//            )?
		//        )*
		//        // '->' element
		//        ( { fmlExpr::ValueElementSpecification.parent=current }
		//            '->' //kind=ValueArrowFieldExpressionKind
		//            element=[fmlCommon::NamedElement|ESIdentifier]
		//            // '[' index ',' ... ',' index ']'
		//            ( kind=ValueIndexExpressionKind
		//                arg=PositionalTupleExpressionList  ']'
		////            // TODO '(' parameter ',' ... ',' parameter ')'
		////            | kind=ValueParameterExpressionKind
		////                arg=MixTupleExpressionList  ')'
		//            )?
		//            // '.' element
		//            ( { fmlExpr::ValueElementSpecification.parent=current }
		//                 '.' //kind=ValueDotFieldExpressionKind
		//                element=[fmlCommon::NamedElement|ESIdentifier]
		//                // '[' index ',' ... ',' index ']'
		//                ( kind=ValueIndexExpressionKind
		//                    arg=PositionalTupleExpressionList  ']'
		////                // TODO '(' parameter ',' ... ',' parameter ')'
		////                | kind=ValueParameterExpressionKind
		////                    arg=MixTupleExpressionList  ')'
		//                )?
		//            )*
		//        )?
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		// LiteralReferenceExpression
		//        // '.' element
		//        ( { fmlExpr::ValueElementSpecification.parent=current }
		//            '.' //kind=ValueDotFieldExpressionKind
		//            element=[fmlCommon::NamedElement|ESIdentifier]
		//            // '[' index ',' ... ',' index ']'
		//            ( kind=ValueIndexExpressionKind
		//                arg=PositionalTupleExpressionList  ']'
		////            // TODO '(' parameter ',' ... ',' parameter ')'
		////            | kind=ValueParameterExpressionKind
		////                arg=MixTupleExpressionList  ')'
		//            )?
		//        )*
		//        // '->' element
		//        ( { fmlExpr::ValueElementSpecification.parent=current }
		//            '->' //kind=ValueArrowFieldExpressionKind
		//            element=[fmlCommon::NamedElement|ESIdentifier]
		//            // '[' index ',' ... ',' index ']'
		//            ( kind=ValueIndexExpressionKind
		//                arg=PositionalTupleExpressionList  ']'
		////            // TODO '(' parameter ',' ... ',' parameter ')'
		////            | kind=ValueParameterExpressionKind
		////                arg=MixTupleExpressionList  ')'
		//            )?
		//            // '.' element
		//            ( { fmlExpr::ValueElementSpecification.parent=current }
		//                 '.' //kind=ValueDotFieldExpressionKind
		//                element=[fmlCommon::NamedElement|ESIdentifier]
		//                // '[' index ',' ... ',' index ']'
		//                ( kind=ValueIndexExpressionKind
		//                    arg=PositionalTupleExpressionList  ']'
		////                // TODO '(' parameter ',' ... ',' parameter ')'
		////                | kind=ValueParameterExpressionKind
		////                    arg=MixTupleExpressionList  ')'
		//                )?
		//            )*
		//        )?
		public Group getGroup() { return cGroup; }
		
		//LiteralReferenceExpression
		public RuleCall getLiteralReferenceExpressionParserRuleCall_0() { return cLiteralReferenceExpressionParserRuleCall_0; }
		
		//        // '.' element
		//        ( { fmlExpr::ValueElementSpecification.parent=current }
		//            '.' //kind=ValueDotFieldExpressionKind
		//            element=[fmlCommon::NamedElement|ESIdentifier]
		//            // '[' index ',' ... ',' index ']'
		//            ( kind=ValueIndexExpressionKind
		//                arg=PositionalTupleExpressionList  ']'
		////            // TODO '(' parameter ',' ... ',' parameter ')'
		////            | kind=ValueParameterExpressionKind
		////                arg=MixTupleExpressionList  ')'
		//            )?
		//        )*
		public Group getGroup_1() { return cGroup_1; }
		
		//{ fmlExpr::ValueElementSpecification.parent=current }
		public Action getValueElementSpecificationParentAction_1_0() { return cValueElementSpecificationParentAction_1_0; }
		
		//'.'
		public Keyword getFullStopKeyword_1_1() { return cFullStopKeyword_1_1; }
		
		////kind=ValueDotFieldExpressionKind
		//           element=[fmlCommon::NamedElement|ESIdentifier]
		public Assignment getElementAssignment_1_2() { return cElementAssignment_1_2; }
		
		//[fmlCommon::NamedElement|ESIdentifier]
		public CrossReference getElementNamedElementCrossReference_1_2_0() { return cElementNamedElementCrossReference_1_2_0; }
		
		//ESIdentifier
		public RuleCall getElementNamedElementESIdentifierParserRuleCall_1_2_0_1() { return cElementNamedElementESIdentifierParserRuleCall_1_2_0_1; }
		
		//            // '[' index ',' ... ',' index ']'
		//            ( kind=ValueIndexExpressionKind
		//                arg=PositionalTupleExpressionList  ']'
		////            // TODO '(' parameter ',' ... ',' parameter ')'
		////            | kind=ValueParameterExpressionKind
		////                arg=MixTupleExpressionList  ')'
		//            )?
		public Group getGroup_1_3() { return cGroup_1_3; }
		
		//kind=ValueIndexExpressionKind
		public Assignment getKindAssignment_1_3_0() { return cKindAssignment_1_3_0; }
		
		//ValueIndexExpressionKind
		public RuleCall getKindValueIndexExpressionKindEnumRuleCall_1_3_0_0() { return cKindValueIndexExpressionKindEnumRuleCall_1_3_0_0; }
		
		//arg=PositionalTupleExpressionList
		public Assignment getArgAssignment_1_3_1() { return cArgAssignment_1_3_1; }
		
		//PositionalTupleExpressionList
		public RuleCall getArgPositionalTupleExpressionListParserRuleCall_1_3_1_0() { return cArgPositionalTupleExpressionListParserRuleCall_1_3_1_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_1_3_2() { return cRightSquareBracketKeyword_1_3_2; }
		
		//        // '->' element
		//        ( { fmlExpr::ValueElementSpecification.parent=current }
		//            '->' //kind=ValueArrowFieldExpressionKind
		//            element=[fmlCommon::NamedElement|ESIdentifier]
		//            // '[' index ',' ... ',' index ']'
		//            ( kind=ValueIndexExpressionKind
		//                arg=PositionalTupleExpressionList  ']'
		////            // TODO '(' parameter ',' ... ',' parameter ')'
		////            | kind=ValueParameterExpressionKind
		////                arg=MixTupleExpressionList  ')'
		//            )?
		//            // '.' element
		//            ( { fmlExpr::ValueElementSpecification.parent=current }
		//                 '.' //kind=ValueDotFieldExpressionKind
		//                element=[fmlCommon::NamedElement|ESIdentifier]
		//                // '[' index ',' ... ',' index ']'
		//                ( kind=ValueIndexExpressionKind
		//                    arg=PositionalTupleExpressionList  ']'
		////                // TODO '(' parameter ',' ... ',' parameter ')'
		////                | kind=ValueParameterExpressionKind
		////                    arg=MixTupleExpressionList  ')'
		//                )?
		//            )*
		//        )?
		public Group getGroup_2() { return cGroup_2; }
		
		//{ fmlExpr::ValueElementSpecification.parent=current }
		public Action getValueElementSpecificationParentAction_2_0() { return cValueElementSpecificationParentAction_2_0; }
		
		//'->'
		public Keyword getHyphenMinusGreaterThanSignKeyword_2_1() { return cHyphenMinusGreaterThanSignKeyword_2_1; }
		
		////kind=ValueArrowFieldExpressionKind
		//           element=[fmlCommon::NamedElement|ESIdentifier]
		public Assignment getElementAssignment_2_2() { return cElementAssignment_2_2; }
		
		//[fmlCommon::NamedElement|ESIdentifier]
		public CrossReference getElementNamedElementCrossReference_2_2_0() { return cElementNamedElementCrossReference_2_2_0; }
		
		//ESIdentifier
		public RuleCall getElementNamedElementESIdentifierParserRuleCall_2_2_0_1() { return cElementNamedElementESIdentifierParserRuleCall_2_2_0_1; }
		
		//            // '[' index ',' ... ',' index ']'
		//            ( kind=ValueIndexExpressionKind
		//                arg=PositionalTupleExpressionList  ']'
		////            // TODO '(' parameter ',' ... ',' parameter ')'
		////            | kind=ValueParameterExpressionKind
		////                arg=MixTupleExpressionList  ')'
		//            )?
		public Group getGroup_2_3() { return cGroup_2_3; }
		
		//kind=ValueIndexExpressionKind
		public Assignment getKindAssignment_2_3_0() { return cKindAssignment_2_3_0; }
		
		//ValueIndexExpressionKind
		public RuleCall getKindValueIndexExpressionKindEnumRuleCall_2_3_0_0() { return cKindValueIndexExpressionKindEnumRuleCall_2_3_0_0; }
		
		//arg=PositionalTupleExpressionList
		public Assignment getArgAssignment_2_3_1() { return cArgAssignment_2_3_1; }
		
		//PositionalTupleExpressionList
		public RuleCall getArgPositionalTupleExpressionListParserRuleCall_2_3_1_0() { return cArgPositionalTupleExpressionListParserRuleCall_2_3_1_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_2_3_2() { return cRightSquareBracketKeyword_2_3_2; }
		
		//            // '.' element
		//            ( { fmlExpr::ValueElementSpecification.parent=current }
		//                 '.' //kind=ValueDotFieldExpressionKind
		//                element=[fmlCommon::NamedElement|ESIdentifier]
		//                // '[' index ',' ... ',' index ']'
		//                ( kind=ValueIndexExpressionKind
		//                    arg=PositionalTupleExpressionList  ']'
		////                // TODO '(' parameter ',' ... ',' parameter ')'
		////                | kind=ValueParameterExpressionKind
		////                    arg=MixTupleExpressionList  ')'
		//                )?
		//            )*
		public Group getGroup_2_4() { return cGroup_2_4; }
		
		//{ fmlExpr::ValueElementSpecification.parent=current }
		public Action getValueElementSpecificationParentAction_2_4_0() { return cValueElementSpecificationParentAction_2_4_0; }
		
		//'.'
		public Keyword getFullStopKeyword_2_4_1() { return cFullStopKeyword_2_4_1; }
		
		////kind=ValueDotFieldExpressionKind
		//               element=[fmlCommon::NamedElement|ESIdentifier]
		public Assignment getElementAssignment_2_4_2() { return cElementAssignment_2_4_2; }
		
		//[fmlCommon::NamedElement|ESIdentifier]
		public CrossReference getElementNamedElementCrossReference_2_4_2_0() { return cElementNamedElementCrossReference_2_4_2_0; }
		
		//ESIdentifier
		public RuleCall getElementNamedElementESIdentifierParserRuleCall_2_4_2_0_1() { return cElementNamedElementESIdentifierParserRuleCall_2_4_2_0_1; }
		
		//                // '[' index ',' ... ',' index ']'
		//                ( kind=ValueIndexExpressionKind
		//                    arg=PositionalTupleExpressionList  ']'
		////                // TODO '(' parameter ',' ... ',' parameter ')'
		////                | kind=ValueParameterExpressionKind
		////                    arg=MixTupleExpressionList  ')'
		//                )?
		public Group getGroup_2_4_3() { return cGroup_2_4_3; }
		
		//kind=ValueIndexExpressionKind
		public Assignment getKindAssignment_2_4_3_0() { return cKindAssignment_2_4_3_0; }
		
		//ValueIndexExpressionKind
		public RuleCall getKindValueIndexExpressionKindEnumRuleCall_2_4_3_0_0() { return cKindValueIndexExpressionKindEnumRuleCall_2_4_3_0_0; }
		
		//arg=PositionalTupleExpressionList
		public Assignment getArgAssignment_2_4_3_1() { return cArgAssignment_2_4_3_1; }
		
		//PositionalTupleExpressionList
		public RuleCall getArgPositionalTupleExpressionListParserRuleCall_2_4_3_1_0() { return cArgPositionalTupleExpressionListParserRuleCall_2_4_3_1_0; }
		
		//']'
		public Keyword getRightSquareBracketKeyword_2_4_3_2() { return cRightSquareBracketKeyword_2_4_3_2; }
	}
	public class ValuePureNamedMachineExpressionElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ValuePureNamedMachineExpression");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final RuleCall cLiteralPureReferenceExpressionParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
		private final Action cValueElementSpecificationParentAction_1_0 = (Action)cGroup_1.eContents().get(0);
		private final Assignment cKindAssignment_1_1 = (Assignment)cGroup_1.eContents().get(1);
		private final Alternatives cKindAlternatives_1_1_0 = (Alternatives)cKindAssignment_1_1.eContents().get(0);
		private final RuleCall cKindValueDotFieldExpressionKindEnumRuleCall_1_1_0_0 = (RuleCall)cKindAlternatives_1_1_0.eContents().get(0);
		private final RuleCall cKindValueArrowFieldExpressionKindEnumRuleCall_1_1_0_1 = (RuleCall)cKindAlternatives_1_1_0.eContents().get(1);
		private final Assignment cElementAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
		private final CrossReference cElementNamedElementCrossReference_1_2_0 = (CrossReference)cElementAssignment_1_2.eContents().get(0);
		private final RuleCall cElementNamedElementESIdentifierParserRuleCall_1_2_0_1 = (RuleCall)cElementNamedElementCrossReference_1_2_0.eContents().get(1);
		
		////ValuePureNamedElementExpression
		////ValuePureNamedElementExpression returns fmlExpr::Expression
		////    : LiteralPureReferenceExpression
		////
		////        // '.' element
		////        ( { fmlExpr::ValueElementSpecification.parent=current }
		////            kind=ValueDotFieldExpressionKind
		////            element=[fmlCommon::NamedElement|ESIdentifier]
		////        )*
		////
		////        // '->' element
		////        ( { fmlExpr::ValueElementSpecification.parent=current }
		////            kind=ValueArrowFieldExpressionKind
		////            element=[fmlCommon::NamedElement|ESIdentifier]
		////
		////            // '.' element
		////            ( { fmlExpr::ValueElementSpecification.parent=current }
		////                kind=ValueDotFieldExpressionKind
		////                element=[fmlCommon::NamedElement|ESIdentifier]
		////            )*
		////        )?
		////    ;
		//ValuePureNamedMachineExpression returns fmlExpr::Expression
		//    : LiteralPureReferenceExpression
		//        // ( '.' | '->' ) element
		//        ( { fmlExpr::ValueElementSpecification.parent=current }
		//            kind=(ValueDotFieldExpressionKind | ValueArrowFieldExpressionKind )
		//            element=[fmlCommon::NamedElement|ESIdentifier]
		//        )*
		//    ;
		@Override public ParserRule getRule() { return rule; }
		
		//LiteralPureReferenceExpression
		//       // ( '.' | '->' ) element
		//       ( { fmlExpr::ValueElementSpecification.parent=current }
		//           kind=(ValueDotFieldExpressionKind | ValueArrowFieldExpressionKind )
		//           element=[fmlCommon::NamedElement|ESIdentifier]
		//       )*
		public Group getGroup() { return cGroup; }
		
		//LiteralPureReferenceExpression
		public RuleCall getLiteralPureReferenceExpressionParserRuleCall_0() { return cLiteralPureReferenceExpressionParserRuleCall_0; }
		
		//// ( '.' | '->' ) element
		//( { fmlExpr::ValueElementSpecification.parent=current }
		//    kind=(ValueDotFieldExpressionKind | ValueArrowFieldExpressionKind )
		//    element=[fmlCommon::NamedElement|ESIdentifier]
		//)*
		public Group getGroup_1() { return cGroup_1; }
		
		//{ fmlExpr::ValueElementSpecification.parent=current }
		public Action getValueElementSpecificationParentAction_1_0() { return cValueElementSpecificationParentAction_1_0; }
		
		//kind=(ValueDotFieldExpressionKind | ValueArrowFieldExpressionKind )
		public Assignment getKindAssignment_1_1() { return cKindAssignment_1_1; }
		
		//(ValueDotFieldExpressionKind | ValueArrowFieldExpressionKind )
		public Alternatives getKindAlternatives_1_1_0() { return cKindAlternatives_1_1_0; }
		
		//ValueDotFieldExpressionKind
		public RuleCall getKindValueDotFieldExpressionKindEnumRuleCall_1_1_0_0() { return cKindValueDotFieldExpressionKindEnumRuleCall_1_1_0_0; }
		
		//ValueArrowFieldExpressionKind
		public RuleCall getKindValueArrowFieldExpressionKindEnumRuleCall_1_1_0_1() { return cKindValueArrowFieldExpressionKindEnumRuleCall_1_1_0_1; }
		
		//element=[fmlCommon::NamedElement|ESIdentifier]
		public Assignment getElementAssignment_1_2() { return cElementAssignment_1_2; }
		
		//[fmlCommon::NamedElement|ESIdentifier]
		public CrossReference getElementNamedElementCrossReference_1_2_0() { return cElementNamedElementCrossReference_1_2_0; }
		
		//ESIdentifier
		public RuleCall getElementNamedElementESIdentifierParserRuleCall_1_2_0_1() { return cElementNamedElementESIdentifierParserRuleCall_1_2_0_1; }
	}
	
	public class VisibilityKindElements extends AbstractElementFinder.AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.VisibilityKind");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cPublicEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cPublicPublicKeyword_0_0 = (Keyword)cPublicEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cPrivateEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cPrivatePrivateKeyword_1_0 = (Keyword)cPrivateEnumLiteralDeclaration_1.eContents().get(0);
		private final EnumLiteralDeclaration cProtectedEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
		private final Keyword cProtectedProtectedKeyword_2_0 = (Keyword)cProtectedEnumLiteralDeclaration_2.eContents().get(0);
		private final EnumLiteralDeclaration cPackageEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
		private final Keyword cPackagePackageKeyword_3_0 = (Keyword)cPackageEnumLiteralDeclaration_3.eContents().get(0);
		
		//enum VisibilityKind returns fmlCommon::VisibilityKind
		//    : public   ='public'
		//    | private  ='private'
		//    | protected='protected'
		//    | package  ='package'
		//    ;
		public EnumRule getRule() { return rule; }
		
		//public   ='public'
		//   | private  ='private'
		//   | protected='protected'
		//   | package  ='package'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//public   ='public'
		public EnumLiteralDeclaration getPublicEnumLiteralDeclaration_0() { return cPublicEnumLiteralDeclaration_0; }
		
		//'public'
		public Keyword getPublicPublicKeyword_0_0() { return cPublicPublicKeyword_0_0; }
		
		//private  ='private'
		public EnumLiteralDeclaration getPrivateEnumLiteralDeclaration_1() { return cPrivateEnumLiteralDeclaration_1; }
		
		//'private'
		public Keyword getPrivatePrivateKeyword_1_0() { return cPrivatePrivateKeyword_1_0; }
		
		//protected='protected'
		public EnumLiteralDeclaration getProtectedEnumLiteralDeclaration_2() { return cProtectedEnumLiteralDeclaration_2; }
		
		//'protected'
		public Keyword getProtectedProtectedKeyword_2_0() { return cProtectedProtectedKeyword_2_0; }
		
		//package  ='package'
		public EnumLiteralDeclaration getPackageEnumLiteralDeclaration_3() { return cPackageEnumLiteralDeclaration_3; }
		
		//'package'
		public Keyword getPackagePackageKeyword_3_0() { return cPackagePackageKeyword_3_0; }
	}
	public class DesignKindElements extends AbstractElementFinder.AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.DesignKind");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cModelEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cModelModelKeyword_0_0 = (Keyword)cModelEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cPrototypeEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cPrototypePrototypeKeyword_1_0 = (Keyword)cPrototypeEnumLiteralDeclaration_1.eContents().get(0);
		private final EnumLiteralDeclaration cModelEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
		private final Keyword cModelModelKeyword_2_0 = (Keyword)cModelEnumLiteralDeclaration_2.eContents().get(0);
		private final EnumLiteralDeclaration cPrototypeEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
		private final Keyword cPrototypePrototypeKeyword_3_0 = (Keyword)cPrototypeEnumLiteralDeclaration_3.eContents().get(0);
		
		//////////////////////////////////////////////////////////////////////////////////
		//// Machine PropertyDefinition Rules
		//////////////////////////////////////////////////////////////////////////////////
		//enum DesignKind returns fmlInfra::DesignKind
		//    : model     = 'model'
		//    | prototype = 'prototype'
		//    | model     = '#model'
		//    | prototype = '#prototype'
		//    ;
		public EnumRule getRule() { return rule; }
		
		//model     = 'model'
		//   | prototype = 'prototype'
		//   | model     = '#model'
		//   | prototype = '#prototype'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//model     = 'model'
		public EnumLiteralDeclaration getModelEnumLiteralDeclaration_0() { return cModelEnumLiteralDeclaration_0; }
		
		//'model'
		public Keyword getModelModelKeyword_0_0() { return cModelModelKeyword_0_0; }
		
		//prototype = 'prototype'
		public EnumLiteralDeclaration getPrototypeEnumLiteralDeclaration_1() { return cPrototypeEnumLiteralDeclaration_1; }
		
		//'prototype'
		public Keyword getPrototypePrototypeKeyword_1_0() { return cPrototypePrototypeKeyword_1_0; }
		
		//model     = '#model'
		public EnumLiteralDeclaration getModelEnumLiteralDeclaration_2() { return cModelEnumLiteralDeclaration_2; }
		
		//'#model'
		public Keyword getModelModelKeyword_2_0() { return cModelModelKeyword_2_0; }
		
		//prototype = '#prototype'
		public EnumLiteralDeclaration getPrototypeEnumLiteralDeclaration_3() { return cPrototypeEnumLiteralDeclaration_3; }
		
		//'#prototype'
		public Keyword getPrototypePrototypeKeyword_3_0() { return cPrototypePrototypeKeyword_3_0; }
	}
	public class DesignInstanceKindElements extends AbstractElementFinder.AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.DesignInstanceKind");
		private final EnumLiteralDeclaration cInstanceEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
		private final Keyword cInstanceInstanceKeyword_0 = (Keyword)cInstanceEnumLiteralDeclaration.eContents().get(0);
		
		//enum DesignInstanceKind returns fmlInfra::DesignKind
		//    : instance  = 'instance'
		//    ;
		public EnumRule getRule() { return rule; }
		
		//instance  = 'instance'
		public EnumLiteralDeclaration getInstanceEnumLiteralDeclaration() { return cInstanceEnumLiteralDeclaration; }
		
		//'instance'
		public Keyword getInstanceInstanceKeyword_0() { return cInstanceInstanceKeyword_0; }
	}
	public class PseudostateKindElements extends AbstractElementFinder.AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PseudostateKind");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cJunctionEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cJunctionJunctionKeyword_0_0 = (Keyword)cJunctionEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cChoiceEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cChoiceChoiceKeyword_1_0 = (Keyword)cChoiceEnumLiteralDeclaration_1.eContents().get(0);
		private final EnumLiteralDeclaration cEntryPointEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
		private final Keyword cEntryPointEntryPointKeyword_2_0 = (Keyword)cEntryPointEnumLiteralDeclaration_2.eContents().get(0);
		private final EnumLiteralDeclaration cExitPointEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
		private final Keyword cExitPointExitPointKeyword_3_0 = (Keyword)cExitPointEnumLiteralDeclaration_3.eContents().get(0);
		private final EnumLiteralDeclaration cForkEnumLiteralDeclaration_4 = (EnumLiteralDeclaration)cAlternatives.eContents().get(4);
		private final Keyword cForkForkKeyword_4_0 = (Keyword)cForkEnumLiteralDeclaration_4.eContents().get(0);
		private final EnumLiteralDeclaration cJoinEnumLiteralDeclaration_5 = (EnumLiteralDeclaration)cAlternatives.eContents().get(5);
		private final Keyword cJoinJoinKeyword_5_0 = (Keyword)cJoinEnumLiteralDeclaration_5.eContents().get(0);
		private final EnumLiteralDeclaration cDeepHistoryEnumLiteralDeclaration_6 = (EnumLiteralDeclaration)cAlternatives.eContents().get(6);
		private final Keyword cDeepHistoryDhistoryKeyword_6_0 = (Keyword)cDeepHistoryEnumLiteralDeclaration_6.eContents().get(0);
		private final EnumLiteralDeclaration cShallowHistoryEnumLiteralDeclaration_7 = (EnumLiteralDeclaration)cAlternatives.eContents().get(7);
		private final Keyword cShallowHistoryShistoryKeyword_7_0 = (Keyword)cShallowHistoryEnumLiteralDeclaration_7.eContents().get(0);
		
		//enum PseudostateKind returns fmlStmchn::PseudostateKind
		//    : Junction='junction'
		//    | Choice  ='choice'
		//    | EntryPoint='entryPoint'
		//    | ExitPoint  ='exitPoint'
		////    | Initial ='initial'
		////
		////    | Terminal='terminal'
		////    | Return   ='return'
		//    | Fork='fork'
		//    | Join='join'
		//    | DeepHistory   ='dhistory'
		//    | ShallowHistory='shistory'
		//    ;
		public EnumRule getRule() { return rule; }
		
		// Junction='junction'
		//    | Choice  ='choice'
		//    | EntryPoint='entryPoint'
		//    | ExitPoint  ='exitPoint'
		////    | Initial ='initial'
		////
		////    | Terminal='terminal'
		////    | Return   ='return'
		//    | Fork='fork'
		//    | Join='join'
		//    | DeepHistory   ='dhistory'
		//    | ShallowHistory='shistory'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//Junction='junction'
		public EnumLiteralDeclaration getJunctionEnumLiteralDeclaration_0() { return cJunctionEnumLiteralDeclaration_0; }
		
		//'junction'
		public Keyword getJunctionJunctionKeyword_0_0() { return cJunctionJunctionKeyword_0_0; }
		
		//Choice  ='choice'
		public EnumLiteralDeclaration getChoiceEnumLiteralDeclaration_1() { return cChoiceEnumLiteralDeclaration_1; }
		
		//'choice'
		public Keyword getChoiceChoiceKeyword_1_0() { return cChoiceChoiceKeyword_1_0; }
		
		//EntryPoint='entryPoint'
		public EnumLiteralDeclaration getEntryPointEnumLiteralDeclaration_2() { return cEntryPointEnumLiteralDeclaration_2; }
		
		//'entryPoint'
		public Keyword getEntryPointEntryPointKeyword_2_0() { return cEntryPointEntryPointKeyword_2_0; }
		
		//ExitPoint  ='exitPoint'
		public EnumLiteralDeclaration getExitPointEnumLiteralDeclaration_3() { return cExitPointEnumLiteralDeclaration_3; }
		
		//'exitPoint'
		public Keyword getExitPointExitPointKeyword_3_0() { return cExitPointExitPointKeyword_3_0; }
		
		//Fork='fork'
		public EnumLiteralDeclaration getForkEnumLiteralDeclaration_4() { return cForkEnumLiteralDeclaration_4; }
		
		//'fork'
		public Keyword getForkForkKeyword_4_0() { return cForkForkKeyword_4_0; }
		
		//Join='join'
		public EnumLiteralDeclaration getJoinEnumLiteralDeclaration_5() { return cJoinEnumLiteralDeclaration_5; }
		
		//'join'
		public Keyword getJoinJoinKeyword_5_0() { return cJoinJoinKeyword_5_0; }
		
		//DeepHistory   ='dhistory'
		public EnumLiteralDeclaration getDeepHistoryEnumLiteralDeclaration_6() { return cDeepHistoryEnumLiteralDeclaration_6; }
		
		//'dhistory'
		public Keyword getDeepHistoryDhistoryKeyword_6_0() { return cDeepHistoryDhistoryKeyword_6_0; }
		
		//ShallowHistory='shistory'
		public EnumLiteralDeclaration getShallowHistoryEnumLiteralDeclaration_7() { return cShallowHistoryEnumLiteralDeclaration_7; }
		
		//'shistory'
		public Keyword getShallowHistoryShistoryKeyword_7_0() { return cShallowHistoryShistoryKeyword_7_0; }
	}
	public class PseudostateInitialKindElements extends AbstractElementFinder.AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PseudostateInitialKind");
		private final EnumLiteralDeclaration cInitialEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
		private final Keyword cInitialInitialKeyword_0 = (Keyword)cInitialEnumLiteralDeclaration.eContents().get(0);
		
		//enum PseudostateInitialKind returns fmlStmchn::PseudostateKind
		//    : Initial ='initial'
		//    ;
		public EnumRule getRule() { return rule; }
		
		//Initial ='initial'
		public EnumLiteralDeclaration getInitialEnumLiteralDeclaration() { return cInitialEnumLiteralDeclaration; }
		
		//'initial'
		public Keyword getInitialInitialKeyword_0() { return cInitialInitialKeyword_0; }
	}
	public class EndingPseudostateKindElements extends AbstractElementFinder.AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.EndingPseudostateKind");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cTerminalEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cTerminalTerminalKeyword_0_0 = (Keyword)cTerminalEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cReturnEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cReturnReturnKeyword_1_0 = (Keyword)cReturnEnumLiteralDeclaration_1.eContents().get(0);
		
		//enum EndingPseudostateKind returns fmlStmchn::PseudostateKind
		//    : Terminal='terminal'
		//    | Return='return'
		//    ;
		public EnumRule getRule() { return rule; }
		
		//Terminal='terminal'
		//   | Return='return'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//Terminal='terminal'
		public EnumLiteralDeclaration getTerminalEnumLiteralDeclaration_0() { return cTerminalEnumLiteralDeclaration_0; }
		
		//'terminal'
		public Keyword getTerminalTerminalKeyword_0_0() { return cTerminalTerminalKeyword_0_0; }
		
		//Return='return'
		public EnumLiteralDeclaration getReturnEnumLiteralDeclaration_1() { return cReturnEnumLiteralDeclaration_1; }
		
		//'return'
		public Keyword getReturnReturnKeyword_1_0() { return cReturnReturnKeyword_1_0; }
	}
	public class ComProtocolKindElements extends AbstractElementFinder.AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ComProtocolKind");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cEnvEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cEnvEnvKeyword_0_0 = (Keyword)cEnvEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cRdvEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cRdvRdvKeyword_1_0 = (Keyword)cRdvEnumLiteralDeclaration_1.eContents().get(0);
		private final EnumLiteralDeclaration cMulti_rdvEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
		private final Keyword cMulti_rdvMultirdvKeyword_2_0 = (Keyword)cMulti_rdvEnumLiteralDeclaration_2.eContents().get(0);
		
		//enum ComProtocolKind returns fmlInfra::ComProtocolKind
		//    : env       = 'env'
		//    | rdv       = 'rdv'
		//    | multi_rdv = 'multirdv'
		//    ;
		public EnumRule getRule() { return rule; }
		
		//env       = 'env'
		//   | rdv       = 'rdv'
		//   | multi_rdv = 'multirdv'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//env       = 'env'
		public EnumLiteralDeclaration getEnvEnumLiteralDeclaration_0() { return cEnvEnumLiteralDeclaration_0; }
		
		//'env'
		public Keyword getEnvEnvKeyword_0_0() { return cEnvEnvKeyword_0_0; }
		
		//rdv       = 'rdv'
		public EnumLiteralDeclaration getRdvEnumLiteralDeclaration_1() { return cRdvEnumLiteralDeclaration_1; }
		
		//'rdv'
		public Keyword getRdvRdvKeyword_1_0() { return cRdvRdvKeyword_1_0; }
		
		//multi_rdv = 'multirdv'
		public EnumLiteralDeclaration getMulti_rdvEnumLiteralDeclaration_2() { return cMulti_rdvEnumLiteralDeclaration_2; }
		
		//'multirdv'
		public Keyword getMulti_rdvMultirdvKeyword_2_0() { return cMulti_rdvMultirdvKeyword_2_0; }
	}
	public class ComEnvRdvProtocolKindElements extends AbstractElementFinder.AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ComEnvRdvProtocolKind");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cEnvEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cEnvEnvKeyword_0_0 = (Keyword)cEnvEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cRdvEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cRdvRdvKeyword_1_0 = (Keyword)cRdvEnumLiteralDeclaration_1.eContents().get(0);
		
		//enum ComEnvRdvProtocolKind returns fmlInfra::ComProtocolKind
		//    : env = 'env'
		//    | rdv = 'rdv'
		//    ;
		public EnumRule getRule() { return rule; }
		
		//env = 'env'
		//   | rdv = 'rdv'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//env = 'env'
		public EnumLiteralDeclaration getEnvEnumLiteralDeclaration_0() { return cEnvEnumLiteralDeclaration_0; }
		
		//'env'
		public Keyword getEnvEnvKeyword_0_0() { return cEnvEnvKeyword_0_0; }
		
		//rdv = 'rdv'
		public EnumLiteralDeclaration getRdvEnumLiteralDeclaration_1() { return cRdvEnumLiteralDeclaration_1; }
		
		//'rdv'
		public Keyword getRdvRdvKeyword_1_0() { return cRdvRdvKeyword_1_0; }
	}
	public class ComMultiRdvProtocolKindElements extends AbstractElementFinder.AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ComMultiRdvProtocolKind");
		private final EnumLiteralDeclaration cMulti_rdvEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
		private final Keyword cMulti_rdvMultirdvKeyword_0 = (Keyword)cMulti_rdvEnumLiteralDeclaration.eContents().get(0);
		
		//enum ComMultiRdvProtocolKind returns fmlInfra::ComProtocolKind
		//    : multi_rdv = 'multirdv'
		//    ;
		public EnumRule getRule() { return rule; }
		
		//multi_rdv = 'multirdv'
		public EnumLiteralDeclaration getMulti_rdvEnumLiteralDeclaration() { return cMulti_rdvEnumLiteralDeclaration; }
		
		//'multirdv'
		public Keyword getMulti_rdvMultirdvKeyword_0() { return cMulti_rdvMultirdvKeyword_0; }
	}
	public class BufferProtocolKindElements extends AbstractElementFinder.AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.BufferProtocolKind");
		private final EnumLiteralDeclaration cBufferEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
		private final Keyword cBufferBufferKeyword_0 = (Keyword)cBufferEnumLiteralDeclaration.eContents().get(0);
		
		//enum BufferProtocolKind returns fmlInfra::ComProtocolKind
		//    : buffer = 'buffer'
		//    ;
		public EnumRule getRule() { return rule; }
		
		//buffer = 'buffer'
		public EnumLiteralDeclaration getBufferEnumLiteralDeclaration() { return cBufferEnumLiteralDeclaration; }
		
		//'buffer'
		public Keyword getBufferBufferKeyword_0() { return cBufferBufferKeyword_0; }
	}
	public class ComCastKingElements extends AbstractElementFinder.AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ComCastKing");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cUnicastEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cUnicastUnicastKeyword_0_0 = (Keyword)cUnicastEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cAnycastEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cAnycastAnycastKeyword_1_0 = (Keyword)cAnycastEnumLiteralDeclaration_1.eContents().get(0);
		private final EnumLiteralDeclaration cMulticastEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
		private final Keyword cMulticastMulticastKeyword_2_0 = (Keyword)cMulticastEnumLiteralDeclaration_2.eContents().get(0);
		private final EnumLiteralDeclaration cBroadcastEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
		private final Keyword cBroadcastBroadcastKeyword_3_0 = (Keyword)cBroadcastEnumLiteralDeclaration_3.eContents().get(0);
		
		//enum ComCastKing returns fmlInfra::ComCastKind
		//    : unicast   = 'unicast'
		//    | anycast   = 'anycast'
		//    | multicast = 'multicast'
		//    | broadcast = 'broadcast'
		//    ;
		public EnumRule getRule() { return rule; }
		
		//unicast   = 'unicast'
		//   | anycast   = 'anycast'
		//   | multicast = 'multicast'
		//   | broadcast = 'broadcast'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//unicast   = 'unicast'
		public EnumLiteralDeclaration getUnicastEnumLiteralDeclaration_0() { return cUnicastEnumLiteralDeclaration_0; }
		
		//'unicast'
		public Keyword getUnicastUnicastKeyword_0_0() { return cUnicastUnicastKeyword_0_0; }
		
		//anycast   = 'anycast'
		public EnumLiteralDeclaration getAnycastEnumLiteralDeclaration_1() { return cAnycastEnumLiteralDeclaration_1; }
		
		//'anycast'
		public Keyword getAnycastAnycastKeyword_1_0() { return cAnycastAnycastKeyword_1_0; }
		
		//multicast = 'multicast'
		public EnumLiteralDeclaration getMulticastEnumLiteralDeclaration_2() { return cMulticastEnumLiteralDeclaration_2; }
		
		//'multicast'
		public Keyword getMulticastMulticastKeyword_2_0() { return cMulticastMulticastKeyword_2_0; }
		
		//broadcast = 'broadcast'
		public EnumLiteralDeclaration getBroadcastEnumLiteralDeclaration_3() { return cBroadcastEnumLiteralDeclaration_3; }
		
		//'broadcast'
		public Keyword getBroadcastBroadcastKeyword_3_0() { return cBroadcastBroadcastKeyword_3_0; }
	}
	public class PrimitiveNumberSignElements extends AbstractElementFinder.AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PrimitiveNumberSign");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cPositiveEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cPositivePlusSignKeyword_0_0 = (Keyword)cPositiveEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cPositive_strictEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cPositive_strictPlusSignPlusSignKeyword_1_0 = (Keyword)cPositive_strictEnumLiteralDeclaration_1.eContents().get(0);
		private final EnumLiteralDeclaration cNegativeEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
		private final Keyword cNegativeHyphenMinusKeyword_2_0 = (Keyword)cNegativeEnumLiteralDeclaration_2.eContents().get(0);
		private final EnumLiteralDeclaration cNegative_strictEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
		private final Keyword cNegative_strictHyphenMinusHyphenMinusKeyword_3_0 = (Keyword)cNegative_strictEnumLiteralDeclaration_3.eContents().get(0);
		
		//enum PrimitiveNumberSign returns fmlType::PrimitiveNumberSign
		//    : positive='+'
		//    | positive_strict='++'
		//    | negative='-'
		//    | negative_strict='--'
		//    ;
		public EnumRule getRule() { return rule; }
		
		//positive='+'
		//   | positive_strict='++'
		//   | negative='-'
		//   | negative_strict='--'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//positive='+'
		public EnumLiteralDeclaration getPositiveEnumLiteralDeclaration_0() { return cPositiveEnumLiteralDeclaration_0; }
		
		//'+'
		public Keyword getPositivePlusSignKeyword_0_0() { return cPositivePlusSignKeyword_0_0; }
		
		//positive_strict='++'
		public EnumLiteralDeclaration getPositive_strictEnumLiteralDeclaration_1() { return cPositive_strictEnumLiteralDeclaration_1; }
		
		//'++'
		public Keyword getPositive_strictPlusSignPlusSignKeyword_1_0() { return cPositive_strictPlusSignPlusSignKeyword_1_0; }
		
		//negative='-'
		public EnumLiteralDeclaration getNegativeEnumLiteralDeclaration_2() { return cNegativeEnumLiteralDeclaration_2; }
		
		//'-'
		public Keyword getNegativeHyphenMinusKeyword_2_0() { return cNegativeHyphenMinusKeyword_2_0; }
		
		//negative_strict='--'
		public EnumLiteralDeclaration getNegative_strictEnumLiteralDeclaration_3() { return cNegative_strictEnumLiteralDeclaration_3; }
		
		//'--'
		public Keyword getNegative_strictHyphenMinusHyphenMinusKeyword_3_0() { return cNegative_strictHyphenMinusHyphenMinusKeyword_3_0; }
	}
	public class PrimitiveInstanceKindElements extends AbstractElementFinder.AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.PrimitiveInstanceKind");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cBufferEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cBufferBufferKeyword_0_0 = (Keyword)cBufferEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cMessageEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cMessageMessageKeyword_1_0 = (Keyword)cMessageEnumLiteralDeclaration_1.eContents().get(0);
		private final EnumLiteralDeclaration cPortEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
		private final Keyword cPortPortKeyword_2_0 = (Keyword)cPortEnumLiteralDeclaration_2.eContents().get(0);
		private final EnumLiteralDeclaration cSignalEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
		private final Keyword cSignalSignalKeyword_3_0 = (Keyword)cSignalEnumLiteralDeclaration_3.eContents().get(0);
		private final EnumLiteralDeclaration cMachineEnumLiteralDeclaration_4 = (EnumLiteralDeclaration)cAlternatives.eContents().get(4);
		private final Keyword cMachineMachineKeyword_4_0 = (Keyword)cMachineEnumLiteralDeclaration_4.eContents().get(0);
		private final EnumLiteralDeclaration cVertexEnumLiteralDeclaration_5 = (EnumLiteralDeclaration)cAlternatives.eContents().get(5);
		private final Keyword cVertexVertexKeyword_5_0 = (Keyword)cVertexEnumLiteralDeclaration_5.eContents().get(0);
		
		//enum PrimitiveInstanceKind returns fmlType::PrimitiveInstanceKind
		//    : buffer='buffer'
		//    | message='message'
		//    | port='port'
		//    | signal='signal'
		//    | machine='machine'
		//    | vertex='vertex'
		//    ;
		public EnumRule getRule() { return rule; }
		
		//buffer='buffer'
		//   | message='message'
		//   | port='port'
		//   | signal='signal'
		//   | machine='machine'
		//   | vertex='vertex'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//buffer='buffer'
		public EnumLiteralDeclaration getBufferEnumLiteralDeclaration_0() { return cBufferEnumLiteralDeclaration_0; }
		
		//'buffer'
		public Keyword getBufferBufferKeyword_0_0() { return cBufferBufferKeyword_0_0; }
		
		//message='message'
		public EnumLiteralDeclaration getMessageEnumLiteralDeclaration_1() { return cMessageEnumLiteralDeclaration_1; }
		
		//'message'
		public Keyword getMessageMessageKeyword_1_0() { return cMessageMessageKeyword_1_0; }
		
		//port='port'
		public EnumLiteralDeclaration getPortEnumLiteralDeclaration_2() { return cPortEnumLiteralDeclaration_2; }
		
		//'port'
		public Keyword getPortPortKeyword_2_0() { return cPortPortKeyword_2_0; }
		
		//signal='signal'
		public EnumLiteralDeclaration getSignalEnumLiteralDeclaration_3() { return cSignalEnumLiteralDeclaration_3; }
		
		//'signal'
		public Keyword getSignalSignalKeyword_3_0() { return cSignalSignalKeyword_3_0; }
		
		//machine='machine'
		public EnumLiteralDeclaration getMachineEnumLiteralDeclaration_4() { return cMachineEnumLiteralDeclaration_4; }
		
		//'machine'
		public Keyword getMachineMachineKeyword_4_0() { return cMachineMachineKeyword_4_0; }
		
		//vertex='vertex'
		public EnumLiteralDeclaration getVertexEnumLiteralDeclaration_5() { return cVertexEnumLiteralDeclaration_5; }
		
		//'vertex'
		public Keyword getVertexVertexKeyword_5_0() { return cVertexVertexKeyword_5_0; }
	}
	public class CollectionKindElements extends AbstractElementFinder.AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.CollectionKind");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cVectorEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cVectorVectorKeyword_0_0 = (Keyword)cVectorEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cRvectorEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cRvectorRvectorKeyword_1_0 = (Keyword)cRvectorEnumLiteralDeclaration_1.eContents().get(0);
		private final EnumLiteralDeclaration cListEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
		private final Keyword cListListKeyword_2_0 = (Keyword)cListEnumLiteralDeclaration_2.eContents().get(0);
		private final EnumLiteralDeclaration cSetEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
		private final Keyword cSetSetKeyword_3_0 = (Keyword)cSetEnumLiteralDeclaration_3.eContents().get(0);
		private final EnumLiteralDeclaration cBagEnumLiteralDeclaration_4 = (EnumLiteralDeclaration)cAlternatives.eContents().get(4);
		private final Keyword cBagBagKeyword_4_0 = (Keyword)cBagEnumLiteralDeclaration_4.eContents().get(0);
		private final EnumLiteralDeclaration cFifoEnumLiteralDeclaration_5 = (EnumLiteralDeclaration)cAlternatives.eContents().get(5);
		private final Keyword cFifoFifoKeyword_5_0 = (Keyword)cFifoEnumLiteralDeclaration_5.eContents().get(0);
		private final EnumLiteralDeclaration cLifoEnumLiteralDeclaration_6 = (EnumLiteralDeclaration)cAlternatives.eContents().get(6);
		private final Keyword cLifoLifoKeyword_6_0 = (Keyword)cLifoEnumLiteralDeclaration_6.eContents().get(0);
		
		//enum CollectionKind returns fmlType::CollectionKind
		//    : vector = 'vector'
		//    | rvector = 'rvector'
		//    | list='list'
		//    | set = 'set'
		//    | bag = 'bag'
		//    | fifo = 'fifo'
		//    | lifo = 'lifo'
		//    ;
		public EnumRule getRule() { return rule; }
		
		//vector = 'vector'
		//   | rvector = 'rvector'
		//   | list='list'
		//   | set = 'set'
		//   | bag = 'bag'
		//   | fifo = 'fifo'
		//   | lifo = 'lifo'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//vector = 'vector'
		public EnumLiteralDeclaration getVectorEnumLiteralDeclaration_0() { return cVectorEnumLiteralDeclaration_0; }
		
		//'vector'
		public Keyword getVectorVectorKeyword_0_0() { return cVectorVectorKeyword_0_0; }
		
		//rvector = 'rvector'
		public EnumLiteralDeclaration getRvectorEnumLiteralDeclaration_1() { return cRvectorEnumLiteralDeclaration_1; }
		
		//'rvector'
		public Keyword getRvectorRvectorKeyword_1_0() { return cRvectorRvectorKeyword_1_0; }
		
		//list='list'
		public EnumLiteralDeclaration getListEnumLiteralDeclaration_2() { return cListEnumLiteralDeclaration_2; }
		
		//'list'
		public Keyword getListListKeyword_2_0() { return cListListKeyword_2_0; }
		
		//set = 'set'
		public EnumLiteralDeclaration getSetEnumLiteralDeclaration_3() { return cSetEnumLiteralDeclaration_3; }
		
		//'set'
		public Keyword getSetSetKeyword_3_0() { return cSetSetKeyword_3_0; }
		
		//bag = 'bag'
		public EnumLiteralDeclaration getBagEnumLiteralDeclaration_4() { return cBagEnumLiteralDeclaration_4; }
		
		//'bag'
		public Keyword getBagBagKeyword_4_0() { return cBagBagKeyword_4_0; }
		
		//fifo = 'fifo'
		public EnumLiteralDeclaration getFifoEnumLiteralDeclaration_5() { return cFifoEnumLiteralDeclaration_5; }
		
		//'fifo'
		public Keyword getFifoFifoKeyword_5_0() { return cFifoFifoKeyword_5_0; }
		
		//lifo = 'lifo'
		public EnumLiteralDeclaration getLifoEnumLiteralDeclaration_6() { return cLifoEnumLiteralDeclaration_6; }
		
		//'lifo'
		public Keyword getLifoLifoKeyword_6_0() { return cLifoLifoKeyword_6_0; }
	}
	public class ParameterDirectionKindElements extends AbstractElementFinder.AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ParameterDirectionKind");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cInEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cInInKeyword_0_0 = (Keyword)cInEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cInEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cInInputKeyword_1_0 = (Keyword)cInEnumLiteralDeclaration_1.eContents().get(0);
		private final EnumLiteralDeclaration cInoutEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
		private final Keyword cInoutInoutKeyword_2_0 = (Keyword)cInoutEnumLiteralDeclaration_2.eContents().get(0);
		private final EnumLiteralDeclaration cOutEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
		private final Keyword cOutOutKeyword_3_0 = (Keyword)cOutEnumLiteralDeclaration_3.eContents().get(0);
		private final EnumLiteralDeclaration cOutEnumLiteralDeclaration_4 = (EnumLiteralDeclaration)cAlternatives.eContents().get(4);
		private final Keyword cOutOutputKeyword_4_0 = (Keyword)cOutEnumLiteralDeclaration_4.eContents().get(0);
		private final EnumLiteralDeclaration cReturnEnumLiteralDeclaration_5 = (EnumLiteralDeclaration)cAlternatives.eContents().get(5);
		private final Keyword cReturnReturnKeyword_5_0 = (Keyword)cReturnEnumLiteralDeclaration_5.eContents().get(0);
		
		//////////////////////////////////////////////////////////////////////////////////
		//// Functional ParameterSet Rules
		//////////////////////////////////////////////////////////////////////////////////
		//enum ParameterDirectionKind returns fmlInfra::ParameterDirectionKind
		//    : in     = 'in'
		//    | in     = 'input'
		//    | inout  = 'inout'
		//    | out    = 'out'
		//    | out    = 'output'
		//    | return = 'return'
		//    ;
		public EnumRule getRule() { return rule; }
		
		//in     = 'in'
		//   | in     = 'input'
		//   | inout  = 'inout'
		//   | out    = 'out'
		//   | out    = 'output'
		//   | return = 'return'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//in     = 'in'
		public EnumLiteralDeclaration getInEnumLiteralDeclaration_0() { return cInEnumLiteralDeclaration_0; }
		
		//'in'
		public Keyword getInInKeyword_0_0() { return cInInKeyword_0_0; }
		
		//in     = 'input'
		public EnumLiteralDeclaration getInEnumLiteralDeclaration_1() { return cInEnumLiteralDeclaration_1; }
		
		//'input'
		public Keyword getInInputKeyword_1_0() { return cInInputKeyword_1_0; }
		
		//inout  = 'inout'
		public EnumLiteralDeclaration getInoutEnumLiteralDeclaration_2() { return cInoutEnumLiteralDeclaration_2; }
		
		//'inout'
		public Keyword getInoutInoutKeyword_2_0() { return cInoutInoutKeyword_2_0; }
		
		//out    = 'out'
		public EnumLiteralDeclaration getOutEnumLiteralDeclaration_3() { return cOutEnumLiteralDeclaration_3; }
		
		//'out'
		public Keyword getOutOutKeyword_3_0() { return cOutOutKeyword_3_0; }
		
		//out    = 'output'
		public EnumLiteralDeclaration getOutEnumLiteralDeclaration_4() { return cOutEnumLiteralDeclaration_4; }
		
		//'output'
		public Keyword getOutOutputKeyword_4_0() { return cOutOutputKeyword_4_0; }
		
		//return = 'return'
		public EnumLiteralDeclaration getReturnEnumLiteralDeclaration_5() { return cReturnEnumLiteralDeclaration_5; }
		
		//'return'
		public Keyword getReturnReturnKeyword_5_0() { return cReturnReturnKeyword_5_0; }
	}
	public class BufferContainerKindElements extends AbstractElementFinder.AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.BufferContainerKind");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cSetEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cSetSetKeyword_0_0 = (Keyword)cSetEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cBagEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cBagBagKeyword_1_0 = (Keyword)cBagEnumLiteralDeclaration_1.eContents().get(0);
		private final EnumLiteralDeclaration cFifoEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
		private final Keyword cFifoFifoKeyword_2_0 = (Keyword)cFifoEnumLiteralDeclaration_2.eContents().get(0);
		private final EnumLiteralDeclaration cLifoEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
		private final Keyword cLifoLifoKeyword_3_0 = (Keyword)cLifoEnumLiteralDeclaration_3.eContents().get(0);
		
		//enum BufferContainerKind returns fmlType::CollectionKind
		//    : set  = 'set'
		//    | bag  = 'bag'
		//    | fifo = 'fifo'
		//    | lifo = 'lifo'
		//    ;
		public EnumRule getRule() { return rule; }
		
		//set  = 'set'
		//   | bag  = 'bag'
		//   | fifo = 'fifo'
		//   | lifo = 'lifo'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//set  = 'set'
		public EnumLiteralDeclaration getSetEnumLiteralDeclaration_0() { return cSetEnumLiteralDeclaration_0; }
		
		//'set'
		public Keyword getSetSetKeyword_0_0() { return cSetSetKeyword_0_0; }
		
		//bag  = 'bag'
		public EnumLiteralDeclaration getBagEnumLiteralDeclaration_1() { return cBagEnumLiteralDeclaration_1; }
		
		//'bag'
		public Keyword getBagBagKeyword_1_0() { return cBagBagKeyword_1_0; }
		
		//fifo = 'fifo'
		public EnumLiteralDeclaration getFifoEnumLiteralDeclaration_2() { return cFifoEnumLiteralDeclaration_2; }
		
		//'fifo'
		public Keyword getFifoFifoKeyword_2_0() { return cFifoFifoKeyword_2_0; }
		
		//lifo = 'lifo'
		public EnumLiteralDeclaration getLifoEnumLiteralDeclaration_3() { return cLifoEnumLiteralDeclaration_3; }
		
		//'lifo'
		public Keyword getLifoLifoKeyword_3_0() { return cLifoLifoKeyword_3_0; }
	}
	public class ChannelDirectionElements extends AbstractElementFinder.AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ChannelDirection");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cInputEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cInputInputKeyword_0_0 = (Keyword)cInputEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cInoutEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cInoutInoutKeyword_1_0 = (Keyword)cInoutEnumLiteralDeclaration_1.eContents().get(0);
		private final EnumLiteralDeclaration cOutputEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
		private final Keyword cOutputOutputKeyword_2_0 = (Keyword)cOutputEnumLiteralDeclaration_2.eContents().get(0);
		
		//////////////////////////////////////////////////////////////////////////////////
		//// Channel rules
		//////////////////////////////////////////////////////////////////////////////////
		//enum ChannelDirection returns fmlInfra::ChannelDirection
		//    : input  = 'input'
		//    | inout  = 'inout'
		//    | output = 'output'
		//    ;
		public EnumRule getRule() { return rule; }
		
		//input  = 'input'
		//   | inout  = 'inout'
		//   | output = 'output'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//input  = 'input'
		public EnumLiteralDeclaration getInputEnumLiteralDeclaration_0() { return cInputEnumLiteralDeclaration_0; }
		
		//'input'
		public Keyword getInputInputKeyword_0_0() { return cInputInputKeyword_0_0; }
		
		//inout  = 'inout'
		public EnumLiteralDeclaration getInoutEnumLiteralDeclaration_1() { return cInoutEnumLiteralDeclaration_1; }
		
		//'inout'
		public Keyword getInoutInoutKeyword_1_0() { return cInoutInoutKeyword_1_0; }
		
		//output = 'output'
		public EnumLiteralDeclaration getOutputEnumLiteralDeclaration_2() { return cOutputEnumLiteralDeclaration_2; }
		
		//'output'
		public Keyword getOutputOutputKeyword_2_0() { return cOutputOutputKeyword_2_0; }
	}
	public class TransitionMocElements extends AbstractElementFinder.AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.TransitionMoc");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cSimpleEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cSimpleSimpleKeyword_0_0 = (Keyword)cSimpleEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cAbortEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cAbortAbortKeyword_1_0 = (Keyword)cAbortEnumLiteralDeclaration_1.eContents().get(0);
		private final EnumLiteralDeclaration cFinalEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
		private final Keyword cFinalFinalKeyword_2_0 = (Keyword)cFinalEnumLiteralDeclaration_2.eContents().get(0);
		
		//enum TransitionMoc returns fmlStmchn::TransitionMoc
		//    : simple = 'simple'
		//    | abort  = 'abort'
		//    | final  = 'final'
		//    ;
		public EnumRule getRule() { return rule; }
		
		//simple = 'simple'
		//   | abort  = 'abort'
		//   | final  = 'final'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//simple = 'simple'
		public EnumLiteralDeclaration getSimpleEnumLiteralDeclaration_0() { return cSimpleEnumLiteralDeclaration_0; }
		
		//'simple'
		public Keyword getSimpleSimpleKeyword_0_0() { return cSimpleSimpleKeyword_0_0; }
		
		//abort  = 'abort'
		public EnumLiteralDeclaration getAbortEnumLiteralDeclaration_1() { return cAbortEnumLiteralDeclaration_1; }
		
		//'abort'
		public Keyword getAbortAbortKeyword_1_0() { return cAbortAbortKeyword_1_0; }
		
		//final  = 'final'
		public EnumLiteralDeclaration getFinalEnumLiteralDeclaration_2() { return cFinalEnumLiteralDeclaration_2; }
		
		//'final'
		public Keyword getFinalFinalKeyword_2_0() { return cFinalFinalKeyword_2_0; }
	}
	public class InterruptStatementKindElements extends AbstractElementFinder.AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.InterruptStatementKind");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cBreakEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cBreakBreakKeyword_0_0 = (Keyword)cBreakEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cContinueEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cContinueContinueKeyword_1_0 = (Keyword)cContinueEnumLiteralDeclaration_1.eContents().get(0);
		private final EnumLiteralDeclaration cReturnEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
		private final Keyword cReturnReturnKeyword_2_0 = (Keyword)cReturnEnumLiteralDeclaration_2.eContents().get(0);
		private final EnumLiteralDeclaration cExitEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
		private final Keyword cExitExitKeyword_3_0 = (Keyword)cExitEnumLiteralDeclaration_3.eContents().get(0);
		
		//enum InterruptStatementKind returns fmlStmnt::InterruptStatementKind
		//    : break    = 'break'
		//    | continue = 'continue'
		//    | return   = 'return'
		//    | exit     = 'exit'
		//    ;
		public EnumRule getRule() { return rule; }
		
		//break    = 'break'
		//   | continue = 'continue'
		//   | return   = 'return'
		//   | exit     = 'exit'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//break    = 'break'
		public EnumLiteralDeclaration getBreakEnumLiteralDeclaration_0() { return cBreakEnumLiteralDeclaration_0; }
		
		//'break'
		public Keyword getBreakBreakKeyword_0_0() { return cBreakBreakKeyword_0_0; }
		
		//continue = 'continue'
		public EnumLiteralDeclaration getContinueEnumLiteralDeclaration_1() { return cContinueEnumLiteralDeclaration_1; }
		
		//'continue'
		public Keyword getContinueContinueKeyword_1_0() { return cContinueContinueKeyword_1_0; }
		
		//return   = 'return'
		public EnumLiteralDeclaration getReturnEnumLiteralDeclaration_2() { return cReturnEnumLiteralDeclaration_2; }
		
		//'return'
		public Keyword getReturnReturnKeyword_2_0() { return cReturnReturnKeyword_2_0; }
		
		//exit     = 'exit'
		public EnumLiteralDeclaration getExitEnumLiteralDeclaration_3() { return cExitEnumLiteralDeclaration_3; }
		
		//'exit'
		public Keyword getExitExitKeyword_3_0() { return cExitExitKeyword_3_0; }
	}
	public class OPERATOR_ACTIVITYElements extends AbstractElementFinder.AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.OPERATOR_ACTIVITY");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cInitEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cInitInitKeyword_0_0 = (Keyword)cInitEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cFinalEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cFinalFinalKeyword_1_0 = (Keyword)cFinalEnumLiteralDeclaration_1.eContents().get(0);
		private final EnumLiteralDeclaration cNewEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
		private final Keyword cNewNewKeyword_2_0 = (Keyword)cNewEnumLiteralDeclaration_2.eContents().get(0);
		private final EnumLiteralDeclaration cDestroyEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
		private final Keyword cDestroyDestroyKeyword_3_0 = (Keyword)cDestroyEnumLiteralDeclaration_3.eContents().get(0);
		private final EnumLiteralDeclaration cStartEnumLiteralDeclaration_4 = (EnumLiteralDeclaration)cAlternatives.eContents().get(4);
		private final Keyword cStartStartKeyword_4_0 = (Keyword)cStartEnumLiteralDeclaration_4.eContents().get(0);
		private final EnumLiteralDeclaration cStopEnumLiteralDeclaration_5 = (EnumLiteralDeclaration)cAlternatives.eContents().get(5);
		private final Keyword cStopStopKeyword_5_0 = (Keyword)cStopEnumLiteralDeclaration_5.eContents().get(0);
		private final EnumLiteralDeclaration cRestartEnumLiteralDeclaration_6 = (EnumLiteralDeclaration)cAlternatives.eContents().get(6);
		private final Keyword cRestartRestartKeyword_6_0 = (Keyword)cRestartEnumLiteralDeclaration_6.eContents().get(0);
		private final EnumLiteralDeclaration cSuspendEnumLiteralDeclaration_7 = (EnumLiteralDeclaration)cAlternatives.eContents().get(7);
		private final Keyword cSuspendSuspendKeyword_7_0 = (Keyword)cSuspendEnumLiteralDeclaration_7.eContents().get(0);
		private final EnumLiteralDeclaration cResumeEnumLiteralDeclaration_8 = (EnumLiteralDeclaration)cAlternatives.eContents().get(8);
		private final Keyword cResumeResumeKeyword_8_0 = (Keyword)cResumeEnumLiteralDeclaration_8.eContents().get(0);
		private final EnumLiteralDeclaration cWaitEnumLiteralDeclaration_9 = (EnumLiteralDeclaration)cAlternatives.eContents().get(9);
		private final Keyword cWaitWaitKeyword_9_0 = (Keyword)cWaitEnumLiteralDeclaration_9.eContents().get(0);
		private final EnumLiteralDeclaration cDisableEnumLiteralDeclaration_10 = (EnumLiteralDeclaration)cAlternatives.eContents().get(10);
		private final Keyword cDisableDisableKeyword_10_0 = (Keyword)cDisableEnumLiteralDeclaration_10.eContents().get(0);
		private final EnumLiteralDeclaration cEnableEnumLiteralDeclaration_11 = (EnumLiteralDeclaration)cAlternatives.eContents().get(11);
		private final Keyword cEnableEnableKeyword_11_0 = (Keyword)cEnableEnumLiteralDeclaration_11.eContents().get(0);
		private final EnumLiteralDeclaration cAbortEnumLiteralDeclaration_12 = (EnumLiteralDeclaration)cAlternatives.eContents().get(12);
		private final Keyword cAbortAbortKeyword_12_0 = (Keyword)cAbortEnumLiteralDeclaration_12.eContents().get(0);
		private final EnumLiteralDeclaration cGotoEnumLiteralDeclaration_13 = (EnumLiteralDeclaration)cAlternatives.eContents().get(13);
		private final Keyword cGotoGotoKeyword_13_0 = (Keyword)cGotoEnumLiteralDeclaration_13.eContents().get(0);
		private final EnumLiteralDeclaration cScheduleEnumLiteralDeclaration_14 = (EnumLiteralDeclaration)cAlternatives.eContents().get(14);
		private final Keyword cScheduleScheduleKeyword_14_0 = (Keyword)cScheduleEnumLiteralDeclaration_14.eContents().get(0);
		private final EnumLiteralDeclaration cIrunEnumLiteralDeclaration_15 = (EnumLiteralDeclaration)cAlternatives.eContents().get(15);
		private final Keyword cIrunIrunKeyword_15_0 = (Keyword)cIrunEnumLiteralDeclaration_15.eContents().get(0);
		private final EnumLiteralDeclaration cRunEnumLiteralDeclaration_16 = (EnumLiteralDeclaration)cAlternatives.eContents().get(16);
		private final Keyword cRunRunKeyword_16_0 = (Keyword)cRunEnumLiteralDeclaration_16.eContents().get(0);
		private final EnumLiteralDeclaration cRtcEnumLiteralDeclaration_17 = (EnumLiteralDeclaration)cAlternatives.eContents().get(17);
		private final Keyword cRtcRtcKeyword_17_0 = (Keyword)cRtcEnumLiteralDeclaration_17.eContents().get(0);
		
		//enum OPERATOR_ACTIVITY returns fmlStmnt::ActivityStatementKind
		//    : init     = 'init'
		//    | final    = 'final'
		//    | new      = 'new'
		//    | destroy  = 'destroy'
		//    | start    = 'start'
		//    | stop     = 'stop'
		//    | restart  = 'restart'
		//    | suspend  = 'suspend'
		//    | resume   = 'resume'
		//    | wait     = 'wait'
		//    | disable  = 'disable'
		//    | enable   = 'enable'
		//    | abort    = 'abort'
		//    | goto     = 'goto'
		//    | schedule = 'schedule'
		//    | irun = 'irun'
		//    | run  = 'run'
		//    | rtc  = 'rtc'
		//    ;
		public EnumRule getRule() { return rule; }
		
		//init     = 'init'
		//   | final    = 'final'
		//   | new      = 'new'
		//   | destroy  = 'destroy'
		//   | start    = 'start'
		//   | stop     = 'stop'
		//   | restart  = 'restart'
		//   | suspend  = 'suspend'
		//   | resume   = 'resume'
		//   | wait     = 'wait'
		//   | disable  = 'disable'
		//   | enable   = 'enable'
		//   | abort    = 'abort'
		//   | goto     = 'goto'
		//   | schedule = 'schedule'
		//   | irun = 'irun'
		//   | run  = 'run'
		//   | rtc  = 'rtc'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//init     = 'init'
		public EnumLiteralDeclaration getInitEnumLiteralDeclaration_0() { return cInitEnumLiteralDeclaration_0; }
		
		//'init'
		public Keyword getInitInitKeyword_0_0() { return cInitInitKeyword_0_0; }
		
		//final    = 'final'
		public EnumLiteralDeclaration getFinalEnumLiteralDeclaration_1() { return cFinalEnumLiteralDeclaration_1; }
		
		//'final'
		public Keyword getFinalFinalKeyword_1_0() { return cFinalFinalKeyword_1_0; }
		
		//new      = 'new'
		public EnumLiteralDeclaration getNewEnumLiteralDeclaration_2() { return cNewEnumLiteralDeclaration_2; }
		
		//'new'
		public Keyword getNewNewKeyword_2_0() { return cNewNewKeyword_2_0; }
		
		//destroy  = 'destroy'
		public EnumLiteralDeclaration getDestroyEnumLiteralDeclaration_3() { return cDestroyEnumLiteralDeclaration_3; }
		
		//'destroy'
		public Keyword getDestroyDestroyKeyword_3_0() { return cDestroyDestroyKeyword_3_0; }
		
		//start    = 'start'
		public EnumLiteralDeclaration getStartEnumLiteralDeclaration_4() { return cStartEnumLiteralDeclaration_4; }
		
		//'start'
		public Keyword getStartStartKeyword_4_0() { return cStartStartKeyword_4_0; }
		
		//stop     = 'stop'
		public EnumLiteralDeclaration getStopEnumLiteralDeclaration_5() { return cStopEnumLiteralDeclaration_5; }
		
		//'stop'
		public Keyword getStopStopKeyword_5_0() { return cStopStopKeyword_5_0; }
		
		//restart  = 'restart'
		public EnumLiteralDeclaration getRestartEnumLiteralDeclaration_6() { return cRestartEnumLiteralDeclaration_6; }
		
		//'restart'
		public Keyword getRestartRestartKeyword_6_0() { return cRestartRestartKeyword_6_0; }
		
		//suspend  = 'suspend'
		public EnumLiteralDeclaration getSuspendEnumLiteralDeclaration_7() { return cSuspendEnumLiteralDeclaration_7; }
		
		//'suspend'
		public Keyword getSuspendSuspendKeyword_7_0() { return cSuspendSuspendKeyword_7_0; }
		
		//resume   = 'resume'
		public EnumLiteralDeclaration getResumeEnumLiteralDeclaration_8() { return cResumeEnumLiteralDeclaration_8; }
		
		//'resume'
		public Keyword getResumeResumeKeyword_8_0() { return cResumeResumeKeyword_8_0; }
		
		//wait     = 'wait'
		public EnumLiteralDeclaration getWaitEnumLiteralDeclaration_9() { return cWaitEnumLiteralDeclaration_9; }
		
		//'wait'
		public Keyword getWaitWaitKeyword_9_0() { return cWaitWaitKeyword_9_0; }
		
		//disable  = 'disable'
		public EnumLiteralDeclaration getDisableEnumLiteralDeclaration_10() { return cDisableEnumLiteralDeclaration_10; }
		
		//'disable'
		public Keyword getDisableDisableKeyword_10_0() { return cDisableDisableKeyword_10_0; }
		
		//enable   = 'enable'
		public EnumLiteralDeclaration getEnableEnumLiteralDeclaration_11() { return cEnableEnumLiteralDeclaration_11; }
		
		//'enable'
		public Keyword getEnableEnableKeyword_11_0() { return cEnableEnableKeyword_11_0; }
		
		//abort    = 'abort'
		public EnumLiteralDeclaration getAbortEnumLiteralDeclaration_12() { return cAbortEnumLiteralDeclaration_12; }
		
		//'abort'
		public Keyword getAbortAbortKeyword_12_0() { return cAbortAbortKeyword_12_0; }
		
		//goto     = 'goto'
		public EnumLiteralDeclaration getGotoEnumLiteralDeclaration_13() { return cGotoEnumLiteralDeclaration_13; }
		
		//'goto'
		public Keyword getGotoGotoKeyword_13_0() { return cGotoGotoKeyword_13_0; }
		
		//schedule = 'schedule'
		public EnumLiteralDeclaration getScheduleEnumLiteralDeclaration_14() { return cScheduleEnumLiteralDeclaration_14; }
		
		//'schedule'
		public Keyword getScheduleScheduleKeyword_14_0() { return cScheduleScheduleKeyword_14_0; }
		
		//irun = 'irun'
		public EnumLiteralDeclaration getIrunEnumLiteralDeclaration_15() { return cIrunEnumLiteralDeclaration_15; }
		
		//'irun'
		public Keyword getIrunIrunKeyword_15_0() { return cIrunIrunKeyword_15_0; }
		
		//run  = 'run'
		public EnumLiteralDeclaration getRunEnumLiteralDeclaration_16() { return cRunEnumLiteralDeclaration_16; }
		
		//'run'
		public Keyword getRunRunKeyword_16_0() { return cRunRunKeyword_16_0; }
		
		//rtc  = 'rtc'
		public EnumLiteralDeclaration getRtcEnumLiteralDeclaration_17() { return cRtcEnumLiteralDeclaration_17; }
		
		//'rtc'
		public Keyword getRtcRtcKeyword_17_0() { return cRtcRtcKeyword_17_0; }
	}
	public class OPERATOR_METAElements extends AbstractElementFinder.AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.OPERATOR_META");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cInformalEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cInformalInformalKeyword_0_0 = (Keyword)cInformalEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cTraceEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cTraceTraceKeyword_1_0 = (Keyword)cTraceEnumLiteralDeclaration_1.eContents().get(0);
		private final EnumLiteralDeclaration cDebugEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
		private final Keyword cDebugDebugKeyword_2_0 = (Keyword)cDebugEnumLiteralDeclaration_2.eContents().get(0);
		private final EnumLiteralDeclaration cCommentEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
		private final Keyword cCommentCommentKeyword_3_0 = (Keyword)cCommentEnumLiteralDeclaration_3.eContents().get(0);
		private final EnumLiteralDeclaration cQuoteEnumLiteralDeclaration_4 = (EnumLiteralDeclaration)cAlternatives.eContents().get(4);
		private final Keyword cQuoteQuoteKeyword_4_0 = (Keyword)cQuoteEnumLiteralDeclaration_4.eContents().get(0);
		private final EnumLiteralDeclaration cEvalEnumLiteralDeclaration_5 = (EnumLiteralDeclaration)cAlternatives.eContents().get(5);
		private final Keyword cEvalEvalKeyword_5_0 = (Keyword)cEvalEnumLiteralDeclaration_5.eContents().get(0);
		private final EnumLiteralDeclaration cRunEnumLiteralDeclaration_6 = (EnumLiteralDeclaration)cAlternatives.eContents().get(6);
		private final Keyword cRunRunKeyword_6_0 = (Keyword)cRunEnumLiteralDeclaration_6.eContents().get(0);
		
		//enum OPERATOR_META returns fmlStmnt::MetaStatementKind
		//    : informal = '@informal'
		//    | trace    = '@trace'
		//    | debug    = '@debug'
		//    | comment  = '@comment'
		//    | quote    = '@quote'
		//    | eval     = '@eval'
		//    | run      = '@run'
		//    ;
		public EnumRule getRule() { return rule; }
		
		//informal = '@informal'
		//   | trace    = '@trace'
		//   | debug    = '@debug'
		//   | comment  = '@comment'
		//   | quote    = '@quote'
		//   | eval     = '@eval'
		//   | run      = '@run'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//informal = '@informal'
		public EnumLiteralDeclaration getInformalEnumLiteralDeclaration_0() { return cInformalEnumLiteralDeclaration_0; }
		
		//'@informal'
		public Keyword getInformalInformalKeyword_0_0() { return cInformalInformalKeyword_0_0; }
		
		//trace    = '@trace'
		public EnumLiteralDeclaration getTraceEnumLiteralDeclaration_1() { return cTraceEnumLiteralDeclaration_1; }
		
		//'@trace'
		public Keyword getTraceTraceKeyword_1_0() { return cTraceTraceKeyword_1_0; }
		
		//debug    = '@debug'
		public EnumLiteralDeclaration getDebugEnumLiteralDeclaration_2() { return cDebugEnumLiteralDeclaration_2; }
		
		//'@debug'
		public Keyword getDebugDebugKeyword_2_0() { return cDebugDebugKeyword_2_0; }
		
		//comment  = '@comment'
		public EnumLiteralDeclaration getCommentEnumLiteralDeclaration_3() { return cCommentEnumLiteralDeclaration_3; }
		
		//'@comment'
		public Keyword getCommentCommentKeyword_3_0() { return cCommentCommentKeyword_3_0; }
		
		//quote    = '@quote'
		public EnumLiteralDeclaration getQuoteEnumLiteralDeclaration_4() { return cQuoteEnumLiteralDeclaration_4; }
		
		//'@quote'
		public Keyword getQuoteQuoteKeyword_4_0() { return cQuoteQuoteKeyword_4_0; }
		
		//eval     = '@eval'
		public EnumLiteralDeclaration getEvalEnumLiteralDeclaration_5() { return cEvalEnumLiteralDeclaration_5; }
		
		//'@eval'
		public Keyword getEvalEvalKeyword_5_0() { return cEvalEvalKeyword_5_0; }
		
		//run      = '@run'
		public EnumLiteralDeclaration getRunEnumLiteralDeclaration_6() { return cRunEnumLiteralDeclaration_6; }
		
		//'@run'
		public Keyword getRunRunKeyword_6_0() { return cRunRunKeyword_6_0; }
	}
	public class AnyPrimitiveInstanceKindElements extends AbstractElementFinder.AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.AnyPrimitiveInstanceKind");
		private final EnumLiteralDeclaration cAnyEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
		private final Keyword cAnyNullKeyword_0 = (Keyword)cAnyEnumLiteralDeclaration.eContents().get(0);
		
		//enum AnyPrimitiveInstanceKind returns fmlType::PrimitiveInstanceKind
		//    : any='$null'
		//    ;
		public EnumRule getRule() { return rule; }
		
		//any='$null'
		public EnumLiteralDeclaration getAnyEnumLiteralDeclaration() { return cAnyEnumLiteralDeclaration; }
		
		//'$null'
		public Keyword getAnyNullKeyword_0() { return cAnyNullKeyword_0; }
	}
	public class ValueDotFieldExpressionKindElements extends AbstractElementFinder.AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ValueDotFieldExpressionKind");
		private final EnumLiteralDeclaration cFieldEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
		private final Keyword cFieldFullStopKeyword_0 = (Keyword)cFieldEnumLiteralDeclaration.eContents().get(0);
		
		////ValueAnyElementExpression returns fmlExpr::ValueElementSpecification
		////    : element=[fmlCommon::NamedElement|ESIdentifier]
		////
		////        // '.' element
		////        ( { fmlExpr::ValueElementSpecification.parent=current }
		////            kind=ValueDotFieldExpressionKind
		////            element=[fmlCommon::NamedElement|ESIdentifier]
		////
		////        // '[' index ',' ... ',' index ']'
		////        | { fmlExpr::ValueElementSpecification.parent=current }
		////            kind=ValueIndexExpressionKind
		////            arg=PositionalTupleExpressionList
		////            ']'
		////
		////        // '(' parameter ',' ... ',' parameter ')'
		////        | { fmlExpr::ValueElementSpecification.parent=current }
		////            kind=ValueParameterExpressionKind
		////            arg=MixTupleExpressionList
		////            ')'
		////        )*
		////
		////        // '->' element
		////        ( { fmlExpr::ValueElementSpecification.parent=current }
		////            kind=ValueArrowFieldExpressionKind
		////            element=[fmlCommon::NamedElement|ESIdentifier]
		////
		////            // '.' element
		////            ( { fmlExpr::ValueElementSpecification.parent=current }
		////                kind=ValueDotFieldExpressionKind
		////                element=[fmlCommon::NamedElement|ESIdentifier]
		////
		////            // '[' index ',' ... ',' index ']'
		////            | { fmlExpr::ValueElementSpecification.parent=current }
		////                kind=ValueIndexExpressionKind
		////                arg=PositionalTupleExpressionList
		////                ']'
		////
		////            // '(' parameter ',' ... ',' parameter ')'
		////            | { fmlExpr::ValueElementSpecification.parent=current }
		////                kind=ValueParameterExpressionKind
		////                arg=MixTupleExpressionList
		////                ')'
		////            )*
		////        )?
		////    ;
		//enum ValueDotFieldExpressionKind returns fmlExpr::ValueElementSpecificationKind
		//    : field='.'
		//    ;
		public EnumRule getRule() { return rule; }
		
		//field='.'
		public EnumLiteralDeclaration getFieldEnumLiteralDeclaration() { return cFieldEnumLiteralDeclaration; }
		
		//'.'
		public Keyword getFieldFullStopKeyword_0() { return cFieldFullStopKeyword_0; }
	}
	public class ValueColonFieldExpressionKindElements extends AbstractElementFinder.AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ValueColonFieldExpressionKind");
		private final EnumLiteralDeclaration cFieldEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
		private final Keyword cFieldColonKeyword_0 = (Keyword)cFieldEnumLiteralDeclaration.eContents().get(0);
		
		//enum ValueColonFieldExpressionKind returns fmlExpr::ValueElementSpecificationKind
		//    : field=':'
		//    ;
		public EnumRule getRule() { return rule; }
		
		//field=':'
		public EnumLiteralDeclaration getFieldEnumLiteralDeclaration() { return cFieldEnumLiteralDeclaration; }
		
		//':'
		public Keyword getFieldColonKeyword_0() { return cFieldColonKeyword_0; }
	}
	public class ValueDoubleColonFieldExpressionKindElements extends AbstractElementFinder.AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ValueDoubleColonFieldExpressionKind");
		private final EnumLiteralDeclaration cFieldEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
		private final Keyword cFieldColonColonKeyword_0 = (Keyword)cFieldEnumLiteralDeclaration.eContents().get(0);
		
		//enum ValueDoubleColonFieldExpressionKind returns fmlExpr::ValueElementSpecificationKind
		//    : field='::'
		//    ;
		public EnumRule getRule() { return rule; }
		
		//field='::'
		public EnumLiteralDeclaration getFieldEnumLiteralDeclaration() { return cFieldEnumLiteralDeclaration; }
		
		//'::'
		public Keyword getFieldColonColonKeyword_0() { return cFieldColonColonKeyword_0; }
	}
	public class ValueArrowFieldExpressionKindElements extends AbstractElementFinder.AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ValueArrowFieldExpressionKind");
		private final EnumLiteralDeclaration cFieldEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
		private final Keyword cFieldHyphenMinusGreaterThanSignKeyword_0 = (Keyword)cFieldEnumLiteralDeclaration.eContents().get(0);
		
		//enum ValueArrowFieldExpressionKind returns fmlExpr::ValueElementSpecificationKind
		//    : field='->'
		//    ;
		public EnumRule getRule() { return rule; }
		
		//field='->'
		public EnumLiteralDeclaration getFieldEnumLiteralDeclaration() { return cFieldEnumLiteralDeclaration; }
		
		//'->'
		public Keyword getFieldHyphenMinusGreaterThanSignKeyword_0() { return cFieldHyphenMinusGreaterThanSignKeyword_0; }
	}
	public class ValueIndexExpressionKindElements extends AbstractElementFinder.AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ValueIndexExpressionKind");
		private final EnumLiteralDeclaration cIndexEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
		private final Keyword cIndexLeftSquareBracketKeyword_0 = (Keyword)cIndexEnumLiteralDeclaration.eContents().get(0);
		
		//enum ValueIndexExpressionKind returns fmlExpr::ValueElementSpecificationKind
		//    : index='['
		//    ;
		public EnumRule getRule() { return rule; }
		
		//index='['
		public EnumLiteralDeclaration getIndexEnumLiteralDeclaration() { return cIndexEnumLiteralDeclaration; }
		
		//'['
		public Keyword getIndexLeftSquareBracketKeyword_0() { return cIndexLeftSquareBracketKeyword_0; }
	}
	public class ValueParameterExpressionKindElements extends AbstractElementFinder.AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.ValueParameterExpressionKind");
		private final EnumLiteralDeclaration cParameterEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
		private final Keyword cParameterLeftParenthesisKeyword_0 = (Keyword)cParameterEnumLiteralDeclaration.eContents().get(0);
		
		//enum ValueParameterExpressionKind returns fmlExpr::ValueElementSpecificationKind
		//    : parameter='('
		//    ;
		public EnumRule getRule() { return rule; }
		
		//parameter='('
		public EnumLiteralDeclaration getParameterEnumLiteralDeclaration() { return cParameterEnumLiteralDeclaration; }
		
		//'('
		public Keyword getParameterLeftParenthesisKeyword_0() { return cParameterLeftParenthesisKeyword_0; }
	}
	
	private final XliaElements pXlia;
	private final XliaPrologObjectElements pXliaPrologObject;
	private final XliaPrologAttributeElements pXliaPrologAttribute;
	private final XliaOptionObjectElements pXliaOptionObject;
	private final XliaNamedElementElements pXliaNamedElement;
	private final XliaObjectElements pXliaObject;
	private final XliaSectionElements pXliaSection;
	private final XliaAttributeElements pXliaAttribute;
	private final EBooleanElements pEBoolean;
	private final TerminalRule tINT;
	private final EIntElements pEInt;
	private final EIntegerElements pEInteger;
	private final EFloatElements pEFloat;
	private final EDoubleElements pEDouble;
	private final TerminalRule tCHARACTER;
	private final ECharacterElements pECharacter;
	private final EStringElements pEString;
	private final TerminalRule tOFFSET;
	private final EOffsetElements pEOffset;
	private final ReservedKeyWordElements pReservedKeyWord;
	private final TerminalRule tXLIA_ID;
	private final ESIdentifierElements pESIdentifier;
	private final ESUfidElements pESUfid;
	private final UnrestrictedNameElements pUnrestrictedName;
	private final QualifiedNameElements pQualifiedName;
	private final PotentiallyAmbiguousQualifiedNameElements pPotentiallyAmbiguousQualifiedName;
	private final ColonQualifiedNameElements pColonQualifiedName;
	private final DotQualifiedNameElements pDotQualifiedName;
	private final UnqualifiedNameElements pUnqualifiedName;
	private final NameBindingElements pNameBinding;
	private final VisibilityKindElements eVisibilityKind;
	private final ModelOfComputationKingElements pModelOfComputationKing;
	private final DesignKindElements eDesignKind;
	private final DesignDebugTraceElements pDesignDebugTrace;
	private final DesignInstanceKindElements eDesignInstanceKind;
	private final XliaSystemElements pXliaSystem;
	private final AnyMachineBlockElements pAnyMachineBlock;
	private final InstanceMachineElements pInstanceMachine;
	private final SlotParameterElements pSlotParameter;
	private final SlotPropertyElements pSlotProperty;
	private final MachineBlockElements pMachineBlock;
	private final PropertyPartElements pPropertyPart;
	private final CompositePartElements pCompositePart;
	private final BehaviorPartElements pBehaviorPart;
	private final ProcedureElements pProcedure;
	private final ProcedureExecutionElements pProcedureExecution;
	private final BehaviorElements pBehavior;
	private final MoeBehaviorElements pMoeBehavior;
	private final StatemachineElements pStatemachine;
	private final StatemachineRegionElements pStatemachineRegion;
	private final StatemachineNamedRegionElements pStatemachineNamedRegion;
	private final StatemachineRegionLiteElements pStatemachineRegionLite;
	private final StateElements pState;
	private final CompositeStateElements pCompositeState;
	private final MoeCompositeStateRoutinesElements pMoeCompositeStateRoutines;
	private final SimpleStateElements pSimpleState;
	private final MoeSimpleStateRoutinesElements pMoeSimpleStateRoutines;
	private final StartStateElements pStartState;
	private final MoeStartStateRoutinesElements pMoeStartStateRoutines;
	private final FinalStateElements pFinalState;
	private final MoeFinalStateRoutinesElements pMoeFinalStateRoutines;
	private final PseudostateElements pPseudostate;
	private final OtherPseudostateElements pOtherPseudostate;
	private final MoePseudotateRoutinesElements pMoePseudotateRoutines;
	private final PseudostateKindElements ePseudostateKind;
	private final PseudostateInitialElements pPseudostateInitial;
	private final PseudostateInitialKindElements ePseudostateInitialKind;
	private final EndingPseudostateElements pEndingPseudostate;
	private final EndingPseudostateKindElements eEndingPseudostateKind;
	private final ModelOfComputationElements pModelOfComputation;
	private final ModelOfExecutionElements pModelOfExecution;
	private final MoeRoutineElements pMoeRoutine;
	private final RoutineElements pRoutine;
	private final ModelOfInteractionElements pModelOfInteraction;
	private final RouteElements pRoute;
	private final ComRouteProtocolElements pComRouteProtocol;
	private final ConnectorElements pConnector;
	private final ComProtocolElements pComProtocol;
	private final ComProtocolKindElements eComProtocolKind;
	private final ComEnvRdvProtocolKindElements eComEnvRdvProtocolKind;
	private final ComMultiRdvProtocolKindElements eComMultiRdvProtocolKind;
	private final BufferProtocolKindElements eBufferProtocolKind;
	private final ComCastKingElements eComCastKing;
	private final ConnectorEndElements pConnectorEnd;
	private final ComPointElements pComPoint;
	private final ComPointProtocolElements pComPointProtocol;
	private final ComBufferElements pComBuffer;
	private final ComBufferRefElements pComBufferRef;
	private final BufferReferenceElementElements pBufferReferenceElement;
	private final LiteralPureReferenceMachineElements pLiteralPureReferenceMachine;
	private final TypeDefinitionElements pTypeDefinition;
	private final DataTypeMultiplicityElements pDataTypeMultiplicity;
	private final DataTypeReferenceElements pDataTypeReference;
	private final OtherDataTypeDefinitionElements pOtherDataTypeDefinition;
	private final TypeConstraintRoutineElements pTypeConstraintRoutine;
	private final ConditionalBlockStatementElements pConditionalBlockStatement;
	private final GuardTestExpressionElements pGuardTestExpression;
	private final DataTypeElements pDataType;
	private final SimpleDataTypeElements pSimpleDataType;
	private final StructuredDataTypeElements pStructuredDataType;
	private final PrimitiveTypeElements pPrimitiveType;
	private final PrimitiveNumberTypeElements pPrimitiveNumberType;
	private final PrimitiveNumberSignElements ePrimitiveNumberSign;
	private final PrimitiveIntegerTypeElements pPrimitiveIntegerType;
	private final PrimitiveRationalTypeElements pPrimitiveRationalType;
	private final PrimitiveFloatTypeElements pPrimitiveFloatType;
	private final PrimitiveRealTypeElements pPrimitiveRealType;
	private final PrimitiveTimeTypeElements pPrimitiveTimeType;
	private final PrimitiveTimeNumberTypeElements pPrimitiveTimeNumberType;
	private final OtherPrimitiveTypeElements pOtherPrimitiveType;
	private final PrimitiveBooleanTypeElements pPrimitiveBooleanType;
	private final PrimitiveCharacterTypeElements pPrimitiveCharacterType;
	private final PrimitiveStringTypeElements pPrimitiveStringType;
	private final PrimitiveInstanceKindElements ePrimitiveInstanceKind;
	private final PrimitiveInstanceTypeElements pPrimitiveInstanceType;
	private final IntervalTypeElements pIntervalType;
	private final IntervalTypeDefinitionElements pIntervalTypeDefinition;
	private final IntervalTypeDefinitionImplElements pIntervalTypeDefinitionImpl;
	private final CollectionTypeElements pCollectionType;
	private final CollectionTypeDefinitionElements pCollectionTypeDefinition;
	private final CollectionTypeDefinitionImplElements pCollectionTypeDefinitionImpl;
	private final CollectionKindElements eCollectionKind;
	private final EnumerationTypeElements pEnumerationType;
	private final EnumerationTypeDefinitionElements pEnumerationTypeDefinition;
	private final EnumerationTypeDefinitionImplElements pEnumerationTypeDefinitionImpl;
	private final EnumerationLiteralElements pEnumerationLiteral;
	private final StructureTypeElements pStructureType;
	private final StructureTypeDefinitionElements pStructureTypeDefinition;
	private final StructureTypeDefinitionImplElements pStructureTypeDefinitionImpl;
	private final UnionTypeElements pUnionType;
	private final UnionTypeDefinitionElements pUnionTypeDefinition;
	private final UnionTypeDefinitionImplElements pUnionTypeDefinitionImpl;
	private final ChoiceTypeElements pChoiceType;
	private final ChoiceTypeDefinitionElements pChoiceTypeDefinition;
	private final ChoiceTypeDefinitionImplElements pChoiceTypeDefinitionImpl;
	private final ModifierElements pModifier;
	private final FunctionElements pFunction;
	private final FunctionImplElements pFunctionImpl;
	private final FunctionPublicElements pFunctionPublic;
	private final FunctionProtectedElements pFunctionProtected;
	private final FunctionPrivateElements pFunctionPrivate;
	private final ModifierVarElements pModifierVar;
	private final VariableElements pVariable;
	private final VariableImplElements pVariableImpl;
	private final OnWriteRoutineElements pOnWriteRoutine;
	private final VariableRoutineParameterSetElements pVariableRoutineParameterSet;
	private final VariableRoutineParameterElements pVariableRoutineParameter;
	private final VariablePublicElements pVariablePublic;
	private final VariableProtectedElements pVariableProtected;
	private final VariablePrivateElements pVariablePrivate;
	private final ParameterDirectionKindElements eParameterDirectionKind;
	private final FunctionalParameterSetElements pFunctionalParameterSet;
	private final FunctionalParameterElements pFunctionalParameter;
	private final FormalParameterSetElements pFormalParameterSet;
	private final FormalParameterElements pFormalParameter;
	private final FormalParameterOffsetElements pFormalParameterOffset;
	private final BlockParameterSetElements pBlockParameterSet;
	private final ParameterElements pParameter;
	private final ParameterImplElements pParameterImpl;
	private final ParameterInputElements pParameterInput;
	private final ParameterInoutElements pParameterInout;
	private final ParameterOutputElements pParameterOutput;
	private final ParameterReturnElements pParameterReturn;
	private final BufferContainerTypeElements pBufferContainerType;
	private final BufferContainerKindElements eBufferContainerKind;
	private final BufferElements pBuffer;
	private final BufferImplElements pBufferImpl;
	private final BufferPublicElements pBufferPublic;
	private final BufferProtectedElements pBufferProtected;
	private final BufferPrivateElements pBufferPrivate;
	private final PortElements pPort;
	private final PortImplElements pPortImpl;
	private final PortPublicElements pPortPublic;
	private final PortProtectedElements pPortProtected;
	private final PortPrivateElements pPortPrivate;
	private final SignalElements pSignal;
	private final SignalImplElements pSignalImpl;
	private final SignalPublicElements pSignalPublic;
	private final SignalProtectedElements pSignalProtected;
	private final SignalPrivateElements pSignalPrivate;
	private final ChannelDirectionElements eChannelDirection;
	private final ChannelElements pChannel;
	private final SignalReferenceElements pSignalReference;
	private final ChannelimplElements pChannelimpl;
	private final ChannelPublicElements pChannelPublic;
	private final ChannelProtectedElements pChannelProtected;
	private final ChannelPrivateElements pChannelPrivate;
	private final TransitionElements pTransition;
	private final TransitionMoeElements pTransitionMoe;
	private final TransitionMocElements eTransitionMoc;
	private final TransitionBehaviorElements pTransitionBehavior;
	private final TransitionTriggerElements pTransitionTrigger;
	private final TransitionGuardElements pTransitionGuard;
	private final TransitionGuardExpressionElements pTransitionGuardExpression;
	private final TransitionTimedGuardElements pTransitionTimedGuard;
	private final TransitionEffectElements pTransitionEffect;
	private final TransitionEffectStatementElements pTransitionEffectStatement;
	private final StatementElements pStatement;
	private final BlockStatementElements pBlockStatement;
	private final BlockStatementSchedulerElements pBlockStatementScheduler;
	private final ExpressionStatementElements pExpressionStatement;
	private final GuardStatementElements pGuardStatement;
	private final TimedGuardStatementElements pTimedGuardStatement;
	private final EventGuardStatementElements pEventGuardStatement;
	private final CheckSatGuardStatementElements pCheckSatGuardStatement;
	private final InputComStatementElements pInputComStatement;
	private final OutputComStatementElements pOutputComStatement;
	private final LitteralComElementElements pLitteralComElement;
	private final IfStatementElements pIfStatement;
	private final ElseIfStatementElements pElseIfStatement;
	private final WhileDoStatementElements pWhileDoStatement;
	private final DoWhileStatementElements pDoWhileStatement;
	private final ForStatementElements pForStatement;
	private final ForAssignmentExpressionElements pForAssignmentExpression;
	private final ForEachStatementElements pForEachStatement;
	private final InterruptStatementElements pInterruptStatement;
	private final InterruptStatementKindElements eInterruptStatementKind;
	private final ActivityStatementElements pActivityStatement;
	private final OPERATOR_ACTIVITYElements eOPERATOR_ACTIVITY;
	private final InvokeStatementElements pInvokeStatement;
	private final ObserverStatementElements pObserverStatement;
	private final ObservableStatementElements pObservableStatement;
	private final ObsInputComStatementElements pObsInputComStatement;
	private final ObsOutputComStatementElements pObsOutputComStatement;
	private final ObsComElementElements pObsComElement;
	private final MetaStatementElements pMetaStatement;
	private final OPERATOR_METAElements eOPERATOR_META;
	private final ExpressionElements pExpression;
	private final AssignmentExpressionElements pAssignmentExpression;
	private final AssignmentOperatorElements pAssignmentOperator;
	private final LeftHandSideExpressionElements pLeftHandSideExpression;
	private final ConditionalTestExpressionElements pConditionalTestExpression;
	private final LogicalOrExpressionElements pLogicalOrExpression;
	private final LogicalAndExpressionElements pLogicalAndExpression;
	private final BitwiseOrExpressionElements pBitwiseOrExpression;
	private final BitwiseXorExpressionElements pBitwiseXorExpression;
	private final BitwiseAndExpressionElements pBitwiseAndExpression;
	private final EqualityExpressionElements pEqualityExpression;
	private final EqualityOperatorElements pEqualityOperator;
	private final RelationalExpressionElements pRelationalExpression;
	private final RelationalOperatorElements pRelationalOperator;
	private final AdditiveExpressionElements pAdditiveExpression;
	private final MultiplicativeExpressionElements pMultiplicativeExpression;
	private final UnaryExpressionElements pUnaryExpression;
	private final PostfixUnaryExpressionElements pPostfixUnaryExpression;
	private final IncrementOrDecrementPostfixExpressionElements pIncrementOrDecrementPostfixExpression;
	private final PrefixUnaryExpressionElements pPrefixUnaryExpression;
	private final IncrementOrDecrementPrefixExpressionElements pIncrementOrDecrementPrefixExpression;
	private final AffixOperatorElements pAffixOperator;
	private final NewfreshExpressionElements pNewfreshExpression;
	private final CastExpressionElements pCastExpression;
	private final CollectionFunctionExpressionElements pCollectionFunctionExpression;
	private final ArithmeticUnaryExpressionElements pArithmeticUnaryExpression;
	private final ArithmeticUnaryOperatorElements pArithmeticUnaryOperator;
	private final QuantifiedLogicalExpressionElements pQuantifiedLogicalExpression;
	private final BoundVariableElements pBoundVariable;
	private final LogicalUnaryExpressionElements pLogicalUnaryExpression;
	private final BitwiseUnaryExpressionElements pBitwiseUnaryExpression;
	private final PrimaryExpressionElements pPrimaryExpression;
	private final BaseExpressionElements pBaseExpression;
	private final InvokeExpressionElements pInvokeExpression;
	private final InvokeExpressionDeprecatedElements pInvokeExpressionDeprecated;
	private final DynamicInstantiationExpressionElements pDynamicInstantiationExpression;
	private final InstanceSpecificationElements pInstanceSpecification;
	private final TupleParameterExpressionElements pTupleParameterExpression;
	private final MixTupleExpressionListElements pMixTupleExpressionList;
	private final PositionalTupleExpressionListElements pPositionalTupleExpressionList;
	private final NamedExpressionElements pNamedExpression;
	private final LiteralExpressionElements pLiteralExpression;
	private final LiteralReferenceableExpressionElements pLiteralReferenceableExpression;
	private final LiteralTerminalExpressionElements pLiteralTerminalExpression;
	private final LiteralBooleanExpressionElements pLiteralBooleanExpression;
	private final LiteralIntegerExpressionElements pLiteralIntegerExpression;
	private final LiteralRationalExpressionElements pLiteralRationalExpression;
	private final LiteralFloatExpressionElements pLiteralFloatExpression;
	private final LiteralCharacterExpressionElements pLiteralCharacterExpression;
	private final LiteralStringExpressionElements pLiteralStringExpression;
	private final LiteralNullExpressionElements pLiteralNullExpression;
	private final AnyNullPrimitiveInstanceTypeElements pAnyNullPrimitiveInstanceType;
	private final AnyPrimitiveInstanceKindElements eAnyPrimitiveInstanceKind;
	private final NullPrimitiveInstanceTypeElements pNullPrimitiveInstanceType;
	private final AnyDataTypeReferenceElements pAnyDataTypeReference;
	private final LiteralAnyValueExpressionElements pLiteralAnyValueExpression;
	private final LiteralOptionalValueExpressionElements pLiteralOptionalValueExpression;
	private final LiteralNoneValueExpressionElements pLiteralNoneValueExpression;
	private final LiteralAnyOrNoneValueExpressionElements pLiteralAnyOrNoneValueExpression;
	private final LiteralCollectionExpressionElements pLiteralCollectionExpression;
	private final LiteralReferenceExpressionElements pLiteralReferenceExpression;
	private final LiteralReferenceElementElements pLiteralReferenceElement;
	private final LiteralPureReferenceElementElements pLiteralPureReferenceElement;
	private final LiteralReferenceVariableContextElements pLiteralReferenceVariableContext;
	private final LiteralTimeExpressionElements pLiteralTimeExpression;
	private final LiteralTimeInitialExpressionElements pLiteralTimeInitialExpression;
	private final LiteralTimeDeltaExpressionElements pLiteralTimeDeltaExpression;
	private final LiteralTimeDeltaInitialExpressionElements pLiteralTimeDeltaInitialExpression;
	private final LiteralReferenceMachineContextElements pLiteralReferenceMachineContext;
	private final LiteralThisExpressionElements pLiteralThisExpression;
	private final LiteralSelfExpressionElements pLiteralSelfExpression;
	private final LiteralParentExpressionElements pLiteralParentExpression;
	private final LiteralSuperExpressionElements pLiteralSuperExpression;
	private final LiteralSystemExpressionElements pLiteralSystemExpression;
	private final LiteralEnvExpressionElements pLiteralEnvExpression;
	private final LiteralPureReferenceExpressionElements pLiteralPureReferenceExpression;
	private final LiteralReferenceSpecificationElements pLiteralReferenceSpecification;
	private final ValueSelectionExpressionElements pValueSelectionExpression;
	private final ValuePureNamedMachineExpressionElements pValuePureNamedMachineExpression;
	private final ValueDotFieldExpressionKindElements eValueDotFieldExpressionKind;
	private final ValueColonFieldExpressionKindElements eValueColonFieldExpressionKind;
	private final ValueDoubleColonFieldExpressionKindElements eValueDoubleColonFieldExpressionKind;
	private final ValueArrowFieldExpressionKindElements eValueArrowFieldExpressionKind;
	private final ValueIndexExpressionKindElements eValueIndexExpressionKind;
	private final ValueParameterExpressionKindElements eValueParameterExpressionKind;
	
	private final Grammar grammar;
	
	private final TerminalsGrammarAccess gaTerminals;

	@Inject
	public FormalMLGrammarAccess(GrammarProvider grammarProvider,
			TerminalsGrammarAccess gaTerminals) {
		this.grammar = internalFindGrammar(grammarProvider);
		this.gaTerminals = gaTerminals;
		this.pXlia = new XliaElements();
		this.pXliaPrologObject = new XliaPrologObjectElements();
		this.pXliaPrologAttribute = new XliaPrologAttributeElements();
		this.pXliaOptionObject = new XliaOptionObjectElements();
		this.pXliaNamedElement = new XliaNamedElementElements();
		this.pXliaObject = new XliaObjectElements();
		this.pXliaSection = new XliaSectionElements();
		this.pXliaAttribute = new XliaAttributeElements();
		this.pEBoolean = new EBooleanElements();
		this.tINT = (TerminalRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.INT");
		this.pEInt = new EIntElements();
		this.pEInteger = new EIntegerElements();
		this.pEFloat = new EFloatElements();
		this.pEDouble = new EDoubleElements();
		this.tCHARACTER = (TerminalRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.CHARACTER");
		this.pECharacter = new ECharacterElements();
		this.pEString = new EStringElements();
		this.tOFFSET = (TerminalRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.OFFSET");
		this.pEOffset = new EOffsetElements();
		this.pReservedKeyWord = new ReservedKeyWordElements();
		this.tXLIA_ID = (TerminalRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.efm.formalml.xtext.FormalML.XLIA_ID");
		this.pESIdentifier = new ESIdentifierElements();
		this.pESUfid = new ESUfidElements();
		this.pUnrestrictedName = new UnrestrictedNameElements();
		this.pQualifiedName = new QualifiedNameElements();
		this.pPotentiallyAmbiguousQualifiedName = new PotentiallyAmbiguousQualifiedNameElements();
		this.pColonQualifiedName = new ColonQualifiedNameElements();
		this.pDotQualifiedName = new DotQualifiedNameElements();
		this.pUnqualifiedName = new UnqualifiedNameElements();
		this.pNameBinding = new NameBindingElements();
		this.eVisibilityKind = new VisibilityKindElements();
		this.pModelOfComputationKing = new ModelOfComputationKingElements();
		this.eDesignKind = new DesignKindElements();
		this.pDesignDebugTrace = new DesignDebugTraceElements();
		this.eDesignInstanceKind = new DesignInstanceKindElements();
		this.pXliaSystem = new XliaSystemElements();
		this.pAnyMachineBlock = new AnyMachineBlockElements();
		this.pInstanceMachine = new InstanceMachineElements();
		this.pSlotParameter = new SlotParameterElements();
		this.pSlotProperty = new SlotPropertyElements();
		this.pMachineBlock = new MachineBlockElements();
		this.pPropertyPart = new PropertyPartElements();
		this.pCompositePart = new CompositePartElements();
		this.pBehaviorPart = new BehaviorPartElements();
		this.pProcedure = new ProcedureElements();
		this.pProcedureExecution = new ProcedureExecutionElements();
		this.pBehavior = new BehaviorElements();
		this.pMoeBehavior = new MoeBehaviorElements();
		this.pStatemachine = new StatemachineElements();
		this.pStatemachineRegion = new StatemachineRegionElements();
		this.pStatemachineNamedRegion = new StatemachineNamedRegionElements();
		this.pStatemachineRegionLite = new StatemachineRegionLiteElements();
		this.pState = new StateElements();
		this.pCompositeState = new CompositeStateElements();
		this.pMoeCompositeStateRoutines = new MoeCompositeStateRoutinesElements();
		this.pSimpleState = new SimpleStateElements();
		this.pMoeSimpleStateRoutines = new MoeSimpleStateRoutinesElements();
		this.pStartState = new StartStateElements();
		this.pMoeStartStateRoutines = new MoeStartStateRoutinesElements();
		this.pFinalState = new FinalStateElements();
		this.pMoeFinalStateRoutines = new MoeFinalStateRoutinesElements();
		this.pPseudostate = new PseudostateElements();
		this.pOtherPseudostate = new OtherPseudostateElements();
		this.pMoePseudotateRoutines = new MoePseudotateRoutinesElements();
		this.ePseudostateKind = new PseudostateKindElements();
		this.pPseudostateInitial = new PseudostateInitialElements();
		this.ePseudostateInitialKind = new PseudostateInitialKindElements();
		this.pEndingPseudostate = new EndingPseudostateElements();
		this.eEndingPseudostateKind = new EndingPseudostateKindElements();
		this.pModelOfComputation = new ModelOfComputationElements();
		this.pModelOfExecution = new ModelOfExecutionElements();
		this.pMoeRoutine = new MoeRoutineElements();
		this.pRoutine = new RoutineElements();
		this.pModelOfInteraction = new ModelOfInteractionElements();
		this.pRoute = new RouteElements();
		this.pComRouteProtocol = new ComRouteProtocolElements();
		this.pConnector = new ConnectorElements();
		this.pComProtocol = new ComProtocolElements();
		this.eComProtocolKind = new ComProtocolKindElements();
		this.eComEnvRdvProtocolKind = new ComEnvRdvProtocolKindElements();
		this.eComMultiRdvProtocolKind = new ComMultiRdvProtocolKindElements();
		this.eBufferProtocolKind = new BufferProtocolKindElements();
		this.eComCastKing = new ComCastKingElements();
		this.pConnectorEnd = new ConnectorEndElements();
		this.pComPoint = new ComPointElements();
		this.pComPointProtocol = new ComPointProtocolElements();
		this.pComBuffer = new ComBufferElements();
		this.pComBufferRef = new ComBufferRefElements();
		this.pBufferReferenceElement = new BufferReferenceElementElements();
		this.pLiteralPureReferenceMachine = new LiteralPureReferenceMachineElements();
		this.pTypeDefinition = new TypeDefinitionElements();
		this.pDataTypeMultiplicity = new DataTypeMultiplicityElements();
		this.pDataTypeReference = new DataTypeReferenceElements();
		this.pOtherDataTypeDefinition = new OtherDataTypeDefinitionElements();
		this.pTypeConstraintRoutine = new TypeConstraintRoutineElements();
		this.pConditionalBlockStatement = new ConditionalBlockStatementElements();
		this.pGuardTestExpression = new GuardTestExpressionElements();
		this.pDataType = new DataTypeElements();
		this.pSimpleDataType = new SimpleDataTypeElements();
		this.pStructuredDataType = new StructuredDataTypeElements();
		this.pPrimitiveType = new PrimitiveTypeElements();
		this.pPrimitiveNumberType = new PrimitiveNumberTypeElements();
		this.ePrimitiveNumberSign = new PrimitiveNumberSignElements();
		this.pPrimitiveIntegerType = new PrimitiveIntegerTypeElements();
		this.pPrimitiveRationalType = new PrimitiveRationalTypeElements();
		this.pPrimitiveFloatType = new PrimitiveFloatTypeElements();
		this.pPrimitiveRealType = new PrimitiveRealTypeElements();
		this.pPrimitiveTimeType = new PrimitiveTimeTypeElements();
		this.pPrimitiveTimeNumberType = new PrimitiveTimeNumberTypeElements();
		this.pOtherPrimitiveType = new OtherPrimitiveTypeElements();
		this.pPrimitiveBooleanType = new PrimitiveBooleanTypeElements();
		this.pPrimitiveCharacterType = new PrimitiveCharacterTypeElements();
		this.pPrimitiveStringType = new PrimitiveStringTypeElements();
		this.ePrimitiveInstanceKind = new PrimitiveInstanceKindElements();
		this.pPrimitiveInstanceType = new PrimitiveInstanceTypeElements();
		this.pIntervalType = new IntervalTypeElements();
		this.pIntervalTypeDefinition = new IntervalTypeDefinitionElements();
		this.pIntervalTypeDefinitionImpl = new IntervalTypeDefinitionImplElements();
		this.pCollectionType = new CollectionTypeElements();
		this.pCollectionTypeDefinition = new CollectionTypeDefinitionElements();
		this.pCollectionTypeDefinitionImpl = new CollectionTypeDefinitionImplElements();
		this.eCollectionKind = new CollectionKindElements();
		this.pEnumerationType = new EnumerationTypeElements();
		this.pEnumerationTypeDefinition = new EnumerationTypeDefinitionElements();
		this.pEnumerationTypeDefinitionImpl = new EnumerationTypeDefinitionImplElements();
		this.pEnumerationLiteral = new EnumerationLiteralElements();
		this.pStructureType = new StructureTypeElements();
		this.pStructureTypeDefinition = new StructureTypeDefinitionElements();
		this.pStructureTypeDefinitionImpl = new StructureTypeDefinitionImplElements();
		this.pUnionType = new UnionTypeElements();
		this.pUnionTypeDefinition = new UnionTypeDefinitionElements();
		this.pUnionTypeDefinitionImpl = new UnionTypeDefinitionImplElements();
		this.pChoiceType = new ChoiceTypeElements();
		this.pChoiceTypeDefinition = new ChoiceTypeDefinitionElements();
		this.pChoiceTypeDefinitionImpl = new ChoiceTypeDefinitionImplElements();
		this.pModifier = new ModifierElements();
		this.pFunction = new FunctionElements();
		this.pFunctionImpl = new FunctionImplElements();
		this.pFunctionPublic = new FunctionPublicElements();
		this.pFunctionProtected = new FunctionProtectedElements();
		this.pFunctionPrivate = new FunctionPrivateElements();
		this.pModifierVar = new ModifierVarElements();
		this.pVariable = new VariableElements();
		this.pVariableImpl = new VariableImplElements();
		this.pOnWriteRoutine = new OnWriteRoutineElements();
		this.pVariableRoutineParameterSet = new VariableRoutineParameterSetElements();
		this.pVariableRoutineParameter = new VariableRoutineParameterElements();
		this.pVariablePublic = new VariablePublicElements();
		this.pVariableProtected = new VariableProtectedElements();
		this.pVariablePrivate = new VariablePrivateElements();
		this.eParameterDirectionKind = new ParameterDirectionKindElements();
		this.pFunctionalParameterSet = new FunctionalParameterSetElements();
		this.pFunctionalParameter = new FunctionalParameterElements();
		this.pFormalParameterSet = new FormalParameterSetElements();
		this.pFormalParameter = new FormalParameterElements();
		this.pFormalParameterOffset = new FormalParameterOffsetElements();
		this.pBlockParameterSet = new BlockParameterSetElements();
		this.pParameter = new ParameterElements();
		this.pParameterImpl = new ParameterImplElements();
		this.pParameterInput = new ParameterInputElements();
		this.pParameterInout = new ParameterInoutElements();
		this.pParameterOutput = new ParameterOutputElements();
		this.pParameterReturn = new ParameterReturnElements();
		this.pBufferContainerType = new BufferContainerTypeElements();
		this.eBufferContainerKind = new BufferContainerKindElements();
		this.pBuffer = new BufferElements();
		this.pBufferImpl = new BufferImplElements();
		this.pBufferPublic = new BufferPublicElements();
		this.pBufferProtected = new BufferProtectedElements();
		this.pBufferPrivate = new BufferPrivateElements();
		this.pPort = new PortElements();
		this.pPortImpl = new PortImplElements();
		this.pPortPublic = new PortPublicElements();
		this.pPortProtected = new PortProtectedElements();
		this.pPortPrivate = new PortPrivateElements();
		this.pSignal = new SignalElements();
		this.pSignalImpl = new SignalImplElements();
		this.pSignalPublic = new SignalPublicElements();
		this.pSignalProtected = new SignalProtectedElements();
		this.pSignalPrivate = new SignalPrivateElements();
		this.eChannelDirection = new ChannelDirectionElements();
		this.pChannel = new ChannelElements();
		this.pSignalReference = new SignalReferenceElements();
		this.pChannelimpl = new ChannelimplElements();
		this.pChannelPublic = new ChannelPublicElements();
		this.pChannelProtected = new ChannelProtectedElements();
		this.pChannelPrivate = new ChannelPrivateElements();
		this.pTransition = new TransitionElements();
		this.pTransitionMoe = new TransitionMoeElements();
		this.eTransitionMoc = new TransitionMocElements();
		this.pTransitionBehavior = new TransitionBehaviorElements();
		this.pTransitionTrigger = new TransitionTriggerElements();
		this.pTransitionGuard = new TransitionGuardElements();
		this.pTransitionGuardExpression = new TransitionGuardExpressionElements();
		this.pTransitionTimedGuard = new TransitionTimedGuardElements();
		this.pTransitionEffect = new TransitionEffectElements();
		this.pTransitionEffectStatement = new TransitionEffectStatementElements();
		this.pStatement = new StatementElements();
		this.pBlockStatement = new BlockStatementElements();
		this.pBlockStatementScheduler = new BlockStatementSchedulerElements();
		this.pExpressionStatement = new ExpressionStatementElements();
		this.pGuardStatement = new GuardStatementElements();
		this.pTimedGuardStatement = new TimedGuardStatementElements();
		this.pEventGuardStatement = new EventGuardStatementElements();
		this.pCheckSatGuardStatement = new CheckSatGuardStatementElements();
		this.pInputComStatement = new InputComStatementElements();
		this.pOutputComStatement = new OutputComStatementElements();
		this.pLitteralComElement = new LitteralComElementElements();
		this.pIfStatement = new IfStatementElements();
		this.pElseIfStatement = new ElseIfStatementElements();
		this.pWhileDoStatement = new WhileDoStatementElements();
		this.pDoWhileStatement = new DoWhileStatementElements();
		this.pForStatement = new ForStatementElements();
		this.pForAssignmentExpression = new ForAssignmentExpressionElements();
		this.pForEachStatement = new ForEachStatementElements();
		this.pInterruptStatement = new InterruptStatementElements();
		this.eInterruptStatementKind = new InterruptStatementKindElements();
		this.pActivityStatement = new ActivityStatementElements();
		this.eOPERATOR_ACTIVITY = new OPERATOR_ACTIVITYElements();
		this.pInvokeStatement = new InvokeStatementElements();
		this.pObserverStatement = new ObserverStatementElements();
		this.pObservableStatement = new ObservableStatementElements();
		this.pObsInputComStatement = new ObsInputComStatementElements();
		this.pObsOutputComStatement = new ObsOutputComStatementElements();
		this.pObsComElement = new ObsComElementElements();
		this.pMetaStatement = new MetaStatementElements();
		this.eOPERATOR_META = new OPERATOR_METAElements();
		this.pExpression = new ExpressionElements();
		this.pAssignmentExpression = new AssignmentExpressionElements();
		this.pAssignmentOperator = new AssignmentOperatorElements();
		this.pLeftHandSideExpression = new LeftHandSideExpressionElements();
		this.pConditionalTestExpression = new ConditionalTestExpressionElements();
		this.pLogicalOrExpression = new LogicalOrExpressionElements();
		this.pLogicalAndExpression = new LogicalAndExpressionElements();
		this.pBitwiseOrExpression = new BitwiseOrExpressionElements();
		this.pBitwiseXorExpression = new BitwiseXorExpressionElements();
		this.pBitwiseAndExpression = new BitwiseAndExpressionElements();
		this.pEqualityExpression = new EqualityExpressionElements();
		this.pEqualityOperator = new EqualityOperatorElements();
		this.pRelationalExpression = new RelationalExpressionElements();
		this.pRelationalOperator = new RelationalOperatorElements();
		this.pAdditiveExpression = new AdditiveExpressionElements();
		this.pMultiplicativeExpression = new MultiplicativeExpressionElements();
		this.pUnaryExpression = new UnaryExpressionElements();
		this.pPostfixUnaryExpression = new PostfixUnaryExpressionElements();
		this.pIncrementOrDecrementPostfixExpression = new IncrementOrDecrementPostfixExpressionElements();
		this.pPrefixUnaryExpression = new PrefixUnaryExpressionElements();
		this.pIncrementOrDecrementPrefixExpression = new IncrementOrDecrementPrefixExpressionElements();
		this.pAffixOperator = new AffixOperatorElements();
		this.pNewfreshExpression = new NewfreshExpressionElements();
		this.pCastExpression = new CastExpressionElements();
		this.pCollectionFunctionExpression = new CollectionFunctionExpressionElements();
		this.pArithmeticUnaryExpression = new ArithmeticUnaryExpressionElements();
		this.pArithmeticUnaryOperator = new ArithmeticUnaryOperatorElements();
		this.pQuantifiedLogicalExpression = new QuantifiedLogicalExpressionElements();
		this.pBoundVariable = new BoundVariableElements();
		this.pLogicalUnaryExpression = new LogicalUnaryExpressionElements();
		this.pBitwiseUnaryExpression = new BitwiseUnaryExpressionElements();
		this.pPrimaryExpression = new PrimaryExpressionElements();
		this.pBaseExpression = new BaseExpressionElements();
		this.pInvokeExpression = new InvokeExpressionElements();
		this.pInvokeExpressionDeprecated = new InvokeExpressionDeprecatedElements();
		this.pDynamicInstantiationExpression = new DynamicInstantiationExpressionElements();
		this.pInstanceSpecification = new InstanceSpecificationElements();
		this.pTupleParameterExpression = new TupleParameterExpressionElements();
		this.pMixTupleExpressionList = new MixTupleExpressionListElements();
		this.pPositionalTupleExpressionList = new PositionalTupleExpressionListElements();
		this.pNamedExpression = new NamedExpressionElements();
		this.pLiteralExpression = new LiteralExpressionElements();
		this.pLiteralReferenceableExpression = new LiteralReferenceableExpressionElements();
		this.pLiteralTerminalExpression = new LiteralTerminalExpressionElements();
		this.pLiteralBooleanExpression = new LiteralBooleanExpressionElements();
		this.pLiteralIntegerExpression = new LiteralIntegerExpressionElements();
		this.pLiteralRationalExpression = new LiteralRationalExpressionElements();
		this.pLiteralFloatExpression = new LiteralFloatExpressionElements();
		this.pLiteralCharacterExpression = new LiteralCharacterExpressionElements();
		this.pLiteralStringExpression = new LiteralStringExpressionElements();
		this.pLiteralNullExpression = new LiteralNullExpressionElements();
		this.pAnyNullPrimitiveInstanceType = new AnyNullPrimitiveInstanceTypeElements();
		this.eAnyPrimitiveInstanceKind = new AnyPrimitiveInstanceKindElements();
		this.pNullPrimitiveInstanceType = new NullPrimitiveInstanceTypeElements();
		this.pAnyDataTypeReference = new AnyDataTypeReferenceElements();
		this.pLiteralAnyValueExpression = new LiteralAnyValueExpressionElements();
		this.pLiteralOptionalValueExpression = new LiteralOptionalValueExpressionElements();
		this.pLiteralNoneValueExpression = new LiteralNoneValueExpressionElements();
		this.pLiteralAnyOrNoneValueExpression = new LiteralAnyOrNoneValueExpressionElements();
		this.pLiteralCollectionExpression = new LiteralCollectionExpressionElements();
		this.pLiteralReferenceExpression = new LiteralReferenceExpressionElements();
		this.pLiteralReferenceElement = new LiteralReferenceElementElements();
		this.pLiteralPureReferenceElement = new LiteralPureReferenceElementElements();
		this.pLiteralReferenceVariableContext = new LiteralReferenceVariableContextElements();
		this.pLiteralTimeExpression = new LiteralTimeExpressionElements();
		this.pLiteralTimeInitialExpression = new LiteralTimeInitialExpressionElements();
		this.pLiteralTimeDeltaExpression = new LiteralTimeDeltaExpressionElements();
		this.pLiteralTimeDeltaInitialExpression = new LiteralTimeDeltaInitialExpressionElements();
		this.pLiteralReferenceMachineContext = new LiteralReferenceMachineContextElements();
		this.pLiteralThisExpression = new LiteralThisExpressionElements();
		this.pLiteralSelfExpression = new LiteralSelfExpressionElements();
		this.pLiteralParentExpression = new LiteralParentExpressionElements();
		this.pLiteralSuperExpression = new LiteralSuperExpressionElements();
		this.pLiteralSystemExpression = new LiteralSystemExpressionElements();
		this.pLiteralEnvExpression = new LiteralEnvExpressionElements();
		this.pLiteralPureReferenceExpression = new LiteralPureReferenceExpressionElements();
		this.pLiteralReferenceSpecification = new LiteralReferenceSpecificationElements();
		this.pValueSelectionExpression = new ValueSelectionExpressionElements();
		this.pValuePureNamedMachineExpression = new ValuePureNamedMachineExpressionElements();
		this.eValueDotFieldExpressionKind = new ValueDotFieldExpressionKindElements();
		this.eValueColonFieldExpressionKind = new ValueColonFieldExpressionKindElements();
		this.eValueDoubleColonFieldExpressionKind = new ValueDoubleColonFieldExpressionKindElements();
		this.eValueArrowFieldExpressionKind = new ValueArrowFieldExpressionKindElements();
		this.eValueIndexExpressionKind = new ValueIndexExpressionKindElements();
		this.eValueParameterExpressionKind = new ValueParameterExpressionKindElements();
	}
	
	protected Grammar internalFindGrammar(GrammarProvider grammarProvider) {
		Grammar grammar = grammarProvider.getGrammar(this);
		while (grammar != null) {
			if ("org.eclipse.efm.formalml.xtext.FormalML".equals(grammar.getName())) {
				return grammar;
			}
			List<Grammar> grammars = grammar.getUsedGrammars();
			if (!grammars.isEmpty()) {
				grammar = grammars.iterator().next();
			} else {
				return null;
			}
		}
		return grammar;
	}
	
	@Override
	public Grammar getGrammar() {
		return grammar;
	}
	
	
	public TerminalsGrammarAccess getTerminalsGrammarAccess() {
		return gaTerminals;
	}

	
	//////////////////////////////////////////////////////////////////////////////////
	//// Main Rules
	//////////////////////////////////////////////////////////////////////////////////
	//Xlia returns fmlSpec::XliaModel
	//    : prolog = XliaPrologObject
	//          system = XliaSystem
	//    ;
	public XliaElements getXliaAccess() {
		return pXlia;
	}
	
	public ParserRule getXliaRule() {
		return getXliaAccess().getRule();
	}
	
	//XliaPrologObject returns fmlSpec::XliaObject
	//    : name=( '@FormalML' | '@xfml' | '@fml' | '@xlia' | '@xfsp' | '@diversity' )
	//        '<'
	//        ( elements+=XliaPrologAttribute )
	////        ( ',' elements+=XliaPrologAttribute )+
	//        '>:'
	//        ( elements += XliaOptionObject )?
	//    ;
	public XliaPrologObjectElements getXliaPrologObjectAccess() {
		return pXliaPrologObject;
	}
	
	public ParserRule getXliaPrologObjectRule() {
		return getXliaPrologObjectAccess().getRule();
	}
	
	//XliaPrologAttribute returns fmlSpec::XliaAttribute
	//    : name=( 'system' | 'package' )
	//        ( ',' ( 'version:' )?
	//            value=( LiteralFloatExpression | LiteralStringExpression )
	//        )?
	//    ;
	public XliaPrologAttributeElements getXliaPrologAttributeAccess() {
		return pXliaPrologAttribute;
	}
	
	public ParserRule getXliaPrologAttributeRule() {
		return getXliaPrologAttributeAccess().getRule();
	}
	
	////XliaPrologAttribute returns XliaAttribute
	////    : (name = 'model')?    value=XliaModelKind
	////    | (name = 'version')?
	////        value=( LiteralFloatExpression | LiteralStringExpression )
	////    ;
	////
	////XliaModelKind returns fmlExpr::LiteralStringExpression
	////    : value=( 'system' | 'package' )
	////    ;
	//XliaOptionObject returns fmlSpec::XliaObject
	//    : name='@option'  '{'
	//        ( elements+=XliaNamedElement )*
	//      '}'
	//    ;
	public XliaOptionObjectElements getXliaOptionObjectAccess() {
		return pXliaOptionObject;
	}
	
	public ParserRule getXliaOptionObjectRule() {
		return getXliaOptionObjectAccess().getRule();
	}
	
	//XliaNamedElement returns fmlSpec::XliaNamedElement
	//    : XliaObject
	//    | XliaSection
	//    | XliaAttribute
	//    ;
	public XliaNamedElementElements getXliaNamedElementAccess() {
		return pXliaNamedElement;
	}
	
	public ParserRule getXliaNamedElementRule() {
		return getXliaNamedElementAccess().getRule();
	}
	
	//XliaObject returns fmlSpec::XliaObject
	//    : name=XLIA_ID '{'
	//        ( elements+=XliaNamedElement )*
	//      '}'
	//    ;
	public XliaObjectElements getXliaObjectAccess() {
		return pXliaObject;
	}
	
	public ParserRule getXliaObjectRule() {
		return getXliaObjectAccess().getRule();
	}
	
	//XliaSection returns fmlSpec::XliaSection
	//    : name=XLIA_ID '['
	//        ( elements+=XliaAttribute )*
	//      ']'
	//    ;
	public XliaSectionElements getXliaSectionAccess() {
		return pXliaSection;
	}
	
	public ParserRule getXliaSectionRule() {
		return getXliaSectionAccess().getRule();
	}
	
	//XliaAttribute returns fmlSpec::XliaAttribute
	//    : name=XLIA_ID '=' value=Expression ';'
	//    ;
	public XliaAttributeElements getXliaAttributeAccess() {
		return pXliaAttribute;
	}
	
	public ParserRule getXliaAttributeRule() {
		return getXliaAttributeAccess().getRule();
	}
	
	//////////////////////////////////////////////////////////////////////////////////
	//// Primitive Value
	//////////////////////////////////////////////////////////////////////////////////
	//EBoolean returns ecore::EBoolean
	//    : 'true' | 'false'
	//    ;
	public EBooleanElements getEBooleanAccess() {
		return pEBoolean;
	}
	
	public ParserRule getEBooleanRule() {
		return getEBooleanAccess().getRule();
	}
	
	//// Comment @Override for Eclipse/Neon compatibility
	//@Override
	//terminal INT returns ecore::EInt: ('0'..'9')+;
	public TerminalRule getINTRule() {
		return tINT;
	}
	
	//EInt returns ecore::EInt
	//    : '-'? INT
	//    ;
	public EIntElements getEIntAccess() {
		return pEInt;
	}
	
	public ParserRule getEIntRule() {
		return getEIntAccess().getRule();
	}
	
	//EInteger returns ecore::ELong
	//    : '-'? INT
	//    ;
	public EIntegerElements getEIntegerAccess() {
		return pEInteger;
	}
	
	public ParserRule getEIntegerRule() {
		return getEIntegerAccess().getRule();
	}
	
	//EFloat returns ecore::EFloat
	//    : '-'? INT? '.' INT //(('E'|'e') '-'? INT)?
	//    ;
	public EFloatElements getEFloatAccess() {
		return pEFloat;
	}
	
	public ParserRule getEFloatRule() {
		return getEFloatAccess().getRule();
	}
	
	//EDouble returns ecore::EDouble
	//    : '-'? INT? '.' INT //(('E'|'e') '-'? INT)?
	//    ;
	public EDoubleElements getEDoubleAccess() {
		return pEDouble;
	}
	
	public ParserRule getEDoubleRule() {
		return getEDoubleAccess().getRule();
	}
	
	//terminal CHARACTER
	//    : "'" . "'"
	//    ;
	public TerminalRule getCHARACTERRule() {
		return tCHARACTER;
	}
	
	//ECharacter returns ecore::EChar
	//    : CHARACTER
	//    ;
	public ECharacterElements getECharacterAccess() {
		return pECharacter;
	}
	
	public ParserRule getECharacterRule() {
		return getECharacterAccess().getRule();
	}
	
	//EString returns ecore::EString
	//    : STRING
	//    ;
	public EStringElements getEStringAccess() {
		return pEString;
	}
	
	public ParserRule getEStringRule() {
		return getEStringAccess().getRule();
	}
	
	//terminal OFFSET
	//    : '$' INT? ':'
	//    ;
	public TerminalRule getOFFSETRule() {
		return tOFFSET;
	}
	
	//EOffset returns ecore::EString
	//    : OFFSET ;
	public EOffsetElements getEOffsetAccess() {
		return pEOffset;
	}
	
	public ParserRule getEOffsetRule() {
		return getEOffsetAccess().getRule();
	}
	
	////QualifiedName returns ecore::EString
	////    : ID ( '[' ID ']' )? '.' ID ( '[' ID ']' )? | ID
	////    ;
	//ReservedKeyWord
	//    : 'package'   | 'system'      | 'machine'  | 'executable'
	//    | 'vertex'    | 'pseudostate'
	//    | 'state'     | 'statemachine'
	//    | 'macro'     | 'routine'
	//    | 'procedure' | 'transition'
	//    | 'public'    | 'private'     | 'protected'
	//    | 'static'    | 'final'
	//    | 'volatile'  | 'transient'
	//    | 'model'     | 'prototype'   | 'instance'
	//    | 'timed'     | 'timed#dense' | 'timed#discrete'
	//    | 'unsafe'    | 'input_enabled'
	//    | 'port'      | 'signal'      | 'message'
	//    | 'buffer'    | 'channel'     | 'via'
	//    | 'var'       | 'val'         | 'const'
	//    | 'input'     | 'in'          | 'inout'
	//    | 'output'    | 'out'         | 'return'
	//    | 'simple'    | 'start'       | 'final'
	//    | 'initial'   | 'terminal'    | 'junction'
	//    | 'choice'    | 'fork'        | 'join'
	//    | 'dhistory'  | 'shistory'
	//    | 'route'     | 'connector'   | 'connect'
	//    | 'env'       | 'rdv'         | 'multirdv'
	//    | 'buffer'    | 'unicast'     | 'anycast'
	//    | 'multicast' | 'broadcast'
	//    | 'boolean'   | 'bool'
	//    | 'char'      | 'string'
	//    | 'integer'   | 'int'
	//    | 'uinteger'  | 'uint'
	//    | 'rational'  | 'rat'
	//    | 'urational' | 'urat'
	//    | 'time'      | 'clock'
	//    | 'float'     | 'double'      | 'real'
	//    | 'ufloat'    | 'udouble'     | 'ureal'
	//    | 'interval'  | 'enum'        | 'struct' | 'union'
	//    | 'vector'    | 'rvector'     | 'list'
	//    | 'set'       | 'bag'         | 'multiset'
	//    | 'fifo'      | 'lifo'
	//    | 'guard'     | 'tguard'
	//    | 'event'     | 'checksat'
	//    | 'break'     | 'continue'    | 'exit'   | 'init'
	//    | 'destroy'   | 'stop'        | 'abort'  | 'restart'
	//    | 'suspend'   | 'resume'      | 'wait'
	//    | 'disable'   | 'enable'
	//    | 'schedule'  | 'irun'        | 'run'    | 'rtc'
	//    | 'call'      | 'new'         | 'ctor'   | 'newfresh'
	//    | 'this'      | 'self'        | 'parent' | 'super'
	//    | 'null'
	//    | '#model'    | '#instance'        | '#static'   |  '#dynamic'
	//    | '#runtime'  | '#static#instance' | '#dynamic#instance'
	//    | '#prototype'| '#dynamic#prototype'
	//    ;
	public ReservedKeyWordElements getReservedKeyWordAccess() {
		return pReservedKeyWord;
	}
	
	public ParserRule getReservedKeyWordRule() {
		return getReservedKeyWordAccess().getRule();
	}
	
	//terminal XLIA_ID
	//    : ('a'..'z'|'A'..'Z'|'_'|'#') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'#')*
	//    ;
	public TerminalRule getXLIA_IDRule() {
		return tXLIA_ID;
	}
	
	//ESIdentifier returns ecore::EString
	//    : XLIA_ID
	//    ;
	public ESIdentifierElements getESIdentifierAccess() {
		return pESIdentifier;
	}
	
	public ParserRule getESIdentifierRule() {
		return getESIdentifierAccess().getRule();
	}
	
	//ESUfid returns ecore::EString
	//    : ( 'spec::' | '::' )?  XLIA_ID  ( ( '.' | ':' ) XLIA_ID )*
	//    ;
	public ESUfidElements getESUfidAccess() {
		return pESUfid;
	}
	
	public ParserRule getESUfidRule() {
		return getESUfidAccess().getRule();
	}
	
	//UnrestrictedName returns ecore::EString
	//    : STRING
	//    ;
	public UnrestrictedNameElements getUnrestrictedNameAccess() {
		return pUnrestrictedName;
	}
	
	public ParserRule getUnrestrictedNameRule() {
		return getUnrestrictedNameAccess().getRule();
	}
	
	//QualifiedName returns fmlCommon::QualifiedName
	//    : UnqualifiedName
	//        ( '::' nameBinding += NameBinding )*
	//        ( '.' nameBinding += NameBinding )*
	//    ;
	public QualifiedNameElements getQualifiedNameAccess() {
		return pQualifiedName;
	}
	
	public ParserRule getQualifiedNameRule() {
		return getQualifiedNameAccess().getRule();
	}
	
	//PotentiallyAmbiguousQualifiedName returns fmlCommon::QualifiedName
	//    : UnqualifiedName
	//        ( '::' nameBinding += NameBinding )*
	//        ( isAmbiguous ?= '.' nameBinding += NameBinding
	//            ( '.' nameBinding += NameBinding )*
	//        )?
	//    ;
	public PotentiallyAmbiguousQualifiedNameElements getPotentiallyAmbiguousQualifiedNameAccess() {
		return pPotentiallyAmbiguousQualifiedName;
	}
	
	public ParserRule getPotentiallyAmbiguousQualifiedNameRule() {
		return getPotentiallyAmbiguousQualifiedNameAccess().getRule();
	}
	
	//ColonQualifiedName returns fmlCommon::QualifiedName
	//    : UnqualifiedName ( '::' nameBinding += NameBinding )+
	//    ;
	public ColonQualifiedNameElements getColonQualifiedNameAccess() {
		return pColonQualifiedName;
	}
	
	public ParserRule getColonQualifiedNameRule() {
		return getColonQualifiedNameAccess().getRule();
	}
	
	//DotQualifiedName returns fmlCommon::QualifiedName
	//    : UnqualifiedName ( '.' nameBinding += NameBinding )+
	//    ;
	public DotQualifiedNameElements getDotQualifiedNameAccess() {
		return pDotQualifiedName;
	}
	
	public ParserRule getDotQualifiedNameRule() {
		return getDotQualifiedNameAccess().getRule();
	}
	
	//UnqualifiedName returns fmlCommon::QualifiedName
	//    : nameBinding += NameBinding
	//    ;
	public UnqualifiedNameElements getUnqualifiedNameAccess() {
		return pUnqualifiedName;
	}
	
	public ParserRule getUnqualifiedNameRule() {
		return getUnqualifiedNameAccess().getRule();
	}
	
	//NameBinding
	//    : XLIA_ID
	//    ;
	public NameBindingElements getNameBindingAccess() {
		return pNameBinding;
	}
	
	public ParserRule getNameBindingRule() {
		return getNameBindingAccess().getRule();
	}
	
	//enum VisibilityKind returns fmlCommon::VisibilityKind
	//    : public   ='public'
	//    | private  ='private'
	//    | protected='protected'
	//    | package  ='package'
	//    ;
	public VisibilityKindElements getVisibilityKindAccess() {
		return eVisibilityKind;
	}
	
	public EnumRule getVisibilityKindRule() {
		return getVisibilityKindAccess().getRule();
	}
	
	//ModelOfComputationKing
	//    : 'and'
	//    | 'or'
	//    | 'start'
	//    | '#STF'
	//    | '#STS'
	//    | '#DF'
	//    | '#alt'
	//    | '#opt'
	//    | '#loop'
	//    | '#break'
	//    | '#par'
	//    | '#strict'
	//    | '#weak'
	//    | '#seq'
	//    | '#critical'
	//    | '#ignore'
	//    | '#consider'
	//    | '#assert'
	//    | '#neg'
	//    ;
	public ModelOfComputationKingElements getModelOfComputationKingAccess() {
		return pModelOfComputationKing;
	}
	
	public ParserRule getModelOfComputationKingRule() {
		return getModelOfComputationKingAccess().getRule();
	}
	
	//////////////////////////////////////////////////////////////////////////////////
	//// Machine PropertyDefinition Rules
	//////////////////////////////////////////////////////////////////////////////////
	//enum DesignKind returns fmlInfra::DesignKind
	//    : model     = 'model'
	//    | prototype = 'prototype'
	//    | model     = '#model'
	//    | prototype = '#prototype'
	//    ;
	public DesignKindElements getDesignKindAccess() {
		return eDesignKind;
	}
	
	public EnumRule getDesignKindRule() {
		return getDesignKindAccess().getRule();
	}
	
	//DesignDebugTrace
	//    : '#model'
	//    | '#instance'
	//    | '#static'
	//    | '#dynamic'
	//    | '#runtime'
	//    | '#static#instance'
	//    | '#dynamic#instance'
	//    | '#prototype'
	//    | '#dynamic#prototype'
	//    ;
	public DesignDebugTraceElements getDesignDebugTraceAccess() {
		return pDesignDebugTrace;
	}
	
	public ParserRule getDesignDebugTraceRule() {
		return getDesignDebugTraceAccess().getRule();
	}
	
	//enum DesignInstanceKind returns fmlInfra::DesignKind
	//    : instance  = 'instance'
	//    ;
	public DesignInstanceKindElements getDesignInstanceKindAccess() {
		return eDesignInstanceKind;
	}
	
	public EnumRule getDesignInstanceKindRule() {
		return getDesignInstanceKindAccess().getRule();
	}
	
	//XliaSystem returns fmlInfra::XliaSystem
	//    : ( ( visibility=VisibilityKind )?
	//        & ( timed?='timed' )?
	//        & ( dense_timed?='timed#dense' )?
	//        & ( discrete_timed?='timed#discrete' )?
	//        & ( input_enabled ?= 'input_enabled' )?
	//        & ( unsafe ?= 'unsafe' )?
	//        )
	//        'system' ('<' ( 'moc:' )? ( 'and' | 'or' ) '>')?
	//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
	//        '{'
	//        ( // optional unnamed section for property full declaration / definition
	////            ( 'port'
	////                ( port+=PortImpl
	////                | '{' ( port+=PortImpl )+ '}'
	////                )
	////            | 'signal'
	////                ( signal+=SignalImpl
	////                | '{' ( signal+=SignalImpl )+ '}'
	////                )
	////            | 'buffer'
	////                ( buffer+=BufferImpl
	////                | '{' ( buffer+=BufferImpl )+ '}'
	////                )
	////            | channel+=Channel
	////            | 'type'
	////                ( typedef+=TypeDefinitionImpl
	////                | '{' ( typedef+=TypeDefinitionImpl )+ '}'
	////                )
	////            | 'var'
	////                ( property+=VariableImpl
	////                | '{' ( variable+=VariableImpl )+ '}'
	////                )
	////            | ( 'val' | 'const' )
	////                ( variable+=VariableImpl
	////                | '{' ( variable+=VariableImpl )+ '}'
	////                )
	////            | variable+=Variable
	////            )*
	//            ( port+=Port
	//            | signal+=Signal
	//            | buffer+=Buffer
	//            | channel+=Channel
	//            | typedef+=TypeDefinition
	//            | function+=Function
	//            | variable+=Variable
	//            )*
	//        )
	//        ( '@property:'
	//            ( port+=Port
	//            | signal+=Signal
	//            | buffer+=Buffer
	//            | channel+=Channel
	//            | typedef+=TypeDefinition
	//            | function+=Function
	//            | variable+=Variable
	//            )*
	//        | '@public:'
	//            ( port+=PortPublic
	//            | signal+=SignalPublic
	//            | buffer+=BufferPublic
	//            | channel+=ChannelPublic
	//            | typedef+=TypeDefinition
	//            | function+=FunctionPublic
	//            | variable+=VariablePublic
	//            )*
	//        | '@protected:'
	//            ( port+=PortProtected
	//            | signal+=SignalProtected
	//            | buffer+=BufferProtected
	//            | channel+=ChannelProtected
	//            | typedef+=TypeDefinition
	//            | function+=FunctionProtected
	//            | variable+=VariableProtected
	//            )*
	//        | '@private:'
	//            ( port+=PortPrivate
	//            | signal+=SignalPrivate
	//            | buffer+=BufferPrivate
	//            | channel+=ChannelPrivate
	//            | typedef+=TypeDefinition
	//            | function+=FunctionPrivate
	//            | variable+=VariablePrivate
	//            )*
	//        )*
	//        ( ( ( '@routine:' | '@macro:' ) ( routine+=Routine )+
	//          | '@procedure:' ( procedure+=Procedure )+
	//          )*
	//        | ( routine+=Routine | procedure+=Procedure )+
	//        )
	//        ( ( '@composite:' | '@machine:' )
	//            ( machine +=AnyMachineBlock
	//            | instance+=InstanceMachine
	//            )+
	//        | '@model:'     ( machine +=AnyMachineBlock )*
	//        | '@prototype:' ( machine +=AnyMachineBlock )*
	//        | '@instance:'  ( instance+=InstanceMachine )*
	//        )*
	//        ( '@behavior:'     ( behavior+=Behavior )+
	//        | '@statemachine:' ( behavior+=Statemachine )+
	//        )*
	//        main=MoeBehavior
	////        // optional unnamed section for property full declaration / definition
	////        propertyPart=PropertyPart
	////
	////        compositePart=CompositePart
	////
	////        behaviorPart=BehaviorPart
	//        '}'
	//    ;
	public XliaSystemElements getXliaSystemAccess() {
		return pXliaSystem;
	}
	
	public ParserRule getXliaSystemRule() {
		return getXliaSystemAccess().getRule();
	}
	
	//AnyMachineBlock returns fmlInfra::Machine
	//    : MachineBlock
	//    | Statemachine
	//    ;
	public AnyMachineBlockElements getAnyMachineBlockAccess() {
		return pAnyMachineBlock;
	}
	
	public ParserRule getAnyMachineBlockRule() {
		return getAnyMachineBlockAccess().getRule();
	}
	
	//InstanceMachine returns fmlInfra::InstanceMachine
	//    : 'instance' ( 'machine' | 'statemachine' ) ?
	//        '<' ( 'model:' )? model=[fmlInfra::Machine|ESUfid] '>'
	//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
	//        ( '(' ( slot+=SlotParameter ( ',' slot+=SlotParameter )* )? ')' )?
	//        ( '{'  ( slot+=SlotProperty ';' )*  '}'
	//        | ';'
	//        )
	//    ;
	public InstanceMachineElements getInstanceMachineAccess() {
		return pInstanceMachine;
	}
	
	public ParserRule getInstanceMachineRule() {
		return getInstanceMachineAccess().getRule();
	}
	
	//SlotParameter returns fmlInfra::SlotProperty
	//    : ( xliaProperty=[fmlInfra::PropertyDefinition|ESIdentifier]
	////      | umlProperty=[uml::Property|ESIdentifier]
	//      )  ( ':' | '='  | ':=' | '::=' )  value=Expression
	//    ;
	public SlotParameterElements getSlotParameterAccess() {
		return pSlotParameter;
	}
	
	public ParserRule getSlotParameterRule() {
		return getSlotParameterAccess().getRule();
	}
	
	//SlotProperty returns fmlInfra::SlotProperty
	//    : ( xliaProperty=[fmlInfra::PropertyDefinition|ESIdentifier]
	////      | umlProperty=[uml::Property|ESIdentifier]
	//      ) ( '='  | ':' | ':=' | '::=' )  value=Expression
	//    ;
	public SlotPropertyElements getSlotPropertyAccess() {
		return pSlotProperty;
	}
	
	public ParserRule getSlotPropertyRule() {
		return getSlotPropertyAccess().getRule();
	}
	
	//MachineBlock returns fmlInfra::Machine
	//    : ( ( visibility=VisibilityKind )?
	//        & ( timed?='timed' )?
	//        & ( dense_timed?='timed#dense' )?
	//        & ( discrete_timed?='timed#discrete' )?
	//        & ( input_enabled ?= 'input_enabled' )?
	//        & ( lifeline?='lifeline' )?
	//        & ( design=DesignKind )?
	//        )
	//        ( 'machine' | 'executable' )
	//        ( '<' ( ( 'moc:' )?  ModelOfComputationKing )?
	//            ( 'instance:' '[' ( '+' | '*'
	//                | ( 'init:' EInteger 'max:' EInteger ) ) ']' )? '>'
	//        )?
	//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
	//        '{'
	//        ( // optional unnamed section for property full declaration / definition
	//            ( port+=Port
	//            | signal+=Signal
	//            | buffer+=Buffer
	//            | channel+=Channel
	//            | typedef+=TypeDefinition
	//            | function+=Function
	//            | variable+=Variable
	//            )*
	//        )
	//        ( '@property:'
	//            ( port+=Port
	//            | signal+=Signal
	//            | buffer+=Buffer
	//            | channel+=Channel
	//            | typedef+=TypeDefinition
	//            | function+=Function
	//            | variable+=Variable
	//            )*
	//        | '@public:'
	//            ( port+=PortPublic
	//            | signal+=SignalPublic
	//            | buffer+=BufferPublic
	//            | channel+=ChannelPublic
	//            | typedef+=TypeDefinition
	//            | function+=FunctionPublic
	//            | variable+=VariablePublic
	//            )*
	//        | '@protected:'
	//            ( port+=PortProtected
	//            | signal+=SignalProtected
	//            | buffer+=BufferProtected
	//            | channel+=ChannelProtected
	//            | typedef+=TypeDefinition
	//            | function+=FunctionProtected
	//            | variable+=VariableProtected
	//            )*
	//        | '@private:'
	//            ( port+=PortPrivate
	//            | signal+=SignalPrivate
	//            | buffer+=BufferPrivate
	//            | channel+=ChannelPrivate
	//            | typedef+=TypeDefinition
	//            | function+=FunctionPrivate
	//            | variable+=VariablePrivate
	//            )*
	//        )*
	//        ( ( ( '@routine:' | '@macro:' ) ( routine+=Routine )+
	//          | '@procedure:' ( procedure+=Procedure )+
	//          )*
	//        | ( routine+=Routine | procedure+=Procedure )+
	//        )
	//        ( ( '@composite:' | '@machine:' )
	//            ( machine +=AnyMachineBlock
	//            | instance+=InstanceMachine
	//            )+
	//        | '@model:'     ( machine +=AnyMachineBlock )*
	//        | '@prototype:' ( machine +=AnyMachineBlock )*
	//        | '@instance:'  ( instance+=InstanceMachine )*
	//        )*
	//        ( '@behavior:'     ( behavior+=Behavior )+
	//        | '@statemachine:' ( behavior+=Statemachine )+
	//        )*
	//        main=MoeBehavior
	////        // optional unnamed section for property full declaration / definition
	////        propertyPart=PropertyPart
	////
	////        compositePart=CompositePart
	////
	////        behaviorPart=BehaviorPart
	//        '}'
	//    ;
	public MachineBlockElements getMachineBlockAccess() {
		return pMachineBlock;
	}
	
	public ParserRule getMachineBlockRule() {
		return getMachineBlockAccess().getRule();
	}
	
	//PropertyPart returns fmlInfra::PropertyPart
	//    : {fmlInfra::PropertyPart}
	//        ( '@parameter:'
	//            ( 'input'
	//                ( parameter+=ParameterInput
	//                | '{' ( parameter+=ParameterInput )+ '}'
	//                )
	//            | 'inout'
	//                ( parameter+=ParameterInout
	//                | '{' ( parameter+=ParameterInout )+ '}'
	//                )
	//            | 'output'
	//                ( parameter+=ParameterOutput
	//                | '{' ( parameter+=ParameterOutput )+ '}'
	//                )
	//            | 'return'
	//                ( parameter+=ParameterReturn
	//                | '{' ( parameter+=ParameterReturn )+ '}'
	//                )
	//            )*
	//        | // optional unnamed section for property full declaration / definition
	//            ( port+=Port
	//            | signal+=Signal
	//            | buffer+=Buffer
	//            | channel+=Channel
	//            | typedef+=TypeDefinition
	//            | function+=Function
	//            | variable+=Variable
	//            )*
	//        )
	//        ( '@input:'
	//            ( parameter+=ParameterInput  )*
	//        | '@inout:'
	//            ( parameter+=ParameterInout  )*
	//        | '@output:'
	//            ( parameter+=ParameterOutput )*
	//        | '@return:'
	//            ( parameter+=ParameterReturn )*
	//        )*
	//        ( '@property:'
	//            ( port+=Port
	//            | signal+=Signal
	//            | buffer+=Buffer
	//            | channel+=Channel
	//            | typedef+=TypeDefinition
	//            | function+=Function
	//            | variable+=Variable
	//            )*
	//        | '@public:'
	//            ( port+=PortPublic
	//            | signal+=SignalPublic
	//            | buffer+=BufferPublic
	//            | channel+=ChannelPublic
	//            | typedef+=TypeDefinition
	//            | function+=FunctionPublic
	//            | variable+=VariablePublic
	//            )*
	//        | '@protected:'
	//            ( port+=PortProtected
	//            | signal+=SignalProtected
	//            | buffer+=BufferProtected
	//            | channel+=ChannelProtected
	//            | typedef+=TypeDefinition
	//            | function+=FunctionProtected
	//            | variable+=VariableProtected
	//            )*
	//        | '@private:'
	//            ( port+=PortPrivate
	//            | signal+=SignalPrivate
	//            | buffer+=BufferPrivate
	//            | channel+=ChannelPrivate
	//            | typedef+=TypeDefinition
	//            | function+=FunctionPrivate
	//            | variable+=VariablePrivate
	//            )*
	//        )*
	//    ;
	public PropertyPartElements getPropertyPartAccess() {
		return pPropertyPart;
	}
	
	public ParserRule getPropertyPartRule() {
		return getPropertyPartAccess().getRule();
	}
	
	//CompositePart returns fmlInfra::CompositePart
	//    : {fmlInfra::CompositePart}
	//        ( ( ( '@routine:' | '@macro:' ) ( routine+=Routine )+
	//          | '@procedure:' ( procedure+=Procedure )+
	//          )*
	//        | ( routine+=Routine | procedure+=Procedure )+
	//        )
	//        ( ( '@composite:' | '@machine:' )
	//            ( machine +=AnyMachineBlock
	//            | instance+=InstanceMachine
	//            )+
	//        | '@model:'     ( machine +=AnyMachineBlock )*
	//        | '@prototype:' ( machine +=AnyMachineBlock )*
	//        | '@instance:'  ( instance+=InstanceMachine )*
	//        )*
	//    ;
	public CompositePartElements getCompositePartAccess() {
		return pCompositePart;
	}
	
	public ParserRule getCompositePartRule() {
		return getCompositePartAccess().getRule();
	}
	
	//BehaviorPart returns fmlInfra::BehaviorPart
	//    : {fmlInfra::BehaviorPart}
	//        ( '@behavior:'     ( behavior+=Behavior )+
	//        | '@statemachine:' ( behavior+=Statemachine )+
	//        )*
	//        main=MoeBehavior
	//    ;
	public BehaviorPartElements getBehaviorPartAccess() {
		return pBehaviorPart;
	}
	
	public ParserRule getBehaviorPartRule() {
		return getBehaviorPartAccess().getRule();
	}
	
	//////////////////////////////////////////////////////////////////////////////////
	//// Procedure View Rules
	//////////////////////////////////////////////////////////////////////////////////
	//Procedure returns fmlInfra::Procedure
	//    : ( visibility=VisibilityKind )?
	//        'procedure' ( '<' ( 'moc:' )?  ( 'and' | 'or' ) '>' )?
	//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
	//        ( ( '(' ( parameter+=FunctionalParameter
	//            ( ',' parameter+=FunctionalParameter )* )? ')' )?
	//             ( '-->'
	//                 ( parameter+=FormalParameter
	//                 | '('  parameter+=FormalParameter
	//                     ( ',' parameter+=FormalParameter )* ')'
	//                 )
	//             )?
	//         )?
	//        '{'
	//        ( '@parameter:'
	//            ( 'input'
	//                ( parameter+=ParameterInput
	//                | '{' ( parameter+=ParameterInput )+ '}'
	//                )
	//            | 'inout'
	//                ( parameter+=ParameterInout
	//                | '{' ( parameter+=ParameterInout )+ '}'
	//                )
	//            | 'output'
	//                ( parameter+=ParameterOutput
	//                | '{' ( parameter+=ParameterOutput )+ '}'
	//                )
	//            | 'return'
	//                ( parameter+=ParameterReturn
	//                | '{' ( parameter+=ParameterReturn )+ '}'
	//                )
	//            )*
	//        | // optional unnamed section for property full declaration / definition
	//            ( port+=Port
	//            | signal+=Signal
	//            | buffer+=Buffer
	//            | channel+=Channel
	//            | typedef+=TypeDefinition
	//            | function+=Function
	//            | variable+=Variable
	//            )*
	//        )
	//        ( '@input:'
	//            ( parameter+=ParameterInput  )*
	//        | '@inout:'
	//            ( parameter+=ParameterInout  )*
	//        | '@output:'
	//            ( parameter+=ParameterOutput )*
	//        | '@return:'
	//            ( parameter+=ParameterReturn )*
	//        )*
	//        ( '@property:'
	//            ( port+=Port
	//            | signal+=Signal
	//            | buffer+=Buffer
	//            | channel+=Channel
	//            | typedef+=TypeDefinition
	//            | function+=Function
	//            | variable+=Variable
	//            )*
	//        | '@public:'
	//            ( port+=PortPublic
	//            | signal+=SignalPublic
	//            | buffer+=BufferPublic
	//            | channel+=ChannelPublic
	//            | typedef+=TypeDefinition
	//            | function+=FunctionPublic
	//            | variable+=VariablePublic
	//            )*
	//        | '@protected:'
	//            ( port+=PortProtected
	//            | signal+=SignalProtected
	//            | buffer+=BufferProtected
	//            | channel+=ChannelProtected
	//            | typedef+=TypeDefinition
	//            | function+=FunctionProtected
	//            | variable+=VariableProtected
	//            )*
	//        | '@private:'
	//            ( port+=PortPrivate
	//            | signal+=SignalPrivate
	//            | buffer+=BufferPrivate
	//            | channel+=ChannelPrivate
	//            | typedef+=TypeDefinition
	//            | function+=FunctionPrivate
	//            | variable+=VariablePrivate
	//            )*
	//        )*
	//        ( ( ( '@routine:' | '@macro:' ) ( routine+=Routine )+
	//          | '@procedure:' ( procedure+=Procedure )+
	//          )*
	//        | ( routine+=Routine | procedure+=Procedure )+
	//        )
	////        // optional unnamed section for property full declaration / definition
	////        propertyPart=PropertyPart
	////
	////        compositePart=CompositePart
	////        ( region+=StatemachineRegion
	////        | ( region+=StatemachineNamedRegion )+
	////        | region+=StatemachineRegionLite
	////        )?
	//        ( ( execution=ProcedureExecution )?
	////        & ( computation=ModelOfComputation )?
	////        & ( interaction=ModelOfInteraction )?
	//        )
	//        '}'
	//    ;
	public ProcedureElements getProcedureAccess() {
		return pProcedure;
	}
	
	public ParserRule getProcedureRule() {
		return getProcedureAccess().getRule();
	}
	
	//ProcedureExecution returns fmlInfra::ModelOfExecution
	//    : { fmlInfra::ModelOfExecution }
	//        ( '@moe:' )?
	//        ( ( ( '@schedule' | '@xschedule' )  scheduleRoutine=moeRoutine )?
	//        & ( '@run'  runRoutine=moeRoutine )?
	//        )
	//    ;
	public ProcedureExecutionElements getProcedureExecutionAccess() {
		return pProcedureExecution;
	}
	
	public ParserRule getProcedureExecutionRule() {
		return getProcedureExecutionAccess().getRule();
	}
	
	//////////////////////////////////////////////////////////////////////////////////
	//// Behavior View Rules
	//////////////////////////////////////////////////////////////////////////////////
	//Behavior returns fmlInfra::Behavior
	//    : Statemachine
	//    ;
	public BehaviorElements getBehaviorAccess() {
		return pBehavior;
	}
	
	public ParserRule getBehaviorRule() {
		return getBehaviorAccess().getRule();
	}
	
	//MoeBehavior returns fmlInfra::Behavior
	//    : {fmlInfra::Behavior}
	//        ( '@local:'
	//            ( port+=PortPrivate
	//            | signal+=SignalPrivate
	//            | buffer+=BufferPrivate
	//            | channel+=ChannelPrivate
	//            | typedef+=TypeDefinition
	//            | function+=FunctionPrivate
	//            | variable+=VariablePrivate
	//            )*
	//        )?
	//        ( ( execution=ModelOfExecution )?
	////        & ( computation=ModelOfComputation )?
	//        & ( interaction=ModelOfInteraction )?
	//        )
	//    ;
	public MoeBehaviorElements getMoeBehaviorAccess() {
		return pMoeBehavior;
	}
	
	public ParserRule getMoeBehaviorRule() {
		return getMoeBehaviorAccess().getRule();
	}
	
	//////////////////////////////////////////////////////////////////////////////////
	//// Statemachine Behavior View Rules
	//////////////////////////////////////////////////////////////////////////////////
	//Statemachine returns fmlStmchn::Statemachine
	//    : { fmlStmchn::Statemachine }
	//        ( ( visibility=VisibilityKind )?
	//        & ( timed?='timed' )?
	//        & ( dense_timed?='timed#dense' )?
	//        & ( discrete_timed?='timed#discrete' )?
	//        & ( input_enabled ?= 'input_enabled' )?
	//        & ( lifeline?='lifeline' )?
	//        & ( design=DesignKind )?
	//        )
	//        'statemachine' ( '<' ( 'moc:' )? ModelOfComputationKing '>' )?
	//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
	//        '{'
	//        ( '@parameter:'  //( parameter+=Parameter )+
	//            ( 'input'
	//                ( parameter+=ParameterInput
	//                | '{' ( parameter+=ParameterInput )+ '}'
	//                )
	//            | 'inout'
	//                ( parameter+=ParameterInout
	//                | '{' ( parameter+=ParameterInout )+ '}'
	//                )
	//            | 'output'
	//                ( parameter+=ParameterOutput
	//                | '{' ( parameter+=ParameterOutput )+ '}'
	//                )
	//            | 'return'
	//                ( parameter+=ParameterReturn
	//                | '{' ( parameter+=ParameterReturn )+ '}'
	//                )
	//            )*
	//        | // optional unnamed section for property full declaration / definition
	//            ( port+=Port
	//            | signal+=Signal
	//            | buffer+=Buffer
	//            | channel+=Channel
	//            | typedef+=TypeDefinition
	//            | function+=Function
	//            | variable+=Variable
	//            )*
	//        )
	//        ( '@input:'
	//            ( parameter+=ParameterInput  )*
	//        | '@inout:'
	//            ( parameter+=ParameterInout  )*
	//        | '@output:'
	//            ( parameter+=ParameterOutput )*
	//        | '@return:'
	//            ( parameter+=ParameterReturn )*
	//        )*
	//        ( '@property:'
	//            ( port+=Port
	//            | signal+=Signal
	//            | buffer+=Buffer
	//            | channel+=Channel
	//            | typedef+=TypeDefinition
	//            | function+=Function
	//            | variable+=Variable
	//            )*
	//        | '@public:'
	//            ( port+=PortPublic
	//            | signal+=SignalPublic
	//            | buffer+=BufferPublic
	//            | channel+=ChannelPublic
	//            | typedef+=TypeDefinition
	//            | function+=FunctionPublic
	//            | variable+=VariablePublic
	//            )*
	//        | '@protected:'
	//            ( port+=PortProtected
	//            | signal+=SignalProtected
	//            | buffer+=BufferProtected
	//            | channel+=ChannelProtected
	//            | typedef+=TypeDefinition
	//            | function+=FunctionProtected
	//            | variable+=VariableProtected
	//            )*
	//        | '@private:'
	//            ( port+=PortPrivate
	//            | signal+=SignalPrivate
	//            | buffer+=BufferPrivate
	//            | channel+=ChannelPrivate
	//            | typedef+=TypeDefinition
	//            | function+=FunctionPrivate
	//            | variable+=VariablePrivate
	//            )*
	//        )*
	//        ( ( ( '@routine:' | '@macro:' ) ( routine+=Routine )+
	//          | '@procedure:' ( procedure+=Procedure )+
	//          )*
	//        | ( routine+=Routine  | procedure+=Procedure )+
	//        )
	////        ( ( '@composite:' | '@statemachine:' )  ( machine +=Statemachine )+
	//        ( ( '@statemachine:' ( machine +=Statemachine    )+
	//            | '@composite:'  ( machine +=AnyMachineBlock )*
	//            | '@model:'      ( machine +=AnyMachineBlock )*
	//            | '@prototype:'  ( machine +=AnyMachineBlock )*
	//            | '@instance:'   ( instance+=InstanceMachine )*
	//            )+
	//        | region+=StatemachineRegion
	//        | ( region+=StatemachineNamedRegion )+
	//        | region+=StatemachineRegionLite
	//        )
	////        // optional unnamed section for property full declaration / definition
	////        propertyPart=PropertyPart
	////
	////        compositePart=CompositePart
	////
	////        ( region+=StatemachineRegion
	////        | ( region+=StatemachineNamedRegion )+
	////
	////        | region+=StatemachineRegionLite
	////        )
	//        ( ( execution=ModelOfExecution )?
	////        & ( computation=ModelOfComputation )?
	//        & ( interaction=ModelOfInteraction )?
	//        )
	//        '}'
	//    ;
	public StatemachineElements getStatemachineAccess() {
		return pStatemachine;
	}
	
	public ParserRule getStatemachineRule() {
		return getStatemachineAccess().getRule();
	}
	
	//StatemachineRegion returns fmlStmchn::Region
	//    : {fmlStmchn::Region}
	//        ( '@state:' | '@region:' )
	//        ( vertex+=State
	//        | vertex+=Pseudostate
	//        )+
	//    ;
	public StatemachineRegionElements getStatemachineRegionAccess() {
		return pStatemachineRegion;
	}
	
	public ParserRule getStatemachineRegionRule() {
		return getStatemachineRegionAccess().getRule();
	}
	
	//StatemachineNamedRegion returns fmlStmchn::Region
	//    : {fmlStmchn::Region}
	//        '@region(' ( 'id:' | 'name:' )?  name=ESIdentifier
	//            ( unrestrictedName=UnrestrictedName )?  '):'
	//        ( vertex+=State
	//        | vertex+=Pseudostate
	//        )+
	//    ;
	public StatemachineNamedRegionElements getStatemachineNamedRegionAccess() {
		return pStatemachineNamedRegion;
	}
	
	public ParserRule getStatemachineNamedRegionRule() {
		return getStatemachineNamedRegionAccess().getRule();
	}
	
	//StatemachineRegionLite returns fmlStmchn::Region
	//    : ( vertex+=State | vertex+=Pseudostate )+
	//    ;
	public StatemachineRegionLiteElements getStatemachineRegionLiteAccess() {
		return pStatemachineRegionLite;
	}
	
	public ParserRule getStatemachineRegionLiteRule() {
		return getStatemachineRegionLiteAccess().getRule();
	}
	
	//////////////////////////////////////////////////////////////////////////////////
	//// State Rules
	//////////////////////////////////////////////////////////////////////////////////
	//State returns fmlStmchn::State
	//    : CompositeState
	//    | StartState
	//    | SimpleState
	//    | FinalState
	//    ;
	public StateElements getStateAccess() {
		return pState;
	}
	
	public ParserRule getStateRule() {
		return getStateAccess().getRule();
	}
	
	//////////////////////////////////////////////////////////////////////////////////
	//// CompositeState Rules
	//////////////////////////////////////////////////////////////////////////////////
	//CompositeState returns fmlStmchn::State
	//    : { fmlStmchn::State }
	//        composite?='state' '<' ( 'moc:' )? ( 'or' | orthogonal?='and' ) '>'
	//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
	//        ( '{'
	//            ( ( ( region+=StatemachineRegion
	//                | ( region+=StatemachineNamedRegion )+
	//                )
	//              & ( '@moe:' moe=moeCompositeStateRoutines )?
	//              & '@transition:' ( transition+=Transition )*
	//              )
	//            | ( ( region+=StatemachineRegionLite )*
	//              & ( moe=moeCompositeStateRoutines  )?
	//              & ( transition+=Transition )*
	//              )
	//            )
	//          '}'
	//        | ';'
	//        )
	//    ;
	public CompositeStateElements getCompositeStateAccess() {
		return pCompositeState;
	}
	
	public ParserRule getCompositeStateRule() {
		return getCompositeStateAccess().getRule();
	}
	
	//moeCompositeStateRoutines returns fmlInfra::ModelOfExecution
	//    : { fmlInfra::ModelOfExecution }
	//    ( ( '@create' createRoutine=moeRoutine )?
	//    & ( '@init'   initRoutine=moeRoutine   )?
	//    & ( '@final'  finalRoutine=moeRoutine  )?
	//    & ( '@enable'  enableRoutine=moeRoutine  )?
	//    & ( '@disable' disableRoutine=moeRoutine )?
	//    & ( '@concurrency' concurrencyRoutine=moeRoutine )?
	//    & ( ( '@schedule' | '@xschedule' ) scheduleRoutine=moeRoutine )?
	//    & ( '@irun' irunRoutine=moeRoutine )?
	//    & ( '@run'  runRoutine=moeRoutine  )?
	//    )
	//    ;
	public MoeCompositeStateRoutinesElements getMoeCompositeStateRoutinesAccess() {
		return pMoeCompositeStateRoutines;
	}
	
	public ParserRule getMoeCompositeStateRoutinesRule() {
		return getMoeCompositeStateRoutinesAccess().getRule();
	}
	
	//////////////////////////////////////////////////////////////////////////////////
	//// SimpleState Rules
	//////////////////////////////////////////////////////////////////////////////////
	//SimpleState returns fmlStmchn::State
	//    : { fmlStmchn::State }
	//    simple?='state' ( '<' ( 'moc:' )? 'simple' '>' )?
	//    name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
	//    ( '{'
	//        (
	//            ( ( transition+=Transition    )*
	//            & ( moe=moeSimpleStateRoutines )?
	//            )
	////        |
	////            ( ( '@transition:'  ( transition+=Transition )* )?
	////            & ( '@moe:'         moe=moeSimpleStateRoutines  )?
	////            )
	//        )
	//      '}'
	//    | ';'
	//    )
	//    ;
	public SimpleStateElements getSimpleStateAccess() {
		return pSimpleState;
	}
	
	public ParserRule getSimpleStateRule() {
		return getSimpleStateAccess().getRule();
	}
	
	//moeSimpleStateRoutines returns fmlInfra::ModelOfExecution
	//    : { fmlInfra::ModelOfExecution }
	//    ( ( '@enable'  enableRoutine=moeRoutine  )?
	//    & ( '@disable' disableRoutine=moeRoutine )?
	//    & ( '@irun' irunRoutine=moeRoutine )?
	////    & ( '@run'  runRoutine=moeRoutine  )?
	//    )
	//    ;
	public MoeSimpleStateRoutinesElements getMoeSimpleStateRoutinesAccess() {
		return pMoeSimpleStateRoutines;
	}
	
	public ParserRule getMoeSimpleStateRoutinesRule() {
		return getMoeSimpleStateRoutinesAccess().getRule();
	}
	
	//////////////////////////////////////////////////////////////////////////////////
	//// StartState Rules
	//////////////////////////////////////////////////////////////////////////////////
	//StartState returns fmlStmchn::StartState
	//    : { fmlStmchn::StartState }
	//    ( simple?='state' '<' ( 'moc:' )? 'start' '>' name=ESIdentifier
	//    | simple?='#start'
	//    )
	//    ( unrestrictedName=UnrestrictedName )?
	//    ( '{'
	//        (
	//            ( ( transition+=Transition    )*
	//            & ( moe=moeStartStateRoutines )?
	//            )
	////        |
	////            ( ( '@transition:'  ( transition+=Transition )* )?
	////            & ( '@moe:'         moe=moeStartStateRoutines  )?
	////            )
	//        )
	//      '}'
	//    | ';'
	//    )
	//    ;
	public StartStateElements getStartStateAccess() {
		return pStartState;
	}
	
	public ParserRule getStartStateRule() {
		return getStartStateAccess().getRule();
	}
	
	//moeStartStateRoutines returns fmlInfra::ModelOfExecution
	//    : { fmlInfra::ModelOfExecution }
	//    ( ( '@create' createRoutine=moeRoutine )?
	//    & ( '@init'   initRoutine=moeRoutine   )?
	//    & ( '@final'  finalRoutine=moeRoutine  )?
	//    & ( '@enable'  enableRoutine=moeRoutine  )?
	//    & ( '@disable' disableRoutine=moeRoutine )?
	//    & ( '@irun' irunRoutine=moeRoutine )?
	////    & ( '@run'  runRoutine=moeRoutine  )?
	//    )
	//    ;
	public MoeStartStateRoutinesElements getMoeStartStateRoutinesAccess() {
		return pMoeStartStateRoutines;
	}
	
	public ParserRule getMoeStartStateRoutinesRule() {
		return getMoeStartStateRoutinesAccess().getRule();
	}
	
	//////////////////////////////////////////////////////////////////////////////////
	//// FinalState Rules
	//////////////////////////////////////////////////////////////////////////////////
	//FinalState returns fmlStmchn::FinalState
	//    : { fmlStmchn::FinalState }
	//    ( simple?='state' '<' ( 'moc:' )? 'final' '>' name=ESIdentifier
	//    | simple?='#final'
	//    )
	//    ( unrestrictedName=UnrestrictedName )?
	//    ( '{'
	//        ( ( '@moe:' )?  moe=moeFinalStateRoutines )?
	//      '}'
	//    | ';'
	//    )
	//    ;
	public FinalStateElements getFinalStateAccess() {
		return pFinalState;
	}
	
	public ParserRule getFinalStateRule() {
		return getFinalStateAccess().getRule();
	}
	
	//moeFinalStateRoutines returns fmlInfra::ModelOfExecution
	//    : { fmlInfra::ModelOfExecution }
	//    ( ( '@enable'  enableRoutine=moeRoutine )?
	//    & ( '@final'   finalRoutine=moeRoutine  )?
	////    & ( '@run'     runRoutine=moeRoutine    )?
	//    )
	//    ;
	public MoeFinalStateRoutinesElements getMoeFinalStateRoutinesAccess() {
		return pMoeFinalStateRoutines;
	}
	
	public ParserRule getMoeFinalStateRoutinesRule() {
		return getMoeFinalStateRoutinesAccess().getRule();
	}
	
	//////////////////////////////////////////////////////////////////////////////////
	//// Pseudostate Rules
	//////////////////////////////////////////////////////////////////////////////////
	//Pseudostate returns fmlStmchn::Pseudostate
	//    : PseudostateInitial
	//    | EndingPseudostate
	//    | OtherPseudostate
	//    ;
	public PseudostateElements getPseudostateAccess() {
		return pPseudostate;
	}
	
	public ParserRule getPseudostateRule() {
		return getPseudostateAccess().getRule();
	}
	
	//OtherPseudostate returns fmlStmchn::Pseudostate
	//    : { fmlStmchn::Pseudostate }
	//        ( 'state' | 'pseudostate' ) '<' ( 'moc:' )? kind=PseudostateKind '>'
	//        name=ESIdentifier
	//        ( unrestrictedName=UnrestrictedName )?
	//        ( '{'
	//        (
	//            ( ( transition+=Transition    )*
	//            & ( moe=moePseudotateRoutines )?
	//            )
	////        |
	////            ( ( '@transition:'  ( transition+=Transition )* )?
	////            & ( '@moe:'         moe=moePseudotateRoutines  )?
	////            )
	//        )
	//          '}'
	//        | ';'
	//        )
	////    | PseudostateInitial
	////    | PseudostateTerminal
	////    | PseudostateReturn
	////    | PseudostateJunction
	////    | PseudostateChoice
	////    | PseudostateFork
	////    | PseudostateJoin
	////    | PseudostateDeepHistory
	////    | PseudostateShallowHistory
	//    ;
	public OtherPseudostateElements getOtherPseudostateAccess() {
		return pOtherPseudostate;
	}
	
	public ParserRule getOtherPseudostateRule() {
		return getOtherPseudostateAccess().getRule();
	}
	
	//moePseudotateRoutines returns fmlInfra::ModelOfExecution
	//    : { fmlInfra::ModelOfExecution }
	//    ( ( '@enable'  enableRoutine=moeRoutine  )?
	//    & ( '@disable' disableRoutine=moeRoutine )?
	//    )
	//    ;
	public MoePseudotateRoutinesElements getMoePseudotateRoutinesAccess() {
		return pMoePseudotateRoutines;
	}
	
	public ParserRule getMoePseudotateRoutinesRule() {
		return getMoePseudotateRoutinesAccess().getRule();
	}
	
	//enum PseudostateKind returns fmlStmchn::PseudostateKind
	//    : Junction='junction'
	//    | Choice  ='choice'
	//    | EntryPoint='entryPoint'
	//    | ExitPoint  ='exitPoint'
	////    | Initial ='initial'
	////
	////    | Terminal='terminal'
	////    | Return   ='return'
	//    | Fork='fork'
	//    | Join='join'
	//    | DeepHistory   ='dhistory'
	//    | ShallowHistory='shistory'
	//    ;
	public PseudostateKindElements getPseudostateKindAccess() {
		return ePseudostateKind;
	}
	
	public EnumRule getPseudostateKindRule() {
		return getPseudostateKindAccess().getRule();
	}
	
	//PseudostateInitial returns fmlStmchn::Pseudostate
	//    : { fmlStmchn::Pseudostate }
	//    ( ( 'state' | 'pseudostate' )
	//        '<' ( 'moc:' )? kind=PseudostateInitialKind '>'
	//        name=(ESIdentifier | '#initial' | '#init' )
	//    | name=( '#initial' | '#init' )
	//    )
	//    ( unrestrictedName=UnrestrictedName )?
	//    ( '{'  ( ( '@transition:' )?  ( transition+=Transition )* )?  '}'
	//    | ';'
	//    )
	//    ;
	public PseudostateInitialElements getPseudostateInitialAccess() {
		return pPseudostateInitial;
	}
	
	public ParserRule getPseudostateInitialRule() {
		return getPseudostateInitialAccess().getRule();
	}
	
	//enum PseudostateInitialKind returns fmlStmchn::PseudostateKind
	//    : Initial ='initial'
	//    ;
	public PseudostateInitialKindElements getPseudostateInitialKindAccess() {
		return ePseudostateInitialKind;
	}
	
	public EnumRule getPseudostateInitialKindRule() {
		return getPseudostateInitialKindAccess().getRule();
	}
	
	//EndingPseudostate returns fmlStmchn::Pseudostate
	//    : { fmlStmchn::Pseudostate }
	//    ( 'state' | 'pseudostate' ) '<' ( 'moc:' )? kind=EndingPseudostateKind '>'
	//    name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
	//    ( '{'  ( ( '@moe:' )?  moe=moeFinalStateRoutines )?  '}'
	//    | ';'
	//    )
	//    ;
	public EndingPseudostateElements getEndingPseudostateAccess() {
		return pEndingPseudostate;
	}
	
	public ParserRule getEndingPseudostateRule() {
		return getEndingPseudostateAccess().getRule();
	}
	
	//enum EndingPseudostateKind returns fmlStmchn::PseudostateKind
	//    : Terminal='terminal'
	//    | Return='return'
	//    ;
	public EndingPseudostateKindElements getEndingPseudostateKindAccess() {
		return eEndingPseudostateKind;
	}
	
	public EnumRule getEndingPseudostateKindRule() {
		return getEndingPseudostateKindAccess().getRule();
	}
	
	//////////////////////////////////////////////////////////////////////////////////
	//// Section Model Of Computation Rules
	//////////////////////////////////////////////////////////////////////////////////
	//ModelOfComputation returns fmlInfra::ModelOfComputation
	//    : { fmlInfra::ModelOfComputation }
	//    ;
	public ModelOfComputationElements getModelOfComputationAccess() {
		return pModelOfComputation;
	}
	
	public ParserRule getModelOfComputationRule() {
		return getModelOfComputationAccess().getRule();
	}
	
	//////////////////////////////////////////////////////////////////////////////////
	//// Section Model Of Execution Rules
	//////////////////////////////////////////////////////////////////////////////////
	//ModelOfExecution returns fmlInfra::ModelOfExecution
	//    : { fmlInfra::ModelOfExecution }
	//    '@moe:'
	//    ( routine+=Routine )*
	//    ( ( '@create'  createRoutine=moeRoutine )?
	//    & ( '@init'    initRoutine=moeRoutine   )?
	//    & ( '@final'   finalRoutine=moeRoutine  )?
	//    & ( '@enable'  enableRoutine=moeRoutine  )?
	//    & ( '@disable' disableRoutine=moeRoutine )?
	//    & ( '@concurrency' concurrencyRoutine=moeRoutine )?
	//    & ( ( '@schedule' | '@xschedule' )    scheduleRoutine=moeRoutine )?
	//    & ( '@irun' irunRoutine=moeRoutine )?
	//    & ( '@run'  runRoutine=moeRoutine  )?
	//    )
	//    ( routine+=Routine )*
	//    ;
	public ModelOfExecutionElements getModelOfExecutionAccess() {
		return pModelOfExecution;
	}
	
	public ParserRule getModelOfExecutionRule() {
		return getModelOfExecutionAccess().getRule();
	}
	
	//moeRoutine returns fmlInfra::Routine
	//    : { fmlInfra::Routine }
	//        ( '(' ( parameterSet=FormalParameterSet )? ')' )?
	//        ('->'
	//            (     resultSet=FormalParameterSet
	//            | '(' resultSet=FormalParameterSet ')'
	//            )
	//        )?
	//        bodyBlock=BlockStatement
	//    ;
	public MoeRoutineElements getMoeRoutineAccess() {
		return pMoeRoutine;
	}
	
	public ParserRule getMoeRoutineRule() {
		return getMoeRoutineAccess().getRule();
	}
	
	//Routine returns fmlInfra::Routine
	//    : ( visibility=VisibilityKind )?  ( macro?='macro' )?  ( DesignDebugTrace )*
	//        'routine'
	//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
	//        ( '(' ( parameterSet=FormalParameterSet )? ')' )?
	//        ( '-->'
	//            (     resultSet=FormalParameterSet
	//            | '(' resultSet=FormalParameterSet ')'
	//            )
	//        )?
	//        bodyBlock=BlockStatement
	//    ;
	public RoutineElements getRoutineAccess() {
		return pRoutine;
	}
	
	public ParserRule getRoutineRule() {
		return getRoutineAccess().getRule();
	}
	
	//////////////////////////////////////////////////////////////////////////////////
	//// Section Model Of Interaction / Communication Rules
	//////////////////////////////////////////////////////////////////////////////////
	//ModelOfInteraction returns fmlInfra::ModelOfInteraction
	//    : { fmlInfra::ModelOfInteraction }
	//        '@com:'
	//        ( routes+=Route
	//        | connectors+=Connector
	//        )*
	//    ;
	public ModelOfInteractionElements getModelOfInteractionAccess() {
		return pModelOfInteraction;
	}
	
	public ParserRule getModelOfInteractionRule() {
		return getModelOfInteractionAccess().getRule();
	}
	
	//Route returns fmlInfra::Route
	//    : { fmlInfra::Route }
	//        'route' '<' protocol=ComRouteProtocol '>'
	//        ( name=ESIdentifier ( unrestrictedName=UnrestrictedName )? )?
	//        '['
	//        ( '*'
	//        | signals+=[fmlInfra::Signal|ESUfid]
	//            ( ',' signals+=[fmlInfra::Signal|ESUfid] )*
	//        )
	//        ']' ';'
	//    ;
	public RouteElements getRouteAccess() {
		return pRoute;
	}
	
	public ParserRule getRouteRule() {
		return getRouteAccess().getRule();
	}
	
	//ComRouteProtocol returns fmlInfra::ComProtocol
	//    : protocol=ComProtocolKind
	//    | protocol=BufferProtocolKind
	//        ( ':'
	//            ( inner_buffer=BufferContainerType
	//            | buffer=ComBuffer
	//            )
	//        | '<'
	//            ( inner_buffer=BufferContainerType
	//            | buffer=ComBuffer
	//            ) '>'
	//        )?
	//    | inner_buffer=BufferContainerType
	//    | buffer=ComBuffer
	//    ;
	public ComRouteProtocolElements getComRouteProtocolAccess() {
		return pComRouteProtocol;
	}
	
	public ParserRule getComRouteProtocolRule() {
		return getComRouteProtocolAccess().getRule();
	}
	
	//Connector returns fmlInfra::Connector
	//    : ( 'connector' | 'connect' ) '<' protocol=ComProtocol '>'
	//        ( name=ESIdentifier )?  ( unrestrictedName=UnrestrictedName )?
	//        '{' (connectorEnd+=ConnectorEnd)+ '}'
	//    ;
	public ConnectorElements getConnectorAccess() {
		return pConnector;
	}
	
	public ParserRule getConnectorRule() {
		return getConnectorAccess().getRule();
	}
	
	//ComProtocol returns fmlInfra::ComProtocol
	//    : protocol=ComEnvRdvProtocolKind
	//    | protocol=ComMultiRdvProtocolKind ( '<' cast=ComCastKing '>')?
	//    | protocol=BufferProtocolKind
	//        ( ':'
	//            ( inner_buffer=BufferContainerType
	//            | buffer=ComBuffer
	//            )
	//        | '<'
	//            ( inner_buffer=BufferContainerType
	//            | buffer=ComBuffer
	//            ) '>'
	//        )?
	//    | inner_buffer=BufferContainerType
	//    | buffer=ComBuffer
	//    | cast=ComCastKing
	//    ;
	public ComProtocolElements getComProtocolAccess() {
		return pComProtocol;
	}
	
	public ParserRule getComProtocolRule() {
		return getComProtocolAccess().getRule();
	}
	
	//enum ComProtocolKind returns fmlInfra::ComProtocolKind
	//    : env       = 'env'
	//    | rdv       = 'rdv'
	//    | multi_rdv = 'multirdv'
	//    ;
	public ComProtocolKindElements getComProtocolKindAccess() {
		return eComProtocolKind;
	}
	
	public EnumRule getComProtocolKindRule() {
		return getComProtocolKindAccess().getRule();
	}
	
	//enum ComEnvRdvProtocolKind returns fmlInfra::ComProtocolKind
	//    : env = 'env'
	//    | rdv = 'rdv'
	//    ;
	public ComEnvRdvProtocolKindElements getComEnvRdvProtocolKindAccess() {
		return eComEnvRdvProtocolKind;
	}
	
	public EnumRule getComEnvRdvProtocolKindRule() {
		return getComEnvRdvProtocolKindAccess().getRule();
	}
	
	//enum ComMultiRdvProtocolKind returns fmlInfra::ComProtocolKind
	//    : multi_rdv = 'multirdv'
	//    ;
	public ComMultiRdvProtocolKindElements getComMultiRdvProtocolKindAccess() {
		return eComMultiRdvProtocolKind;
	}
	
	public EnumRule getComMultiRdvProtocolKindRule() {
		return getComMultiRdvProtocolKindAccess().getRule();
	}
	
	//enum BufferProtocolKind returns fmlInfra::ComProtocolKind
	//    : buffer = 'buffer'
	//    ;
	public BufferProtocolKindElements getBufferProtocolKindAccess() {
		return eBufferProtocolKind;
	}
	
	public EnumRule getBufferProtocolKindRule() {
		return getBufferProtocolKindAccess().getRule();
	}
	
	//enum ComCastKing returns fmlInfra::ComCastKind
	//    : unicast   = 'unicast'
	//    | anycast   = 'anycast'
	//    | multicast = 'multicast'
	//    | broadcast = 'broadcast'
	//    ;
	public ComCastKingElements getComCastKingAccess() {
		return eComCastKing;
	}
	
	public EnumRule getComCastKingRule() {
		return getComCastKingAccess().getRule();
	}
	
	//ConnectorEnd returns fmlInfra::ConnectorEnd
	//    : { fmlInfra::ConnectorEnd }
	//        direction=ChannelDirection ( '<' protocol=ComPointProtocol '>' )?
	//        ( points+=ComPoint ';'
	//        | '[' points+=ComPoint ( ',' points+=ComPoint )* ']' ';'
	//        | '{' ( points+=ComPoint ';' )+ '}'
	//        )
	//    ;
	public ConnectorEndElements getConnectorEndAccess() {
		return pConnectorEnd;
	}
	
	public ParserRule getConnectorEndRule() {
		return getConnectorEndAccess().getRule();
	}
	
	//ComPoint returns fmlInfra::ComPoint
	//    : { fmlInfra::ComPoint }
	//        ( machine=[fmlCommon::NamedElement|ESIdentifier] ('->'| '.') )?
	////        ( machine=ValuePureNamedMachineExpression  ('->'| '.') )?
	//        port=[fmlInfra::Port|ESIdentifier]
	//    ;
	public ComPointElements getComPointAccess() {
		return pComPoint;
	}
	
	public ParserRule getComPointRule() {
		return getComPointAccess().getRule();
	}
	
	//ComPointProtocol returns fmlInfra::ComProtocol
	//    : protocol=BufferProtocolKind
	//        ( ':'
	//            ( inner_buffer=BufferContainerType
	//            | buffer=ComBuffer
	//            )
	//        | '<'
	//            ( inner_buffer=BufferContainerType
	//            | buffer=ComBuffer
	//            ) '>'
	//        )?
	//    | inner_buffer=BufferContainerType
	////    | buffer=ComBuffer
	//    | bufferRef=ComBufferRef
	//    ;
	public ComPointProtocolElements getComPointProtocolAccess() {
		return pComPointProtocol;
	}
	
	public ParserRule getComPointProtocolRule() {
		return getComPointProtocolAccess().getRule();
	}
	
	//ComBuffer returns fmlExpr::ValueElementSpecification
	//    : ( parent=LiteralPureReferenceMachine
	//        // ( '.' | '->' ) element
	//        kind=( ValueDotFieldExpressionKind | ValueArrowFieldExpressionKind )
	//      )?
	//      element=[fmlInfra::Buffer|ESIdentifier]
	//    ;
	public ComBufferElements getComBufferAccess() {
		return pComBuffer;
	}
	
	public ParserRule getComBufferRule() {
		return getComBufferAccess().getRule();
	}
	
	//ComBufferRef returns fmlExpr::LiteralReferenceSpecification
	//    : { fmlExpr::LiteralReferenceSpecification }
	//        ( parent+=LiteralReferenceExpression ( '.'  |  '->' ) )*
	//        element=BufferReferenceElement
	//    ;
	public ComBufferRefElements getComBufferRefAccess() {
		return pComBufferRef;
	}
	
	public ParserRule getComBufferRefRule() {
		return getComBufferRefAccess().getRule();
	}
	
	//BufferReferenceElement returns fmlExpr::LiteralReferenceElement
	//    : {fmlExpr::LiteralReferenceElement}
	//        element=[fmlInfra::Buffer|ESIdentifier]
	//    ;
	public BufferReferenceElementElements getBufferReferenceElementAccess() {
		return pBufferReferenceElement;
	}
	
	public ParserRule getBufferReferenceElementRule() {
		return getBufferReferenceElementAccess().getRule();
	}
	
	//LiteralPureReferenceMachine returns fmlExpr::LiteralReferenceExpression
	//    : {fmlExpr::LiteralReferenceElement}
	//        element=[fmlInfra::Machine|ESIdentifier]
	//    | LiteralReferenceMachineContext
	//    ;
	public LiteralPureReferenceMachineElements getLiteralPureReferenceMachineAccess() {
		return pLiteralPureReferenceMachine;
	}
	
	public ParserRule getLiteralPureReferenceMachineRule() {
		return getLiteralPureReferenceMachineAccess().getRule();
	}
	
	//////////////////////////////////////////////////////////////////////////////////
	//// Sections Declarations Data Rules
	//////////////////////////////////////////////////////////////////////////////////
	////TypeDefinition returns fmlType::DataType
	////    : typedef?='type' name=ESIdentifier
	////        ( support=DataTypeReference ';'
	////        | support=StructuredDataType
	////        )
	////    ;
	//TypeDefinition returns fmlType::DataType
	//    : EnumerationTypeDefinition
	//    | StructureTypeDefinition
	//    | UnionTypeDefinition
	//    | ChoiceTypeDefinition
	//    | IntervalTypeDefinition
	//    | CollectionTypeDefinition
	//    | OtherDataTypeDefinition
	//    ;
	public TypeDefinitionElements getTypeDefinitionAccess() {
		return pTypeDefinition;
	}
	
	public ParserRule getTypeDefinitionRule() {
		return getTypeDefinitionAccess().getRule();
	}
	
	////TypeDefinitionImpl returns fmlType::DataTypeReference
	////    : name=ESIdentifier
	////        ( support=DataTypeReference ';'
	////        | support=StructuredDataType
	////        )
	////    ;
	////TypeDefinitionImpl returns fmlType::DataType
	////    : EnumerationTypeDefinitionImpl
	////    | StructureTypeDefinitionImpl
	////    | UnionTypeDefinitionImpl
	////    | ChoiceTypeDefinitionImpl
	////
	////    | IntervalTypeDefinitionImpl
	////    | CollectionTypeDefinitionImpl
	////
	////    | OtherDataTypeDefinitionImpl
	////    ;
	//DataTypeMultiplicity returns fmlExpr::Expression
	//    : LiteralIntegerExpression
	//    | LiteralReferenceElement
	//    ;
	public DataTypeMultiplicityElements getDataTypeMultiplicityAccess() {
		return pDataTypeMultiplicity;
	}
	
	public ParserRule getDataTypeMultiplicityRule() {
		return getDataTypeMultiplicityAccess().getRule();
	}
	
	//DataTypeReference returns fmlType::DataType
	//    : SimpleDataType
	//        ( {fmlType::DataTypeReference.support=current}
	//            '[' multiplicity=DataTypeMultiplicity ']'
	//        )?
	//    | {fmlType::DataTypeReference}
	//        typeref=[fmlType::DataType|ESUfid]
	//        ( '[' multiplicity=DataTypeMultiplicity ']' )?
	//    ;
	public DataTypeReferenceElements getDataTypeReferenceAccess() {
		return pDataTypeReference;
	}
	
	public ParserRule getDataTypeReferenceRule() {
		return getDataTypeReferenceAccess().getRule();
	}
	
	//OtherDataTypeDefinition returns fmlType::DataTypeReference
	//    : {fmlType::DataTypeReference}
	//        ( visibility=VisibilityKind )?  typedef?='type'
	//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
	//        ( support=PrimitiveType
	//            ( '[' multiplicity=DataTypeMultiplicity ']' )?
	//        | typeref=[fmlType::DataType|ESUfid]
	//            ( '[' multiplicity=DataTypeMultiplicity ']' )?
	//        )  ( constraint=TypeConstraintRoutine | ';' )
	//    ;
	public OtherDataTypeDefinitionElements getOtherDataTypeDefinitionAccess() {
		return pOtherDataTypeDefinition;
	}
	
	public ParserRule getOtherDataTypeDefinitionRule() {
		return getOtherDataTypeDefinitionAccess().getRule();
	}
	
	//TypeConstraintRoutine returns fmlInfra::Routine
	//    : { fmlInfra::Routine } '{'
	//        '@constraint'
	//        ( '(' parameterSet=VariableRoutineParameterSet ')' )?
	//        ( bodyBlock=BlockStatement
	//        | bodyBlock=ConditionalBlockStatement ';'
	//        )
	//        '}'
	//    ;
	public TypeConstraintRoutineElements getTypeConstraintRoutineAccess() {
		return pTypeConstraintRoutine;
	}
	
	public ParserRule getTypeConstraintRoutineRule() {
		return getTypeConstraintRoutineAccess().getRule();
	}
	
	//ConditionalBlockStatement returns fmlStmnt::BlockStatement
	//    : {fmlStmnt::BlockStatement}
	//        statement+=GuardTestExpression
	//    ;
	public ConditionalBlockStatementElements getConditionalBlockStatementAccess() {
		return pConditionalBlockStatement;
	}
	
	public ParserRule getConditionalBlockStatementRule() {
		return getConditionalBlockStatementAccess().getRule();
	}
	
	//GuardTestExpression returns fmlStmnt::GuardStatement
	//    : '|=>' condition=Expression
	//    ;
	public GuardTestExpressionElements getGuardTestExpressionAccess() {
		return pGuardTestExpression;
	}
	
	public ParserRule getGuardTestExpressionRule() {
		return getGuardTestExpressionAccess().getRule();
	}
	
	////OtherDataTypeDefinitionImpl returns fmlType::DataTypeReference
	////    : {fmlType::DataTypeReference}
	////        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
	////        ( support=PrimitiveType
	////            ( '[' multiplicity=DataTypeMultiplicity ']' )?
	////        | typeref=[fmlType::DataType|ESUfid]
	////            ( '[' multiplicity=DataTypeMultiplicity ']' )?
	////        )  typedef?=';'
	////    ;
	//DataType returns fmlType::DataType
	//    : DataTypeReference
	//    | StructuredDataType
	//    ;
	public DataTypeElements getDataTypeAccess() {
		return pDataType;
	}
	
	public ParserRule getDataTypeRule() {
		return getDataTypeAccess().getRule();
	}
	
	//SimpleDataType returns fmlType::DataType
	//    : PrimitiveType
	//    | IntervalType
	//    | CollectionType
	//    ;
	public SimpleDataTypeElements getSimpleDataTypeAccess() {
		return pSimpleDataType;
	}
	
	public ParserRule getSimpleDataTypeRule() {
		return getSimpleDataTypeAccess().getRule();
	}
	
	//StructuredDataType returns fmlType::DataType
	//    : EnumerationType
	//    | StructureType
	//    | UnionType
	//    | ChoiceType
	//    ;
	public StructuredDataTypeElements getStructuredDataTypeAccess() {
		return pStructuredDataType;
	}
	
	public ParserRule getStructuredDataTypeRule() {
		return getStructuredDataTypeAccess().getRule();
	}
	
	////PrimitiveType returns fmlType::PrimitiveType
	////    : kind=NumberPrimitiveTypeKind ( '<' ( 'bit:' )? bitSize = EInt '>' )?
	////    | kind=OtherPrimitiveKind
	////    ;
	////
	////enum OtherPrimitiveKind returns fmlType::PrimitiveTypeKind
	////    : BOOLEAN   = 'boolean'
	////    | BOOLEAN   = 'bool'
	////    | CHAR      = 'char'
	////    | STRING    = 'string'
	////    | BUFFER    = 'buffer'
	////    | MESSAGE   = 'message'
	////    | PORT      = 'port'
	////    | MACHINE   = 'machine'
	////    ;
	////
	////
	////enum NumberPrimitiveTypeKind returns fmlType::PrimitiveTypeKind
	////    : INTEGER   = 'integer'
	////    | RATIONAL  = 'rational'
	////    | FLOAT     = 'float'
	////    | DOUBLE    = 'double'
	////    | REAL      = 'real'
	////
	////    | TIME      = 'time'
	////
	////    | UINTEGER  = 'uinteger'
	////    | URATIONAL = 'urational'
	////    | UFLOAT    = 'ufloat'
	////    | UDOUBLE   = 'udouble'
	////    | UREAL     = 'ureal'
	////
	////    | INT       = 'int'
	////    | RAT       = 'rat'
	////
	////    | UINT      = 'uint'
	////    | URAT      = 'urat'
	////    ;
	//PrimitiveType returns fmlType::PrimitiveType
	//    : PrimitiveNumberType
	//    | OtherPrimitiveType
	//    ;
	public PrimitiveTypeElements getPrimitiveTypeAccess() {
		return pPrimitiveType;
	}
	
	public ParserRule getPrimitiveTypeRule() {
		return getPrimitiveTypeAccess().getRule();
	}
	
	//PrimitiveNumberType returns fmlType::PrimitiveNumberType
	//    : PrimitiveIntegerType
	//    | PrimitiveRationalType
	//    | PrimitiveFloatType
	//    | PrimitiveRealType
	//    | PrimitiveTimeType
	//    ;
	public PrimitiveNumberTypeElements getPrimitiveNumberTypeAccess() {
		return pPrimitiveNumberType;
	}
	
	public ParserRule getPrimitiveNumberTypeRule() {
		return getPrimitiveNumberTypeAccess().getRule();
	}
	
	//enum PrimitiveNumberSign returns fmlType::PrimitiveNumberSign
	//    : positive='+'
	//    | positive_strict='++'
	//    | negative='-'
	//    | negative_strict='--'
	//    ;
	public PrimitiveNumberSignElements getPrimitiveNumberSignAccess() {
		return ePrimitiveNumberSign;
	}
	
	public EnumRule getPrimitiveNumberSignRule() {
		return getPrimitiveNumberSignAccess().getRule();
	}
	
	//PrimitiveIntegerType returns fmlType::PrimitiveIntegerType
	//    : { fmlType::PrimitiveIntegerType }
	//        ( sign=PrimitiveNumberSign )?
	//        name=( 'integer'
	//        | 'uinteger'
	//        | 'pos_integer'
	//        | 'int'
	//        | 'uint'
	//        )
	//        ( ':' size = EInt
	//            | '<' ( 'size:' )? size = EInt '>'
	//        )?
	//    ;
	public PrimitiveIntegerTypeElements getPrimitiveIntegerTypeAccess() {
		return pPrimitiveIntegerType;
	}
	
	public ParserRule getPrimitiveIntegerTypeRule() {
		return getPrimitiveIntegerTypeAccess().getRule();
	}
	
	//PrimitiveRationalType returns fmlType::PrimitiveRationalType
	//    : { fmlType::PrimitiveRationalType }
	//        ( sign=PrimitiveNumberSign )?
	//        name=( 'rational'
	//        | 'urational'
	//        | 'pos_rational'
	//        | 'rat'
	//        | 'urat'
	//        )
	//        ( ':' size = EInt
	//            | '<' ( 'size:' )? size = EInt '>'
	//        )?
	//    ;
	public PrimitiveRationalTypeElements getPrimitiveRationalTypeAccess() {
		return pPrimitiveRationalType;
	}
	
	public ParserRule getPrimitiveRationalTypeRule() {
		return getPrimitiveRationalTypeAccess().getRule();
	}
	
	//PrimitiveFloatType returns fmlType::PrimitiveFloatType
	//    : { fmlType::PrimitiveFloatType }
	//        ( sign=PrimitiveNumberSign )?
	//        name=( 'float'
	//        | 'ufloat'
	//        | 'pos_float'
	//        | 'double'
	//        | 'udouble'
	//        )
	//        ( ':' size = EInt
	//            | '<' ( 'size:' )? size = EInt '>'
	//        )?
	//    ;
	public PrimitiveFloatTypeElements getPrimitiveFloatTypeAccess() {
		return pPrimitiveFloatType;
	}
	
	public ParserRule getPrimitiveFloatTypeRule() {
		return getPrimitiveFloatTypeAccess().getRule();
	}
	
	//PrimitiveRealType returns fmlType::PrimitiveRealType
	//    : { fmlType::PrimitiveRealType }
	//        ( sign=PrimitiveNumberSign )?
	//        name=( 'real'
	//        | 'ureal'
	//        | 'pos_real'
	//        )
	//        ( ':' size = EInt
	//            | '<' ( 'size:' )? size = EInt '>'
	//        )?
	//    ;
	public PrimitiveRealTypeElements getPrimitiveRealTypeAccess() {
		return pPrimitiveRealType;
	}
	
	public ParserRule getPrimitiveRealTypeRule() {
		return getPrimitiveRealTypeAccess().getRule();
	}
	
	//PrimitiveTimeType returns fmlType::PrimitiveTimeType
	//    : { fmlType::PrimitiveTimeType }
	//        'time'
	//        ( '<' support=PrimitiveTimeNumberType '>'
	//        | support=PrimitiveTimeNumberType
	//        )?
	//    | { fmlType::PrimitiveTimeType }
	//        clock?='clock'
	//        ( '<' support=PrimitiveTimeNumberType '>'
	//        | support=PrimitiveTimeNumberType
	//        )?
	//    ;
	public PrimitiveTimeTypeElements getPrimitiveTimeTypeAccess() {
		return pPrimitiveTimeType;
	}
	
	public ParserRule getPrimitiveTimeTypeRule() {
		return getPrimitiveTimeTypeAccess().getRule();
	}
	
	//PrimitiveTimeNumberType returns fmlType::PrimitiveNumberType
	//    : PrimitiveIntegerType
	//    | PrimitiveRationalType
	//    | PrimitiveFloatType
	//    | PrimitiveRealType
	//    ;
	public PrimitiveTimeNumberTypeElements getPrimitiveTimeNumberTypeAccess() {
		return pPrimitiveTimeNumberType;
	}
	
	public ParserRule getPrimitiveTimeNumberTypeRule() {
		return getPrimitiveTimeNumberTypeAccess().getRule();
	}
	
	//OtherPrimitiveType returns fmlType::PrimitiveType
	//    : PrimitiveBooleanType
	//    | PrimitiveCharacterType
	//    | PrimitiveStringType
	//    | PrimitiveInstanceType
	//    ;
	public OtherPrimitiveTypeElements getOtherPrimitiveTypeAccess() {
		return pOtherPrimitiveType;
	}
	
	public ParserRule getOtherPrimitiveTypeRule() {
		return getOtherPrimitiveTypeAccess().getRule();
	}
	
	//PrimitiveBooleanType returns fmlType::PrimitiveBooleanType
	//    : { fmlType::PrimitiveBooleanType }
	//        name=( 'boolean'| 'bool' )
	//    ;
	public PrimitiveBooleanTypeElements getPrimitiveBooleanTypeAccess() {
		return pPrimitiveBooleanType;
	}
	
	public ParserRule getPrimitiveBooleanTypeRule() {
		return getPrimitiveBooleanTypeAccess().getRule();
	}
	
	//PrimitiveCharacterType returns fmlType::PrimitiveCharacterType
	//    : { fmlType::PrimitiveCharacterType } 'char'
	//    ;
	public PrimitiveCharacterTypeElements getPrimitiveCharacterTypeAccess() {
		return pPrimitiveCharacterType;
	}
	
	public ParserRule getPrimitiveCharacterTypeRule() {
		return getPrimitiveCharacterTypeAccess().getRule();
	}
	
	//PrimitiveStringType returns fmlType::PrimitiveStringType
	//    : { fmlType::PrimitiveStringType }
	//        name='string'
	//        ( ':' size = EInt
	//        | '<' ( 'size:' )? size = EInt '>'
	//        )?
	//    ;
	public PrimitiveStringTypeElements getPrimitiveStringTypeAccess() {
		return pPrimitiveStringType;
	}
	
	public ParserRule getPrimitiveStringTypeRule() {
		return getPrimitiveStringTypeAccess().getRule();
	}
	
	//enum PrimitiveInstanceKind returns fmlType::PrimitiveInstanceKind
	//    : buffer='buffer'
	//    | message='message'
	//    | port='port'
	//    | signal='signal'
	//    | machine='machine'
	//    | vertex='vertex'
	//    ;
	public PrimitiveInstanceKindElements getPrimitiveInstanceKindAccess() {
		return ePrimitiveInstanceKind;
	}
	
	public EnumRule getPrimitiveInstanceKindRule() {
		return getPrimitiveInstanceKindAccess().getRule();
	}
	
	//PrimitiveInstanceType returns fmlType::PrimitiveInstanceType
	//    : { fmlType::PrimitiveInstanceType }
	//        expected=PrimitiveInstanceKind
	//        ( '<' model=[fmlCommon::NamedElement|ESIdentifier] '>' )?
	//    ;
	public PrimitiveInstanceTypeElements getPrimitiveInstanceTypeAccess() {
		return pPrimitiveInstanceType;
	}
	
	public ParserRule getPrimitiveInstanceTypeRule() {
		return getPrimitiveInstanceTypeAccess().getRule();
	}
	
	//IntervalType returns fmlType::IntervalType
	//    : {fmlType::IntervalType}
	//        name='interval'
	//        '<'
	//            support=PrimitiveNumberType
	//            ( lopen?=']' | '[' )
	//            infimum=Expression ',' supremum=Expression
	//            ( ']' |  ropen?='[' )
	//        '>'
	//    ;
	public IntervalTypeElements getIntervalTypeAccess() {
		return pIntervalType;
	}
	
	public ParserRule getIntervalTypeRule() {
		return getIntervalTypeAccess().getRule();
	}
	
	//IntervalTypeDefinition returns fmlType::IntervalType
	//    : {fmlType::IntervalType}
	//        ( visibility=VisibilityKind )? 'type'
	//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
	//        'interval'
	//        '<'
	//            support=PrimitiveNumberType
	//            ( lopen?=']' | '[' )
	//            infimum=Expression ',' supremum=Expression
	//            ( ']' |  ropen?='[' )
	//        '>' ';'
	//    ;
	public IntervalTypeDefinitionElements getIntervalTypeDefinitionAccess() {
		return pIntervalTypeDefinition;
	}
	
	public ParserRule getIntervalTypeDefinitionRule() {
		return getIntervalTypeDefinitionAccess().getRule();
	}
	
	//IntervalTypeDefinitionImpl returns fmlType::IntervalType
	//    : {fmlType::IntervalType}
	//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
	//        'interval'
	//        '<'
	//            support=PrimitiveNumberType
	//            ( lopen?=']' | '[' )
	//            infimum=Expression ',' supremum=Expression
	//            ( ']' |  ropen?='[' )
	//        '>' ';'
	//    ;
	public IntervalTypeDefinitionImplElements getIntervalTypeDefinitionImplAccess() {
		return pIntervalTypeDefinitionImpl;
	}
	
	public ParserRule getIntervalTypeDefinitionImplRule() {
		return getIntervalTypeDefinitionImplAccess().getRule();
	}
	
	//// TODO
	//// mettre à jour la grammaire par rapport au noyau, i.e.
	//// CollectionKind | CollectionKind< size > | CollectionKind< type , size >
	//CollectionType returns fmlType::CollectionType
	//    : {fmlType::CollectionType}
	//        container = CollectionKind
	//        ( '<'
	//            support=DataType
	//            ( ',' ( size=EInt | unbounded?='*' ) )?
	//        '>' )?
	//    ;
	public CollectionTypeElements getCollectionTypeAccess() {
		return pCollectionType;
	}
	
	public ParserRule getCollectionTypeRule() {
		return getCollectionTypeAccess().getRule();
	}
	
	//CollectionTypeDefinition returns fmlType::CollectionType
	//    : {fmlType::CollectionType}
	//        ( visibility=VisibilityKind )? 'type'
	//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
	//        container = CollectionKind
	//        '<'
	//            support=DataType
	//            ( ',' ( size=EInt | unbounded?='*' ) )?
	//        '>' ';'
	//    ;
	public CollectionTypeDefinitionElements getCollectionTypeDefinitionAccess() {
		return pCollectionTypeDefinition;
	}
	
	public ParserRule getCollectionTypeDefinitionRule() {
		return getCollectionTypeDefinitionAccess().getRule();
	}
	
	//CollectionTypeDefinitionImpl returns fmlType::CollectionType
	//    : {fmlType::CollectionType}
	//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
	//        container = CollectionKind
	//        '<'
	//            support=DataType
	//            ( ',' ( size=EInt | unbounded?='*' ) )?
	//        '>' ';'
	//    ;
	public CollectionTypeDefinitionImplElements getCollectionTypeDefinitionImplAccess() {
		return pCollectionTypeDefinitionImpl;
	}
	
	public ParserRule getCollectionTypeDefinitionImplRule() {
		return getCollectionTypeDefinitionImplAccess().getRule();
	}
	
	//enum CollectionKind returns fmlType::CollectionKind
	//    : vector = 'vector'
	//    | rvector = 'rvector'
	//    | list='list'
	//    | set = 'set'
	//    | bag = 'bag'
	//    | fifo = 'fifo'
	//    | lifo = 'lifo'
	//    ;
	public CollectionKindElements getCollectionKindAccess() {
		return eCollectionKind;
	}
	
	public EnumRule getCollectionKindRule() {
		return getCollectionKindAccess().getRule();
	}
	
	//EnumerationType returns fmlType::EnumerationType
	//    : {fmlType::EnumerationType}
	//        'enum'  ( '<' ( 'super:' )? superType=[fmlType::EnumerationType|ESUfid] '>') ?
	//        '{'
	//            literal+= EnumerationLiteral  ( ',' literal+= EnumerationLiteral )*
	//        '}'
	//    ;
	public EnumerationTypeElements getEnumerationTypeAccess() {
		return pEnumerationType;
	}
	
	public ParserRule getEnumerationTypeRule() {
		return getEnumerationTypeAccess().getRule();
	}
	
	//EnumerationTypeDefinition returns fmlType::EnumerationType
	//    : {fmlType::EnumerationType}
	//        ( visibility=VisibilityKind )? typedef?='type'
	//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
	//        'enum'  ( '<' ( 'super:' )? superType=[fmlType::EnumerationType|ESUfid] '>') ?
	//        '{'
	//            literal+= EnumerationLiteral  ( ',' literal+= EnumerationLiteral )*
	//        '}'
	//    ;
	public EnumerationTypeDefinitionElements getEnumerationTypeDefinitionAccess() {
		return pEnumerationTypeDefinition;
	}
	
	public ParserRule getEnumerationTypeDefinitionRule() {
		return getEnumerationTypeDefinitionAccess().getRule();
	}
	
	//EnumerationTypeDefinitionImpl returns fmlType::EnumerationType
	//    : {fmlType::EnumerationType}
	//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
	//        typedef?='enum'
	//        ( '<' ( 'super:' )? superType=[fmlType::EnumerationType|ESUfid] '>') ?
	//        '{'
	//            literal+= EnumerationLiteral  ( ',' literal+= EnumerationLiteral )*
	//        '}'
	//    ;
	public EnumerationTypeDefinitionImplElements getEnumerationTypeDefinitionImplAccess() {
		return pEnumerationTypeDefinitionImpl;
	}
	
	public ParserRule getEnumerationTypeDefinitionImplRule() {
		return getEnumerationTypeDefinitionImplAccess().getRule();
	}
	
	//EnumerationLiteral returns fmlType::EnumerationLiteral
	//    : name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
	//        ( '=' value=LiteralTerminalExpression )?
	//    ;
	public EnumerationLiteralElements getEnumerationLiteralAccess() {
		return pEnumerationLiteral;
	}
	
	public ParserRule getEnumerationLiteralRule() {
		return getEnumerationLiteralAccess().getRule();
	}
	
	//StructureType returns fmlType::StructureType
	//    : {fmlType::StructureType}
	//        'struct'
	//        '{'
	//            ( '@property:' )?
	//            ( property+=Variable )+
	//        '}'
	//    ;
	public StructureTypeElements getStructureTypeAccess() {
		return pStructureType;
	}
	
	public ParserRule getStructureTypeRule() {
		return getStructureTypeAccess().getRule();
	}
	
	//StructureTypeDefinition returns fmlType::StructureType
	//    : {fmlType::StructureType}
	//        ( visibility=VisibilityKind )? typedef?='type'
	//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
	//        'struct'
	//        '{'
	//            ( '@property:' )?
	//            ( property+=Variable )+
	//        '}'
	//    ;
	public StructureTypeDefinitionElements getStructureTypeDefinitionAccess() {
		return pStructureTypeDefinition;
	}
	
	public ParserRule getStructureTypeDefinitionRule() {
		return getStructureTypeDefinitionAccess().getRule();
	}
	
	//StructureTypeDefinitionImpl returns fmlType::StructureType
	//    : {fmlType::StructureType}
	//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
	//        typedef?='struct'
	//        '{'
	//            ( '@property:' )?
	//            ( property+=Variable )+
	//        '}'
	//    ;
	public StructureTypeDefinitionImplElements getStructureTypeDefinitionImplAccess() {
		return pStructureTypeDefinitionImpl;
	}
	
	public ParserRule getStructureTypeDefinitionImplRule() {
		return getStructureTypeDefinitionImplAccess().getRule();
	}
	
	//UnionType returns fmlType::UnionType
	//    : {fmlType::UnionType}
	//        'union'
	//        '{'
	//            ( '@property:' )?
	//            ( property+=Variable )+
	//        '}'
	//    ;
	public UnionTypeElements getUnionTypeAccess() {
		return pUnionType;
	}
	
	public ParserRule getUnionTypeRule() {
		return getUnionTypeAccess().getRule();
	}
	
	//UnionTypeDefinition returns fmlType::UnionType
	//    : {fmlType::UnionType}
	//        ( visibility=VisibilityKind )? typedef?='type'
	//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
	//        'union'
	//        '{'
	//            ( '@property:' )?
	//            ( property+=Variable )+
	//        '}'
	//    ;
	public UnionTypeDefinitionElements getUnionTypeDefinitionAccess() {
		return pUnionTypeDefinition;
	}
	
	public ParserRule getUnionTypeDefinitionRule() {
		return getUnionTypeDefinitionAccess().getRule();
	}
	
	//UnionTypeDefinitionImpl returns fmlType::UnionType
	//    : {fmlType::UnionType}
	//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
	//        typedef?='union'
	//        '{'
	//            ( '@property:' )?
	//            ( property+=Variable )+
	//        '}'
	//    ;
	public UnionTypeDefinitionImplElements getUnionTypeDefinitionImplAccess() {
		return pUnionTypeDefinitionImpl;
	}
	
	public ParserRule getUnionTypeDefinitionImplRule() {
		return getUnionTypeDefinitionImplAccess().getRule();
	}
	
	//ChoiceType returns fmlType::ChoiceType
	//    : {fmlType::ChoiceType}
	//        'choice'
	//        '{'
	//            ( '@property:' )?
	//            ( property+=Variable )+
	//        '}'
	//    ;
	public ChoiceTypeElements getChoiceTypeAccess() {
		return pChoiceType;
	}
	
	public ParserRule getChoiceTypeRule() {
		return getChoiceTypeAccess().getRule();
	}
	
	//ChoiceTypeDefinition returns fmlType::ChoiceType
	//    : {fmlType::ChoiceType}
	//        ( visibility=VisibilityKind )? typedef?='type'
	//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
	//        'choice'
	//        '{'
	//            ( '@property:' )?
	//            ( property+=Variable )+
	//        '}'
	//    ;
	public ChoiceTypeDefinitionElements getChoiceTypeDefinitionAccess() {
		return pChoiceTypeDefinition;
	}
	
	public ParserRule getChoiceTypeDefinitionRule() {
		return getChoiceTypeDefinitionAccess().getRule();
	}
	
	//ChoiceTypeDefinitionImpl returns fmlType::ChoiceType
	//    : {fmlType::ChoiceType}
	//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
	//        typedef?='choice'
	//        '{'
	//            ( '@property:' )?
	//            ( property+=Variable )+
	//        '}'
	//    ;
	public ChoiceTypeDefinitionImplElements getChoiceTypeDefinitionImplAccess() {
		return pChoiceTypeDefinitionImpl;
	}
	
	public ParserRule getChoiceTypeDefinitionImplRule() {
		return getChoiceTypeDefinitionImplAccess().getRule();
	}
	
	///*
	//enum TypeSpecifyerKind returns TypeSpecifyerKind
	//    : ALIAS = 'ALIAS'
	//    | BOOLEAN = 'BOOLEAN'
	//    | CHAR = 'CHAR'
	//    | INT = 'INT'
	//    | RATIONAL = 'RATIONAL'
	//    | URATIONAL = 'URATIONAL'
	//    | FLOAT = 'FLOAT'
	//    | UFLOAT = 'UFLOAT'
	//    | DOUBLE = 'DOUBLE'
	//    | UDOUBLE = 'UDOUBLE'
	//    | REAL = 'REAL'
	//    | UREAL = 'UREAL'
	//    | CTIME = 'CTIME'
	//    | DTIME = 'DTIME'
	//    | STRING = 'STRING'
	//    | IDENTIFIER = 'IDENTIFIER'
	//    | UFI = 'UFI'
	//    | ARRAY = 'ARRAY'
	//    | VECTOR = 'VECTOR'
	//    | LIST = 'LIST'
	//    | FIFO = 'FIFO'
	//    | LIFO = 'LIFO'
	//    | MULTISET = 'MULTISET'
	//    | SET = 'SET'
	//    | INTERVAL = 'INTERVAL'
	//    | ENUM = 'ENUM'
	//    | STRUCTURE = 'STRUCTURE'
	//    | BUFFER = 'BUFFER'
	//    | MESSAGE = 'MESSAGE'
	//    | PORT = 'PORT'
	//    | CONNECTION = 'CONNECTION'
	//    | OPERATOR = 'OPERATOR'
	//    | MACHINE = 'MACHINE'
	//    | LAMBDA = 'LAMBDA'
	//    | UNIVERSAL = 'UNIVERSAL'
	//    ;
	//*/
	//////////////////////////////////////////////////////////////////////////////////
	//// Modifier Rules
	//////////////////////////////////////////////////////////////////////////////////
	//Modifier returns fmlInfra::Modifier
	//    : {fmlInfra::Modifier}
	//        ( ( static?='static' )?
	//        & ( final ?='final'  )?
	//        & ( volatile ?='volatile'  )?
	//        & ( transient?='transient' )?
	//        & ( optional?='optional' )?
	//        )
	//    ;
	public ModifierElements getModifierAccess() {
		return pModifier;
	}
	
	public ParserRule getModifierRule() {
		return getModifierAccess().getRule();
	}
	
	//////////////////////////////////////////////////////////////////////////////////
	//// Function Rules
	//////////////////////////////////////////////////////////////////////////////////
	//Function returns fmlInfra::Function
	//    : {fmlInfra::Function}
	//        ( visibility=VisibilityKind
	//          & modifier=Modifier
	//        )?
	//        'fun'
	//        name=ESIdentifier  ( unrestrictedName=UnrestrictedName )?
	//        ( '(' ( parameterSet=FormalParameterSet )? ')' )?
	//        '->'
	//        (     resultSet=FormalParameterSet
	//        | '(' resultSet=FormalParameterSet ')'
	//        )
	//        ';'
	//    ;
	public FunctionElements getFunctionAccess() {
		return pFunction;
	}
	
	public ParserRule getFunctionRule() {
		return getFunctionAccess().getRule();
	}
	
	//FunctionImpl returns fmlInfra::Function
	//    : {fmlInfra::Function}
	//        ( modifier=Modifier )?
	//        'fun'
	//        name=ESIdentifier  ( unrestrictedName=UnrestrictedName )?
	//        ( '(' ( parameterSet=FormalParameterSet )? ')' )?
	//        '->'
	//        (     resultSet=FormalParameterSet
	//        | '(' resultSet=FormalParameterSet ')'
	//        )
	//        ';'
	//    ;
	public FunctionImplElements getFunctionImplAccess() {
		return pFunctionImpl;
	}
	
	public ParserRule getFunctionImplRule() {
		return getFunctionImplAccess().getRule();
	}
	
	//FunctionPublic returns fmlInfra::Function
	//    : FunctionImpl
	//    ;
	public FunctionPublicElements getFunctionPublicAccess() {
		return pFunctionPublic;
	}
	
	public ParserRule getFunctionPublicRule() {
		return getFunctionPublicAccess().getRule();
	}
	
	//FunctionProtected returns fmlInfra::Function
	//    : FunctionImpl
	//    ;
	public FunctionProtectedElements getFunctionProtectedAccess() {
		return pFunctionProtected;
	}
	
	public ParserRule getFunctionProtectedRule() {
		return getFunctionProtectedAccess().getRule();
	}
	
	//FunctionPrivate returns fmlInfra::Function
	//    : FunctionImpl
	//    ;
	public FunctionPrivateElements getFunctionPrivateAccess() {
		return pFunctionPrivate;
	}
	
	public ParserRule getFunctionPrivateRule() {
		return getFunctionPrivateAccess().getRule();
	}
	
	//////////////////////////////////////////////////////////////////////////////////
	//// Variable Rules
	//////////////////////////////////////////////////////////////////////////////////
	//ModifierVar returns fmlInfra::Modifier
	//    : {fmlInfra::Modifier}
	//        ( ( static?='static' )?
	//        & ( final ?=('final' | 'const') )?
	//        & ( volatile ?='volatile'  )?
	//        & ( transient?='transient' )?
	//        )
	//    ;
	public ModifierVarElements getModifierVarAccess() {
		return pModifierVar;
	}
	
	public ParserRule getModifierVarRule() {
		return getModifierVarAccess().getRule();
	}
	
	//Variable returns fmlInfra::Variable
	//    : ( ( visibility=VisibilityKind )?
	//        & ( modifier=Modifier )?
	//        )
	//        ( 'var' | const?='val'
	//        | ( const?='const' | const?='final' ) ( macro?='macro' )? ( 'var' )?
	//        | macro?='macro' ( 'var' | const?='val' )?
	//        )
	//         type=DataType  ( reference?='&' )?
	//         name=ESIdentifier  ( unrestrictedName=UnrestrictedName )?
	//        ( '=' defaultValue=Expression )?
	//        ( ( '{' onWriteAction=OnWriteRoutine  '}' )
	//        | ';'
	//        )
	//    ;
	public VariableElements getVariableAccess() {
		return pVariable;
	}
	
	public ParserRule getVariableRule() {
		return getVariableAccess().getRule();
	}
	
	//VariableImpl returns fmlInfra::Variable
	//    : ( modifier=Modifier )?
	//        ( 'var' | const?='val'
	//        | const?='const' ( macro?='macro' )? ( 'var' )?
	//        | macro?='macro' ( 'var' | const?='val' )?
	//        )
	//         type=DataType  ( reference?='&' )?
	//         name=ESIdentifier  ( unrestrictedName=UnrestrictedName )?
	//        ( '=' defaultValue=Expression )?
	//        ( ( '{' onWriteAction=OnWriteRoutine  '}' )
	//        | ';'
	//        )
	//    ;
	public VariableImplElements getVariableImplAccess() {
		return pVariableImpl;
	}
	
	public ParserRule getVariableImplRule() {
		return getVariableImplAccess().getRule();
	}
	
	//OnWriteRoutine returns fmlInfra::Routine
	//    : { fmlInfra::Routine }
	//        ( '@write' | '@on_write' )
	//        ( '(' parameterSet=VariableRoutineParameterSet ')' )?
	//        bodyBlock=BlockStatement
	//    ;
	public OnWriteRoutineElements getOnWriteRoutineAccess() {
		return pOnWriteRoutine;
	}
	
	public ParserRule getOnWriteRoutineRule() {
		return getOnWriteRoutineAccess().getRule();
	}
	
	//VariableRoutineParameterSet returns fmlInfra::ParameterSet
	//    : {fmlInfra::ParameterSet}
	//        parameter+=VariableRoutineParameter
	//    ;
	public VariableRoutineParameterSetElements getVariableRoutineParameterSetAccess() {
		return pVariableRoutineParameterSet;
	}
	
	public ParserRule getVariableRoutineParameterSetRule() {
		return getVariableRoutineParameterSetAccess().getRule();
	}
	
	//VariableRoutineParameter returns fmlInfra::Parameter
	//    : ( FormalParameterOffset )?
	//        ( direction=ParameterDirectionKind )?
	//        ( type=DataType )?
	//        name=ESIdentifier
	//        ( '=' defaultValue=Expression )?
	//    ;
	public VariableRoutineParameterElements getVariableRoutineParameterAccess() {
		return pVariableRoutineParameter;
	}
	
	public ParserRule getVariableRoutineParameterRule() {
		return getVariableRoutineParameterAccess().getRule();
	}
	
	//VariablePublic returns fmlInfra::Variable
	//    : VariableImpl
	//    ;
	public VariablePublicElements getVariablePublicAccess() {
		return pVariablePublic;
	}
	
	public ParserRule getVariablePublicRule() {
		return getVariablePublicAccess().getRule();
	}
	
	//VariableProtected returns fmlInfra::Variable
	//    : VariableImpl
	//    ;
	public VariableProtectedElements getVariableProtectedAccess() {
		return pVariableProtected;
	}
	
	public ParserRule getVariableProtectedRule() {
		return getVariableProtectedAccess().getRule();
	}
	
	//VariablePrivate returns fmlInfra::Variable
	//    : VariableImpl
	//    ;
	public VariablePrivateElements getVariablePrivateAccess() {
		return pVariablePrivate;
	}
	
	public ParserRule getVariablePrivateRule() {
		return getVariablePrivateAccess().getRule();
	}
	
	//////////////////////////////////////////////////////////////////////////////////
	//// Functional ParameterSet Rules
	//////////////////////////////////////////////////////////////////////////////////
	//enum ParameterDirectionKind returns fmlInfra::ParameterDirectionKind
	//    : in     = 'in'
	//    | in     = 'input'
	//    | inout  = 'inout'
	//    | out    = 'out'
	//    | out    = 'output'
	//    | return = 'return'
	//    ;
	public ParameterDirectionKindElements getParameterDirectionKindAccess() {
		return eParameterDirectionKind;
	}
	
	public EnumRule getParameterDirectionKindRule() {
		return getParameterDirectionKindAccess().getRule();
	}
	
	//FunctionalParameterSet returns fmlInfra::ParameterSet
	//    : {fmlInfra::ParameterSet}
	//        parameter+=FunctionalParameter
	//        ( ',' parameter+=FunctionalParameter )*
	//    ;
	public FunctionalParameterSetElements getFunctionalParameterSetAccess() {
		return pFunctionalParameterSet;
	}
	
	public ParserRule getFunctionalParameterSetRule() {
		return getFunctionalParameterSetAccess().getRule();
	}
	
	//FunctionalParameter returns fmlInfra::Parameter
	//    : {fmlInfra::Parameter}
	//        ( direction=ParameterDirectionKind )?  type=DataType
	//         name=ESIdentifier
	//        ( '=' defaultValue=Expression )?
	//    ;
	public FunctionalParameterElements getFunctionalParameterAccess() {
		return pFunctionalParameter;
	}
	
	public ParserRule getFunctionalParameterRule() {
		return getFunctionalParameterAccess().getRule();
	}
	
	//FormalParameterSet returns fmlInfra::ParameterSet
	//    : {fmlInfra::ParameterSet}
	//        parameter+=FormalParameter
	//        ( ',' parameter+=FormalParameter )*
	//    ;
	public FormalParameterSetElements getFormalParameterSetAccess() {
		return pFormalParameterSet;
	}
	
	public ParserRule getFormalParameterSetRule() {
		return getFormalParameterSetAccess().getRule();
	}
	
	//FormalParameter returns fmlInfra::Parameter
	//    : {fmlInfra::Parameter}
	//        ( FormalParameterOffset )?
	//        ( direction=ParameterDirectionKind )? ( modifier=Modifier )?
	//        type=DataType  ( name=ESIdentifier )?
	//        ( '=' defaultValue=Expression )?
	//    ;
	public FormalParameterElements getFormalParameterAccess() {
		return pFormalParameter;
	}
	
	public ParserRule getFormalParameterRule() {
		return getFormalParameterAccess().getRule();
	}
	
	//FormalParameterOffset
	//    : EOffset
	//    ;
	public FormalParameterOffsetElements getFormalParameterOffsetAccess() {
		return pFormalParameterOffset;
	}
	
	public ParserRule getFormalParameterOffsetRule() {
		return getFormalParameterOffsetAccess().getRule();
	}
	
	//////////////////////////////////////////////////////////////////////////////////
	//// Block ParameterSet Rules
	//////////////////////////////////////////////////////////////////////////////////
	//BlockParameterSet returns fmlInfra::ParameterSet
	//    : {fmlInfra::ParameterSet}
	//        ( 'input'
	//            ( parameter+=ParameterInput
	//            | '{' ( parameter+=ParameterInput )+ '}'
	//            )
	//        | 'inout'
	//            ( parameter+=ParameterInout
	//            | '{' ( parameter+=ParameterInout )+ '}'
	//            )
	//        | 'output'
	//            ( parameter+=ParameterOutput
	//            | '{' ( parameter+=ParameterOutput )+ '}'
	//            )
	//        | 'return'
	//            ( parameter+=ParameterReturn
	//            | '{' ( parameter+=ParameterReturn )+ '}'
	//            )
	//        )*
	//    ;
	public BlockParameterSetElements getBlockParameterSetAccess() {
		return pBlockParameterSet;
	}
	
	public ParserRule getBlockParameterSetRule() {
		return getBlockParameterSetAccess().getRule();
	}
	
	//Parameter returns fmlInfra::Parameter
	//    : {fmlInfra::Parameter}
	//        ( visibility=VisibilityKind )?
	//        direction=ParameterDirectionKind
	//        'var'  type=DataType
	//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
	//        ( '=' defaultValue=Expression )?  ';'
	//    ;
	public ParameterElements getParameterAccess() {
		return pParameter;
	}
	
	public ParserRule getParameterRule() {
		return getParameterAccess().getRule();
	}
	
	//ParameterImpl returns fmlInfra::Parameter
	//    : {fmlInfra::Parameter}
	//        'var'  type=DataType
	//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
	//        ( '=' defaultValue=Expression )?  ';'
	//    ;
	public ParameterImplElements getParameterImplAccess() {
		return pParameterImpl;
	}
	
	public ParserRule getParameterImplRule() {
		return getParameterImplAccess().getRule();
	}
	
	//ParameterInput returns fmlInfra::Parameter
	//    : ParameterImpl
	//    ;
	public ParameterInputElements getParameterInputAccess() {
		return pParameterInput;
	}
	
	public ParserRule getParameterInputRule() {
		return getParameterInputAccess().getRule();
	}
	
	//ParameterInout returns fmlInfra::Parameter
	//    : ParameterImpl
	//    ;
	public ParameterInoutElements getParameterInoutAccess() {
		return pParameterInout;
	}
	
	public ParserRule getParameterInoutRule() {
		return getParameterInoutAccess().getRule();
	}
	
	//ParameterOutput returns fmlInfra::Parameter
	//    : ParameterImpl
	//    ;
	public ParameterOutputElements getParameterOutputAccess() {
		return pParameterOutput;
	}
	
	public ParserRule getParameterOutputRule() {
		return getParameterOutputAccess().getRule();
	}
	
	//ParameterReturn returns fmlInfra::Parameter
	//    : ParameterImpl
	//    ;
	public ParameterReturnElements getParameterReturnAccess() {
		return pParameterReturn;
	}
	
	public ParserRule getParameterReturnRule() {
		return getParameterReturnAccess().getRule();
	}
	
	//////////////////////////////////////////////////////////////////////////////////
	//// Buffer Rules
	//////////////////////////////////////////////////////////////////////////////////
	//BufferContainerType returns fmlType::CollectionType
	//    : {fmlType::CollectionType}
	//        container = BufferContainerKind
	//        ( '<' ( ( 'size:' )? size=EInt | unbounded?='*' )? '>'
	//        | '[' ( ( 'size:' )? size=EInt | unbounded?='*' )? ']'
	//        )?
	//    ;
	public BufferContainerTypeElements getBufferContainerTypeAccess() {
		return pBufferContainerType;
	}
	
	public ParserRule getBufferContainerTypeRule() {
		return getBufferContainerTypeAccess().getRule();
	}
	
	//enum BufferContainerKind returns fmlType::CollectionKind
	//    : set  = 'set'
	//    | bag  = 'bag'
	//    | fifo = 'fifo'
	//    | lifo = 'lifo'
	//    ;
	public BufferContainerKindElements getBufferContainerKindAccess() {
		return eBufferContainerKind;
	}
	
	public EnumRule getBufferContainerKindRule() {
		return getBufferContainerKindAccess().getRule();
	}
	
	//Buffer returns fmlInfra::Buffer
	//    : {fmlInfra::Buffer}
	//        ( visibility=VisibilityKind
	//          & modifier=Modifier
	//        )?
	//        'buffer' type=BufferContainerType
	//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )? ';'
	//    ;
	public BufferElements getBufferAccess() {
		return pBuffer;
	}
	
	public ParserRule getBufferRule() {
		return getBufferAccess().getRule();
	}
	
	//BufferImpl returns fmlInfra::Buffer
	//    : {fmlInfra::Buffer}
	//        ( modifier=Modifier )?
	//        'buffer' type=BufferContainerType
	//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )? ';'
	//    ;
	public BufferImplElements getBufferImplAccess() {
		return pBufferImpl;
	}
	
	public ParserRule getBufferImplRule() {
		return getBufferImplAccess().getRule();
	}
	
	//BufferPublic returns fmlInfra::Buffer
	//    : BufferImpl
	//    ;
	public BufferPublicElements getBufferPublicAccess() {
		return pBufferPublic;
	}
	
	public ParserRule getBufferPublicRule() {
		return getBufferPublicAccess().getRule();
	}
	
	//BufferProtected returns fmlInfra::Buffer
	//    : BufferImpl
	//    ;
	public BufferProtectedElements getBufferProtectedAccess() {
		return pBufferProtected;
	}
	
	public ParserRule getBufferProtectedRule() {
		return getBufferProtectedAccess().getRule();
	}
	
	//BufferPrivate returns fmlInfra::Buffer
	//    : BufferImpl
	//    ;
	public BufferPrivateElements getBufferPrivateAccess() {
		return pBufferPrivate;
	}
	
	public ParserRule getBufferPrivateRule() {
		return getBufferPrivateAccess().getRule();
	}
	
	//////////////////////////////////////////////////////////////////////////////////
	//// Port rules
	//////////////////////////////////////////////////////////////////////////////////
	//Port returns fmlInfra::Port
	//    : {fmlInfra::Port}
	//        ( visibility=VisibilityKind
	//          & modifier=Modifier
	//        )?
	//        ( direction=ChannelDirection  'port'
	//        | 'port'  ( direction=ChannelDirection )?
	//        )
	//        name=ESIdentifier  ( unrestrictedName=UnrestrictedName )?
	//        ( '(' ( parameterSet=FormalParameterSet )? ')' )?
	//        ';'
	//    ;
	public PortElements getPortAccess() {
		return pPort;
	}
	
	public ParserRule getPortRule() {
		return getPortAccess().getRule();
	}
	
	//PortImpl returns fmlInfra::Port
	//    : {fmlInfra::Port}
	//        ( modifier=Modifier )?
	//        ( direction=ChannelDirection  'port'
	//        | 'port'  ( direction=ChannelDirection )?
	//        )
	//        name=ESIdentifier  ( unrestrictedName=UnrestrictedName )?
	//        ( '(' ( parameterSet=FormalParameterSet )? ')' )?
	//        ';'
	//    ;
	public PortImplElements getPortImplAccess() {
		return pPortImpl;
	}
	
	public ParserRule getPortImplRule() {
		return getPortImplAccess().getRule();
	}
	
	//PortPublic returns fmlInfra::Port
	//    : PortImpl
	//    ;
	public PortPublicElements getPortPublicAccess() {
		return pPortPublic;
	}
	
	public ParserRule getPortPublicRule() {
		return getPortPublicAccess().getRule();
	}
	
	//PortProtected returns fmlInfra::Port
	//    : PortImpl
	//    ;
	public PortProtectedElements getPortProtectedAccess() {
		return pPortProtected;
	}
	
	public ParserRule getPortProtectedRule() {
		return getPortProtectedAccess().getRule();
	}
	
	//PortPrivate returns fmlInfra::Port
	//    : PortImpl
	//    ;
	public PortPrivateElements getPortPrivateAccess() {
		return pPortPrivate;
	}
	
	public ParserRule getPortPrivateRule() {
		return getPortPrivateAccess().getRule();
	}
	
	//////////////////////////////////////////////////////////////////////////////////
	//// Signal rules
	//////////////////////////////////////////////////////////////////////////////////
	//Signal returns fmlInfra::Signal
	//    : {fmlInfra::Signal}
	//        ( visibility=VisibilityKind )?
	//        ( direction=ChannelDirection  'signal'
	//        | 'signal'  ( direction=ChannelDirection )?
	//        )
	//        name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
	//        ( '(' ( parameterSet=FormalParameterSet )? ')' )?
	//        ';'
	//    ;
	public SignalElements getSignalAccess() {
		return pSignal;
	}
	
	public ParserRule getSignalRule() {
		return getSignalAccess().getRule();
	}
	
	//SignalImpl returns fmlInfra::Signal
	//    : {fmlInfra::Signal}
	//        ( direction=ChannelDirection  'signal'
	//        | 'signal'  ( direction=ChannelDirection )?
	//        )
	//        name=ESIdentifier  ( unrestrictedName=UnrestrictedName )?
	//        ( '(' ( parameterSet=FormalParameterSet )? ')' )?
	//        ';'
	//    ;
	public SignalImplElements getSignalImplAccess() {
		return pSignalImpl;
	}
	
	public ParserRule getSignalImplRule() {
		return getSignalImplAccess().getRule();
	}
	
	//SignalPublic returns fmlInfra::Signal
	//    : SignalImpl
	//    ;
	public SignalPublicElements getSignalPublicAccess() {
		return pSignalPublic;
	}
	
	public ParserRule getSignalPublicRule() {
		return getSignalPublicAccess().getRule();
	}
	
	//SignalProtected returns fmlInfra::Signal
	//    : SignalImpl
	//    ;
	public SignalProtectedElements getSignalProtectedAccess() {
		return pSignalProtected;
	}
	
	public ParserRule getSignalProtectedRule() {
		return getSignalProtectedAccess().getRule();
	}
	
	//SignalPrivate returns fmlInfra::Signal
	//    : SignalImpl
	//    ;
	public SignalPrivateElements getSignalPrivateAccess() {
		return pSignalPrivate;
	}
	
	public ParserRule getSignalPrivateRule() {
		return getSignalPrivateAccess().getRule();
	}
	
	//////////////////////////////////////////////////////////////////////////////////
	//// Channel rules
	//////////////////////////////////////////////////////////////////////////////////
	//enum ChannelDirection returns fmlInfra::ChannelDirection
	//    : input  = 'input'
	//    | inout  = 'inout'
	//    | output = 'output'
	//    ;
	public ChannelDirectionElements getChannelDirectionAccess() {
		return eChannelDirection;
	}
	
	public EnumRule getChannelDirectionRule() {
		return getChannelDirectionAccess().getRule();
	}
	
	//Channel returns fmlInfra::Channel
	//    : {fmlInfra::Channel}
	//        ( visibility=VisibilityKind
	//          & modifier=Modifier
	//        )?
	//        'channel' name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
	//        '{'
	//            ( signal+=SignalReference ';' )+
	//        '}'
	//    ;
	public ChannelElements getChannelAccess() {
		return pChannel;
	}
	
	public ParserRule getChannelRule() {
		return getChannelAccess().getRule();
	}
	
	//SignalReference returns fmlInfra::Signal
	//    : ( direction=ChannelDirection )? name=ESIdentifier
	//    ;
	public SignalReferenceElements getSignalReferenceAccess() {
		return pSignalReference;
	}
	
	public ParserRule getSignalReferenceRule() {
		return getSignalReferenceAccess().getRule();
	}
	
	//Channelimpl returns fmlInfra::Channel
	//    : {fmlInfra::Channel}
	//        ( modifier=Modifier )?
	//        'channel' name=ESIdentifier ( unrestrictedName=UnrestrictedName )?
	//        '{'
	//            ( signal+=SignalReference ';' )+
	//        '}'
	//    ;
	public ChannelimplElements getChannelimplAccess() {
		return pChannelimpl;
	}
	
	public ParserRule getChannelimplRule() {
		return getChannelimplAccess().getRule();
	}
	
	//ChannelPublic returns fmlInfra::Channel
	//    : Channelimpl
	//    ;
	public ChannelPublicElements getChannelPublicAccess() {
		return pChannelPublic;
	}
	
	public ParserRule getChannelPublicRule() {
		return getChannelPublicAccess().getRule();
	}
	
	//ChannelProtected returns fmlInfra::Channel
	//    : Channelimpl
	//    ;
	public ChannelProtectedElements getChannelProtectedAccess() {
		return pChannelProtected;
	}
	
	public ParserRule getChannelProtectedRule() {
		return getChannelProtectedAccess().getRule();
	}
	
	//ChannelPrivate returns fmlInfra::Channel
	//    : Channelimpl
	//    ;
	public ChannelPrivateElements getChannelPrivateAccess() {
		return pChannelPrivate;
	}
	
	public ParserRule getChannelPrivateRule() {
		return getChannelPrivateAccess().getRule();
	}
	
	//////////////////////////////////////////////////////////////////////////////////
	//// Section Transition Rules
	//////////////////////////////////////////////////////////////////////////////////
	//Transition returns fmlStmchn::Transition
	//    : {fmlStmchn::Transition} (transient?='transient')? 'transition'
	//        ( moe=TransitionMoe )?
	//        ( name=ESIdentifier )?  ( unrestrictedName=UnrestrictedName )?
	////        ( ( behavior=BlockStatement '-->' target=[fmlStmchn::Vertex|ESUfid] ';' )
	////        | ( '-->' target=[fmlStmchn::Vertex|ESUfid] (behavior=BlockStatement | ';') )
	////        )
	//        ( ( '{'
	//            ( ( ( '@trigger:' ( trigger+= TransitionTrigger )* )?
	//                ( guard  = TransitionGuard      | '@guard:' )?
	//                ( tguard = TransitionTimedGuard | '@tguard:')?
	//                '@effect:'  ( effect = TransitionEffect  )?
	//              )
	//            | behavior=TransitionBehavior
	//            )?
	//            '}'
	//            ( '-->'
	//                ( target=[fmlStmchn::Vertex|ESUfid]
	//                | targetExpression=ValuePureNamedMachineExpression
	//                ) ';'
	//            )?
	//          )
	//        | ( '-->'
	//            ( target=[fmlStmchn::Vertex|ESUfid]
	//            | targetExpression=ValuePureNamedMachineExpression
	//            )
	//            ( ( '{'
	//                ( ( ( '@trigger:' ( trigger+= TransitionTrigger )* )?
	//                    ( guard  = TransitionGuard      | '@guard:' )?
	//                    ( tguard = TransitionTimedGuard | '@tguard:')?
	//                    '@effect:'  ( effect = TransitionEffect  )?
	//                  )
	//                | behavior=TransitionBehavior
	//                )?
	//                '}' )
	//            | ';'
	//            )
	//          )
	//        )
	//    ;
	public TransitionElements getTransitionAccess() {
		return pTransition;
	}
	
	public ParserRule getTransitionRule() {
		return getTransitionAccess().getRule();
	}
	
	//TransitionMoe returns fmlStmchn::TransitionMoe
	//    : '<'
	//        ( ('moc:')?
	//            ( moc=TransitionMoc  ( '&' isElse?='else' )?
	//            | isElse?='else'
	//            ) ( ',' ( 'prior:' )? priority=EInt )?
	//        | ( 'prior:' )? priority=EInt
	//        )
	//      '>'
	//    ;
	public TransitionMoeElements getTransitionMoeAccess() {
		return pTransitionMoe;
	}
	
	public ParserRule getTransitionMoeRule() {
		return getTransitionMoeAccess().getRule();
	}
	
	//enum TransitionMoc returns fmlStmchn::TransitionMoc
	//    : simple = 'simple'
	//    | abort  = 'abort'
	//    | final  = 'final'
	//    ;
	public TransitionMocElements getTransitionMocAccess() {
		return eTransitionMoc;
	}
	
	public EnumRule getTransitionMocRule() {
		return getTransitionMocAccess().getRule();
	}
	
	//TransitionBehavior returns fmlStmnt::BlockStatement
	//    : {fmlStmnt::BlockStatement}
	//        ( op=BlockStatementScheduler )?
	//         ( statement+=Statement )*
	//    ;
	public TransitionBehaviorElements getTransitionBehaviorAccess() {
		return pTransitionBehavior;
	}
	
	public ParserRule getTransitionBehaviorRule() {
		return getTransitionBehaviorAccess().getRule();
	}
	
	//TransitionTrigger returns fmlStmnt::InputComStatement
	//    : InputComStatement
	//    ;
	public TransitionTriggerElements getTransitionTriggerAccess() {
		return pTransitionTrigger;
	}
	
	public ParserRule getTransitionTriggerRule() {
		return getTransitionTriggerAccess().getRule();
	}
	
	//TransitionGuard returns fmlStmnt::AbstractGuardStatement
	//    : {fmlStmnt::GuardStatement}
	//        '@guard<' condition=TransitionGuardExpression
	//    | '@guard:'
	//        ( {fmlStmnt::GuardStatement}
	//            ( '[' condition=Expression ']'
	//            | condition=Expression
	//            )
	//        | GuardStatement
	//        | EventGuardStatement
	//        | CheckSatGuardStatement
	//        )
	//    ;
	public TransitionGuardElements getTransitionGuardAccess() {
		return pTransitionGuard;
	}
	
	public ParserRule getTransitionGuardRule() {
		return getTransitionGuardAccess().getRule();
	}
	
	//TransitionGuardExpression returns fmlExpr::Expression
	//    : {fmlExpr::LogicalAssociativeExpression}
	//        operator=( '&&' | 'and' | '||' | 'or' ) '>:'
	//        ( operand+=BitwiseOrExpression )+
	//    ;
	public TransitionGuardExpressionElements getTransitionGuardExpressionAccess() {
		return pTransitionGuardExpression;
	}
	
	public ParserRule getTransitionGuardExpressionRule() {
		return getTransitionGuardExpressionAccess().getRule();
	}
	
	//TransitionTimedGuard returns fmlStmnt::TimedGuardStatement
	//    : {fmlStmnt::TimedGuardStatement}
	//        '@tguard<' condition=TransitionGuardExpression
	//    | '@tguard:'
	//        ( {fmlStmnt::TimedGuardStatement}
	//            ( '{' condition=Expression '}'
	//            | condition=Expression
	//            )
	//        | TimedGuardStatement
	//        )
	//    ;
	public TransitionTimedGuardElements getTransitionTimedGuardAccess() {
		return pTransitionTimedGuard;
	}
	
	public ParserRule getTransitionTimedGuardRule() {
		return getTransitionTimedGuardAccess().getRule();
	}
	
	//TransitionEffect returns fmlStmnt::Statement
	//    : TransitionEffectStatement
	//        ( {fmlStmnt::BlockStatement.statement+=current}
	//            statement+=TransitionEffectStatement
	//        )*
	//    ;
	public TransitionEffectElements getTransitionEffectAccess() {
		return pTransitionEffect;
	}
	
	public ParserRule getTransitionEffectRule() {
		return getTransitionEffectAccess().getRule();
	}
	
	//TransitionEffectStatement returns fmlStmnt::Statement
	//    : ExpressionStatement
	//    | OutputComStatement
	//    | IfStatement
	//    | WhileDoStatement
	//    | DoWhileStatement
	//    | ForStatement
	//    | ForEachStatement
	//    | InterruptStatement
	//    | ActivityStatement
	//    | InvokeStatement
	//    ;
	public TransitionEffectStatementElements getTransitionEffectStatementAccess() {
		return pTransitionEffectStatement;
	}
	
	public ParserRule getTransitionEffectStatementRule() {
		return getTransitionEffectStatementAccess().getRule();
	}
	
	//////////////////////////////////////////////////////////////////////////////////
	//// Statement Rules
	//////////////////////////////////////////////////////////////////////////////////
	//Statement returns fmlStmnt::Statement
	//     : BlockStatement
	//     | ExpressionStatement
	//    | GuardStatement
	//    | TimedGuardStatement
	//    | EventGuardStatement
	//    | CheckSatGuardStatement
	//    | InputComStatement
	//    | OutputComStatement
	//    | IfStatement
	//    | WhileDoStatement
	//    | DoWhileStatement
	//    | ForStatement
	//    | ForEachStatement
	//    | InterruptStatement
	//    | ActivityStatement
	//    | InvokeStatement
	////    | ObserverStatement
	//    | MetaStatement
	//    ;
	public StatementElements getStatementAccess() {
		return pStatement;
	}
	
	public ParserRule getStatementRule() {
		return getStatementAccess().getRule();
	}
	
	//BlockStatement returns fmlStmnt::BlockStatement
	//    : {fmlStmnt::BlockStatement}
	//        '{'
	//            ( op=BlockStatementScheduler )?
	//             ( statement+=Statement )*
	//         '}'
	//    ;
	public BlockStatementElements getBlockStatementAccess() {
		return pBlockStatement;
	}
	
	public ParserRule getBlockStatementRule() {
		return getBlockStatementAccess().getRule();
	}
	
	//BlockStatementScheduler
	//    : '|;|' | '|§|' | '|;;|' | '|.|' | '|/;|'
	//    | '|i|' | '|interleaving|'
	//    | '|~|' | '|partial-order|'
	//    | '|,|' | '|parallel|'
	//    | '|a|' | '|async|'
	//    | '|partial-order|'
	//    | '|and|' | '|or|'
	//    | '|and#then|' | '|or#else|'
	//    | '|indet|' | '|/\\|'
	//    | '|fork|' | '|join|'
	//    ;
	public BlockStatementSchedulerElements getBlockStatementSchedulerAccess() {
		return pBlockStatementScheduler;
	}
	
	public ParserRule getBlockStatementSchedulerRule() {
		return getBlockStatementSchedulerAccess().getRule();
	}
	
	///////////////////////////////////////////
	//// Assignment Rules as Expression Statement
	//// lv = rv
	//// newfresh lv
	//// ++lv --lv
	//// lv++  lv--
	///////////////////////////////////////////
	//ExpressionStatement returns fmlStmnt::ExpressionStatement
	//    : expression=AssignmentExpression ';'
	//    | expression=NewfreshExpression ';'
	//    | expression=IncrementOrDecrementPrefixExpression  ';'
	//    | expression=IncrementOrDecrementPostfixExpression ';'
	////    | expression=DynamicInstantiationExpression ';'
	////    | expression=InvokeExpression ';'
	//    ;
	public ExpressionStatementElements getExpressionStatementAccess() {
		return pExpressionStatement;
	}
	
	public ParserRule getExpressionStatementRule() {
		return getExpressionStatementAccess().getRule();
	}
	
	/////////////////////////////////////////////
	////// Guard Rules
	/////////////////////////////////////////////
	//GuardStatement returns fmlStmnt::GuardStatement
	//    : 'guard' condition=Expression ';'
	//    ;
	public GuardStatementElements getGuardStatementAccess() {
		return pGuardStatement;
	}
	
	public ParserRule getGuardStatementRule() {
		return getGuardStatementAccess().getRule();
	}
	
	//TimedGuardStatement returns fmlStmnt::TimedGuardStatement
	//    : 'tguard' condition=Expression ';'
	//    ;
	public TimedGuardStatementElements getTimedGuardStatementAccess() {
		return pTimedGuardStatement;
	}
	
	public ParserRule getTimedGuardStatementRule() {
		return getTimedGuardStatementAccess().getRule();
	}
	
	//EventGuardStatement returns fmlStmnt::EventGuardStatement
	//    : 'event' condition=Expression ';'
	//    ;
	public EventGuardStatementElements getEventGuardStatementAccess() {
		return pEventGuardStatement;
	}
	
	public ParserRule getEventGuardStatementRule() {
		return getEventGuardStatementAccess().getRule();
	}
	
	//CheckSatGuardStatement returns fmlStmnt::CheckSatGuardStatement
	//    : 'checksat' '<' solver=ESIdentifier '>' condition=Expression ';'
	//    ;
	public CheckSatGuardStatementElements getCheckSatGuardStatementAccess() {
		return pCheckSatGuardStatement;
	}
	
	public ParserRule getCheckSatGuardStatementRule() {
		return getCheckSatGuardStatementAccess().getRule();
	}
	
	/////////////////////////////////////////////
	////
	////// Communication Rules
	/////////////////////////////////////////////
	//InputComStatement returns fmlStmnt::InputComStatement
	//    : 'input' port=LitteralComElement //ExpressionAsPort
	//        ( '(' leftValue+=Expression ( ',' leftValue+= Expression )* ')' )?
	////        ( ( '<--' target=ValuePureNamedMachineExpression )?
	//        ( ( '<--' target=LiteralPureReferenceExpression )?
	//        & ( ( '<==' | 'via' ) route=[fmlInfra::Channel|ESUfid]/*ExpressionAsChannel*/ )?
	//        ) ';'
	//    ;
	public InputComStatementElements getInputComStatementAccess() {
		return pInputComStatement;
	}
	
	public ParserRule getInputComStatementRule() {
		return getInputComStatementAccess().getRule();
	}
	
	//OutputComStatement returns fmlStmnt::OutputComStatement
	//    : 'output' port=LitteralComElement //port=ExpressionAsPort
	//        ( '(' rightValue+=Expression ( ',' rightValue+=Expression )* ')' )?
	////        ( ( '-->' target=ValuePureNamedMachineExpression )?
	//        ( ( '-->' target=LiteralPureReferenceExpression )?
	//        & ( ( '==>' | 'via' ) route=[fmlInfra::Channel|ESUfid]/*ExpressionAsChannel*/ )?
	//        ) ';'
	//    ;
	public OutputComStatementElements getOutputComStatementAccess() {
		return pOutputComStatement;
	}
	
	public ParserRule getOutputComStatementRule() {
		return getOutputComStatementAccess().getRule();
	}
	
	//LitteralComElement returns fmlExpr::LiteralReferenceElement
	//    : element=[fmlCommon::NamedElement|ESIdentifier]
	////    | element=[fmlInfra::Port|ESIdentifier]
	////    | element=[fmlInfra::Signal|ESIdentifier]
	////    | element=[fmlInfra::Message|ESIdentifier]
	//    ;
	public LitteralComElementElements getLitteralComElementAccess() {
		return pLitteralComElement;
	}
	
	public ParserRule getLitteralComElementRule() {
		return getLitteralComElementAccess().getRule();
	}
	
	/////////////////////////////////////////////
	////// If - Conditional Rules
	/////////////////////////////////////////////
	//IfStatement returns fmlStmnt::IfStatement
	//    : 'if' condition=Expression
	//        bodyBlock=BlockStatement
	//        ( elseifStatement+=ElseIfStatement )*
	//        ( 'else' elseBlock=BlockStatement )?
	//    ;
	public IfStatementElements getIfStatementAccess() {
		return pIfStatement;
	}
	
	public ParserRule getIfStatementRule() {
		return getIfStatementAccess().getRule();
	}
	
	//ElseIfStatement returns fmlStmnt::ConditionalBlockStatement
	//    : ( 'elseif' | 'else' 'if' ) condition=Expression
	//        bodyBlock=BlockStatement
	//    ;
	public ElseIfStatementElements getElseIfStatementAccess() {
		return pElseIfStatement;
	}
	
	public ParserRule getElseIfStatementRule() {
		return getElseIfStatementAccess().getRule();
	}
	
	///////////////////////////////////////////
	//// Loop - Iteration Rules
	///////////////////////////////////////////
	//WhileDoStatement returns fmlStmnt::WhileDoStatement
	//    : 'while' condition=Expression  bodyBlock=BlockStatement
	//    ;
	public WhileDoStatementElements getWhileDoStatementAccess() {
		return pWhileDoStatement;
	}
	
	public ParserRule getWhileDoStatementRule() {
		return getWhileDoStatementAccess().getRule();
	}
	
	//DoWhileStatement returns fmlStmnt::DoWhileStatement
	//    : 'do' bodyBlock=BlockStatement  'while' condition=Expression ';'
	//    ;
	public DoWhileStatementElements getDoWhileStatementAccess() {
		return pDoWhileStatement;
	}
	
	public ParserRule getDoWhileStatementRule() {
		return getDoWhileStatementAccess().getRule();
	}
	
	//ForStatement returns fmlStmnt::ForStatement
	//    : 'for' ( init=ForAssignmentExpression ) ? ';'
	//        condition=Expression ';' ( iterate=ForAssignmentExpression )?
	//        bodyBlock=BlockStatement
	//    | 'for' '(' ( init=ForAssignmentExpression ) ? ';'
	//        condition=Expression ';' ( iterate=ForAssignmentExpression )? ')'
	//        bodyBlock=BlockStatement
	//    ;
	public ForStatementElements getForStatementAccess() {
		return pForStatement;
	}
	
	public ParserRule getForStatementRule() {
		return getForStatementAccess().getRule();
	}
	
	//ForAssignmentExpression returns fmlExpr::Expression
	//    : AssignmentExpression
	//    | IncrementOrDecrementPrefixExpression
	//    | IncrementOrDecrementPostfixExpression
	//    ;
	public ForAssignmentExpressionElements getForAssignmentExpressionAccess() {
		return pForAssignmentExpression;
	}
	
	public ParserRule getForAssignmentExpressionRule() {
		return getForAssignmentExpressionAccess().getRule();
	}
	
	//ForEachStatement returns fmlStmnt::ForEachStatement
	//    : 'for' iterator=LeftHandSideExpression ':' enumeration=Expression
	//        bodyBlock=BlockStatement
	//    | 'for' '(' iterator=LeftHandSideExpression ':' enumeration=Expression ')'
	//        bodyBlock=BlockStatement
	//    ;
	public ForEachStatementElements getForEachStatementAccess() {
		return pForEachStatement;
	}
	
	public ParserRule getForEachStatementRule() {
		return getForEachStatementAccess().getRule();
	}
	
	///////////////////////////////////////////
	//// Interrupt Rules
	///////////////////////////////////////////
	//InterruptStatement returns fmlStmnt::InterruptStatement
	//    : kind=InterruptStatementKind
	//        ( expr+=Expression
	//        | '(' expr+=Expression ( ',' expr+=Expression )* ')'
	//        )? ';'
	//    ;
	public InterruptStatementElements getInterruptStatementAccess() {
		return pInterruptStatement;
	}
	
	public ParserRule getInterruptStatementRule() {
		return getInterruptStatementAccess().getRule();
	}
	
	//enum InterruptStatementKind returns fmlStmnt::InterruptStatementKind
	//    : break    = 'break'
	//    | continue = 'continue'
	//    | return   = 'return'
	//    | exit     = 'exit'
	//    ;
	public InterruptStatementKindElements getInterruptStatementKindAccess() {
		return eInterruptStatementKind;
	}
	
	public EnumRule getInterruptStatementKindRule() {
		return getInterruptStatementKindAccess().getRule();
	}
	
	/////////////////////////////////////////////
	////// Activity Rules
	/////////////////////////////////////////////
	//ActivityStatement returns fmlStmnt::ActivityStatement
	//    : {fmlStmnt::ActivityStatement}
	//        op=OPERATOR_ACTIVITY
	//        ( machine=ValuePureNamedMachineExpression
	//            ( ( tuple=TupleParameterExpression )? ';'
	////            | '(' ( slot+=SlotParameter ( ',' slot+=SlotParameter )* )? ')'  ';'
	//            | '{' ( slot+=SlotProperty ';' )*  '}'
	//            )
	//        | ';'
	//        )?
	//    ;
	public ActivityStatementElements getActivityStatementAccess() {
		return pActivityStatement;
	}
	
	public ParserRule getActivityStatementRule() {
		return getActivityStatementAccess().getRule();
	}
	
	//enum OPERATOR_ACTIVITY returns fmlStmnt::ActivityStatementKind
	//    : init     = 'init'
	//    | final    = 'final'
	//    | new      = 'new'
	//    | destroy  = 'destroy'
	//    | start    = 'start'
	//    | stop     = 'stop'
	//    | restart  = 'restart'
	//    | suspend  = 'suspend'
	//    | resume   = 'resume'
	//    | wait     = 'wait'
	//    | disable  = 'disable'
	//    | enable   = 'enable'
	//    | abort    = 'abort'
	//    | goto     = 'goto'
	//    | schedule = 'schedule'
	//    | irun = 'irun'
	//    | run  = 'run'
	//    | rtc  = 'rtc'
	//    ;
	public OPERATOR_ACTIVITYElements getOPERATOR_ACTIVITYAccess() {
		return eOPERATOR_ACTIVITY;
	}
	
	public EnumRule getOPERATOR_ACTIVITYRule() {
		return getOPERATOR_ACTIVITYAccess().getRule();
	}
	
	//InvokeStatement returns fmlStmnt::InvokeStatement
	//    : expression=InvokeExpressionDeprecated ';'
	//    // Exec Routine
	//    |  invokable=[fmlCommon::NamedElement|ESUfid]
	//        execRoutine?='(' ( args=MixTupleExpressionList )? ')'
	//        ( '-->'
	//            ( rets+=[fmlInfra::Variable] ( ',' rets+=[fmlInfra::Variable] )*
	//            | '(' rets+=[fmlInfra::Variable]
	//                ( ',' rets+=[fmlInfra::Variable] )* ')'
	//            )
	//        )? ';'
	//    // Exec Routine
	//    | execRoutine?='exec' invokable=[fmlCommon::NamedElement|ESUfid]
	//        '(' ( args=MixTupleExpressionList )? ')'
	//        ( '-->'
	//            ( rets+=[fmlInfra::Variable] ( ',' rets+=[fmlInfra::Variable] )*
	//            | '(' rets+=[fmlInfra::Variable]
	//                ( ',' rets+=[fmlInfra::Variable] )* ')'
	//            )
	//        )? ';'
	//    // Call Procedure
	//    | callProcedure?='call' invokable=[fmlCommon::NamedElement|ESUfid]
	//        ( args=MixTupleExpressionList )?
	//        ( '-->'
	//            ( rets+=[fmlInfra::Variable] ( ',' rets+=[fmlInfra::Variable] )*
	//            | '(' rets+=[fmlInfra::Variable]
	//                ( ',' rets+=[fmlInfra::Variable] )* ')'
	//            )
	//        )? ';'
	//    ;
	public InvokeStatementElements getInvokeStatementAccess() {
		return pInvokeStatement;
	}
	
	public ParserRule getInvokeStatementRule() {
		return getInvokeStatementAccess().getRule();
	}
	
	/////////////////////////////////////////////
	////// ObsStatement Rules
	/////////////////////////////////////////////
	//ObserverStatement returns fmlStmnt::ObserverStatement
	//    : {fmlStmnt::ObserverStatement}
	//        ( '@observe' | '@obs' )
	//        ( '('  'ctx:'  context=ValuePureNamedMachineExpression  ')'  )?
	//          '{'
	//               statement=ObservableStatement
	//          '}'
	//        (
	//        ( 'provided:' postCondition=Expression
	//         | '[' postCondition=Expression ']'
	//         )
	//        ';'
	//        )?
	//    ;
	public ObserverStatementElements getObserverStatementAccess() {
		return pObserverStatement;
	}
	
	public ParserRule getObserverStatementRule() {
		return getObserverStatementAccess().getRule();
	}
	
	//ObservableStatement returns fmlStmnt::Statement
	//    : ObsInputComStatement
	//    | ObsOutputComStatement
	//    ;
	public ObservableStatementElements getObservableStatementAccess() {
		return pObservableStatement;
	}
	
	public ParserRule getObservableStatementRule() {
		return getObservableStatementAccess().getRule();
	}
	
	//ObsInputComStatement returns fmlStmnt::InputComStatement
	//    : 'input' port=ObsComElement
	//        ( '(' leftValue+=Expression ( ',' leftValue+= Expression )* ')' )?
	//        ( ( '<--' target=ValuePureNamedMachineExpression )?
	//        & ( ( '<==' | 'via' ) route=[fmlInfra::Channel|ESUfid]/*ExpressionAsChannel*/ )?
	//        ) ';'
	//    ;
	public ObsInputComStatementElements getObsInputComStatementAccess() {
		return pObsInputComStatement;
	}
	
	public ParserRule getObsInputComStatementRule() {
		return getObsInputComStatementAccess().getRule();
	}
	
	//ObsOutputComStatement returns fmlStmnt::OutputComStatement
	//    : 'output' port=ObsComElement
	//        ( '(' rightValue+=Expression ( ',' rightValue+=Expression )* ')' )?
	//        ( ( '-->' target=ValuePureNamedMachineExpression )?
	//        & ( ( '==>' | 'via' ) route=[fmlInfra::Channel|ESUfid]/*ExpressionAsChannel*/ )?
	//        ) ';'
	//    ;
	public ObsOutputComStatementElements getObsOutputComStatementAccess() {
		return pObsOutputComStatement;
	}
	
	public ParserRule getObsOutputComStatementRule() {
		return getObsOutputComStatementAccess().getRule();
	}
	
	//ObsComElement returns fmlExpr::ValueElementSpecification
	//    : ( parent=LiteralPureReferenceExpression
	////    : ( parent=ValuePureNamedInstanceExpression
	////        // ( '.' | '->' ) element
	////        kind=( ValueDotFieldExpressionKind | ValueArrowFieldExpressionKind )
	//      )?
	//      element=[fmlCommon::NamedElement|ESIdentifier]
	//    ;
	public ObsComElementElements getObsComElementAccess() {
		return pObsComElement;
	}
	
	public ParserRule getObsComElementRule() {
		return getObsComElementAccess().getRule();
	}
	
	////ValuePureNamedInstanceExpression returns fmlExpr::Expression
	////    : LiteralPureReferenceExpression
	////
	////        // ( '.' | '->' ) element
	////        ( { fmlExpr::ValueElementSpecification.parent=current }
	//////            kind=(ValueDotFieldExpressionKind | ValueArrowFieldExpressionKind )
	////            kind=ValueDotFieldExpressionKind
	////            element=[fmlCommon::NamedElement|ESIdentifier]
	////        )*
	////    ;
	/////////////////////////////////////////////
	////// MetaStatement Rules
	/////////////////////////////////////////////
	//MetaStatement returns fmlStmnt::MetaStatement
	//    : {fmlStmnt::MetaStatement}
	//        op=OPERATOR_META
	//        ( '{'
	//            ( ( operand+=Statement  )+
	//            | ( operand+=Expression )+
	//            )
	//            '}'
	//        | ( operand+=Expression )+  ';'
	//          )
	//    ;
	public MetaStatementElements getMetaStatementAccess() {
		return pMetaStatement;
	}
	
	public ParserRule getMetaStatementRule() {
		return getMetaStatementAccess().getRule();
	}
	
	//enum OPERATOR_META returns fmlStmnt::MetaStatementKind
	//    : informal = '@informal'
	//    | trace    = '@trace'
	//    | debug    = '@debug'
	//    | comment  = '@comment'
	//    | quote    = '@quote'
	//    | eval     = '@eval'
	//    | run      = '@run'
	//    ;
	public OPERATOR_METAElements getOPERATOR_METAAccess() {
		return eOPERATOR_META;
	}
	
	public EnumRule getOPERATOR_METARule() {
		return getOPERATOR_METAAccess().getRule();
	}
	
	//////////////////////////////////////////////////////////////////////////////////
	//// Expression Rules
	//////////////////////////////////////////////////////////////////////////////////
	//Expression returns fmlExpr::Expression
	//    : AssignmentExpression
	//    | ConditionalTestExpression
	//    ;
	public ExpressionElements getExpressionAccess() {
		return pExpression;
	}
	
	public ParserRule getExpressionRule() {
		return getExpressionAccess().getRule();
	}
	
	//// Assignment Expression
	//AssignmentExpression returns fmlExpr::AssignmentExpression
	//    : leftHandSide=LeftHandSideExpression
	//        operator=AssignmentOperator rightHandSide=Expression
	//    ;
	public AssignmentExpressionElements getAssignmentExpressionAccess() {
		return pAssignmentExpression;
	}
	
	public ParserRule getAssignmentExpressionRule() {
		return getAssignmentExpressionAccess().getRule();
	}
	
	//AssignmentOperator
	//    : '='   | ':='  | '::='
	//    | '+='  | '-='
	//    | '*='  | '/='  | '%='
	//    | '&&=' | '||='
	//    | '&='  | '|='    | '^='
	//    | '<<=' | '>>=' | '>>>='
	//// queue operation: push, assign_top, top, pop
	//    | '<=<'
	//    | '^=<'
	//    | '^=>'
	//    | '>=>'
	//    ;
	public AssignmentOperatorElements getAssignmentOperatorAccess() {
		return pAssignmentOperator;
	}
	
	public ParserRule getAssignmentOperatorRule() {
		return getAssignmentOperatorAccess().getRule();
	}
	
	//LeftHandSideExpression returns fmlExpr::LeftHandSideExpression
	//    : { fmlExpr::LeftHandSideExpression }
	////        lvalue=PrimaryExpression
	//        ( lvalue=ValueSelectionExpression
	//        | '(' lvalue=ValueSelectionExpression ')'
	//        )
	//    ;
	public LeftHandSideExpressionElements getLeftHandSideExpressionAccess() {
		return pLeftHandSideExpression;
	}
	
	public ParserRule getLeftHandSideExpressionRule() {
		return getLeftHandSideExpressionAccess().getRule();
	}
	
	//// Conditional Test Expression
	//ConditionalTestExpression returns fmlExpr::Expression
	//    : LogicalOrExpression
	//        ( {fmlExpr::ConditionalTestExpression.condition=current}
	//            operator='?' thenOperand=Expression elseSeparator=':'
	//            elseOperand=Expression
	//        )?
	//    ;
	public ConditionalTestExpressionElements getConditionalTestExpressionAccess() {
		return pConditionalTestExpression;
	}
	
	public ParserRule getConditionalTestExpressionRule() {
		return getConditionalTestExpressionAccess().getRule();
	}
	
	//// Logical Expression
	//LogicalOrExpression returns fmlExpr::Expression
	//    : LogicalAndExpression
	//        ( {fmlExpr::LogicalAssociativeExpression.operand+=current}
	//            operator=( '||' | 'or' ) operand+=LogicalAndExpression
	//            ( ( '||' | 'or' ) operand+=LogicalAndExpression )*
	//        )?
	//    ;
	public LogicalOrExpressionElements getLogicalOrExpressionAccess() {
		return pLogicalOrExpression;
	}
	
	public ParserRule getLogicalOrExpressionRule() {
		return getLogicalOrExpressionAccess().getRule();
	}
	
	//LogicalAndExpression returns fmlExpr::Expression
	//    : BitwiseOrExpression
	//        ( {fmlExpr::LogicalAssociativeExpression.operand+=current}
	//            operator=( '&&' | 'and' ) operand+=BitwiseOrExpression
	//            ( ( '&&' | 'and' ) operand+=BitwiseOrExpression )*
	//        )?
	//    ;
	public LogicalAndExpressionElements getLogicalAndExpressionAccess() {
		return pLogicalAndExpression;
	}
	
	public ParserRule getLogicalAndExpressionRule() {
		return getLogicalAndExpressionAccess().getRule();
	}
	
	//// Bitwise Expression
	//BitwiseOrExpression returns fmlExpr::Expression
	//    : BitwiseXorExpression
	//        ( {fmlExpr::BitwiseAssociativeExpression.operand+=current}
	//            operator='|' operand+=BitwiseXorExpression
	//            ( '|' operand+=BitwiseXorExpression )*
	//        )?
	//    ;
	public BitwiseOrExpressionElements getBitwiseOrExpressionAccess() {
		return pBitwiseOrExpression;
	}
	
	public ParserRule getBitwiseOrExpressionRule() {
		return getBitwiseOrExpressionAccess().getRule();
	}
	
	//BitwiseXorExpression returns fmlExpr::Expression
	//    : BitwiseAndExpression
	//        ( {fmlExpr::BitwiseAssociativeExpression.operand+=current}
	//            operator='^' operand+=BitwiseAndExpression
	//            ( '^' operand+=BitwiseAndExpression )*
	//        )?
	//    ;
	public BitwiseXorExpressionElements getBitwiseXorExpressionAccess() {
		return pBitwiseXorExpression;
	}
	
	public ParserRule getBitwiseXorExpressionRule() {
		return getBitwiseXorExpressionAccess().getRule();
	}
	
	//BitwiseAndExpression returns fmlExpr::Expression
	//    : EqualityExpression
	//        ( {fmlExpr::BitwiseAssociativeExpression.operand+=current}
	//            operator='&' operand+=EqualityExpression
	//            ( '&' operand+=EqualityExpression )*
	//        )?
	//    ;
	public BitwiseAndExpressionElements getBitwiseAndExpressionAccess() {
		return pBitwiseAndExpression;
	}
	
	public ParserRule getBitwiseAndExpressionRule() {
		return getBitwiseAndExpressionAccess().getRule();
	}
	
	//// Equality Expression
	//EqualityExpression returns fmlExpr::Expression
	//    : RelationalExpression
	//        ( {fmlExpr::EqualityBinaryExpression.leftOperand=current}
	//            operator=EqualityOperator rightOperand=RelationalExpression
	//        )?
	//    ;
	public EqualityExpressionElements getEqualityExpressionAccess() {
		return pEqualityExpression;
	}
	
	public ParserRule getEqualityExpressionRule() {
		return getEqualityExpressionAccess().getRule();
	}
	
	//EqualityOperator
	//    : '==' | '!=' | '===' | '!==' | '=!=' | '=/='
	//    ;
	public EqualityOperatorElements getEqualityOperatorAccess() {
		return pEqualityOperator;
	}
	
	public ParserRule getEqualityOperatorRule() {
		return getEqualityOperatorAccess().getRule();
	}
	
	//// Relational Binary Expression
	//RelationalExpression returns fmlExpr::Expression
	//    : AdditiveExpression
	//        ( {fmlExpr::RelationalBinaryExpression.leftOperand=current}
	//            operator=RelationalOperator rightOperand=AdditiveExpression
	//            ( {fmlExpr::RelationalTernaryExpression.leftRelation=current}
	//                rightOperator=RelationalOperator rightOperand=AdditiveExpression
	//            )?
	//        )?
	//    ;
	public RelationalExpressionElements getRelationalExpressionAccess() {
		return pRelationalExpression;
	}
	
	public ParserRule getRelationalExpressionRule() {
		return getRelationalExpressionAccess().getRule();
	}
	
	//RelationalOperator
	//    : '<' | '>' | '<=' | '>=' | 'in'
	//    ;
	public RelationalOperatorElements getRelationalOperatorAccess() {
		return pRelationalOperator;
	}
	
	public ParserRule getRelationalOperatorRule() {
		return getRelationalOperatorAccess().getRule();
	}
	
	//// Arithmetic Associative (left) Expression
	//AdditiveExpression returns fmlExpr::Expression
	//    : MultiplicativeExpression
	//        ( ( {fmlExpr::ArithmeticAssociativeExpression.operand+=current}
	//            operator='+' operand+=MultiplicativeExpression
	//            ( '+' operand+=MultiplicativeExpression )* )
	//        | ( {fmlExpr::ArithmeticAssociativeExpression.operand+=current}
	//            operator='-' operand+=MultiplicativeExpression
	//            ( '-' operand+=MultiplicativeExpression )* )
	//        )*
	//    ;
	public AdditiveExpressionElements getAdditiveExpressionAccess() {
		return pAdditiveExpression;
	}
	
	public ParserRule getAdditiveExpressionRule() {
		return getAdditiveExpressionAccess().getRule();
	}
	
	//MultiplicativeExpression returns fmlExpr::Expression
	//    : UnaryExpression
	//        ( ( {fmlExpr::ArithmeticAssociativeExpression.operand+=current}
	//            operator='*' operand+=UnaryExpression
	//            ( '*' operand+=UnaryExpression )* )
	//        | ( {fmlExpr::ArithmeticAssociativeExpression.operand+=current}
	//            operator='**' operand+=UnaryExpression
	//            ( '**' operand+=UnaryExpression )* )
	//        | ( {fmlExpr::ArithmeticAssociativeExpression.operand+=current}
	//            operator='/' operand+=UnaryExpression
	//            ( '/' operand+=UnaryExpression )* )
	//        | ( {fmlExpr::ArithmeticAssociativeExpression.operand+=current}
	//            operator='%' operand+=UnaryExpression
	//            ( '%' operand+=UnaryExpression )* )
	//        )*
	//    ;
	public MultiplicativeExpressionElements getMultiplicativeExpressionAccess() {
		return pMultiplicativeExpression;
	}
	
	public ParserRule getMultiplicativeExpressionRule() {
		return getMultiplicativeExpressionAccess().getRule();
	}
	
	//// Unary Expression
	//UnaryExpression returns fmlExpr::Expression
	//    : LiteralTerminalExpression
	//    | ArithmeticUnaryExpression
	//    | LogicalUnaryExpression
	//    | QuantifiedLogicalExpression
	//    | BitwiseUnaryExpression
	//    | NewfreshExpression
	//    | CastExpression
	////    | CollectionFunctionExpression
	//    | PrefixUnaryExpression
	//    | PostfixUnaryExpression
	//    | PrimaryExpression
	//    ;
	public UnaryExpressionElements getUnaryExpressionAccess() {
		return pUnaryExpression;
	}
	
	public ParserRule getUnaryExpressionRule() {
		return getUnaryExpressionAccess().getRule();
	}
	
	//// Postfix Increment or Decrement Expression
	//PostfixUnaryExpression returns fmlExpr::Expression
	//    : IncrementOrDecrementPostfixExpression
	//    ;
	public PostfixUnaryExpressionElements getPostfixUnaryExpressionAccess() {
		return pPostfixUnaryExpression;
	}
	
	public ParserRule getPostfixUnaryExpressionRule() {
		return getPostfixUnaryExpressionAccess().getRule();
	}
	
	//IncrementOrDecrementPostfixExpression returns fmlExpr::IncrementOrDecrementPostfixExpression
	//    : leftHandSide=LeftHandSideExpression operator=(AffixOperator  | '>=>')
	//    ;
	public IncrementOrDecrementPostfixExpressionElements getIncrementOrDecrementPostfixExpressionAccess() {
		return pIncrementOrDecrementPostfixExpression;
	}
	
	public ParserRule getIncrementOrDecrementPostfixExpressionRule() {
		return getIncrementOrDecrementPostfixExpressionAccess().getRule();
	}
	
	//// Prefix Increment or Decrement Expression
	//PrefixUnaryExpression returns fmlExpr::Expression
	//    : IncrementOrDecrementPrefixExpression
	//    ;
	public PrefixUnaryExpressionElements getPrefixUnaryExpressionAccess() {
		return pPrefixUnaryExpression;
	}
	
	public ParserRule getPrefixUnaryExpressionRule() {
		return getPrefixUnaryExpressionAccess().getRule();
	}
	
	//IncrementOrDecrementPrefixExpression returns fmlExpr::IncrementOrDecrementPrefixExpression
	//    : operator=AffixOperator leftHandSide=LeftHandSideExpression
	//    ;
	public IncrementOrDecrementPrefixExpressionElements getIncrementOrDecrementPrefixExpressionAccess() {
		return pIncrementOrDecrementPrefixExpression;
	}
	
	public ParserRule getIncrementOrDecrementPrefixExpressionRule() {
		return getIncrementOrDecrementPrefixExpressionAccess().getRule();
	}
	
	//AffixOperator
	//    : '++' | '--'
	//    ;
	public AffixOperatorElements getAffixOperatorAccess() {
		return pAffixOperator;
	}
	
	public ParserRule getAffixOperatorRule() {
		return getAffixOperatorAccess().getRule();
	}
	
	//// Newfresh Unary Expression
	//NewfreshExpression returns fmlExpr::NewfreshExpression
	//    : 'newfresh' leftHandSide=LeftHandSideExpression
	//    | '(:' leftHandSide=LeftHandSideExpression 'newfresh' ')'
	//    ;
	public NewfreshExpressionElements getNewfreshExpressionAccess() {
		return pNewfreshExpression;
	}
	
	public ParserRule getNewfreshExpressionRule() {
		return getNewfreshExpressionAccess().getRule();
	}
	
	//// Cast Expression
	//CastExpression returns fmlExpr::CastExpression
	//    : 'ctor' '<' datatype=[fmlType::DataType|ESUfid] '>'
	//         '(' operand=Expression ')'
	//    ;
	public CastExpressionElements getCastExpressionAccess() {
		return pCastExpression;
	}
	
	public ParserRule getCastExpressionRule() {
		return getCastExpressionAccess().getRule();
	}
	
	////CollectionFunctionExpression  fmlExpr::MixTupleExpression
	//CollectionFunctionExpression returns fmlExpr::Expression
	//    : 'empty('    Expression ')'
	//    | 'nonempty(' Expression ')'
	//    | 'size('     Expression ')'
	//    ;
	public CollectionFunctionExpressionElements getCollectionFunctionExpressionAccess() {
		return pCollectionFunctionExpression;
	}
	
	public ParserRule getCollectionFunctionExpressionRule() {
		return getCollectionFunctionExpressionAccess().getRule();
	}
	
	//// Arithmetic Unary Expression
	//ArithmeticUnaryExpression returns fmlExpr::ArithmeticUnaryExpression
	//    : operator=ArithmeticUnaryOperator operand=UnaryExpression
	//;
	public ArithmeticUnaryExpressionElements getArithmeticUnaryExpressionAccess() {
		return pArithmeticUnaryExpression;
	}
	
	public ParserRule getArithmeticUnaryExpressionRule() {
		return getArithmeticUnaryExpressionAccess().getRule();
	}
	
	//ArithmeticUnaryOperator
	//    : '+' | '-'
	//    ;
	public ArithmeticUnaryOperatorElements getArithmeticUnaryOperatorAccess() {
		return pArithmeticUnaryOperator;
	}
	
	public ParserRule getArithmeticUnaryOperatorRule() {
		return getArithmeticUnaryOperatorAccess().getRule();
	}
	
	//// Logical Quantified Expression
	//QuantifiedLogicalExpression returns fmlExpr::QuantifiedLogicalExpression
	//    : quantifier=( 'forall' | 'exists' )
	//      '<'  variable+=BoundVariable  ( ',' variable+=BoundVariable )*  '>'
	//      '('  predicate=Expression  ')'
	//    ;
	public QuantifiedLogicalExpressionElements getQuantifiedLogicalExpressionAccess() {
		return pQuantifiedLogicalExpression;
	}
	
	public ParserRule getQuantifiedLogicalExpressionRule() {
		return getQuantifiedLogicalExpressionAccess().getRule();
	}
	
	//BoundVariable returns fmlInfra::Variable
	//    : name=ESIdentifier  ':'  type=DataType
	//    ;
	public BoundVariableElements getBoundVariableAccess() {
		return pBoundVariable;
	}
	
	public ParserRule getBoundVariableRule() {
		return getBoundVariableAccess().getRule();
	}
	
	//// Logical Unary Expression
	//LogicalUnaryExpression returns fmlExpr::LogicalUnaryExpression
	//    : operator=('!' | 'not') operand=UnaryExpression
	//    ;
	public LogicalUnaryExpressionElements getLogicalUnaryExpressionAccess() {
		return pLogicalUnaryExpression;
	}
	
	public ParserRule getLogicalUnaryExpressionRule() {
		return getLogicalUnaryExpressionAccess().getRule();
	}
	
	//// Logical Unary Expression
	//BitwiseUnaryExpression returns fmlExpr::BitwiseUnaryExpression
	//    :operator='~' operand=UnaryExpression
	//    ;
	public BitwiseUnaryExpressionElements getBitwiseUnaryExpressionAccess() {
		return pBitwiseUnaryExpression;
	}
	
	public ParserRule getBitwiseUnaryExpressionRule() {
		return getBitwiseUnaryExpressionAccess().getRule();
	}
	
	//PrimaryExpression returns fmlExpr::Expression
	//    : BaseExpression
	//        // '.' element
	//        ( { fmlExpr::ValueElementSpecification.parent=current }
	//            '.' //kind=ValueDotFieldExpressionKind
	//            element=[fmlCommon::NamedElement|ESIdentifier]
	//            // '[' index ',' ... ',' index ']'
	//            ( kind=ValueIndexExpressionKind
	//                arg=PositionalTupleExpressionList  ']'
	//            // '(' parameter ',' ... ',' parameter ')'
	//            | kind=ValueParameterExpressionKind
	//                arg=MixTupleExpressionList  ')'
	//            )?
	//        )*
	//        // '->' element
	//        ( { fmlExpr::ValueElementSpecification.parent=current }
	//            '->' //kind=ValueArrowFieldExpressionKind
	//            element=[fmlCommon::NamedElement|ESIdentifier]
	//            // '[' index ',' ... ',' index ']'
	//            ( kind=ValueIndexExpressionKind
	//                arg=PositionalTupleExpressionList  ']'
	//            // '(' parameter ',' ... ',' parameter ')'
	//            | kind=ValueParameterExpressionKind
	//                arg=MixTupleExpressionList  ')'
	//            )?
	//            // '.' element
	//            ( { fmlExpr::ValueElementSpecification.parent=current }
	//                 '.' //kind=ValueDotFieldExpressionKind
	//                element=[fmlCommon::NamedElement|ESIdentifier]
	//                // '[' index ',' ... ',' index ']'
	//                ( kind=ValueIndexExpressionKind
	//                    arg=PositionalTupleExpressionList  ']'
	//                // '(' parameter ',' ... ',' parameter ')'
	//                | kind=ValueParameterExpressionKind
	//                    arg=MixTupleExpressionList  ')'
	//                )?
	//            )*
	//        )?
	//    ;
	public PrimaryExpressionElements getPrimaryExpressionAccess() {
		return pPrimaryExpression;
	}
	
	public ParserRule getPrimaryExpressionRule() {
		return getPrimaryExpressionAccess().getRule();
	}
	
	//BaseExpression returns fmlExpr::Expression
	//    : LiteralReferenceableExpression
	//    | '(' Expression ')'
	//    | InvokeExpressionDeprecated
	//    | DynamicInstantiationExpression
	////    | NamedExpression
	//    ;
	public BaseExpressionElements getBaseExpressionAccess() {
		return pBaseExpression;
	}
	
	public ParserRule getBaseExpressionRule() {
		return getBaseExpressionAccess().getRule();
	}
	
	//// Behavior Invoke Expression
	//InvokeExpression returns fmlExpr::InvokeExpression
	//    : {fmlExpr::InvokeExpression}
	//        invokable=ValueSelectionExpression
	//    ;
	public InvokeExpressionElements getInvokeExpressionAccess() {
		return pInvokeExpression;
	}
	
	public ParserRule getInvokeExpressionRule() {
		return getInvokeExpressionAccess().getRule();
	}
	
	//InvokeExpressionDeprecated returns fmlExpr::InvokeExpression
	//    : {fmlExpr::InvokeExpression}
	//        '(:' args+=Expression invokable=LiteralReferenceElement ( args+=Expression )* ')'
	//    ;
	public InvokeExpressionDeprecatedElements getInvokeExpressionDeprecatedAccess() {
		return pInvokeExpressionDeprecated;
	}
	
	public ParserRule getInvokeExpressionDeprecatedRule() {
		return getInvokeExpressionDeprecatedAccess().getRule();
	}
	
	//DynamicInstantiationExpression returns fmlExpr::InstantiationExpression
	//    : {fmlExpr::InstantiationExpression}
	//        'new' instance=InstanceSpecification
	//    ;
	public DynamicInstantiationExpressionElements getDynamicInstantiationExpressionAccess() {
		return pDynamicInstantiationExpression;
	}
	
	public ParserRule getDynamicInstantiationExpressionRule() {
		return getDynamicInstantiationExpressionAccess().getRule();
	}
	
	//InstanceSpecification returns fmlInfra::InstanceMachine
	//    : {fmlInfra::InstanceMachine}
	//        model=[fmlInfra::Machine|ESIdentifier]
	////        ( '(' arg=MixTupleExpressionList ')'
	//        ( '(' ( slot+=SlotParameter ( ',' slot+=SlotParameter )* )? ')' )?
	//        ( '{' ( slot+=SlotProperty ';' )*  '}' )?
	//    ;
	public InstanceSpecificationElements getInstanceSpecificationAccess() {
		return pInstanceSpecification;
	}
	
	public ParserRule getInstanceSpecificationRule() {
		return getInstanceSpecificationAccess().getRule();
	}
	
	//// Tuple Expression
	//TupleParameterExpression returns fmlExpr::TupleExpression
	//    : '('  MixTupleExpressionList  ')'
	//    ;
	public TupleParameterExpressionElements getTupleParameterExpressionAccess() {
		return pTupleParameterExpression;
	}
	
	public ParserRule getTupleParameterExpressionRule() {
		return getTupleParameterExpressionAccess().getRule();
	}
	
	//MixTupleExpressionList returns fmlExpr::MixTupleExpression
	//    : {fmlExpr::MixTupleExpression}
	//        value+=( Expression | NamedExpression )
	//        ( ',' value+=( Expression | NamedExpression ) )*
	//    ;
	public MixTupleExpressionListElements getMixTupleExpressionListAccess() {
		return pMixTupleExpressionList;
	}
	
	public ParserRule getMixTupleExpressionListRule() {
		return getMixTupleExpressionListAccess().getRule();
	}
	
	////// At least one NamedExpression
	////FormalMixTupleExpressionList returns fmlExpr::MixTupleExpression
	////    : {fmlExpr::MixTupleExpression}
	////        ( value+=Expression  ( ',' value+=Expression )*
	////            ( ',' value+=NamedExpression )
	////        | value+=NamedExpression
	////        )
	////        ( ',' value+=( Expression | NamedExpression ) )*
	////    ;
	////
	////// NamedExpression only at the end
	////EndingMixTupleExpressionList returns fmlExpr::MixTupleExpression
	////    : {fmlExpr::MixTupleExpression}
	////        ( value+=Expression  ( ',' value+=Expression )*
	////        | value+=NamedExpression
	////        )
	////        ( ',' value+=NamedExpression )*
	////    ;
	////
	////
	////NamedTupleExpressionList returns fmlExpr::NamedTupleExpression
	////    : value+=NamedExpression ( ',' value+=NamedExpression )*
	////    ;
	//PositionalTupleExpressionList returns fmlExpr::PositionalTupleExpression
	//    : value+=Expression ( ',' value+=Expression )*
	//    ;
	public PositionalTupleExpressionListElements getPositionalTupleExpressionListAccess() {
		return pPositionalTupleExpressionList;
	}
	
	public ParserRule getPositionalTupleExpressionListRule() {
		return getPositionalTupleExpressionListAccess().getRule();
	}
	
	//NamedExpression returns fmlExpr::NamedExpression
	//    : //target=[fmlCommon::NamedElement|ESIdentifier]
	//        name=XLIA_ID
	//        ( ':' | '=>' | '<-' ) expression=Expression
	//    ;
	public NamedExpressionElements getNamedExpressionAccess() {
		return pNamedExpression;
	}
	
	public ParserRule getNamedExpressionRule() {
		return getNamedExpressionAccess().getRule();
	}
	
	////NotificationComExpression returns fmlExpr::Expression
	////    : { fmlExpr::Expression }
	////        symbol=( 'present' | 'absent' )  operand+=Expression
	////    ;
	//////////////////////////////////////////////////////////////////////////////////
	//// Literal Expression Rules
	//////////////////////////////////////////////////////////////////////////////////
	//LiteralExpression returns fmlExpr::LiteralExpression
	//    : LiteralTerminalExpression
	//    | LiteralReferenceableExpression
	//    ;
	public LiteralExpressionElements getLiteralExpressionAccess() {
		return pLiteralExpression;
	}
	
	public ParserRule getLiteralExpressionRule() {
		return getLiteralExpressionAccess().getRule();
	}
	
	//LiteralReferenceableExpression returns fmlExpr::LiteralExpression
	//    : LiteralCollectionExpression
	//    | LiteralReferenceExpression
	//    ;
	public LiteralReferenceableExpressionElements getLiteralReferenceableExpressionAccess() {
		return pLiteralReferenceableExpression;
	}
	
	public ParserRule getLiteralReferenceableExpressionRule() {
		return getLiteralReferenceableExpressionAccess().getRule();
	}
	
	//LiteralTerminalExpression returns fmlExpr::LiteralExpression
	//    : LiteralBooleanExpression
	//    | LiteralIntegerExpression
	//    | LiteralRationalExpression
	//    | LiteralFloatExpression
	//    | LiteralCharacterExpression
	//    | LiteralStringExpression
	//    | LiteralNullExpression
	//    | LiteralAnyValueExpression
	//    | LiteralOptionalValueExpression
	//    | LiteralNoneValueExpression
	//    | LiteralAnyOrNoneValueExpression
	//    ;
	public LiteralTerminalExpressionElements getLiteralTerminalExpressionAccess() {
		return pLiteralTerminalExpression;
	}
	
	public ParserRule getLiteralTerminalExpressionRule() {
		return getLiteralTerminalExpressionAccess().getRule();
	}
	
	//////////////////////////////////////////////////////////////////////////////////
	//// Literal Boolean / Numeric Expression Rules
	//////////////////////////////////////////////////////////////////////////////////
	//LiteralBooleanExpression returns fmlExpr::LiteralBooleanExpression
	//    : {fmlExpr::LiteralBooleanExpression}
	//        value=EBoolean
	//    ;
	public LiteralBooleanExpressionElements getLiteralBooleanExpressionAccess() {
		return pLiteralBooleanExpression;
	}
	
	public ParserRule getLiteralBooleanExpressionRule() {
		return getLiteralBooleanExpressionAccess().getRule();
	}
	
	//LiteralIntegerExpression returns fmlExpr::LiteralIntegerExpression
	//    : {fmlExpr::LiteralIntegerExpression}
	//        value=EInteger
	//    ;
	public LiteralIntegerExpressionElements getLiteralIntegerExpressionAccess() {
		return pLiteralIntegerExpression;
	}
	
	public ParserRule getLiteralIntegerExpressionRule() {
		return getLiteralIntegerExpressionAccess().getRule();
	}
	
	//LiteralRationalExpression returns fmlExpr::LiteralRationalExpression
	//    : {fmlExpr::LiteralRationalExpression}
	//        numerator=EInteger '/' denominator=EInteger
	//    ;
	public LiteralRationalExpressionElements getLiteralRationalExpressionAccess() {
		return pLiteralRationalExpression;
	}
	
	public ParserRule getLiteralRationalExpressionRule() {
		return getLiteralRationalExpressionAccess().getRule();
	}
	
	//LiteralFloatExpression returns fmlExpr::LiteralFloatExpression
	//    : {fmlExpr::LiteralFloatExpression}
	//        value=EDouble
	//    ;
	public LiteralFloatExpressionElements getLiteralFloatExpressionAccess() {
		return pLiteralFloatExpression;
	}
	
	public ParserRule getLiteralFloatExpressionRule() {
		return getLiteralFloatExpressionAccess().getRule();
	}
	
	//////////////////////////////////////////////////////////////////////////////////
	//// Literal Character / String Expression Rules
	//////////////////////////////////////////////////////////////////////////////////
	//LiteralCharacterExpression returns fmlExpr::LiteralCharacterExpression
	//    : {fmlExpr::LiteralCharacterExpression}
	//        value=ECharacter
	//    ;
	public LiteralCharacterExpressionElements getLiteralCharacterExpressionAccess() {
		return pLiteralCharacterExpression;
	}
	
	public ParserRule getLiteralCharacterExpressionRule() {
		return getLiteralCharacterExpressionAccess().getRule();
	}
	
	//LiteralStringExpression returns fmlExpr::LiteralStringExpression
	//    : {fmlExpr::LiteralStringExpression}
	//        value=EString
	//    ;
	public LiteralStringExpressionElements getLiteralStringExpressionAccess() {
		return pLiteralStringExpression;
	}
	
	public ParserRule getLiteralStringExpressionRule() {
		return getLiteralStringExpressionAccess().getRule();
	}
	
	//////////////////////////////////////////////////////////////////////////////////
	//// Literal Null Expression Rules
	//////////////////////////////////////////////////////////////////////////////////
	//LiteralNullExpression returns fmlExpr::LiteralNullExpression
	//    : {fmlExpr::LiteralNullExpression}
	//        '$null' //type=AnyNullPrimitiveInstanceType
	//        ( '<'  type=NullPrimitiveInstanceType  '>' )?
	//    ;
	public LiteralNullExpressionElements getLiteralNullExpressionAccess() {
		return pLiteralNullExpression;
	}
	
	public ParserRule getLiteralNullExpressionRule() {
		return getLiteralNullExpressionAccess().getRule();
	}
	
	//AnyNullPrimitiveInstanceType returns fmlType::PrimitiveInstanceType
	//    : { fmlType::PrimitiveInstanceType }
	//        expected=AnyPrimitiveInstanceKind
	//    ;
	public AnyNullPrimitiveInstanceTypeElements getAnyNullPrimitiveInstanceTypeAccess() {
		return pAnyNullPrimitiveInstanceType;
	}
	
	public ParserRule getAnyNullPrimitiveInstanceTypeRule() {
		return getAnyNullPrimitiveInstanceTypeAccess().getRule();
	}
	
	//enum AnyPrimitiveInstanceKind returns fmlType::PrimitiveInstanceKind
	//    : any='$null'
	//    ;
	public AnyPrimitiveInstanceKindElements getAnyPrimitiveInstanceKindAccess() {
		return eAnyPrimitiveInstanceKind;
	}
	
	public EnumRule getAnyPrimitiveInstanceKindRule() {
		return getAnyPrimitiveInstanceKindAccess().getRule();
	}
	
	//NullPrimitiveInstanceType returns fmlType::PrimitiveInstanceType
	//    : { fmlType::PrimitiveInstanceType }
	//        expected=PrimitiveInstanceKind
	//    | { fmlType::PrimitiveInstanceType }
	//        model=[fmlCommon::NamedElement|ESIdentifier]
	//    ;
	public NullPrimitiveInstanceTypeElements getNullPrimitiveInstanceTypeAccess() {
		return pNullPrimitiveInstanceType;
	}
	
	public ParserRule getNullPrimitiveInstanceTypeRule() {
		return getNullPrimitiveInstanceTypeAccess().getRule();
	}
	
	//////////////////////////////////////////////////////////////////////////////////
	//// Literal Predefined Constant Expression Rules
	//////////////////////////////////////////////////////////////////////////////////
	//AnyDataTypeReference returns fmlType::DataType
	//    : SimpleDataType
	//        ( {fmlType::DataTypeReference.support=current}
	//            '[' multiplicity=DataTypeMultiplicity ']'
	//        )?
	//    | {fmlType::DataTypeReference}
	//        typeref=[fmlType::DataType|ESUfid]
	//        ( '[' multiplicity=DataTypeMultiplicity ']' )?
	//    ;
	public AnyDataTypeReferenceElements getAnyDataTypeReferenceAccess() {
		return pAnyDataTypeReference;
	}
	
	public ParserRule getAnyDataTypeReferenceRule() {
		return getAnyDataTypeReferenceAccess().getRule();
	}
	
	//LiteralAnyValueExpression returns fmlExpr::LiteralAnyValueExpression
	//    : {fmlExpr::LiteralAnyValueExpression}
	//        '$any'
	//        ( '<'  type=AnyDataTypeReference  '>' )?
	//    ;
	public LiteralAnyValueExpressionElements getLiteralAnyValueExpressionAccess() {
		return pLiteralAnyValueExpression;
	}
	
	public ParserRule getLiteralAnyValueExpressionRule() {
		return getLiteralAnyValueExpressionAccess().getRule();
	}
	
	//LiteralOptionalValueExpression returns fmlExpr::LiteralOptionalValueExpression
	//    : {fmlExpr::LiteralOptionalValueExpression}
	//        '$optional'
	//        ( '<'  type=AnyDataTypeReference  '>' )?
	//    ;
	public LiteralOptionalValueExpressionElements getLiteralOptionalValueExpressionAccess() {
		return pLiteralOptionalValueExpression;
	}
	
	public ParserRule getLiteralOptionalValueExpressionRule() {
		return getLiteralOptionalValueExpressionAccess().getRule();
	}
	
	//LiteralNoneValueExpression returns fmlExpr::LiteralNoneValueExpression
	//    : {fmlExpr::LiteralNoneValueExpression}
	//        '$none'
	//        ( '<'  type=AnyDataTypeReference  '>' )?
	//    ;
	public LiteralNoneValueExpressionElements getLiteralNoneValueExpressionAccess() {
		return pLiteralNoneValueExpression;
	}
	
	public ParserRule getLiteralNoneValueExpressionRule() {
		return getLiteralNoneValueExpressionAccess().getRule();
	}
	
	//LiteralAnyOrNoneValueExpression returns fmlExpr::LiteralAnyOrNoneValueExpression
	//    : {fmlExpr::LiteralAnyOrNoneValueExpression}
	//        '$any$none'
	//        ( '<'  type=AnyDataTypeReference  '>' )?
	//    ;
	public LiteralAnyOrNoneValueExpressionElements getLiteralAnyOrNoneValueExpressionAccess() {
		return pLiteralAnyOrNoneValueExpression;
	}
	
	public ParserRule getLiteralAnyOrNoneValueExpressionRule() {
		return getLiteralAnyOrNoneValueExpressionAccess().getRule();
	}
	
	//////////////////////////////////////////////////////////////////////////////////
	//// Literal Collection Expression Rules
	//////////////////////////////////////////////////////////////////////////////////
	//LiteralCollectionExpression returns fmlExpr::LiteralCollectionExpression
	//    : {fmlExpr::LiteralCollectionExpression}
	////        ( 'new' datatype=DataType )?
	//        ( '<' datatype=DataType '>')?
	//        '{' (
	//            ( value+=Expression | value+=NamedExpression )
	//            ( ',' ( value+=Expression | value+=NamedExpression ) )*
	//        )? '}'
	//    ;
	public LiteralCollectionExpressionElements getLiteralCollectionExpressionAccess() {
		return pLiteralCollectionExpression;
	}
	
	public ParserRule getLiteralCollectionExpressionRule() {
		return getLiteralCollectionExpressionAccess().getRule();
	}
	
	//////////////////////////////////////////////////////////////////////////////////
	//// Literal Reference Expression Rules
	//////////////////////////////////////////////////////////////////////////////////
	//LiteralReferenceExpression returns fmlExpr::LiteralReferenceExpression
	//    : LiteralReferenceElement
	//    | LiteralReferenceVariableContext
	//    | LiteralReferenceMachineContext
	//    | LiteralEnvExpression
	//    ;
	public LiteralReferenceExpressionElements getLiteralReferenceExpressionAccess() {
		return pLiteralReferenceExpression;
	}
	
	public ParserRule getLiteralReferenceExpressionRule() {
		return getLiteralReferenceExpressionAccess().getRule();
	}
	
	//LiteralReferenceElement returns fmlExpr::LiteralReferenceElement
	//    : {fmlExpr::LiteralReferenceElement}
	//        ( 'spec::' | '::' )?  element=[fmlCommon::NamedElement|ESIdentifier]
	//        // '[' index ',' ... ',' index ']'
	//        ( kind=ValueIndexExpressionKind
	//            arg=PositionalTupleExpressionList  ']'
	//        // '(' parameter ',' ... ',' parameter ')'
	//        | kind=ValueParameterExpressionKind
	//            arg=MixTupleExpressionList  ')'
	//        )?
	//    ;
	public LiteralReferenceElementElements getLiteralReferenceElementAccess() {
		return pLiteralReferenceElement;
	}
	
	public ParserRule getLiteralReferenceElementRule() {
		return getLiteralReferenceElementAccess().getRule();
	}
	
	//LiteralPureReferenceElement returns fmlExpr::LiteralReferenceElement
	//    : {fmlExpr::LiteralReferenceElement}
	//        ( 'spec::' | '::' )?  element=[fmlCommon::NamedElement|ESIdentifier]
	//    ;
	public LiteralPureReferenceElementElements getLiteralPureReferenceElementAccess() {
		return pLiteralPureReferenceElement;
	}
	
	public ParserRule getLiteralPureReferenceElementRule() {
		return getLiteralPureReferenceElementAccess().getRule();
	}
	
	//LiteralReferenceVariableContext returns fmlExpr::LiteralReferenceExpression
	//    : LiteralTimeExpression
	//    | LiteralTimeDeltaExpression
	//    | LiteralTimeInitialExpression
	//    | LiteralTimeDeltaInitialExpression
	//    ;
	public LiteralReferenceVariableContextElements getLiteralReferenceVariableContextAccess() {
		return pLiteralReferenceVariableContext;
	}
	
	public ParserRule getLiteralReferenceVariableContextRule() {
		return getLiteralReferenceVariableContextAccess().getRule();
	}
	
	//LiteralTimeExpression returns fmlExpr::LiteralTimeExpression
	//    : {fmlExpr::LiteralTimeExpression} ( '$time' )
	//    ;
	public LiteralTimeExpressionElements getLiteralTimeExpressionAccess() {
		return pLiteralTimeExpression;
	}
	
	public ParserRule getLiteralTimeExpressionRule() {
		return getLiteralTimeExpressionAccess().getRule();
	}
	
	//LiteralTimeInitialExpression returns fmlExpr::LiteralTimeExpression
	//    : {fmlExpr::LiteralTimeExpression} ( '$time#initial' )
	//    ;
	public LiteralTimeInitialExpressionElements getLiteralTimeInitialExpressionAccess() {
		return pLiteralTimeInitialExpression;
	}
	
	public ParserRule getLiteralTimeInitialExpressionRule() {
		return getLiteralTimeInitialExpressionAccess().getRule();
	}
	
	//LiteralTimeDeltaExpression returns fmlExpr::LiteralTimeDeltaExpression
	//    : {fmlExpr::LiteralTimeDeltaExpression} ( '$delta' )
	//    ;
	public LiteralTimeDeltaExpressionElements getLiteralTimeDeltaExpressionAccess() {
		return pLiteralTimeDeltaExpression;
	}
	
	public ParserRule getLiteralTimeDeltaExpressionRule() {
		return getLiteralTimeDeltaExpressionAccess().getRule();
	}
	
	//LiteralTimeDeltaInitialExpression returns fmlExpr::LiteralTimeDeltaExpression
	//    : {fmlExpr::LiteralTimeDeltaExpression} ( '$delta#initial' )
	//    ;
	public LiteralTimeDeltaInitialExpressionElements getLiteralTimeDeltaInitialExpressionAccess() {
		return pLiteralTimeDeltaInitialExpression;
	}
	
	public ParserRule getLiteralTimeDeltaInitialExpressionRule() {
		return getLiteralTimeDeltaInitialExpressionAccess().getRule();
	}
	
	//LiteralReferenceMachineContext returns fmlExpr::LiteralReferenceExpression
	//    : LiteralThisExpression
	//    | LiteralSelfExpression
	//    | LiteralParentExpression
	//    | LiteralSuperExpression
	//    | LiteralSystemExpression
	//    | LiteralEnvExpression
	//    ;
	public LiteralReferenceMachineContextElements getLiteralReferenceMachineContextAccess() {
		return pLiteralReferenceMachineContext;
	}
	
	public ParserRule getLiteralReferenceMachineContextRule() {
		return getLiteralReferenceMachineContextAccess().getRule();
	}
	
	//LiteralThisExpression returns fmlExpr::LiteralThisExpression
	//    : {fmlExpr::LiteralThisExpression} ( '$this' )
	//    ;
	public LiteralThisExpressionElements getLiteralThisExpressionAccess() {
		return pLiteralThisExpression;
	}
	
	public ParserRule getLiteralThisExpressionRule() {
		return getLiteralThisExpressionAccess().getRule();
	}
	
	//LiteralSelfExpression returns fmlExpr::LiteralSelfExpression
	//    : {fmlExpr::LiteralSelfExpression} ( '$self' )
	//        ( '<' ( 'model:' )? model=[fmlInfra::Machine|ESUfid] '>' )?
	//    ;
	public LiteralSelfExpressionElements getLiteralSelfExpressionAccess() {
		return pLiteralSelfExpression;
	}
	
	public ParserRule getLiteralSelfExpressionRule() {
		return getLiteralSelfExpressionAccess().getRule();
	}
	
	//LiteralParentExpression returns fmlExpr::LiteralParentExpression
	//    : {fmlExpr::LiteralParentExpression} ( '$parent' )
	//        ( '<' ( 'model:' )? model=[fmlInfra::Machine|ESUfid] '>' )?
	//    ;
	public LiteralParentExpressionElements getLiteralParentExpressionAccess() {
		return pLiteralParentExpression;
	}
	
	public ParserRule getLiteralParentExpressionRule() {
		return getLiteralParentExpressionAccess().getRule();
	}
	
	//LiteralSuperExpression returns fmlExpr::LiteralSuperExpression
	//    : {fmlExpr::LiteralSuperExpression} ( '$super' )
	//        ( '<' ( 'model:' )? model=[fmlInfra::Machine|ESUfid] '>' )?
	//    ;
	public LiteralSuperExpressionElements getLiteralSuperExpressionAccess() {
		return pLiteralSuperExpression;
	}
	
	public ParserRule getLiteralSuperExpressionRule() {
		return getLiteralSuperExpressionAccess().getRule();
	}
	
	//LiteralSystemExpression returns fmlExpr::LiteralSystemExpression
	//    : {fmlExpr::LiteralSystemExpression} ( '$system' )
	//    ;
	public LiteralSystemExpressionElements getLiteralSystemExpressionAccess() {
		return pLiteralSystemExpression;
	}
	
	public ParserRule getLiteralSystemExpressionRule() {
		return getLiteralSystemExpressionAccess().getRule();
	}
	
	//LiteralEnvExpression returns fmlExpr::LiteralEnvExpression
	//    : {fmlExpr::LiteralEnvExpression} ( '$env' )
	//    ;
	public LiteralEnvExpressionElements getLiteralEnvExpressionAccess() {
		return pLiteralEnvExpression;
	}
	
	public ParserRule getLiteralEnvExpressionRule() {
		return getLiteralEnvExpressionAccess().getRule();
	}
	
	//////////////////////////////////////////////////////////////////////////////////
	//// Value Element Specification Expression Rules
	//////////////////////////////////////////////////////////////////////////////////
	//LiteralPureReferenceExpression returns fmlExpr::LiteralReferenceExpression
	//    : LiteralPureReferenceElement
	//    | LiteralReferenceMachineContext
	//    ;
	public LiteralPureReferenceExpressionElements getLiteralPureReferenceExpressionAccess() {
		return pLiteralPureReferenceExpression;
	}
	
	public ParserRule getLiteralPureReferenceExpressionRule() {
		return getLiteralPureReferenceExpressionAccess().getRule();
	}
	
	//LiteralReferenceSpecification returns fmlExpr::LiteralReferenceSpecification
	//    : { fmlExpr::LiteralReferenceSpecification }
	//        ( parent+=LiteralReferenceExpression ( '.'  |  '->' ) )*
	//        element=LiteralReferenceExpression
	//    ;
	public LiteralReferenceSpecificationElements getLiteralReferenceSpecificationAccess() {
		return pLiteralReferenceSpecification;
	}
	
	public ParserRule getLiteralReferenceSpecificationRule() {
		return getLiteralReferenceSpecificationAccess().getRule();
	}
	
	//ValueSelectionExpression returns fmlExpr::Expression
	//    : LiteralReferenceExpression
	//        // '.' element
	//        ( { fmlExpr::ValueElementSpecification.parent=current }
	//            '.' //kind=ValueDotFieldExpressionKind
	//            element=[fmlCommon::NamedElement|ESIdentifier]
	//            // '[' index ',' ... ',' index ']'
	//            ( kind=ValueIndexExpressionKind
	//                arg=PositionalTupleExpressionList  ']'
	////            // TODO '(' parameter ',' ... ',' parameter ')'
	////            | kind=ValueParameterExpressionKind
	////                arg=MixTupleExpressionList  ')'
	//            )?
	//        )*
	//        // '->' element
	//        ( { fmlExpr::ValueElementSpecification.parent=current }
	//            '->' //kind=ValueArrowFieldExpressionKind
	//            element=[fmlCommon::NamedElement|ESIdentifier]
	//            // '[' index ',' ... ',' index ']'
	//            ( kind=ValueIndexExpressionKind
	//                arg=PositionalTupleExpressionList  ']'
	////            // TODO '(' parameter ',' ... ',' parameter ')'
	////            | kind=ValueParameterExpressionKind
	////                arg=MixTupleExpressionList  ')'
	//            )?
	//            // '.' element
	//            ( { fmlExpr::ValueElementSpecification.parent=current }
	//                 '.' //kind=ValueDotFieldExpressionKind
	//                element=[fmlCommon::NamedElement|ESIdentifier]
	//                // '[' index ',' ... ',' index ']'
	//                ( kind=ValueIndexExpressionKind
	//                    arg=PositionalTupleExpressionList  ']'
	////                // TODO '(' parameter ',' ... ',' parameter ')'
	////                | kind=ValueParameterExpressionKind
	////                    arg=MixTupleExpressionList  ')'
	//                )?
	//            )*
	//        )?
	//    ;
	public ValueSelectionExpressionElements getValueSelectionExpressionAccess() {
		return pValueSelectionExpression;
	}
	
	public ParserRule getValueSelectionExpressionRule() {
		return getValueSelectionExpressionAccess().getRule();
	}
	
	////ValuePureNamedElementExpression
	////ValuePureNamedElementExpression returns fmlExpr::Expression
	////    : LiteralPureReferenceExpression
	////
	////        // '.' element
	////        ( { fmlExpr::ValueElementSpecification.parent=current }
	////            kind=ValueDotFieldExpressionKind
	////            element=[fmlCommon::NamedElement|ESIdentifier]
	////        )*
	////
	////        // '->' element
	////        ( { fmlExpr::ValueElementSpecification.parent=current }
	////            kind=ValueArrowFieldExpressionKind
	////            element=[fmlCommon::NamedElement|ESIdentifier]
	////
	////            // '.' element
	////            ( { fmlExpr::ValueElementSpecification.parent=current }
	////                kind=ValueDotFieldExpressionKind
	////                element=[fmlCommon::NamedElement|ESIdentifier]
	////            )*
	////        )?
	////    ;
	//ValuePureNamedMachineExpression returns fmlExpr::Expression
	//    : LiteralPureReferenceExpression
	//        // ( '.' | '->' ) element
	//        ( { fmlExpr::ValueElementSpecification.parent=current }
	//            kind=(ValueDotFieldExpressionKind | ValueArrowFieldExpressionKind )
	//            element=[fmlCommon::NamedElement|ESIdentifier]
	//        )*
	//    ;
	public ValuePureNamedMachineExpressionElements getValuePureNamedMachineExpressionAccess() {
		return pValuePureNamedMachineExpression;
	}
	
	public ParserRule getValuePureNamedMachineExpressionRule() {
		return getValuePureNamedMachineExpressionAccess().getRule();
	}
	
	////ValueAnyElementExpression returns fmlExpr::ValueElementSpecification
	////    : element=[fmlCommon::NamedElement|ESIdentifier]
	////
	////        // '.' element
	////        ( { fmlExpr::ValueElementSpecification.parent=current }
	////            kind=ValueDotFieldExpressionKind
	////            element=[fmlCommon::NamedElement|ESIdentifier]
	////
	////        // '[' index ',' ... ',' index ']'
	////        | { fmlExpr::ValueElementSpecification.parent=current }
	////            kind=ValueIndexExpressionKind
	////            arg=PositionalTupleExpressionList
	////            ']'
	////
	////        // '(' parameter ',' ... ',' parameter ')'
	////        | { fmlExpr::ValueElementSpecification.parent=current }
	////            kind=ValueParameterExpressionKind
	////            arg=MixTupleExpressionList
	////            ')'
	////        )*
	////
	////        // '->' element
	////        ( { fmlExpr::ValueElementSpecification.parent=current }
	////            kind=ValueArrowFieldExpressionKind
	////            element=[fmlCommon::NamedElement|ESIdentifier]
	////
	////            // '.' element
	////            ( { fmlExpr::ValueElementSpecification.parent=current }
	////                kind=ValueDotFieldExpressionKind
	////                element=[fmlCommon::NamedElement|ESIdentifier]
	////
	////            // '[' index ',' ... ',' index ']'
	////            | { fmlExpr::ValueElementSpecification.parent=current }
	////                kind=ValueIndexExpressionKind
	////                arg=PositionalTupleExpressionList
	////                ']'
	////
	////            // '(' parameter ',' ... ',' parameter ')'
	////            | { fmlExpr::ValueElementSpecification.parent=current }
	////                kind=ValueParameterExpressionKind
	////                arg=MixTupleExpressionList
	////                ')'
	////            )*
	////        )?
	////    ;
	//enum ValueDotFieldExpressionKind returns fmlExpr::ValueElementSpecificationKind
	//    : field='.'
	//    ;
	public ValueDotFieldExpressionKindElements getValueDotFieldExpressionKindAccess() {
		return eValueDotFieldExpressionKind;
	}
	
	public EnumRule getValueDotFieldExpressionKindRule() {
		return getValueDotFieldExpressionKindAccess().getRule();
	}
	
	//enum ValueColonFieldExpressionKind returns fmlExpr::ValueElementSpecificationKind
	//    : field=':'
	//    ;
	public ValueColonFieldExpressionKindElements getValueColonFieldExpressionKindAccess() {
		return eValueColonFieldExpressionKind;
	}
	
	public EnumRule getValueColonFieldExpressionKindRule() {
		return getValueColonFieldExpressionKindAccess().getRule();
	}
	
	//enum ValueDoubleColonFieldExpressionKind returns fmlExpr::ValueElementSpecificationKind
	//    : field='::'
	//    ;
	public ValueDoubleColonFieldExpressionKindElements getValueDoubleColonFieldExpressionKindAccess() {
		return eValueDoubleColonFieldExpressionKind;
	}
	
	public EnumRule getValueDoubleColonFieldExpressionKindRule() {
		return getValueDoubleColonFieldExpressionKindAccess().getRule();
	}
	
	//enum ValueArrowFieldExpressionKind returns fmlExpr::ValueElementSpecificationKind
	//    : field='->'
	//    ;
	public ValueArrowFieldExpressionKindElements getValueArrowFieldExpressionKindAccess() {
		return eValueArrowFieldExpressionKind;
	}
	
	public EnumRule getValueArrowFieldExpressionKindRule() {
		return getValueArrowFieldExpressionKindAccess().getRule();
	}
	
	//enum ValueIndexExpressionKind returns fmlExpr::ValueElementSpecificationKind
	//    : index='['
	//    ;
	public ValueIndexExpressionKindElements getValueIndexExpressionKindAccess() {
		return eValueIndexExpressionKind;
	}
	
	public EnumRule getValueIndexExpressionKindRule() {
		return getValueIndexExpressionKindAccess().getRule();
	}
	
	//enum ValueParameterExpressionKind returns fmlExpr::ValueElementSpecificationKind
	//    : parameter='('
	//    ;
	public ValueParameterExpressionKindElements getValueParameterExpressionKindAccess() {
		return eValueParameterExpressionKind;
	}
	
	public EnumRule getValueParameterExpressionKindRule() {
		return getValueParameterExpressionKindAccess().getRule();
	}
	
	//terminal ID: '^'?('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*;
	public TerminalRule getIDRule() {
		return gaTerminals.getIDRule();
	}
	
	//terminal STRING:
	//            '"' ( '\\' . /* 'b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\\' */ | !('\\'|'"') )* '"' |
	//            "'" ( '\\' . /* 'b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\\' */ | !('\\'|"'") )* "'"
	//        ;
	public TerminalRule getSTRINGRule() {
		return gaTerminals.getSTRINGRule();
	}
	
	//terminal ML_COMMENT : '/*' -> '*/';
	public TerminalRule getML_COMMENTRule() {
		return gaTerminals.getML_COMMENTRule();
	}
	
	//terminal SL_COMMENT : '//' !('\n'|'\r')* ('\r'? '\n')?;
	public TerminalRule getSL_COMMENTRule() {
		return gaTerminals.getSL_COMMENTRule();
	}
	
	//terminal WS         : (' '|'\t'|'\r'|'\n')+;
	public TerminalRule getWSRule() {
		return gaTerminals.getWSRule();
	}
	
	//terminal ANY_OTHER: .;
	public TerminalRule getANY_OTHERRule() {
		return gaTerminals.getANY_OTHERRule();
	}
}
