/**
 * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf), Loetz GmbH&Co.KG (Heidelberg)
 * 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:
 *         Florian Pirchner - Initial implementation
 *
 * generated by Xtext 2.11.0
 *
 */

grammar InternalUIGrammar;

options {
	superClass=AbstractInternalAntlrParser;
}

@lexer::header {
package org.eclipse.osbp.ecview.dsl.parser.antlr.internal;

// Hack: Use our own Lexer superclass by means of import. 
// Currently there is no other way to specify the superclass for the lexer.
import org.eclipse.xtext.parser.antlr.Lexer;
}

@parser::header {
package org.eclipse.osbp.ecview.dsl.parser.antlr.internal;

import org.eclipse.xtext.*;
import org.eclipse.xtext.parser.*;
import org.eclipse.xtext.parser.impl.*;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.common.util.Enumerator;
import org.eclipse.xtext.parser.antlr.AbstractInternalAntlrParser;
import org.eclipse.xtext.parser.antlr.XtextTokenStream;
import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
import org.eclipse.xtext.parser.antlr.AntlrDatatypeRuleToken;
import org.eclipse.osbp.ecview.dsl.services.UIGrammarGrammarAccess;

}

@parser::members {

 	private UIGrammarGrammarAccess grammarAccess;

    public InternalUIGrammarParser(TokenStream input, UIGrammarGrammarAccess grammarAccess) {
        this(input);
        this.grammarAccess = grammarAccess;
        registerRules(grammarAccess.getGrammar());
    }

    @Override
    protected String getFirstRuleName() {
    	return "UiModel";
   	}

   	@Override
   	protected UIGrammarGrammarAccess getGrammarAccess() {
   		return grammarAccess;
   	}

}

@rulecatch {
    catch (RecognitionException re) {
        recover(input,re);
        appendSkippedTokens();
    }
}

// Entry rule entryRuleUiModel
entryRuleUiModel returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiModelRule()); }
	iv_ruleUiModel=ruleUiModel
	{ $current=$iv_ruleUiModel.current; }
	EOF;

// Rule UiModel
ruleUiModel returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='package'
		{
			newLeafNode(otherlv_0, grammarAccess.getUiModelAccess().getPackageKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getUiModelAccess().getPackageNameQualifiedNameParserRuleCall_1_0());
				}
				lv_packageName_1_0=ruleQualifiedName
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiModelRule());
					}
					set(
						$current,
						"packageName",
						lv_packageName_1_0,
						"org.eclipse.xtext.xbase.Xbase.QualifiedName");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getUiModelAccess().getImportSectionXImportSectionParserRuleCall_2_0());
				}
				lv_importSection_2_0=ruleXImportSection
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiModelRule());
					}
					set(
						$current,
						"importSection",
						lv_importSection_2_0,
						"org.eclipse.xtext.xbase.Xtype.XImportSection");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getUiModelAccess().getRootsUiRootElementsParserRuleCall_3_0());
				}
				lv_roots_3_0=ruleUiRootElements
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiModelRule());
					}
					add(
						$current,
						"roots",
						lv_roots_3_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiRootElements");
					afterParserOrEnumRuleCall();
				}
			)
		)*
	)
;

// Entry rule entryRuleUiRootElements
entryRuleUiRootElements returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiRootElementsRule()); }
	iv_ruleUiRootElements=ruleUiRootElements
	{ $current=$iv_ruleUiRootElements.current; }
	EOF;

// Rule UiRootElements
ruleUiRootElements returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getUiRootElementsAccess().getUiViewParserRuleCall_0());
		}
		this_UiView_0=ruleUiView
		{
			$current = $this_UiView_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiRootElementsAccess().getUiDisplayViewParserRuleCall_1());
		}
		this_UiDisplayView_1=ruleUiDisplayView
		{
			$current = $this_UiDisplayView_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiRootElementsAccess().getUiViewSetParserRuleCall_2());
		}
		this_UiViewSet_2=ruleUiViewSet
		{
			$current = $this_UiViewSet_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiRootElementsAccess().getUiValidatorAliasParserRuleCall_3());
		}
		this_UiValidatorAlias_3=ruleUiValidatorAlias
		{
			$current = $this_UiValidatorAlias_3.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiRootElementsAccess().getUiMobileViewParserRuleCall_4());
		}
		this_UiMobileView_4=ruleUiMobileView
		{
			$current = $this_UiMobileView_4.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleUiValidatorAlias
entryRuleUiValidatorAlias returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiValidatorAliasRule()); }
	iv_ruleUiValidatorAlias=ruleUiValidatorAlias
	{ $current=$iv_ruleUiValidatorAlias.current; }
	EOF;

// Rule UiValidatorAlias
ruleUiValidatorAlias returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='validatorAlias'
		{
			newLeafNode(otherlv_0, grammarAccess.getUiValidatorAliasAccess().getValidatorAliasKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getUiValidatorAliasAccess().getValidatorUiValidatorParserRuleCall_1_0());
				}
				lv_validator_1_0=ruleUiValidator
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiValidatorAliasRule());
					}
					set(
						$current,
						"validator",
						lv_validator_1_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_2='as'
		{
			newLeafNode(otherlv_2, grammarAccess.getUiValidatorAliasAccess().getAsKeyword_2());
		}
		(
			(
				lv_alias_3_0=RULE_ID
				{
					newLeafNode(lv_alias_3_0, grammarAccess.getUiValidatorAliasAccess().getAliasIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiValidatorAliasRule());
					}
					setWithLastConsumed(
						$current,
						"alias",
						lv_alias_3_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
		(
			otherlv_4=';'
			{
				newLeafNode(otherlv_4, grammarAccess.getUiValidatorAliasAccess().getSemicolonKeyword_4());
			}
		)?
	)
;

// Entry rule entryRuleUiValidatorAssignment
entryRuleUiValidatorAssignment returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiValidatorAssignmentRule()); }
	iv_ruleUiValidatorAssignment=ruleUiValidatorAssignment
	{ $current=$iv_ruleUiValidatorAssignment.current; }
	EOF;

// Rule UiValidatorAssignment
ruleUiValidatorAssignment returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='fieldValidation'
		{
			newLeafNode(otherlv_0, grammarAccess.getUiValidatorAssignmentAccess().getFieldValidationKeyword_0());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiValidatorAssignmentRule());
					}
				}
				otherlv_1=RULE_ID
				{
					newLeafNode(otherlv_1, grammarAccess.getUiValidatorAssignmentAccess().getFieldUiFieldCrossReference_1_0());
				}
			)
		)
		otherlv_2='+='
		{
			newLeafNode(otherlv_2, grammarAccess.getUiValidatorAssignmentAccess().getPlusSignEqualsSignKeyword_2());
		}
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getUiValidatorAssignmentAccess().getValidatorDefUiValidatorDefParserRuleCall_3_0_0());
					}
					lv_validatorDef_3_0=ruleUiValidatorDef
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiValidatorAssignmentRule());
						}
						set(
							$current,
							"validatorDef",
							lv_validatorDef_3_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidatorDef");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					(
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getUiValidatorAssignmentRule());
							}
						}
						{
							newCompositeNode(grammarAccess.getUiValidatorAssignmentAccess().getValidatorAliasUiValidatorAliasCrossReference_3_1_0_0());
						}
						ruleQualifiedName
						{
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					otherlv_5=';'
					{
						newLeafNode(otherlv_5, grammarAccess.getUiValidatorAssignmentAccess().getSemicolonKeyword_3_1_1());
					}
				)?
			)
		)
	)
;

// Entry rule entryRuleUiValidatorDef
entryRuleUiValidatorDef returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiValidatorDefRule()); }
	iv_ruleUiValidatorDef=ruleUiValidatorDef
	{ $current=$iv_ruleUiValidatorDef.current; }
	EOF;

// Rule UiValidatorDef
ruleUiValidatorDef returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				newCompositeNode(grammarAccess.getUiValidatorDefAccess().getValidatorUiValidatorParserRuleCall_0());
			}
			lv_validator_0_0=ruleUiValidator
			{
				if ($current==null) {
					$current = createModelElementForParent(grammarAccess.getUiValidatorDefRule());
				}
				set(
					$current,
					"validator",
					lv_validator_0_0,
					"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
				afterParserOrEnumRuleCall();
			}
		)
	)
;

// Entry rule entryRuleUiViewSet
entryRuleUiViewSet returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiViewSetRule()); }
	iv_ruleUiViewSet=ruleUiViewSet
	{ $current=$iv_ruleUiViewSet.current; }
	EOF;

// Rule UiViewSet
ruleUiViewSet returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='viewset'
		{
			newLeafNode(otherlv_0, grammarAccess.getUiViewSetAccess().getViewsetKeyword_0());
		}
		(
			(
				lv_name_1_0=RULE_ID
				{
					newLeafNode(lv_name_1_0, grammarAccess.getUiViewSetAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiViewSetRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
		otherlv_2='{'
		{
			newLeafNode(otherlv_2, grammarAccess.getUiViewSetAccess().getLeftCurlyBracketKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getUiViewSetAccess().getBeanSlotsUiBeanSlotParserRuleCall_3_0());
				}
				lv_beanSlots_3_0=ruleUiBeanSlot
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiViewSetRule());
					}
					add(
						$current,
						"beanSlots",
						lv_beanSlots_3_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBeanSlot");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			(
				{
					newCompositeNode(grammarAccess.getUiViewSetAccess().getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_4_0());
				}
				lv_bindingEndpointAlias_4_0=ruleUiBindingEndpointAlias
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiViewSetRule());
					}
					add(
						$current,
						"bindingEndpointAlias",
						lv_bindingEndpointAlias_4_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAlias");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		otherlv_5='}'
		{
			newLeafNode(otherlv_5, grammarAccess.getUiViewSetAccess().getRightCurlyBracketKeyword_5());
		}
	)
;

// Entry rule entryRuleUiBindingEndpointAlias
entryRuleUiBindingEndpointAlias returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiBindingEndpointAliasRule()); }
	iv_ruleUiBindingEndpointAlias=ruleUiBindingEndpointAlias
	{ $current=$iv_ruleUiBindingEndpointAlias.current; }
	EOF;

// Rule UiBindingEndpointAlias
ruleUiBindingEndpointAlias returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='dataAlias'
		{
			newLeafNode(otherlv_0, grammarAccess.getUiBindingEndpointAliasAccess().getDataAliasKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getUiBindingEndpointAliasAccess().getEndpointUiBindingEndpointAssignmentParserRuleCall_1_0());
				}
				lv_endpoint_1_0=ruleUiBindingEndpointAssignment
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiBindingEndpointAliasRule());
					}
					set(
						$current,
						"endpoint",
						lv_endpoint_1_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAssignment");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_2='as'
		{
			newLeafNode(otherlv_2, grammarAccess.getUiBindingEndpointAliasAccess().getAsKeyword_2());
		}
		(
			(
				lv_alias_3_0=RULE_ID
				{
					newLeafNode(lv_alias_3_0, grammarAccess.getUiBindingEndpointAliasAccess().getAliasIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiBindingEndpointAliasRule());
					}
					setWithLastConsumed(
						$current,
						"alias",
						lv_alias_3_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
		(
			otherlv_4=';'
			{
				newLeafNode(otherlv_4, grammarAccess.getUiBindingEndpointAliasAccess().getSemicolonKeyword_4());
			}
		)?
	)
;

// Entry rule entryRuleUiBeanSlot
entryRuleUiBeanSlot returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiBeanSlotRule()); }
	iv_ruleUiBeanSlot=ruleUiBeanSlot
	{ $current=$iv_ruleUiBeanSlot.current; }
	EOF;

// Rule UiBeanSlot
ruleUiBeanSlot returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='datasource'
		{
			newLeafNode(otherlv_0, grammarAccess.getUiBeanSlotAccess().getDatasourceKeyword_0());
		}
		(
			(
				lv_name_1_0=RULE_ID
				{
					newLeafNode(lv_name_1_0, grammarAccess.getUiBeanSlotAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiBeanSlotRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
		otherlv_2=':'
		{
			newLeafNode(otherlv_2, grammarAccess.getUiBeanSlotAccess().getColonKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getUiBeanSlotAccess().getJvmTypeJvmTypeReferenceParserRuleCall_3_0());
				}
				lv_jvmType_3_0=ruleJvmTypeReference
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiBeanSlotRule());
					}
					set(
						$current,
						"jvmType",
						lv_jvmType_3_0,
						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_4='eventTopic'
			{
				newLeafNode(otherlv_4, grammarAccess.getUiBeanSlotAccess().getEventTopicKeyword_4_0());
			}
			(
				(
					lv_eventTopic_5_0=RULE_STRING
					{
						newLeafNode(lv_eventTopic_5_0, grammarAccess.getUiBeanSlotAccess().getEventTopicSTRINGTerminalRuleCall_4_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getUiBeanSlotRule());
						}
						setWithLastConsumed(
							$current,
							"eventTopic",
							lv_eventTopic_5_0,
							"org.eclipse.xtext.xbase.Xtype.STRING");
					}
				)
			)
		)?
		(
			otherlv_6=';'
			{
				newLeafNode(otherlv_6, grammarAccess.getUiBeanSlotAccess().getSemicolonKeyword_5());
			}
		)?
	)
;

// Entry rule entryRuleUiBinding
entryRuleUiBinding returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiBindingRule()); }
	iv_ruleUiBinding=ruleUiBinding
	{ $current=$iv_ruleUiBinding.current; }
	EOF;

// Rule UiBinding
ruleUiBinding returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='bind'
		{
			newLeafNode(otherlv_0, grammarAccess.getUiBindingAccess().getBindKeyword_0());
		}
		(
			(
				lv_listBinding_1_0='list'
				{
					newLeafNode(lv_listBinding_1_0, grammarAccess.getUiBindingAccess().getListBindingListKeyword_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiBindingRule());
					}
					setWithLastConsumed($current, "listBinding", true, "list");
				}
			)
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getUiBindingAccess().getSourceUiBindingEndpointAssignmentParserRuleCall_2_0());
				}
				lv_source_2_0=ruleUiBindingEndpointAssignment
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiBindingRule());
					}
					set(
						$current,
						"source",
						lv_source_2_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAssignment");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				(
					lv_targetToSource_3_0='<'
					{
						newLeafNode(lv_targetToSource_3_0, grammarAccess.getUiBindingAccess().getTargetToSourceLessThanSignKeyword_3_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getUiBindingRule());
						}
						setWithLastConsumed($current, "targetToSource", true, "<");
					}
				)
			)?
			otherlv_4='--'
			{
				newLeafNode(otherlv_4, grammarAccess.getUiBindingAccess().getHyphenMinusHyphenMinusKeyword_3_1());
			}
			(
				(
					lv_sourceToTarget_5_0='>'
					{
						newLeafNode(lv_sourceToTarget_5_0, grammarAccess.getUiBindingAccess().getSourceToTargetGreaterThanSignKeyword_3_2_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getUiBindingRule());
						}
						setWithLastConsumed($current, "sourceToTarget", true, ">");
					}
				)
			)?
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getUiBindingAccess().getTargetUiBindingEndpointAssignmentParserRuleCall_4_0());
				}
				lv_target_6_0=ruleUiBindingEndpointAssignment
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiBindingRule());
					}
					set(
						$current,
						"target",
						lv_target_6_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAssignment");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_7=';'
			{
				newLeafNode(otherlv_7, grammarAccess.getUiBindingAccess().getSemicolonKeyword_5());
			}
		)?
	)
;

// Entry rule entryRuleUiBindingEndpointAssignment
entryRuleUiBindingEndpointAssignment returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiBindingEndpointAssignmentRule()); }
	iv_ruleUiBindingEndpointAssignment=ruleUiBindingEndpointAssignment
	{ $current=$iv_ruleUiBindingEndpointAssignment.current; }
	EOF;

// Rule UiBindingEndpointAssignment
ruleUiBindingEndpointAssignment returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				newCompositeNode(grammarAccess.getUiBindingEndpointAssignmentAccess().getUiTypedBindableDefParserRuleCall_0_0());
			}
			this_UiTypedBindableDef_0=ruleUiTypedBindableDef
			{
				$current = $this_UiTypedBindableDef_0.current;
				afterParserOrEnumRuleCall();
			}
			(
				{
					$current = forceCreateModelElementAndSet(
						grammarAccess.getUiBindingEndpointAssignmentAccess().getUiBindingEndpointAssignmentTypedBindableDefAction_0_1(),
						$current);
				}
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getUiBindingEndpointAssignmentAccess().getPathUiPathSegmentParserRuleCall_0_2_0());
					}
					lv_path_2_0=ruleUiPathSegment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiBindingEndpointAssignmentRule());
						}
						set(
							$current,
							"path",
							lv_path_2_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiPathSegment");
						afterParserOrEnumRuleCall();
					}
				)
			)?
		)
		    |
		(
			{
				newCompositeNode(grammarAccess.getUiBindingEndpointAssignmentAccess().getUiCommandBindableDefParserRuleCall_1_0());
			}
			this_UiCommandBindableDef_3=ruleUiCommandBindableDef
			{
				$current = $this_UiCommandBindableDef_3.current;
				afterParserOrEnumRuleCall();
			}
			(
				{
					$current = forceCreateModelElementAndSet(
						grammarAccess.getUiBindingEndpointAssignmentAccess().getUiBindingEndpointAssignmentTypedBindableDefAction_1_1(),
						$current);
				}
			)
		)
		    |
		(
			(
				{
					$current = forceCreateModelElement(
						grammarAccess.getUiBindingEndpointAssignmentAccess().getUiBindingEndpointAssignmentAction_2_0(),
						$current);
				}
			)
			(
				(
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getUiBindingEndpointAssignmentRule());
						}
					}
					otherlv_6=RULE_ID
					{
						newLeafNode(otherlv_6, grammarAccess.getUiBindingEndpointAssignmentAccess().getTypedBindableAliasUiTypedBindableCrossReference_2_1_0());
					}
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getUiBindingEndpointAssignmentAccess().getPathUiPathSegmentParserRuleCall_2_2_0());
					}
					lv_path_7_0=ruleUiPathSegment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiBindingEndpointAssignmentRule());
						}
						set(
							$current,
							"path",
							lv_path_7_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiPathSegment");
						afterParserOrEnumRuleCall();
					}
				)
			)?
		)
	)
;

// Entry rule entryRuleUiPathSegment
entryRuleUiPathSegment returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiPathSegmentRule()); }
	iv_ruleUiPathSegment=ruleUiPathSegment
	{ $current=$iv_ruleUiPathSegment.current; }
	EOF;

// Rule UiPathSegment
ruleUiPathSegment returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiPathSegmentAccess().getUiPathSegmentAction_0(),
					$current);
			}
		)
		otherlv_1='.'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiPathSegmentAccess().getFullStopKeyword_1());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiPathSegmentRule());
					}
				}
				otherlv_2=RULE_ID
				{
					newLeafNode(otherlv_2, grammarAccess.getUiPathSegmentAccess().getGetterJvmOperationCrossReference_2_0());
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getUiPathSegmentAccess().getPathUiPathSegmentParserRuleCall_3_0());
				}
				lv_path_3_0=ruleUiPathSegment
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiPathSegmentRule());
					}
					set(
						$current,
						"path",
						lv_path_3_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiPathSegment");
					afterParserOrEnumRuleCall();
				}
			)
		)?
	)
;

// Entry rule entryRuleUiNestedProperty
entryRuleUiNestedProperty returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiNestedPropertyRule()); }
	iv_ruleUiNestedProperty=ruleUiNestedProperty
	{ $current=$iv_ruleUiNestedProperty.current; }
	EOF;

// Rule UiNestedProperty
ruleUiNestedProperty returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiNestedPropertyAccess().getUiNestedPropertyAction_0(),
					$current);
			}
		)
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiNestedPropertyRule());
					}
				}
				otherlv_1=RULE_ID
				{
					newLeafNode(otherlv_1, grammarAccess.getUiNestedPropertyAccess().getGetterJvmOperationCrossReference_1_0());
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getUiNestedPropertyAccess().getPathUiPathSegmentParserRuleCall_2_0());
				}
				lv_path_2_0=ruleUiPathSegment
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiNestedPropertyRule());
					}
					set(
						$current,
						"path",
						lv_path_2_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiPathSegment");
					afterParserOrEnumRuleCall();
				}
			)
		)?
	)
;

// Entry rule entryRuleUiTypedBindableDef
entryRuleUiTypedBindableDef returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiTypedBindableDefRule()); }
	iv_ruleUiTypedBindableDef=ruleUiTypedBindableDef
	{ $current=$iv_ruleUiTypedBindableDef.current; }
	EOF;

// Rule UiTypedBindableDef
ruleUiTypedBindableDef returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiTypedBindableDefAccess().getUiTypedBindableDefAction_0(),
					$current);
			}
		)
		(
			otherlv_1='['
			{
				newLeafNode(otherlv_1, grammarAccess.getUiTypedBindableDefAccess().getLeftSquareBracketKeyword_1_0());
			}
			(
				(
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getUiTypedBindableDefRule());
						}
					}
					otherlv_2=RULE_ID
					{
						newLeafNode(otherlv_2, grammarAccess.getUiTypedBindableDefAccess().getRawBindableUiRawBindableCrossReference_1_1_0());
					}
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getUiTypedBindableDefAccess().getRawBindablePathUiRawBindablePathSegmentParserRuleCall_1_2_0());
					}
					lv_rawBindablePath_3_0=ruleUiRawBindablePathSegment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiTypedBindableDefRule());
						}
						set(
							$current,
							"rawBindablePath",
							lv_rawBindablePath_3_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiRawBindablePathSegment");
						afterParserOrEnumRuleCall();
					}
				)
			)?
			otherlv_4=']'
			{
				newLeafNode(otherlv_4, grammarAccess.getUiTypedBindableDefAccess().getRightSquareBracketKeyword_1_3());
			}
			otherlv_5='.'
			{
				newLeafNode(otherlv_5, grammarAccess.getUiTypedBindableDefAccess().getFullStopKeyword_1_4());
			}
			(
				(
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getUiTypedBindableDefRule());
						}
					}
					otherlv_6=RULE_ID
					{
						newLeafNode(otherlv_6, grammarAccess.getUiTypedBindableDefAccess().getMethodUxEndpointDefCrossReference_1_5_0());
					}
				)
			)
		)
	)
;

// Entry rule entryRuleUiTypedBindableRawType
entryRuleUiTypedBindableRawType returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiTypedBindableRawTypeRule()); }
	iv_ruleUiTypedBindableRawType=ruleUiTypedBindableRawType
	{ $current=$iv_ruleUiTypedBindableRawType.current; }
	EOF;

// Rule UiTypedBindableRawType
ruleUiTypedBindableRawType returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiTypedBindableRawTypeAccess().getUiTypedBindableRawTypeAction_0(),
					$current);
			}
		)
		otherlv_1='['
		{
			newLeafNode(otherlv_1, grammarAccess.getUiTypedBindableRawTypeAccess().getLeftSquareBracketKeyword_1());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiTypedBindableRawTypeRule());
					}
				}
				otherlv_2=RULE_ID
				{
					newLeafNode(otherlv_2, grammarAccess.getUiTypedBindableRawTypeAccess().getRawBindableUiRawBindableCrossReference_2_0());
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getUiTypedBindableRawTypeAccess().getRawBindablePathUiRawBindablePathSegmentParserRuleCall_3_0());
				}
				lv_rawBindablePath_3_0=ruleUiRawBindablePathSegment
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiTypedBindableRawTypeRule());
					}
					set(
						$current,
						"rawBindablePath",
						lv_rawBindablePath_3_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiRawBindablePathSegment");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		otherlv_4=']'
		{
			newLeafNode(otherlv_4, grammarAccess.getUiTypedBindableRawTypeAccess().getRightSquareBracketKeyword_4());
		}
	)
;

// Entry rule entryRuleUiTypedBindableRawTypeAlias
entryRuleUiTypedBindableRawTypeAlias returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiTypedBindableRawTypeAliasRule()); }
	iv_ruleUiTypedBindableRawTypeAlias=ruleUiTypedBindableRawTypeAlias
	{ $current=$iv_ruleUiTypedBindableRawTypeAlias.current; }
	EOF;

// Rule UiTypedBindableRawTypeAlias
ruleUiTypedBindableRawTypeAlias returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='ui'
		{
			newLeafNode(otherlv_0, grammarAccess.getUiTypedBindableRawTypeAliasAccess().getUiKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getUiTypedBindableRawTypeAliasAccess().getTypeUiTypedBindableRawTypeParserRuleCall_1_0());
				}
				lv_type_1_0=ruleUiTypedBindableRawType
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiTypedBindableRawTypeAliasRule());
					}
					set(
						$current,
						"type",
						lv_type_1_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiTypedBindableRawType");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_2='as'
		{
			newLeafNode(otherlv_2, grammarAccess.getUiTypedBindableRawTypeAliasAccess().getAsKeyword_2());
		}
		(
			(
				lv_alias_3_0=RULE_ID
				{
					newLeafNode(lv_alias_3_0, grammarAccess.getUiTypedBindableRawTypeAliasAccess().getAliasIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiTypedBindableRawTypeAliasRule());
					}
					setWithLastConsumed(
						$current,
						"alias",
						lv_alias_3_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
		(
			otherlv_4=';'
			{
				newLeafNode(otherlv_4, grammarAccess.getUiTypedBindableRawTypeAliasAccess().getSemicolonKeyword_4());
			}
		)?
	)
;

// Entry rule entryRuleUiRawBindablePathSegment
entryRuleUiRawBindablePathSegment returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiRawBindablePathSegmentRule()); }
	iv_ruleUiRawBindablePathSegment=ruleUiRawBindablePathSegment
	{ $current=$iv_ruleUiRawBindablePathSegment.current; }
	EOF;

// Rule UiRawBindablePathSegment
ruleUiRawBindablePathSegment returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiRawBindablePathSegmentAccess().getUiRawBindablePathSegmentAction_0(),
					$current);
			}
		)
		(
			otherlv_1='.'
			{
				newLeafNode(otherlv_1, grammarAccess.getUiRawBindablePathSegmentAccess().getFullStopKeyword_1_0());
			}
			    |
			(
				(
					lv_toParent_2_0='..'
					{
						newLeafNode(lv_toParent_2_0, grammarAccess.getUiRawBindablePathSegmentAccess().getToParentFullStopFullStopKeyword_1_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getUiRawBindablePathSegmentRule());
						}
						setWithLastConsumed($current, "toParent", true, "..");
					}
				)
			)
		)
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiRawBindablePathSegmentRule());
					}
				}
				otherlv_3=RULE_ID
				{
					newLeafNode(otherlv_3, grammarAccess.getUiRawBindablePathSegmentAccess().getRawBindableUiRawBindableCrossReference_2_0());
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getUiRawBindablePathSegmentAccess().getPathUiRawBindablePathSegmentParserRuleCall_3_0());
				}
				lv_path_4_0=ruleUiRawBindablePathSegment
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiRawBindablePathSegmentRule());
					}
					set(
						$current,
						"path",
						lv_path_4_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiRawBindablePathSegment");
					afterParserOrEnumRuleCall();
				}
			)
		)?
	)
;

// Entry rule entryRuleUiCommandBindableDef
entryRuleUiCommandBindableDef returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiCommandBindableDefRule()); }
	iv_ruleUiCommandBindableDef=ruleUiCommandBindableDef
	{ $current=$iv_ruleUiCommandBindableDef.current; }
	EOF;

// Rule UiCommandBindableDef
ruleUiCommandBindableDef returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiCommandBindableDefAccess().getUiCommandBindableDefAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getUiCommandBindableDefAccess().getCommandUiCommandParserRuleCall_1_0());
				}
				lv_command_1_0=ruleUiCommand
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiCommandBindableDefRule());
					}
					set(
						$current,
						"command",
						lv_command_1_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiCommand");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleUiCommand
entryRuleUiCommand returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiCommandRule()); }
	iv_ruleUiCommand=ruleUiCommand
	{ $current=$iv_ruleUiCommand.current; }
	EOF;

// Rule UiCommand
ruleUiCommand returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getUiCommandAccess().getUiMobileNavigationCommandParserRuleCall_0());
		}
		this_UiMobileNavigationCommand_0=ruleUiMobileNavigationCommand
		{
			$current = $this_UiMobileNavigationCommand_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiCommandAccess().getUiOpenDialogCommandParserRuleCall_1());
		}
		this_UiOpenDialogCommand_1=ruleUiOpenDialogCommand
		{
			$current = $this_UiOpenDialogCommand_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiCommandAccess().getUiSearchWithDialogCommandParserRuleCall_2());
		}
		this_UiSearchWithDialogCommand_2=ruleUiSearchWithDialogCommand
		{
			$current = $this_UiSearchWithDialogCommand_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiCommandAccess().getUiAddToTableCommandParserRuleCall_3());
		}
		this_UiAddToTableCommand_3=ruleUiAddToTableCommand
		{
			$current = $this_UiAddToTableCommand_3.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiCommandAccess().getUiRemoveFromTableCommandParserRuleCall_4());
		}
		this_UiRemoveFromTableCommand_4=ruleUiRemoveFromTableCommand
		{
			$current = $this_UiRemoveFromTableCommand_4.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiCommandAccess().getUiSendEventCommandParserRuleCall_5());
		}
		this_UiSendEventCommand_5=ruleUiSendEventCommand
		{
			$current = $this_UiSendEventCommand_5.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiCommandAccess().getUiSetNewInstanceCommandParserRuleCall_6());
		}
		this_UiSetNewInstanceCommand_6=ruleUiSetNewInstanceCommand
		{
			$current = $this_UiSetNewInstanceCommand_6.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleUiMobileNavigationCommand
entryRuleUiMobileNavigationCommand returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiMobileNavigationCommandRule()); }
	iv_ruleUiMobileNavigationCommand=ruleUiMobileNavigationCommand
	{ $current=$iv_ruleUiMobileNavigationCommand.current; }
	EOF;

// Rule UiMobileNavigationCommand
ruleUiMobileNavigationCommand returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiMobileNavigationCommandAccess().getUiMobileNavigationCommandAction_0(),
					$current);
			}
		)
		otherlv_1='navigateTo'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiMobileNavigationCommandAccess().getNavigateToKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getUiMobileNavigationCommandAccess().getTargetPageUiMobileNavigationPageParserRuleCall_2_0());
				}
				lv_targetPage_2_0=ruleUiMobileNavigationPage
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiMobileNavigationCommandRule());
					}
					set(
						$current,
						"targetPage",
						lv_targetPage_2_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileNavigationPage");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleUiOpenDialogCommand
entryRuleUiOpenDialogCommand returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiOpenDialogCommandRule()); }
	iv_ruleUiOpenDialogCommand=ruleUiOpenDialogCommand
	{ $current=$iv_ruleUiOpenDialogCommand.current; }
	EOF;

// Rule UiOpenDialogCommand
ruleUiOpenDialogCommand returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiOpenDialogCommandAccess().getUiOpenDialogCommandAction_0(),
					$current);
			}
		)
		otherlv_1='openDialog'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiOpenDialogCommandAccess().getOpenDialogKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getUiOpenDialogCommandAccess().getDialogUiDialogParserRuleCall_2_0());
				}
				lv_dialog_2_0=ruleUiDialog
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiOpenDialogCommandRule());
					}
					set(
						$current,
						"dialog",
						lv_dialog_2_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiDialog");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleUiSearchWithDialogCommand
entryRuleUiSearchWithDialogCommand returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiSearchWithDialogCommandRule()); }
	iv_ruleUiSearchWithDialogCommand=ruleUiSearchWithDialogCommand
	{ $current=$iv_ruleUiSearchWithDialogCommand.current; }
	EOF;

// Rule UiSearchWithDialogCommand
ruleUiSearchWithDialogCommand returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiSearchWithDialogCommandAccess().getUiSearchWithDialogCommandAction_0(),
					$current);
			}
		)
		otherlv_1='searchWith'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiSearchWithDialogCommandAccess().getSearchWithKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getUiSearchWithDialogCommandAccess().getDialogUiSearchDialogParserRuleCall_2_0());
				}
				lv_dialog_2_0=ruleUiSearchDialog
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiSearchWithDialogCommandRule());
					}
					set(
						$current,
						"dialog",
						lv_dialog_2_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiSearchDialog");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleUiAddToTableCommand
entryRuleUiAddToTableCommand returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiAddToTableCommandRule()); }
	iv_ruleUiAddToTableCommand=ruleUiAddToTableCommand
	{ $current=$iv_ruleUiAddToTableCommand.current; }
	EOF;

// Rule UiAddToTableCommand
ruleUiAddToTableCommand returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiAddToTableCommandAccess().getUiAddToTableCommandAction_0(),
					$current);
			}
		)
		otherlv_1='addToTable'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiAddToTableCommandAccess().getAddToTableKeyword_1());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiAddToTableCommandRule());
					}
				}
				otherlv_2=RULE_ID
				{
					newLeafNode(otherlv_2, grammarAccess.getUiAddToTableCommandAccess().getTableUiTableCrossReference_2_0());
				}
			)
		)
	)
;

// Entry rule entryRuleUiRemoveFromTableCommand
entryRuleUiRemoveFromTableCommand returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiRemoveFromTableCommandRule()); }
	iv_ruleUiRemoveFromTableCommand=ruleUiRemoveFromTableCommand
	{ $current=$iv_ruleUiRemoveFromTableCommand.current; }
	EOF;

// Rule UiRemoveFromTableCommand
ruleUiRemoveFromTableCommand returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiRemoveFromTableCommandAccess().getUiRemoveFromTableCommandAction_0(),
					$current);
			}
		)
		otherlv_1='removeFromTable'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiRemoveFromTableCommandAccess().getRemoveFromTableKeyword_1());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiRemoveFromTableCommandRule());
					}
				}
				otherlv_2=RULE_ID
				{
					newLeafNode(otherlv_2, grammarAccess.getUiRemoveFromTableCommandAccess().getTableUiTableCrossReference_2_0());
				}
			)
		)
	)
;

// Entry rule entryRuleUiSetNewInstanceCommand
entryRuleUiSetNewInstanceCommand returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiSetNewInstanceCommandRule()); }
	iv_ruleUiSetNewInstanceCommand=ruleUiSetNewInstanceCommand
	{ $current=$iv_ruleUiSetNewInstanceCommand.current; }
	EOF;

// Rule UiSetNewInstanceCommand
ruleUiSetNewInstanceCommand returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiSetNewInstanceCommandAccess().getUiSetNewInstanceCommandAction_0(),
					$current);
			}
		)
		otherlv_1='newInstance'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiSetNewInstanceCommandAccess().getNewInstanceKeyword_1());
		}
		(
			otherlv_2='for'
			{
				newLeafNode(otherlv_2, grammarAccess.getUiSetNewInstanceCommandAccess().getForKeyword_2_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getUiSetNewInstanceCommandAccess().getJvmTypeJvmTypeReferenceParserRuleCall_2_1_0());
					}
					lv_jvmType_3_0=ruleJvmTypeReference
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiSetNewInstanceCommandRule());
						}
						set(
							$current,
							"jvmType",
							lv_jvmType_3_0,
							"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
		(
			otherlv_4='at'
			{
				newLeafNode(otherlv_4, grammarAccess.getUiSetNewInstanceCommandAccess().getAtKeyword_3_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getUiSetNewInstanceCommandAccess().getTargetUiBindingEndpointAssignmentParserRuleCall_3_1_0());
					}
					lv_target_5_0=ruleUiBindingEndpointAssignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiSetNewInstanceCommandRule());
						}
						set(
							$current,
							"target",
							lv_target_5_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAssignment");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)
	)
;

// Entry rule entryRuleUiSendEventCommand
entryRuleUiSendEventCommand returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiSendEventCommandRule()); }
	iv_ruleUiSendEventCommand=ruleUiSendEventCommand
	{ $current=$iv_ruleUiSendEventCommand.current; }
	EOF;

// Rule UiSendEventCommand
ruleUiSendEventCommand returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiSendEventCommandAccess().getUiSendEventCommandAction_0(),
					$current);
			}
		)
		otherlv_1='sendEvent'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiSendEventCommandAccess().getSendEventKeyword_1());
		}
		otherlv_2='('
		{
			newLeafNode(otherlv_2, grammarAccess.getUiSendEventCommandAccess().getLeftParenthesisKeyword_2());
		}
		(
			(
				lv_noAutoTrigger_3_0='noAutoTrigger'
				{
					newLeafNode(lv_noAutoTrigger_3_0, grammarAccess.getUiSendEventCommandAccess().getNoAutoTriggerNoAutoTriggerKeyword_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiSendEventCommandRule());
					}
					setWithLastConsumed($current, "noAutoTrigger", true, "noAutoTrigger");
				}
			)
		)?
		(
			(
				lv_eventTopic_4_0=RULE_STRING
				{
					newLeafNode(lv_eventTopic_4_0, grammarAccess.getUiSendEventCommandAccess().getEventTopicSTRINGTerminalRuleCall_4_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiSendEventCommandRule());
					}
					setWithLastConsumed(
						$current,
						"eventTopic",
						lv_eventTopic_4_0,
						"org.eclipse.xtext.xbase.Xtype.STRING");
				}
			)
		)
		otherlv_5=')'
		{
			newLeafNode(otherlv_5, grammarAccess.getUiSendEventCommandAccess().getRightParenthesisKeyword_5());
		}
	)
;

// Entry rule entryRuleUiView
entryRuleUiView returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiViewRule()); }
	iv_ruleUiView=ruleUiView
	{ $current=$iv_ruleUiView.current; }
	EOF;

// Rule UiView
ruleUiView returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	{
		newCompositeNode(grammarAccess.getUiViewAccess().getUiIDEViewParserRuleCall());
	}
	this_UiIDEView_0=ruleUiIDEView
	{
		$current = $this_UiIDEView_0.current;
		afterParserOrEnumRuleCall();
	}
;

// Entry rule entryRuleUiIDEView
entryRuleUiIDEView returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiIDEViewRule()); }
	iv_ruleUiIDEView=ruleUiIDEView
	{ $current=$iv_ruleUiIDEView.current; }
	EOF;

// Rule UiIDEView
ruleUiIDEView returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='ideview'
		{
			newLeafNode(otherlv_0, grammarAccess.getUiIDEViewAccess().getIdeviewKeyword_0());
		}
		(
			(
				lv_name_1_0=RULE_ID
				{
					newLeafNode(lv_name_1_0, grammarAccess.getUiIDEViewAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiIDEViewRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
		otherlv_2='{'
		{
			newLeafNode(otherlv_2, grammarAccess.getUiIDEViewAccess().getLeftCurlyBracketKeyword_2());
		}
		(
			(
				{ 
				  getUnorderedGroupHelper().enter(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3());
				}
				(
					(
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 0)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 0);
					}
								({true}?=>(otherlv_4='sharedStateGroup'
								{
									newLeafNode(otherlv_4, grammarAccess.getUiIDEViewAccess().getSharedStateGroupKeyword_3_0_0());
								}
								(
									(
										lv_sharedStateGroup_5_0=RULE_STRING
										{
											newLeafNode(lv_sharedStateGroup_5_0, grammarAccess.getUiIDEViewAccess().getSharedStateGroupSTRINGTerminalRuleCall_3_0_1_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiIDEViewRule());
											}
											setWithLastConsumed(
												$current,
												"sharedStateGroup",
												lv_sharedStateGroup_5_0,
												"org.eclipse.xtext.xbase.Xtype.STRING");
										}
									)
								)
								(
									otherlv_6=';'
									{
										newLeafNode(otherlv_6, grammarAccess.getUiIDEViewAccess().getSemicolonKeyword_3_0_2());
									}
								)?
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 1)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 1);
					}
								({true}?=>(otherlv_7='category'
								{
									newLeafNode(otherlv_7, grammarAccess.getUiIDEViewAccess().getCategoryKeyword_3_1_0());
								}
								(
									(
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiIDEViewRule());
											}
										}
										{
											newCompositeNode(grammarAccess.getUiIDEViewAccess().getViewCategoryUxViewCategoryCrossReference_3_1_1_0());
										}
										ruleQualifiedName
										{
											afterParserOrEnumRuleCall();
										}
									)
								)
								(
									otherlv_9=';'
									{
										newLeafNode(otherlv_9, grammarAccess.getUiIDEViewAccess().getSemicolonKeyword_3_1_2());
									}
								)?
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 2)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 2);
					}
								({true}?=>(otherlv_10='rootType'
								{
									newLeafNode(otherlv_10, grammarAccess.getUiIDEViewAccess().getRootTypeKeyword_3_2_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getUiIDEViewAccess().getJvmTypeJvmTypeReferenceParserRuleCall_3_2_1_0());
										}
										lv_jvmType_11_0=ruleJvmTypeReference
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
											}
											set(
												$current,
												"jvmType",
												lv_jvmType_11_0,
												"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
											afterParserOrEnumRuleCall();
										}
									)
								)
								(
									otherlv_12=';'
									{
										newLeafNode(otherlv_12, grammarAccess.getUiIDEViewAccess().getSemicolonKeyword_3_2_2());
									}
								)?
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 3)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3(), 3);
					}
								({true}?=>(otherlv_13='exposedActions'
								{
									newLeafNode(otherlv_13, grammarAccess.getUiIDEViewAccess().getExposedActionsKeyword_3_3_0());
								}
								otherlv_14='{'
								{
									newLeafNode(otherlv_14, grammarAccess.getUiIDEViewAccess().getLeftCurlyBracketKeyword_3_3_1());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getUiIDEViewAccess().getExposedActionsUiExposedActionParserRuleCall_3_3_2_0());
										}
										lv_exposedActions_15_0=ruleUiExposedAction
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
											}
											add(
												$current,
												"exposedActions",
												lv_exposedActions_15_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiExposedAction");
											afterParserOrEnumRuleCall();
										}
									)
								)*
								otherlv_16='}'
								{
									newLeafNode(otherlv_16, grammarAccess.getUiIDEViewAccess().getRightCurlyBracketKeyword_3_3_3());
								}
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3());
					}
				)
			)
					)*
				)
			)
				{ 
				  getUnorderedGroupHelper().leave(grammarAccess.getUiIDEViewAccess().getUnorderedGroup_3());
				}
		)
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getUiIDEViewAccess().getBeanSlotsUiBeanSlotParserRuleCall_4_0_0());
					}
					lv_beanSlots_17_0=ruleUiBeanSlot
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
						}
						add(
							$current,
							"beanSlots",
							lv_beanSlots_17_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBeanSlot");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getUiIDEViewAccess().getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_4_1_0());
					}
					lv_bindingEndpointAlias_18_0=ruleUiBindingEndpointAlias
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
						}
						add(
							$current,
							"bindingEndpointAlias",
							lv_bindingEndpointAlias_18_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAlias");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getUiIDEViewAccess().getBindingsUiBindingParserRuleCall_4_2_0());
					}
					lv_bindings_19_0=ruleUiBinding
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
						}
						add(
							$current,
							"bindings",
							lv_bindings_19_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
		(
			(
				{
					newCompositeNode(grammarAccess.getUiIDEViewAccess().getContentUiEmbeddableParserRuleCall_5_0());
				}
				lv_content_20_0=ruleUiEmbeddable
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
					}
					set(
						$current,
						"content",
						lv_content_20_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiEmbeddable");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_21='align'
			{
				newLeafNode(otherlv_21, grammarAccess.getUiIDEViewAccess().getAlignKeyword_6_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getUiIDEViewAccess().getContentAlignmentUiAlignmentEnumRuleCall_6_1_0());
					}
					lv_contentAlignment_22_0=ruleUiAlignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
						}
						set(
							$current,
							"contentAlignment",
							lv_contentAlignment_22_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiAlignment");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getUiIDEViewAccess().getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_7_0_0());
					}
					lv_bindingEndpointAlias_23_0=ruleUiBindingEndpointAlias
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
						}
						add(
							$current,
							"bindingEndpointAlias",
							lv_bindingEndpointAlias_23_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAlias");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getUiIDEViewAccess().getBindingsUiBindingParserRuleCall_7_1_0());
					}
					lv_bindings_24_0=ruleUiBinding
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
						}
						add(
							$current,
							"bindings",
							lv_bindings_24_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getUiIDEViewAccess().getValidatorAssignmentsUiValidatorAssignmentParserRuleCall_7_2_0());
					}
					lv_validatorAssignments_25_0=ruleUiValidatorAssignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
						}
						add(
							$current,
							"validatorAssignments",
							lv_validatorAssignments_25_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidatorAssignment");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getUiIDEViewAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_3_0());
					}
					lv_processorAssignments_26_0=ruleUiVisibilityProcessorAssignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiIDEViewRule());
						}
						add(
							$current,
							"processorAssignments",
							lv_processorAssignments_26_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
		otherlv_27='}'
		{
			newLeafNode(otherlv_27, grammarAccess.getUiIDEViewAccess().getRightCurlyBracketKeyword_8());
		}
	)
;

// Entry rule entryRuleUiDisplayView
entryRuleUiDisplayView returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiDisplayViewRule()); }
	iv_ruleUiDisplayView=ruleUiDisplayView
	{ $current=$iv_ruleUiDisplayView.current; }
	EOF;

// Rule UiDisplayView
ruleUiDisplayView returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='display'
		{
			newLeafNode(otherlv_0, grammarAccess.getUiDisplayViewAccess().getDisplayKeyword_0());
		}
		(
			(
				lv_name_1_0=RULE_ID
				{
					newLeafNode(lv_name_1_0, grammarAccess.getUiDisplayViewAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiDisplayViewRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
		otherlv_2='{'
		{
			newLeafNode(otherlv_2, grammarAccess.getUiDisplayViewAccess().getLeftCurlyBracketKeyword_2());
		}
		otherlv_3='rootType'
		{
			newLeafNode(otherlv_3, grammarAccess.getUiDisplayViewAccess().getRootTypeKeyword_3());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getUiDisplayViewAccess().getJvmTypeJvmTypeReferenceParserRuleCall_4_0());
				}
				lv_jvmType_4_0=ruleJvmTypeReference
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiDisplayViewRule());
					}
					set(
						$current,
						"jvmType",
						lv_jvmType_4_0,
						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getUiDisplayViewAccess().getBeanSlotsUiBeanSlotParserRuleCall_5_0_0());
					}
					lv_beanSlots_5_0=ruleUiBeanSlot
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiDisplayViewRule());
						}
						add(
							$current,
							"beanSlots",
							lv_beanSlots_5_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBeanSlot");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getUiDisplayViewAccess().getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_5_1_0());
					}
					lv_bindingEndpointAlias_6_0=ruleUiBindingEndpointAlias
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiDisplayViewRule());
						}
						add(
							$current,
							"bindingEndpointAlias",
							lv_bindingEndpointAlias_6_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAlias");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getUiDisplayViewAccess().getBindingsUiBindingParserRuleCall_5_2_0());
					}
					lv_bindings_7_0=ruleUiBinding
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiDisplayViewRule());
						}
						add(
							$current,
							"bindings",
							lv_bindings_7_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
		(
			(
				{
					newCompositeNode(grammarAccess.getUiDisplayViewAccess().getContentUiEmbeddableParserRuleCall_6_0());
				}
				lv_content_8_0=ruleUiEmbeddable
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiDisplayViewRule());
					}
					set(
						$current,
						"content",
						lv_content_8_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiEmbeddable");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_9='align'
			{
				newLeafNode(otherlv_9, grammarAccess.getUiDisplayViewAccess().getAlignKeyword_7_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getUiDisplayViewAccess().getContentAlignmentUiAlignmentEnumRuleCall_7_1_0());
					}
					lv_contentAlignment_10_0=ruleUiAlignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiDisplayViewRule());
						}
						set(
							$current,
							"contentAlignment",
							lv_contentAlignment_10_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiAlignment");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getUiDisplayViewAccess().getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_8_0_0());
					}
					lv_bindingEndpointAlias_11_0=ruleUiBindingEndpointAlias
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiDisplayViewRule());
						}
						add(
							$current,
							"bindingEndpointAlias",
							lv_bindingEndpointAlias_11_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAlias");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getUiDisplayViewAccess().getBindingsUiBindingParserRuleCall_8_1_0());
					}
					lv_bindings_12_0=ruleUiBinding
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiDisplayViewRule());
						}
						add(
							$current,
							"bindings",
							lv_bindings_12_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getUiDisplayViewAccess().getValidatorAssignmentsUiValidatorAssignmentParserRuleCall_8_2_0());
					}
					lv_validatorAssignments_13_0=ruleUiValidatorAssignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiDisplayViewRule());
						}
						add(
							$current,
							"validatorAssignments",
							lv_validatorAssignments_13_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidatorAssignment");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getUiDisplayViewAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_8_3_0());
					}
					lv_processorAssignments_14_0=ruleUiVisibilityProcessorAssignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiDisplayViewRule());
						}
						add(
							$current,
							"processorAssignments",
							lv_processorAssignments_14_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
		otherlv_15='}'
		{
			newLeafNode(otherlv_15, grammarAccess.getUiDisplayViewAccess().getRightCurlyBracketKeyword_9());
		}
	)
;

// Entry rule entryRuleUiExposedAction
entryRuleUiExposedAction returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiExposedActionRule()); }
	iv_ruleUiExposedAction=ruleUiExposedAction
	{ $current=$iv_ruleUiExposedAction.current; }
	EOF;

// Rule UiExposedAction
ruleUiExposedAction returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				lv_name_0_0=RULE_ID
				{
					newLeafNode(lv_name_0_0, grammarAccess.getUiExposedActionAccess().getNameIDTerminalRuleCall_0_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiExposedActionRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_0_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
		(
			otherlv_1='icon'
			{
				newLeafNode(otherlv_1, grammarAccess.getUiExposedActionAccess().getIconKeyword_1_0());
			}
			(
				(
					lv_iconName_2_0=RULE_STRING
					{
						newLeafNode(lv_iconName_2_0, grammarAccess.getUiExposedActionAccess().getIconNameSTRINGTerminalRuleCall_1_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getUiExposedActionRule());
						}
						setWithLastConsumed(
							$current,
							"iconName",
							lv_iconName_2_0,
							"org.eclipse.xtext.xbase.Xtype.STRING");
					}
				)
			)
		)?
		otherlv_3='id'
		{
			newLeafNode(otherlv_3, grammarAccess.getUiExposedActionAccess().getIdKeyword_2());
		}
		(
			(
				((
					ruleQualifiedName
				)
				)=>
				(
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getUiExposedActionRule());
						}
					}
					{
						newCompositeNode(grammarAccess.getUiExposedActionAccess().getActionReferenceUxActionCrossReference_3_0_0());
					}
					ruleQualifiedName
					{
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					lv_actionID_5_0=RULE_STRING
					{
						newLeafNode(lv_actionID_5_0, grammarAccess.getUiExposedActionAccess().getActionIDSTRINGTerminalRuleCall_3_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getUiExposedActionRule());
						}
						setWithLastConsumed(
							$current,
							"actionID",
							lv_actionID_5_0,
							"org.eclipse.xtext.xbase.Xtype.STRING");
					}
				)
			)
		)
		(
			(
				lv_checkDirty_6_0='checkDirty'
				{
					newLeafNode(lv_checkDirty_6_0, grammarAccess.getUiExposedActionAccess().getCheckDirtyCheckDirtyKeyword_4_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiExposedActionRule());
					}
					setWithLastConsumed($current, "checkDirty", true, "checkDirty");
				}
			)
		)?
		(
			otherlv_7='externalCommand'
			{
				newLeafNode(otherlv_7, grammarAccess.getUiExposedActionAccess().getExternalCommandKeyword_5_0());
			}
			(
				(
					lv_externalCommandId_8_0=RULE_STRING
					{
						newLeafNode(lv_externalCommandId_8_0, grammarAccess.getUiExposedActionAccess().getExternalCommandIdSTRINGTerminalRuleCall_5_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getUiExposedActionRule());
						}
						setWithLastConsumed(
							$current,
							"externalCommandId",
							lv_externalCommandId_8_0,
							"org.eclipse.xtext.xbase.Xtype.STRING");
					}
				)
			)
		)?
		(
			otherlv_9=';'
			{
				newLeafNode(otherlv_9, grammarAccess.getUiExposedActionAccess().getSemicolonKeyword_6());
			}
		)?
	)
;

// Entry rule entryRuleUiMobileNavBarAction
entryRuleUiMobileNavBarAction returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiMobileNavBarActionRule()); }
	iv_ruleUiMobileNavBarAction=ruleUiMobileNavBarAction
	{ $current=$iv_ruleUiMobileNavBarAction.current; }
	EOF;

// Rule UiMobileNavBarAction
ruleUiMobileNavBarAction returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				lv_name_0_0=RULE_ID
				{
					newLeafNode(lv_name_0_0, grammarAccess.getUiMobileNavBarActionAccess().getNameIDTerminalRuleCall_0_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiMobileNavBarActionRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_0_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
		(
			otherlv_1='icon'
			{
				newLeafNode(otherlv_1, grammarAccess.getUiMobileNavBarActionAccess().getIconKeyword_1_0());
			}
			(
				(
					lv_iconName_2_0=RULE_STRING
					{
						newLeafNode(lv_iconName_2_0, grammarAccess.getUiMobileNavBarActionAccess().getIconNameSTRINGTerminalRuleCall_1_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getUiMobileNavBarActionRule());
						}
						setWithLastConsumed(
							$current,
							"iconName",
							lv_iconName_2_0,
							"org.eclipse.xtext.xbase.Xtype.STRING");
					}
				)
			)
		)?
		otherlv_3='id'
		{
			newLeafNode(otherlv_3, grammarAccess.getUiMobileNavBarActionAccess().getIdKeyword_2());
		}
		(
			(
				((
					ruleQualifiedName
				)
				)=>
				(
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getUiMobileNavBarActionRule());
						}
					}
					{
						newCompositeNode(grammarAccess.getUiMobileNavBarActionAccess().getActionReferenceUxActionCrossReference_3_0_0());
					}
					ruleQualifiedName
					{
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					lv_actionID_5_0=RULE_STRING
					{
						newLeafNode(lv_actionID_5_0, grammarAccess.getUiMobileNavBarActionAccess().getActionIDSTRINGTerminalRuleCall_3_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getUiMobileNavBarActionRule());
						}
						setWithLastConsumed(
							$current,
							"actionID",
							lv_actionID_5_0,
							"org.eclipse.xtext.xbase.Xtype.STRING");
					}
				)
			)
		)
		(
			otherlv_6=';'
			{
				newLeafNode(otherlv_6, grammarAccess.getUiMobileNavBarActionAccess().getSemicolonKeyword_4());
			}
		)?
	)
;

// Entry rule entryRuleUiMobileView
entryRuleUiMobileView returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiMobileViewRule()); }
	iv_ruleUiMobileView=ruleUiMobileView
	{ $current=$iv_ruleUiMobileView.current; }
	EOF;

// Rule UiMobileView
ruleUiMobileView returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='mobile'
		{
			newLeafNode(otherlv_0, grammarAccess.getUiMobileViewAccess().getMobileKeyword_0());
		}
		(
			(
				lv_name_1_0=RULE_ID
				{
					newLeafNode(lv_name_1_0, grammarAccess.getUiMobileViewAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiMobileViewRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
		otherlv_2='{'
		{
			newLeafNode(otherlv_2, grammarAccess.getUiMobileViewAccess().getLeftCurlyBracketKeyword_2());
		}
		(
			(
				{ 
				  getUnorderedGroupHelper().enter(grammarAccess.getUiMobileViewAccess().getUnorderedGroup_3());
				}
				(
					(
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileViewAccess().getUnorderedGroup_3(), 0)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getUiMobileViewAccess().getUnorderedGroup_3(), 0);
					}
								({true}?=>(otherlv_4='sharedStateGroup'
								{
									newLeafNode(otherlv_4, grammarAccess.getUiMobileViewAccess().getSharedStateGroupKeyword_3_0_0());
								}
								(
									(
										lv_sharedStateGroup_5_0=RULE_STRING
										{
											newLeafNode(lv_sharedStateGroup_5_0, grammarAccess.getUiMobileViewAccess().getSharedStateGroupSTRINGTerminalRuleCall_3_0_1_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiMobileViewRule());
											}
											setWithLastConsumed(
												$current,
												"sharedStateGroup",
												lv_sharedStateGroup_5_0,
												"org.eclipse.xtext.xbase.Xtype.STRING");
										}
									)
								)
								(
									otherlv_6=';'
									{
										newLeafNode(otherlv_6, grammarAccess.getUiMobileViewAccess().getSemicolonKeyword_3_0_2());
									}
								)?
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileViewAccess().getUnorderedGroup_3());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileViewAccess().getUnorderedGroup_3(), 1)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getUiMobileViewAccess().getUnorderedGroup_3(), 1);
					}
								({true}?=>(otherlv_7='rootType'
								{
									newLeafNode(otherlv_7, grammarAccess.getUiMobileViewAccess().getRootTypeKeyword_3_1_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getUiMobileViewAccess().getJvmTypeJvmTypeReferenceParserRuleCall_3_1_1_0());
										}
										lv_jvmType_8_0=ruleJvmTypeReference
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
											}
											set(
												$current,
												"jvmType",
												lv_jvmType_8_0,
												"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
											afterParserOrEnumRuleCall();
										}
									)
								)
								(
									otherlv_9=';'
									{
										newLeafNode(otherlv_9, grammarAccess.getUiMobileViewAccess().getSemicolonKeyword_3_1_2());
									}
								)?
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileViewAccess().getUnorderedGroup_3());
					}
				)
			)
					)*
				)
			)
				{ 
				  getUnorderedGroupHelper().leave(grammarAccess.getUiMobileViewAccess().getUnorderedGroup_3());
				}
		)
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getUiMobileViewAccess().getBeanSlotsUiBeanSlotParserRuleCall_4_0_0());
					}
					lv_beanSlots_10_0=ruleUiBeanSlot
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
						}
						add(
							$current,
							"beanSlots",
							lv_beanSlots_10_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBeanSlot");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getUiMobileViewAccess().getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_4_1_0());
					}
					lv_bindingEndpointAlias_11_0=ruleUiBindingEndpointAlias
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
						}
						add(
							$current,
							"bindingEndpointAlias",
							lv_bindingEndpointAlias_11_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAlias");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
		(
			(
				{
					newCompositeNode(grammarAccess.getUiMobileViewAccess().getContentUiMobileEmbeddableParserRuleCall_5_0());
				}
				lv_content_12_0=ruleUiMobileEmbeddable
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
					}
					set(
						$current,
						"content",
						lv_content_12_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileEmbeddable");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_13='align'
			{
				newLeafNode(otherlv_13, grammarAccess.getUiMobileViewAccess().getAlignKeyword_6_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getUiMobileViewAccess().getContentAlignmentUiAlignmentEnumRuleCall_6_1_0());
					}
					lv_contentAlignment_14_0=ruleUiAlignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
						}
						set(
							$current,
							"contentAlignment",
							lv_contentAlignment_14_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiAlignment");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getUiMobileViewAccess().getBindingEndpointAliasUiBindingEndpointAliasParserRuleCall_7_0_0());
					}
					lv_bindingEndpointAlias_15_0=ruleUiBindingEndpointAlias
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
						}
						add(
							$current,
							"bindingEndpointAlias",
							lv_bindingEndpointAlias_15_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAlias");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getUiMobileViewAccess().getBindingsUiBindingParserRuleCall_7_1_0());
					}
					lv_bindings_16_0=ruleUiBinding
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
						}
						add(
							$current,
							"bindings",
							lv_bindings_16_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getUiMobileViewAccess().getValidatorAssignmentsUiValidatorAssignmentParserRuleCall_7_2_0());
					}
					lv_validatorAssignments_17_0=ruleUiValidatorAssignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
						}
						add(
							$current,
							"validatorAssignments",
							lv_validatorAssignments_17_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidatorAssignment");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getUiMobileViewAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_3_0());
					}
					lv_processorAssignments_18_0=ruleUiVisibilityProcessorAssignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiMobileViewRule());
						}
						add(
							$current,
							"processorAssignments",
							lv_processorAssignments_18_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
		otherlv_19='}'
		{
			newLeafNode(otherlv_19, grammarAccess.getUiMobileViewAccess().getRightCurlyBracketKeyword_8());
		}
	)
;

// Entry rule entryRuleUiI18nInfo
entryRuleUiI18nInfo returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiI18nInfoRule()); }
	iv_ruleUiI18nInfo=ruleUiI18nInfo
	{ $current=$iv_ruleUiI18nInfo.current; }
	EOF;

// Rule UiI18nInfo
ruleUiI18nInfo returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='i18n'
		{
			newLeafNode(otherlv_0, grammarAccess.getUiI18nInfoAccess().getI18nKeyword_0());
		}
		(
			(
				(
					lv_noCaption_1_0='noCaption'
					{
						newLeafNode(lv_noCaption_1_0, grammarAccess.getUiI18nInfoAccess().getNoCaptionNoCaptionKeyword_1_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getUiI18nInfoRule());
						}
						setWithLastConsumed($current, "noCaption", true, "noCaption");
					}
				)
			)
			    |
			(
				(
					lv_key_2_0=RULE_STRING
					{
						newLeafNode(lv_key_2_0, grammarAccess.getUiI18nInfoAccess().getKeySTRINGTerminalRuleCall_1_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getUiI18nInfoRule());
						}
						setWithLastConsumed(
							$current,
							"key",
							lv_key_2_0,
							"org.eclipse.xtext.xbase.Xtype.STRING");
					}
				)
			)
		)
	)
;

// Entry rule entryRuleUiGridLayout
entryRuleUiGridLayout returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiGridLayoutRule()); }
	iv_ruleUiGridLayout=ruleUiGridLayout
	{ $current=$iv_ruleUiGridLayout.current; }
	EOF;

// Rule UiGridLayout
ruleUiGridLayout returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiGridLayoutAccess().getUiGridLayoutAction_0(),
					$current);
			}
		)
		otherlv_1='gridlayout'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiGridLayoutAccess().getGridlayoutKeyword_1());
		}
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getUiGridLayoutAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 0);
						}
									({true}?=>(otherlv_4='columns='
									{
										newLeafNode(otherlv_4, grammarAccess.getUiGridLayoutAccess().getColumnsKeyword_2_1_0_0());
									}
									(
										(
											lv_columns_5_0=RULE_INT
											{
												newLeafNode(lv_columns_5_0, grammarAccess.getUiGridLayoutAccess().getColumnsINTTerminalRuleCall_2_1_0_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiGridLayoutRule());
												}
												setWithLastConsumed(
													$current,
													"columns",
													lv_columns_5_0,
													"org.eclipse.xtext.xbase.Xbase.INT");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 1);
						}
									({true}?=>((
										{
											newCompositeNode(grammarAccess.getUiGridLayoutAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_1_0());
										}
										lv_i18nInfo_6_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiGridLayoutRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_6_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 2)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 2);
						}
									({true}?=>(otherlv_7='styles'
									{
										newLeafNode(otherlv_7, grammarAccess.getUiGridLayoutAccess().getStylesKeyword_2_1_2_0());
									}
									(
										(
											lv_styles_8_0=RULE_STRING
											{
												newLeafNode(lv_styles_8_0, grammarAccess.getUiGridLayoutAccess().getStylesSTRINGTerminalRuleCall_2_1_2_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiGridLayoutRule());
												}
												setWithLastConsumed(
													$current,
													"styles",
													lv_styles_8_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 3)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1(), 3);
						}
									({true}?=>((
										lv_readonly_9_0='readonly'
										{
											newLeafNode(lv_readonly_9_0, grammarAccess.getUiGridLayoutAccess().getReadonlyReadonlyKeyword_2_1_3_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiGridLayoutRule());
											}
											setWithLastConsumed($current, "readonly", true, "readonly");
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiGridLayoutAccess().getUnorderedGroup_2_1());
					}
			)
			otherlv_10=')'
			{
				newLeafNode(otherlv_10, grammarAccess.getUiGridLayoutAccess().getRightParenthesisKeyword_2_2());
			}
		)?
		(
			(
				lv_name_11_0=RULE_ID
				{
					newLeafNode(lv_name_11_0, grammarAccess.getUiGridLayoutAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiGridLayoutRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_11_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		otherlv_12='{'
		{
			newLeafNode(otherlv_12, grammarAccess.getUiGridLayoutAccess().getLeftCurlyBracketKeyword_4());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getUiGridLayoutAccess().getContentsUiGridLayoutAssigmentParserRuleCall_5_0());
				}
				lv_contents_13_0=ruleUiGridLayoutAssigment
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiGridLayoutRule());
					}
					add(
						$current,
						"contents",
						lv_contents_13_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiGridLayoutAssigment");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			(
				{
					newCompositeNode(grammarAccess.getUiGridLayoutAccess().getBindingsUiBindingParserRuleCall_6_0());
				}
				lv_bindings_14_0=ruleUiBinding
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiGridLayoutRule());
					}
					add(
						$current,
						"bindings",
						lv_bindings_14_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			(
				{
					newCompositeNode(grammarAccess.getUiGridLayoutAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0());
				}
				lv_processorAssignments_15_0=ruleUiVisibilityProcessorAssignment
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiGridLayoutRule());
					}
					add(
						$current,
						"processorAssignments",
						lv_processorAssignments_15_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		otherlv_16='}'
		{
			newLeafNode(otherlv_16, grammarAccess.getUiGridLayoutAccess().getRightCurlyBracketKeyword_8());
		}
	)
;

// Entry rule entryRuleUiVisibilityProcessorAssignment
entryRuleUiVisibilityProcessorAssignment returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiVisibilityProcessorAssignmentRule()); }
	iv_ruleUiVisibilityProcessorAssignment=ruleUiVisibilityProcessorAssignment
	{ $current=$iv_ruleUiVisibilityProcessorAssignment.current; }
	EOF;

// Rule UiVisibilityProcessorAssignment
ruleUiVisibilityProcessorAssignment returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiVisibilityProcessorAssignmentAccess().getUiVisibilityProcessorAssignmentAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getUiVisibilityProcessorAssignmentAccess().getProcessorUiVisibilityProcessorParserRuleCall_1_0());
				}
				lv_processor_1_0=ruleUiVisibilityProcessor
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiVisibilityProcessorAssignmentRule());
					}
					set(
						$current,
						"processor",
						lv_processor_1_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessor");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleUiGridLayoutAssigment
entryRuleUiGridLayoutAssigment returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiGridLayoutAssigmentRule()); }
	iv_ruleUiGridLayoutAssigment=ruleUiGridLayoutAssigment
	{ $current=$iv_ruleUiGridLayoutAssigment.current; }
	EOF;

// Rule UiGridLayoutAssigment
ruleUiGridLayoutAssigment returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getUiGridLayoutAssigmentAccess().getElementUiEmbeddableParserRuleCall_0_0());
				}
				lv_element_0_0=ruleUiEmbeddable
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiGridLayoutAssigmentRule());
					}
					set(
						$current,
						"element",
						lv_element_0_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiEmbeddable");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_1='align'
			{
				newLeafNode(otherlv_1, grammarAccess.getUiGridLayoutAssigmentAccess().getAlignKeyword_1_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getUiGridLayoutAssigmentAccess().getAlignmentUiAlignmentEnumRuleCall_1_1_0());
					}
					lv_alignment_2_0=ruleUiAlignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiGridLayoutAssigmentRule());
						}
						set(
							$current,
							"alignment",
							lv_alignment_2_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiAlignment");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
	)
;

// Entry rule entryRuleUiFormLayout
entryRuleUiFormLayout returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiFormLayoutRule()); }
	iv_ruleUiFormLayout=ruleUiFormLayout
	{ $current=$iv_ruleUiFormLayout.current; }
	EOF;

// Rule UiFormLayout
ruleUiFormLayout returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiFormLayoutAccess().getUiFormLayoutAction_0(),
					$current);
			}
		)
		otherlv_1='form'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiFormLayoutAccess().getFormKeyword_1());
		}
		(
			(
				{ 
				  getUnorderedGroupHelper().enter(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2());
				}
				(
					(
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2(), 0)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2(), 0);
					}
								({true}?=>(otherlv_3='('
								{
									newLeafNode(otherlv_3, grammarAccess.getUiFormLayoutAccess().getLeftParenthesisKeyword_2_0_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getUiFormLayoutAccess().getI18nInfoUiI18nInfoParserRuleCall_2_0_1_0());
										}
										lv_i18nInfo_4_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiFormLayoutRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_4_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
								)?
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2(), 1)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2(), 1);
					}
								({true}?=>(otherlv_5='styles'
								{
									newLeafNode(otherlv_5, grammarAccess.getUiFormLayoutAccess().getStylesKeyword_2_1_0());
								}
								(
									(
										lv_styles_6_0=RULE_STRING
										{
											newLeafNode(lv_styles_6_0, grammarAccess.getUiFormLayoutAccess().getStylesSTRINGTerminalRuleCall_2_1_1_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiFormLayoutRule());
											}
											setWithLastConsumed(
												$current,
												"styles",
												lv_styles_6_0,
												"org.eclipse.xtext.xbase.Xtype.STRING");
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2(), 2)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2(), 2);
					}
								({true}?=>((
									(
										lv_readonly_7_0='readonly'
										{
											newLeafNode(lv_readonly_7_0, grammarAccess.getUiFormLayoutAccess().getReadonlyReadonlyKeyword_2_2_0_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiFormLayoutRule());
											}
											setWithLastConsumed($current, "readonly", true, "readonly");
										}
									)
								)?
								otherlv_8=')'
								{
									newLeafNode(otherlv_8, grammarAccess.getUiFormLayoutAccess().getRightParenthesisKeyword_2_2_1());
								}
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2());
					}
				)
			)
					)+
					{getUnorderedGroupHelper().canLeave(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2())}?
				)
			)
				{ 
				  getUnorderedGroupHelper().leave(grammarAccess.getUiFormLayoutAccess().getUnorderedGroup_2());
				}
		)?
		(
			(
				lv_name_9_0=RULE_ID
				{
					newLeafNode(lv_name_9_0, grammarAccess.getUiFormLayoutAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiFormLayoutRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_9_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		otherlv_10='{'
		{
			newLeafNode(otherlv_10, grammarAccess.getUiFormLayoutAccess().getLeftCurlyBracketKeyword_4());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getUiFormLayoutAccess().getContentsUiFormLayoutAssigmentParserRuleCall_5_0());
				}
				lv_contents_11_0=ruleUiFormLayoutAssigment
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiFormLayoutRule());
					}
					add(
						$current,
						"contents",
						lv_contents_11_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiFormLayoutAssigment");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			(
				{
					newCompositeNode(grammarAccess.getUiFormLayoutAccess().getBindingsUiBindingParserRuleCall_6_0());
				}
				lv_bindings_12_0=ruleUiBinding
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiFormLayoutRule());
					}
					add(
						$current,
						"bindings",
						lv_bindings_12_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			(
				{
					newCompositeNode(grammarAccess.getUiFormLayoutAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0());
				}
				lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiFormLayoutRule());
					}
					add(
						$current,
						"processorAssignments",
						lv_processorAssignments_13_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		otherlv_14='}'
		{
			newLeafNode(otherlv_14, grammarAccess.getUiFormLayoutAccess().getRightCurlyBracketKeyword_8());
		}
	)
;

// Entry rule entryRuleUiFormLayoutAssigment
entryRuleUiFormLayoutAssigment returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiFormLayoutAssigmentRule()); }
	iv_ruleUiFormLayoutAssigment=ruleUiFormLayoutAssigment
	{ $current=$iv_ruleUiFormLayoutAssigment.current; }
	EOF;

// Rule UiFormLayoutAssigment
ruleUiFormLayoutAssigment returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				newCompositeNode(grammarAccess.getUiFormLayoutAssigmentAccess().getElementUiEmbeddableParserRuleCall_0());
			}
			lv_element_0_0=ruleUiEmbeddable
			{
				if ($current==null) {
					$current = createModelElementForParent(grammarAccess.getUiFormLayoutAssigmentRule());
				}
				set(
					$current,
					"element",
					lv_element_0_0,
					"org.eclipse.osbp.ecview.dsl.UIGrammar.UiEmbeddable");
				afterParserOrEnumRuleCall();
			}
		)
	)
;

// Entry rule entryRuleUiVerticalLayout
entryRuleUiVerticalLayout returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiVerticalLayoutRule()); }
	iv_ruleUiVerticalLayout=ruleUiVerticalLayout
	{ $current=$iv_ruleUiVerticalLayout.current; }
	EOF;

// Rule UiVerticalLayout
ruleUiVerticalLayout returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiVerticalLayoutAccess().getUiVerticalLayoutAction_0(),
					$current);
			}
		)
		otherlv_1='verticalLayout'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiVerticalLayoutAccess().getVerticalLayoutKeyword_1());
		}
		(
			(
				{ 
				  getUnorderedGroupHelper().enter(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2());
				}
				(
					(
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2(), 0)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2(), 0);
					}
								({true}?=>(otherlv_3='('
								{
									newLeafNode(otherlv_3, grammarAccess.getUiVerticalLayoutAccess().getLeftParenthesisKeyword_2_0_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getUiVerticalLayoutAccess().getI18nInfoUiI18nInfoParserRuleCall_2_0_1_0());
										}
										lv_i18nInfo_4_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiVerticalLayoutRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_4_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
								)?
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2(), 1)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2(), 1);
					}
								({true}?=>(otherlv_5='styles'
								{
									newLeafNode(otherlv_5, grammarAccess.getUiVerticalLayoutAccess().getStylesKeyword_2_1_0());
								}
								(
									(
										lv_styles_6_0=RULE_STRING
										{
											newLeafNode(lv_styles_6_0, grammarAccess.getUiVerticalLayoutAccess().getStylesSTRINGTerminalRuleCall_2_1_1_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiVerticalLayoutRule());
											}
											setWithLastConsumed(
												$current,
												"styles",
												lv_styles_6_0,
												"org.eclipse.xtext.xbase.Xtype.STRING");
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2(), 2)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2(), 2);
					}
								({true}?=>((
									(
										lv_readonly_7_0='readonly'
										{
											newLeafNode(lv_readonly_7_0, grammarAccess.getUiVerticalLayoutAccess().getReadonlyReadonlyKeyword_2_2_0_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiVerticalLayoutRule());
											}
											setWithLastConsumed($current, "readonly", true, "readonly");
										}
									)
								)?
								otherlv_8=')'
								{
									newLeafNode(otherlv_8, grammarAccess.getUiVerticalLayoutAccess().getRightParenthesisKeyword_2_2_1());
								}
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2());
					}
				)
			)
					)+
					{getUnorderedGroupHelper().canLeave(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2())}?
				)
			)
				{ 
				  getUnorderedGroupHelper().leave(grammarAccess.getUiVerticalLayoutAccess().getUnorderedGroup_2());
				}
		)?
		(
			(
				lv_name_9_0=RULE_ID
				{
					newLeafNode(lv_name_9_0, grammarAccess.getUiVerticalLayoutAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiVerticalLayoutRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_9_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		otherlv_10='{'
		{
			newLeafNode(otherlv_10, grammarAccess.getUiVerticalLayoutAccess().getLeftCurlyBracketKeyword_4());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getUiVerticalLayoutAccess().getContentsUiVerticalLayoutAssigmentParserRuleCall_5_0());
				}
				lv_contents_11_0=ruleUiVerticalLayoutAssigment
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiVerticalLayoutRule());
					}
					add(
						$current,
						"contents",
						lv_contents_11_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVerticalLayoutAssigment");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			(
				{
					newCompositeNode(grammarAccess.getUiVerticalLayoutAccess().getBindingsUiBindingParserRuleCall_6_0());
				}
				lv_bindings_12_0=ruleUiBinding
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiVerticalLayoutRule());
					}
					add(
						$current,
						"bindings",
						lv_bindings_12_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			(
				{
					newCompositeNode(grammarAccess.getUiVerticalLayoutAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0());
				}
				lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiVerticalLayoutRule());
					}
					add(
						$current,
						"processorAssignments",
						lv_processorAssignments_13_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		otherlv_14='}'
		{
			newLeafNode(otherlv_14, grammarAccess.getUiVerticalLayoutAccess().getRightCurlyBracketKeyword_8());
		}
	)
;

// Entry rule entryRuleUiVerticalLayoutAssigment
entryRuleUiVerticalLayoutAssigment returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiVerticalLayoutAssigmentRule()); }
	iv_ruleUiVerticalLayoutAssigment=ruleUiVerticalLayoutAssigment
	{ $current=$iv_ruleUiVerticalLayoutAssigment.current; }
	EOF;

// Rule UiVerticalLayoutAssigment
ruleUiVerticalLayoutAssigment returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getUiVerticalLayoutAssigmentAccess().getElementUiEmbeddableParserRuleCall_0_0());
				}
				lv_element_0_0=ruleUiEmbeddable
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiVerticalLayoutAssigmentRule());
					}
					set(
						$current,
						"element",
						lv_element_0_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiEmbeddable");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_1='align'
			{
				newLeafNode(otherlv_1, grammarAccess.getUiVerticalLayoutAssigmentAccess().getAlignKeyword_1_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getUiVerticalLayoutAssigmentAccess().getAlignmentUiAlignmentEnumRuleCall_1_1_0());
					}
					lv_alignment_2_0=ruleUiAlignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiVerticalLayoutAssigmentRule());
						}
						set(
							$current,
							"alignment",
							lv_alignment_2_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiAlignment");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
	)
;

// Entry rule entryRuleUiMobileVerticalLayout
entryRuleUiMobileVerticalLayout returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiMobileVerticalLayoutRule()); }
	iv_ruleUiMobileVerticalLayout=ruleUiMobileVerticalLayout
	{ $current=$iv_ruleUiMobileVerticalLayout.current; }
	EOF;

// Rule UiMobileVerticalLayout
ruleUiMobileVerticalLayout returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiMobileVerticalLayoutAccess().getUiVerticalLayoutAction_0(),
					$current);
			}
		)
		otherlv_1='mobileVerticalLayout'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiMobileVerticalLayoutAccess().getMobileVerticalLayoutKeyword_1());
		}
		(
			(
				{ 
				  getUnorderedGroupHelper().enter(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2());
				}
				(
					(
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2(), 0)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2(), 0);
					}
								({true}?=>(otherlv_3='('
								{
									newLeafNode(otherlv_3, grammarAccess.getUiMobileVerticalLayoutAccess().getLeftParenthesisKeyword_2_0_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getUiMobileVerticalLayoutAccess().getI18nInfoUiI18nInfoParserRuleCall_2_0_1_0());
										}
										lv_i18nInfo_4_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiMobileVerticalLayoutRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_4_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
								)?
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2(), 1)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2(), 1);
					}
								({true}?=>(otherlv_5='styles'
								{
									newLeafNode(otherlv_5, grammarAccess.getUiMobileVerticalLayoutAccess().getStylesKeyword_2_1_0());
								}
								(
									(
										lv_styles_6_0=RULE_STRING
										{
											newLeafNode(lv_styles_6_0, grammarAccess.getUiMobileVerticalLayoutAccess().getStylesSTRINGTerminalRuleCall_2_1_1_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiMobileVerticalLayoutRule());
											}
											setWithLastConsumed(
												$current,
												"styles",
												lv_styles_6_0,
												"org.eclipse.xtext.xbase.Xtype.STRING");
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2(), 2)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2(), 2);
					}
								({true}?=>((
									(
										lv_readonly_7_0='readonly'
										{
											newLeafNode(lv_readonly_7_0, grammarAccess.getUiMobileVerticalLayoutAccess().getReadonlyReadonlyKeyword_2_2_0_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiMobileVerticalLayoutRule());
											}
											setWithLastConsumed($current, "readonly", true, "readonly");
										}
									)
								)?
								otherlv_8=')'
								{
									newLeafNode(otherlv_8, grammarAccess.getUiMobileVerticalLayoutAccess().getRightParenthesisKeyword_2_2_1());
								}
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2());
					}
				)
			)
					)+
					{getUnorderedGroupHelper().canLeave(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2())}?
				)
			)
				{ 
				  getUnorderedGroupHelper().leave(grammarAccess.getUiMobileVerticalLayoutAccess().getUnorderedGroup_2());
				}
		)?
		(
			(
				lv_name_9_0=RULE_ID
				{
					newLeafNode(lv_name_9_0, grammarAccess.getUiMobileVerticalLayoutAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiMobileVerticalLayoutRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_9_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		otherlv_10='{'
		{
			newLeafNode(otherlv_10, grammarAccess.getUiMobileVerticalLayoutAccess().getLeftCurlyBracketKeyword_4());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getUiMobileVerticalLayoutAccess().getContentsUiMobileVerticalLayoutAssigmentParserRuleCall_5_0());
				}
				lv_contents_11_0=ruleUiMobileVerticalLayoutAssigment
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiMobileVerticalLayoutRule());
					}
					add(
						$current,
						"contents",
						lv_contents_11_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileVerticalLayoutAssigment");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			(
				{
					newCompositeNode(grammarAccess.getUiMobileVerticalLayoutAccess().getBindingsUiBindingParserRuleCall_6_0());
				}
				lv_bindings_12_0=ruleUiBinding
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiMobileVerticalLayoutRule());
					}
					add(
						$current,
						"bindings",
						lv_bindings_12_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			(
				{
					newCompositeNode(grammarAccess.getUiMobileVerticalLayoutAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0());
				}
				lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiMobileVerticalLayoutRule());
					}
					add(
						$current,
						"processorAssignments",
						lv_processorAssignments_13_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		otherlv_14='}'
		{
			newLeafNode(otherlv_14, grammarAccess.getUiMobileVerticalLayoutAccess().getRightCurlyBracketKeyword_8());
		}
	)
;

// Entry rule entryRuleUiMobileVerticalLayoutAssigment
entryRuleUiMobileVerticalLayoutAssigment returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiMobileVerticalLayoutAssigmentRule()); }
	iv_ruleUiMobileVerticalLayoutAssigment=ruleUiMobileVerticalLayoutAssigment
	{ $current=$iv_ruleUiMobileVerticalLayoutAssigment.current; }
	EOF;

// Rule UiMobileVerticalLayoutAssigment
ruleUiMobileVerticalLayoutAssigment returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getUiMobileVerticalLayoutAssigmentAccess().getElementUiMobileEmbeddableParserRuleCall_0_0());
				}
				lv_element_0_0=ruleUiMobileEmbeddable
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiMobileVerticalLayoutAssigmentRule());
					}
					set(
						$current,
						"element",
						lv_element_0_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileEmbeddable");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_1='align'
			{
				newLeafNode(otherlv_1, grammarAccess.getUiMobileVerticalLayoutAssigmentAccess().getAlignKeyword_1_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getUiMobileVerticalLayoutAssigmentAccess().getAlignmentUiAlignmentEnumRuleCall_1_1_0());
					}
					lv_alignment_2_0=ruleUiAlignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiMobileVerticalLayoutAssigmentRule());
						}
						set(
							$current,
							"alignment",
							lv_alignment_2_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiAlignment");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
	)
;

// Entry rule entryRuleUiMobileNavigationRoot
entryRuleUiMobileNavigationRoot returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiMobileNavigationRootRule()); }
	iv_ruleUiMobileNavigationRoot=ruleUiMobileNavigationRoot
	{ $current=$iv_ruleUiMobileNavigationRoot.current; }
	EOF;

// Rule UiMobileNavigationRoot
ruleUiMobileNavigationRoot returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiMobileNavigationRootAccess().getUiMobileNavigationRootAction_0(),
					$current);
			}
		)
		otherlv_1='navRoot'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiMobileNavigationRootAccess().getNavRootKeyword_1());
		}
		(
			(
				lv_name_2_0=RULE_ID
				{
					newLeafNode(lv_name_2_0, grammarAccess.getUiMobileNavigationRootAccess().getNameIDTerminalRuleCall_2_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiMobileNavigationRootRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_2_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		otherlv_3='{'
		{
			newLeafNode(otherlv_3, grammarAccess.getUiMobileNavigationRootAccess().getLeftCurlyBracketKeyword_3());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getUiMobileNavigationRootAccess().getContentsUiMobileNavigationRootAssigmentParserRuleCall_4_0());
				}
				lv_contents_4_0=ruleUiMobileNavigationRootAssigment
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiMobileNavigationRootRule());
					}
					add(
						$current,
						"contents",
						lv_contents_4_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileNavigationRootAssigment");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_5='}'
		{
			newLeafNode(otherlv_5, grammarAccess.getUiMobileNavigationRootAccess().getRightCurlyBracketKeyword_5());
		}
	)
;

// Entry rule entryRuleUiMobileNavigationRootAssigment
entryRuleUiMobileNavigationRootAssigment returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiMobileNavigationRootAssigmentRule()); }
	iv_ruleUiMobileNavigationRootAssigment=ruleUiMobileNavigationRootAssigment
	{ $current=$iv_ruleUiMobileNavigationRootAssigment.current; }
	EOF;

// Rule UiMobileNavigationRootAssigment
ruleUiMobileNavigationRootAssigment returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				newCompositeNode(grammarAccess.getUiMobileNavigationRootAssigmentAccess().getElementUiMobileNavigationPageParserRuleCall_0());
			}
			lv_element_0_0=ruleUiMobileNavigationPage
			{
				if ($current==null) {
					$current = createModelElementForParent(grammarAccess.getUiMobileNavigationRootAssigmentRule());
				}
				set(
					$current,
					"element",
					lv_element_0_0,
					"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileNavigationPage");
				afterParserOrEnumRuleCall();
			}
		)
	)
;

// Entry rule entryRuleUiHorizontalLayout
entryRuleUiHorizontalLayout returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiHorizontalLayoutRule()); }
	iv_ruleUiHorizontalLayout=ruleUiHorizontalLayout
	{ $current=$iv_ruleUiHorizontalLayout.current; }
	EOF;

// Rule UiHorizontalLayout
ruleUiHorizontalLayout returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiHorizontalLayoutAccess().getUiHorizontalLayoutAction_0(),
					$current);
			}
		)
		otherlv_1='horizontalLayout'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiHorizontalLayoutAccess().getHorizontalLayoutKeyword_1());
		}
		(
			(
				{ 
				  getUnorderedGroupHelper().enter(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2());
				}
				(
					(
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2(), 0)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2(), 0);
					}
								({true}?=>(otherlv_3='('
								{
									newLeafNode(otherlv_3, grammarAccess.getUiHorizontalLayoutAccess().getLeftParenthesisKeyword_2_0_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getUiHorizontalLayoutAccess().getI18nInfoUiI18nInfoParserRuleCall_2_0_1_0());
										}
										lv_i18nInfo_4_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiHorizontalLayoutRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_4_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
								)?
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2(), 1)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2(), 1);
					}
								({true}?=>((
									lv_readonly_5_0='readonly'
									{
										newLeafNode(lv_readonly_5_0, grammarAccess.getUiHorizontalLayoutAccess().getReadonlyReadonlyKeyword_2_1_0());
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getUiHorizontalLayoutRule());
										}
										setWithLastConsumed($current, "readonly", true, "readonly");
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2(), 2)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2(), 2);
					}
								({true}?=>((
									otherlv_6='styles'
									{
										newLeafNode(otherlv_6, grammarAccess.getUiHorizontalLayoutAccess().getStylesKeyword_2_2_0_0());
									}
									(
										(
											lv_styles_7_0=RULE_STRING
											{
												newLeafNode(lv_styles_7_0, grammarAccess.getUiHorizontalLayoutAccess().getStylesSTRINGTerminalRuleCall_2_2_0_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiHorizontalLayoutRule());
												}
												setWithLastConsumed(
													$current,
													"styles",
													lv_styles_7_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
								)?
								otherlv_8=')'
								{
									newLeafNode(otherlv_8, grammarAccess.getUiHorizontalLayoutAccess().getRightParenthesisKeyword_2_2_1());
								}
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2());
					}
				)
			)
					)+
					{getUnorderedGroupHelper().canLeave(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2())}?
				)
			)
				{ 
				  getUnorderedGroupHelper().leave(grammarAccess.getUiHorizontalLayoutAccess().getUnorderedGroup_2());
				}
		)?
		(
			(
				lv_name_9_0=RULE_ID
				{
					newLeafNode(lv_name_9_0, grammarAccess.getUiHorizontalLayoutAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiHorizontalLayoutRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_9_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		otherlv_10='{'
		{
			newLeafNode(otherlv_10, grammarAccess.getUiHorizontalLayoutAccess().getLeftCurlyBracketKeyword_4());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getUiHorizontalLayoutAccess().getContentsUiHorizontalLayoutAssigmentParserRuleCall_5_0());
				}
				lv_contents_11_0=ruleUiHorizontalLayoutAssigment
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiHorizontalLayoutRule());
					}
					add(
						$current,
						"contents",
						lv_contents_11_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiHorizontalLayoutAssigment");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			(
				{
					newCompositeNode(grammarAccess.getUiHorizontalLayoutAccess().getBindingsUiBindingParserRuleCall_6_0());
				}
				lv_bindings_12_0=ruleUiBinding
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiHorizontalLayoutRule());
					}
					add(
						$current,
						"bindings",
						lv_bindings_12_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			(
				{
					newCompositeNode(grammarAccess.getUiHorizontalLayoutAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0());
				}
				lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiHorizontalLayoutRule());
					}
					add(
						$current,
						"processorAssignments",
						lv_processorAssignments_13_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		otherlv_14='}'
		{
			newLeafNode(otherlv_14, grammarAccess.getUiHorizontalLayoutAccess().getRightCurlyBracketKeyword_8());
		}
	)
;

// Entry rule entryRuleUiHorizontalLayoutAssigment
entryRuleUiHorizontalLayoutAssigment returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiHorizontalLayoutAssigmentRule()); }
	iv_ruleUiHorizontalLayoutAssigment=ruleUiHorizontalLayoutAssigment
	{ $current=$iv_ruleUiHorizontalLayoutAssigment.current; }
	EOF;

// Rule UiHorizontalLayoutAssigment
ruleUiHorizontalLayoutAssigment returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getUiHorizontalLayoutAssigmentAccess().getElementUiEmbeddableParserRuleCall_0_0());
				}
				lv_element_0_0=ruleUiEmbeddable
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiHorizontalLayoutAssigmentRule());
					}
					set(
						$current,
						"element",
						lv_element_0_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiEmbeddable");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_1='align'
			{
				newLeafNode(otherlv_1, grammarAccess.getUiHorizontalLayoutAssigmentAccess().getAlignKeyword_1_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getUiHorizontalLayoutAssigmentAccess().getAlignmentUiAlignmentEnumRuleCall_1_1_0());
					}
					lv_alignment_2_0=ruleUiAlignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiHorizontalLayoutAssigmentRule());
						}
						set(
							$current,
							"alignment",
							lv_alignment_2_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiAlignment");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
	)
;

// Entry rule entryRuleUiMobileHorizontalLayout
entryRuleUiMobileHorizontalLayout returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiMobileHorizontalLayoutRule()); }
	iv_ruleUiMobileHorizontalLayout=ruleUiMobileHorizontalLayout
	{ $current=$iv_ruleUiMobileHorizontalLayout.current; }
	EOF;

// Rule UiMobileHorizontalLayout
ruleUiMobileHorizontalLayout returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiMobileHorizontalLayoutAccess().getUiHorizontalLayoutAction_0(),
					$current);
			}
		)
		otherlv_1='mobileHorizontalLayout'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiMobileHorizontalLayoutAccess().getMobileHorizontalLayoutKeyword_1());
		}
		(
			(
				{ 
				  getUnorderedGroupHelper().enter(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2());
				}
				(
					(
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2(), 0)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2(), 0);
					}
								({true}?=>(otherlv_3='('
								{
									newLeafNode(otherlv_3, grammarAccess.getUiMobileHorizontalLayoutAccess().getLeftParenthesisKeyword_2_0_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getUiMobileHorizontalLayoutAccess().getI18nInfoUiI18nInfoParserRuleCall_2_0_1_0());
										}
										lv_i18nInfo_4_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiMobileHorizontalLayoutRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_4_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
								)?
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2(), 1)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2(), 1);
					}
								({true}?=>(otherlv_5='styles'
								{
									newLeafNode(otherlv_5, grammarAccess.getUiMobileHorizontalLayoutAccess().getStylesKeyword_2_1_0());
								}
								(
									(
										lv_styles_6_0=RULE_STRING
										{
											newLeafNode(lv_styles_6_0, grammarAccess.getUiMobileHorizontalLayoutAccess().getStylesSTRINGTerminalRuleCall_2_1_1_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiMobileHorizontalLayoutRule());
											}
											setWithLastConsumed(
												$current,
												"styles",
												lv_styles_6_0,
												"org.eclipse.xtext.xbase.Xtype.STRING");
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2(), 2)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2(), 2);
					}
								({true}?=>((
									(
										lv_readonly_7_0='readonly'
										{
											newLeafNode(lv_readonly_7_0, grammarAccess.getUiMobileHorizontalLayoutAccess().getReadonlyReadonlyKeyword_2_2_0_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiMobileHorizontalLayoutRule());
											}
											setWithLastConsumed($current, "readonly", true, "readonly");
										}
									)
								)?
								otherlv_8=')'
								{
									newLeafNode(otherlv_8, grammarAccess.getUiMobileHorizontalLayoutAccess().getRightParenthesisKeyword_2_2_1());
								}
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2());
					}
				)
			)
					)+
					{getUnorderedGroupHelper().canLeave(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2())}?
				)
			)
				{ 
				  getUnorderedGroupHelper().leave(grammarAccess.getUiMobileHorizontalLayoutAccess().getUnorderedGroup_2());
				}
		)?
		(
			(
				lv_name_9_0=RULE_ID
				{
					newLeafNode(lv_name_9_0, grammarAccess.getUiMobileHorizontalLayoutAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiMobileHorizontalLayoutRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_9_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		otherlv_10='{'
		{
			newLeafNode(otherlv_10, grammarAccess.getUiMobileHorizontalLayoutAccess().getLeftCurlyBracketKeyword_4());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getUiMobileHorizontalLayoutAccess().getContentsUiMobileHorizontalLayoutAssigmentParserRuleCall_5_0());
				}
				lv_contents_11_0=ruleUiMobileHorizontalLayoutAssigment
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiMobileHorizontalLayoutRule());
					}
					add(
						$current,
						"contents",
						lv_contents_11_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileHorizontalLayoutAssigment");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			(
				{
					newCompositeNode(grammarAccess.getUiMobileHorizontalLayoutAccess().getBindingsUiBindingParserRuleCall_6_0());
				}
				lv_bindings_12_0=ruleUiBinding
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiMobileHorizontalLayoutRule());
					}
					add(
						$current,
						"bindings",
						lv_bindings_12_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			(
				{
					newCompositeNode(grammarAccess.getUiMobileHorizontalLayoutAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0());
				}
				lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiMobileHorizontalLayoutRule());
					}
					add(
						$current,
						"processorAssignments",
						lv_processorAssignments_13_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		otherlv_14='}'
		{
			newLeafNode(otherlv_14, grammarAccess.getUiMobileHorizontalLayoutAccess().getRightCurlyBracketKeyword_8());
		}
	)
;

// Entry rule entryRuleUiMobileHorizontalLayoutAssigment
entryRuleUiMobileHorizontalLayoutAssigment returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiMobileHorizontalLayoutAssigmentRule()); }
	iv_ruleUiMobileHorizontalLayoutAssigment=ruleUiMobileHorizontalLayoutAssigment
	{ $current=$iv_ruleUiMobileHorizontalLayoutAssigment.current; }
	EOF;

// Rule UiMobileHorizontalLayoutAssigment
ruleUiMobileHorizontalLayoutAssigment returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getUiMobileHorizontalLayoutAssigmentAccess().getElementUiMobileEmbeddableParserRuleCall_0_0());
				}
				lv_element_0_0=ruleUiMobileEmbeddable
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiMobileHorizontalLayoutAssigmentRule());
					}
					set(
						$current,
						"element",
						lv_element_0_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileEmbeddable");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_1='align'
			{
				newLeafNode(otherlv_1, grammarAccess.getUiMobileHorizontalLayoutAssigmentAccess().getAlignKeyword_1_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getUiMobileHorizontalLayoutAssigmentAccess().getAlignmentUiAlignmentEnumRuleCall_1_1_0());
					}
					lv_alignment_2_0=ruleUiAlignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiMobileHorizontalLayoutAssigmentRule());
						}
						set(
							$current,
							"alignment",
							lv_alignment_2_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiAlignment");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
	)
;

// Entry rule entryRuleUiMobileHorizontalButtonGroup
entryRuleUiMobileHorizontalButtonGroup returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiMobileHorizontalButtonGroupRule()); }
	iv_ruleUiMobileHorizontalButtonGroup=ruleUiMobileHorizontalButtonGroup
	{ $current=$iv_ruleUiMobileHorizontalButtonGroup.current; }
	EOF;

// Rule UiMobileHorizontalButtonGroup
ruleUiMobileHorizontalButtonGroup returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUiHorizontalButtonGroupAction_0(),
					$current);
			}
		)
		otherlv_1='horizontalButtonGroup'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiMobileHorizontalButtonGroupAccess().getHorizontalButtonGroupKeyword_1());
		}
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getUiMobileHorizontalButtonGroupAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1(), 0);
						}
									({true}?=>((
										{
											newCompositeNode(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
										}
										lv_i18nInfo_4_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiMobileHorizontalButtonGroupRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_4_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1(), 1);
						}
									({true}?=>(otherlv_5='styles'
									{
										newLeafNode(otherlv_5, grammarAccess.getUiMobileHorizontalButtonGroupAccess().getStylesKeyword_2_1_1_0());
									}
									(
										(
											lv_styles_6_0=RULE_STRING
											{
												newLeafNode(lv_styles_6_0, grammarAccess.getUiMobileHorizontalButtonGroupAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiMobileHorizontalButtonGroupRule());
												}
												setWithLastConsumed(
													$current,
													"styles",
													lv_styles_6_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1(), 2)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1(), 2);
						}
									({true}?=>((
										lv_readonly_7_0='readonly'
										{
											newLeafNode(lv_readonly_7_0, grammarAccess.getUiMobileHorizontalButtonGroupAccess().getReadonlyReadonlyKeyword_2_1_2_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiMobileHorizontalButtonGroupRule());
											}
											setWithLastConsumed($current, "readonly", true, "readonly");
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getUnorderedGroup_2_1());
					}
			)
			otherlv_8=')'
			{
				newLeafNode(otherlv_8, grammarAccess.getUiMobileHorizontalButtonGroupAccess().getRightParenthesisKeyword_2_2());
			}
		)?
		(
			(
				lv_name_9_0=RULE_ID
				{
					newLeafNode(lv_name_9_0, grammarAccess.getUiMobileHorizontalButtonGroupAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiMobileHorizontalButtonGroupRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_9_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		otherlv_10='{'
		{
			newLeafNode(otherlv_10, grammarAccess.getUiMobileHorizontalButtonGroupAccess().getLeftCurlyBracketKeyword_4());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getContentsUiMobileHorizontalButtonGroupAssigmentParserRuleCall_5_0());
				}
				lv_contents_11_0=ruleUiMobileHorizontalButtonGroupAssigment
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiMobileHorizontalButtonGroupRule());
					}
					add(
						$current,
						"contents",
						lv_contents_11_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileHorizontalButtonGroupAssigment");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			(
				{
					newCompositeNode(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getBindingsUiBindingParserRuleCall_6_0());
				}
				lv_bindings_12_0=ruleUiBinding
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiMobileHorizontalButtonGroupRule());
					}
					add(
						$current,
						"bindings",
						lv_bindings_12_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			(
				{
					newCompositeNode(grammarAccess.getUiMobileHorizontalButtonGroupAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0());
				}
				lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiMobileHorizontalButtonGroupRule());
					}
					add(
						$current,
						"processorAssignments",
						lv_processorAssignments_13_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		otherlv_14='}'
		{
			newLeafNode(otherlv_14, grammarAccess.getUiMobileHorizontalButtonGroupAccess().getRightCurlyBracketKeyword_8());
		}
	)
;

// Entry rule entryRuleUiMobileHorizontalButtonGroupAssigment
entryRuleUiMobileHorizontalButtonGroupAssigment returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiMobileHorizontalButtonGroupAssigmentRule()); }
	iv_ruleUiMobileHorizontalButtonGroupAssigment=ruleUiMobileHorizontalButtonGroupAssigment
	{ $current=$iv_ruleUiMobileHorizontalButtonGroupAssigment.current; }
	EOF;

// Rule UiMobileHorizontalButtonGroupAssigment
ruleUiMobileHorizontalButtonGroupAssigment returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				newCompositeNode(grammarAccess.getUiMobileHorizontalButtonGroupAssigmentAccess().getElementUiMobileEmbeddableParserRuleCall_0());
			}
			lv_element_0_0=ruleUiMobileEmbeddable
			{
				if ($current==null) {
					$current = createModelElementForParent(grammarAccess.getUiMobileHorizontalButtonGroupAssigmentRule());
				}
				set(
					$current,
					"element",
					lv_element_0_0,
					"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileEmbeddable");
				afterParserOrEnumRuleCall();
			}
		)
	)
;

// Entry rule entryRuleUiMobileVerticalComponentGroup
entryRuleUiMobileVerticalComponentGroup returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiMobileVerticalComponentGroupRule()); }
	iv_ruleUiMobileVerticalComponentGroup=ruleUiMobileVerticalComponentGroup
	{ $current=$iv_ruleUiMobileVerticalComponentGroup.current; }
	EOF;

// Rule UiMobileVerticalComponentGroup
ruleUiMobileVerticalComponentGroup returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiMobileVerticalComponentGroupAccess().getUiVerticalComponentGroupAction_0(),
					$current);
			}
		)
		otherlv_1='verticalGroup'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiMobileVerticalComponentGroupAccess().getVerticalGroupKeyword_1());
		}
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getUiMobileVerticalComponentGroupAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1(), 0);
						}
									({true}?=>((
										{
											newCompositeNode(grammarAccess.getUiMobileVerticalComponentGroupAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
										}
										lv_i18nInfo_4_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiMobileVerticalComponentGroupRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_4_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1(), 1);
						}
									({true}?=>((
										lv_readonly_5_0='readonly'
										{
											newLeafNode(lv_readonly_5_0, grammarAccess.getUiMobileVerticalComponentGroupAccess().getReadonlyReadonlyKeyword_2_1_1_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiMobileVerticalComponentGroupRule());
											}
											setWithLastConsumed($current, "readonly", true, "readonly");
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1(), 2)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1(), 2);
						}
									({true}?=>(otherlv_6='styles'
									{
										newLeafNode(otherlv_6, grammarAccess.getUiMobileVerticalComponentGroupAccess().getStylesKeyword_2_1_2_0());
									}
									(
										(
											lv_styles_7_0=RULE_STRING
											{
												newLeafNode(lv_styles_7_0, grammarAccess.getUiMobileVerticalComponentGroupAccess().getStylesSTRINGTerminalRuleCall_2_1_2_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiMobileVerticalComponentGroupRule());
												}
												setWithLastConsumed(
													$current,
													"styles",
													lv_styles_7_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiMobileVerticalComponentGroupAccess().getUnorderedGroup_2_1());
					}
			)
			otherlv_8=')'
			{
				newLeafNode(otherlv_8, grammarAccess.getUiMobileVerticalComponentGroupAccess().getRightParenthesisKeyword_2_2());
			}
		)?
		(
			(
				lv_name_9_0=RULE_ID
				{
					newLeafNode(lv_name_9_0, grammarAccess.getUiMobileVerticalComponentGroupAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiMobileVerticalComponentGroupRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_9_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		otherlv_10='{'
		{
			newLeafNode(otherlv_10, grammarAccess.getUiMobileVerticalComponentGroupAccess().getLeftCurlyBracketKeyword_4());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getUiMobileVerticalComponentGroupAccess().getContentsUiMobileVerticalComponentGroupAssigmentParserRuleCall_5_0());
				}
				lv_contents_11_0=ruleUiMobileVerticalComponentGroupAssigment
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiMobileVerticalComponentGroupRule());
					}
					add(
						$current,
						"contents",
						lv_contents_11_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileVerticalComponentGroupAssigment");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			(
				{
					newCompositeNode(grammarAccess.getUiMobileVerticalComponentGroupAccess().getBindingsUiBindingParserRuleCall_6_0());
				}
				lv_bindings_12_0=ruleUiBinding
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiMobileVerticalComponentGroupRule());
					}
					add(
						$current,
						"bindings",
						lv_bindings_12_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			(
				{
					newCompositeNode(grammarAccess.getUiMobileVerticalComponentGroupAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0());
				}
				lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiMobileVerticalComponentGroupRule());
					}
					add(
						$current,
						"processorAssignments",
						lv_processorAssignments_13_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		otherlv_14='}'
		{
			newLeafNode(otherlv_14, grammarAccess.getUiMobileVerticalComponentGroupAccess().getRightCurlyBracketKeyword_8());
		}
	)
;

// Entry rule entryRuleUiMobileVerticalComponentGroupAssigment
entryRuleUiMobileVerticalComponentGroupAssigment returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiMobileVerticalComponentGroupAssigmentRule()); }
	iv_ruleUiMobileVerticalComponentGroupAssigment=ruleUiMobileVerticalComponentGroupAssigment
	{ $current=$iv_ruleUiMobileVerticalComponentGroupAssigment.current; }
	EOF;

// Rule UiMobileVerticalComponentGroupAssigment
ruleUiMobileVerticalComponentGroupAssigment returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				newCompositeNode(grammarAccess.getUiMobileVerticalComponentGroupAssigmentAccess().getElementUiMobileEmbeddableParserRuleCall_0());
			}
			lv_element_0_0=ruleUiMobileEmbeddable
			{
				if ($current==null) {
					$current = createModelElementForParent(grammarAccess.getUiMobileVerticalComponentGroupAssigmentRule());
				}
				set(
					$current,
					"element",
					lv_element_0_0,
					"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileEmbeddable");
				afterParserOrEnumRuleCall();
			}
		)
	)
;

// Entry rule entryRuleUiSearchPanel
entryRuleUiSearchPanel returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiSearchPanelRule()); }
	iv_ruleUiSearchPanel=ruleUiSearchPanel
	{ $current=$iv_ruleUiSearchPanel.current; }
	EOF;

// Rule UiSearchPanel
ruleUiSearchPanel returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiSearchPanelAccess().getUiSearchPanelAction_0(),
					$current);
			}
		)
		otherlv_1='searchPanel'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiSearchPanelAccess().getSearchPanelKeyword_1());
		}
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getUiSearchPanelAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiSearchPanelAccess().getUnorderedGroup_2_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSearchPanelAccess().getUnorderedGroup_2_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiSearchPanelAccess().getUnorderedGroup_2_1(), 0);
						}
									({true}?=>((
										{
											newCompositeNode(grammarAccess.getUiSearchPanelAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
										}
										lv_i18nInfo_4_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiSearchPanelRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_4_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSearchPanelAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSearchPanelAccess().getUnorderedGroup_2_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiSearchPanelAccess().getUnorderedGroup_2_1(), 1);
						}
									({true}?=>(otherlv_5='styles'
									{
										newLeafNode(otherlv_5, grammarAccess.getUiSearchPanelAccess().getStylesKeyword_2_1_1_0());
									}
									(
										(
											lv_styles_6_0=RULE_STRING
											{
												newLeafNode(lv_styles_6_0, grammarAccess.getUiSearchPanelAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiSearchPanelRule());
												}
												setWithLastConsumed(
													$current,
													"styles",
													lv_styles_6_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSearchPanelAccess().getUnorderedGroup_2_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiSearchPanelAccess().getUnorderedGroup_2_1());
					}
			)
			otherlv_7=')'
			{
				newLeafNode(otherlv_7, grammarAccess.getUiSearchPanelAccess().getRightParenthesisKeyword_2_2());
			}
		)?
		(
			(
				lv_name_8_0=RULE_ID
				{
					newLeafNode(lv_name_8_0, grammarAccess.getUiSearchPanelAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiSearchPanelRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_8_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		otherlv_9='{'
		{
			newLeafNode(otherlv_9, grammarAccess.getUiSearchPanelAccess().getLeftCurlyBracketKeyword_4());
		}
		otherlv_10='type'
		{
			newLeafNode(otherlv_10, grammarAccess.getUiSearchPanelAccess().getTypeKeyword_5());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getUiSearchPanelAccess().getJvmTypeJvmTypeReferenceParserRuleCall_6_0());
				}
				lv_jvmType_11_0=ruleJvmTypeReference
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiSearchPanelRule());
					}
					set(
						$current,
						"jvmType",
						lv_jvmType_11_0,
						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_12=';'
			{
				newLeafNode(otherlv_12, grammarAccess.getUiSearchPanelAccess().getSemicolonKeyword_7());
			}
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getUiSearchPanelAccess().getContentsUiSearchFieldParserRuleCall_8_0());
				}
				lv_contents_13_0=ruleUiSearchField
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiSearchPanelRule());
					}
					add(
						$current,
						"contents",
						lv_contents_13_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiSearchField");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			(
				{
					newCompositeNode(grammarAccess.getUiSearchPanelAccess().getBindingsUiBindingParserRuleCall_9_0());
				}
				lv_bindings_14_0=ruleUiBinding
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiSearchPanelRule());
					}
					add(
						$current,
						"bindings",
						lv_bindings_14_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			(
				{
					newCompositeNode(grammarAccess.getUiSearchPanelAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_10_0());
				}
				lv_processorAssignments_15_0=ruleUiVisibilityProcessorAssignment
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiSearchPanelRule());
					}
					add(
						$current,
						"processorAssignments",
						lv_processorAssignments_15_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		otherlv_16='}'
		{
			newLeafNode(otherlv_16, grammarAccess.getUiSearchPanelAccess().getRightCurlyBracketKeyword_11());
		}
	)
;

// Entry rule entryRuleUiMobileSearchPanel
entryRuleUiMobileSearchPanel returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiMobileSearchPanelRule()); }
	iv_ruleUiMobileSearchPanel=ruleUiMobileSearchPanel
	{ $current=$iv_ruleUiMobileSearchPanel.current; }
	EOF;

// Rule UiMobileSearchPanel
ruleUiMobileSearchPanel returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiMobileSearchPanelAccess().getUiMobileSearchPanelAction_0(),
					$current);
			}
		)
		otherlv_1='mobileSearchPanel'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiMobileSearchPanelAccess().getMobileSearchPanelKeyword_1());
		}
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getUiMobileSearchPanelAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiMobileSearchPanelAccess().getUnorderedGroup_2_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileSearchPanelAccess().getUnorderedGroup_2_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiMobileSearchPanelAccess().getUnorderedGroup_2_1(), 0);
						}
									({true}?=>((
										{
											newCompositeNode(grammarAccess.getUiMobileSearchPanelAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
										}
										lv_i18nInfo_4_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiMobileSearchPanelRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_4_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileSearchPanelAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileSearchPanelAccess().getUnorderedGroup_2_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiMobileSearchPanelAccess().getUnorderedGroup_2_1(), 1);
						}
									({true}?=>(otherlv_5='styles'
									{
										newLeafNode(otherlv_5, grammarAccess.getUiMobileSearchPanelAccess().getStylesKeyword_2_1_1_0());
									}
									(
										(
											lv_styles_6_0=RULE_STRING
											{
												newLeafNode(lv_styles_6_0, grammarAccess.getUiMobileSearchPanelAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiMobileSearchPanelRule());
												}
												setWithLastConsumed(
													$current,
													"styles",
													lv_styles_6_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileSearchPanelAccess().getUnorderedGroup_2_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiMobileSearchPanelAccess().getUnorderedGroup_2_1());
					}
			)
			otherlv_7=')'
			{
				newLeafNode(otherlv_7, grammarAccess.getUiMobileSearchPanelAccess().getRightParenthesisKeyword_2_2());
			}
		)?
		(
			(
				lv_name_8_0=RULE_ID
				{
					newLeafNode(lv_name_8_0, grammarAccess.getUiMobileSearchPanelAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiMobileSearchPanelRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_8_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		otherlv_9='{'
		{
			newLeafNode(otherlv_9, grammarAccess.getUiMobileSearchPanelAccess().getLeftCurlyBracketKeyword_4());
		}
		otherlv_10='type'
		{
			newLeafNode(otherlv_10, grammarAccess.getUiMobileSearchPanelAccess().getTypeKeyword_5());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getUiMobileSearchPanelAccess().getJvmTypeJvmTypeReferenceParserRuleCall_6_0());
				}
				lv_jvmType_11_0=ruleJvmTypeReference
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiMobileSearchPanelRule());
					}
					set(
						$current,
						"jvmType",
						lv_jvmType_11_0,
						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_12=';'
			{
				newLeafNode(otherlv_12, grammarAccess.getUiMobileSearchPanelAccess().getSemicolonKeyword_7());
			}
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getUiMobileSearchPanelAccess().getContentsUiSearchFieldParserRuleCall_8_0());
				}
				lv_contents_13_0=ruleUiSearchField
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiMobileSearchPanelRule());
					}
					add(
						$current,
						"contents",
						lv_contents_13_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiSearchField");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			(
				{
					newCompositeNode(grammarAccess.getUiMobileSearchPanelAccess().getBindingsUiBindingParserRuleCall_9_0());
				}
				lv_bindings_14_0=ruleUiBinding
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiMobileSearchPanelRule());
					}
					add(
						$current,
						"bindings",
						lv_bindings_14_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			(
				{
					newCompositeNode(grammarAccess.getUiMobileSearchPanelAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_10_0());
				}
				lv_processorAssignments_15_0=ruleUiVisibilityProcessorAssignment
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiMobileSearchPanelRule());
					}
					add(
						$current,
						"processorAssignments",
						lv_processorAssignments_15_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		otherlv_16='}'
		{
			newLeafNode(otherlv_16, grammarAccess.getUiMobileSearchPanelAccess().getRightCurlyBracketKeyword_11());
		}
	)
;

// Entry rule entryRuleUiMobileTabSheet
entryRuleUiMobileTabSheet returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiMobileTabSheetRule()); }
	iv_ruleUiMobileTabSheet=ruleUiMobileTabSheet
	{ $current=$iv_ruleUiMobileTabSheet.current; }
	EOF;

// Rule UiMobileTabSheet
ruleUiMobileTabSheet returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiMobileTabSheetAccess().getUiMobileTabSheetAction_0(),
					$current);
			}
		)
		otherlv_1='mobileTab'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiMobileTabSheetAccess().getMobileTabKeyword_1());
		}
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getUiMobileTabSheetAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiMobileTabSheetAccess().getUnorderedGroup_2_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileTabSheetAccess().getUnorderedGroup_2_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiMobileTabSheetAccess().getUnorderedGroup_2_1(), 0);
						}
									({true}?=>((
										{
											newCompositeNode(grammarAccess.getUiMobileTabSheetAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
										}
										lv_i18nInfo_4_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiMobileTabSheetRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_4_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileTabSheetAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileTabSheetAccess().getUnorderedGroup_2_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiMobileTabSheetAccess().getUnorderedGroup_2_1(), 1);
						}
									({true}?=>(otherlv_5='styles'
									{
										newLeafNode(otherlv_5, grammarAccess.getUiMobileTabSheetAccess().getStylesKeyword_2_1_1_0());
									}
									(
										(
											lv_styles_6_0=RULE_STRING
											{
												newLeafNode(lv_styles_6_0, grammarAccess.getUiMobileTabSheetAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiMobileTabSheetRule());
												}
												setWithLastConsumed(
													$current,
													"styles",
													lv_styles_6_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileTabSheetAccess().getUnorderedGroup_2_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiMobileTabSheetAccess().getUnorderedGroup_2_1());
					}
			)
			otherlv_7=')'
			{
				newLeafNode(otherlv_7, grammarAccess.getUiMobileTabSheetAccess().getRightParenthesisKeyword_2_2());
			}
		)?
		(
			(
				lv_name_8_0=RULE_ID
				{
					newLeafNode(lv_name_8_0, grammarAccess.getUiMobileTabSheetAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiMobileTabSheetRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_8_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		otherlv_9='{'
		{
			newLeafNode(otherlv_9, grammarAccess.getUiMobileTabSheetAccess().getLeftCurlyBracketKeyword_4());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getUiMobileTabSheetAccess().getTabsUiMobileTabAssignmentParserRuleCall_5_0());
				}
				lv_tabs_10_0=ruleUiMobileTabAssignment
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiMobileTabSheetRule());
					}
					add(
						$current,
						"tabs",
						lv_tabs_10_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileTabAssignment");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			(
				{
					newCompositeNode(grammarAccess.getUiMobileTabSheetAccess().getBindingsUiBindingParserRuleCall_6_0());
				}
				lv_bindings_11_0=ruleUiBinding
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiMobileTabSheetRule());
					}
					add(
						$current,
						"bindings",
						lv_bindings_11_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			(
				{
					newCompositeNode(grammarAccess.getUiMobileTabSheetAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0());
				}
				lv_processorAssignments_12_0=ruleUiVisibilityProcessorAssignment
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiMobileTabSheetRule());
					}
					add(
						$current,
						"processorAssignments",
						lv_processorAssignments_12_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		otherlv_13='}'
		{
			newLeafNode(otherlv_13, grammarAccess.getUiMobileTabSheetAccess().getRightCurlyBracketKeyword_8());
		}
	)
;

// Entry rule entryRuleUiMobileTabAssignment
entryRuleUiMobileTabAssignment returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiMobileTabAssignmentRule()); }
	iv_ruleUiMobileTabAssignment=ruleUiMobileTabAssignment
	{ $current=$iv_ruleUiMobileTabAssignment.current; }
	EOF;

// Rule UiMobileTabAssignment
ruleUiMobileTabAssignment returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='tab'
		{
			newLeafNode(otherlv_0, grammarAccess.getUiMobileTabAssignmentAccess().getTabKeyword_0());
		}
		(
			(
				lv_name_1_0=RULE_ID
				{
					newLeafNode(lv_name_1_0, grammarAccess.getUiMobileTabAssignmentAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiMobileTabAssignmentRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getUiMobileTabAssignmentAccess().getElementUiMobileEmbeddableParserRuleCall_2_0());
				}
				lv_element_2_0=ruleUiMobileEmbeddable
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiMobileTabAssignmentRule());
					}
					set(
						$current,
						"element",
						lv_element_2_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileEmbeddable");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleUiTabSheet
entryRuleUiTabSheet returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiTabSheetRule()); }
	iv_ruleUiTabSheet=ruleUiTabSheet
	{ $current=$iv_ruleUiTabSheet.current; }
	EOF;

// Rule UiTabSheet
ruleUiTabSheet returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiTabSheetAccess().getUiTabSheetAction_0(),
					$current);
			}
		)
		otherlv_1='tabsheet'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiTabSheetAccess().getTabsheetKeyword_1());
		}
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getUiTabSheetAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiTabSheetAccess().getUnorderedGroup_2_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTabSheetAccess().getUnorderedGroup_2_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiTabSheetAccess().getUnorderedGroup_2_1(), 0);
						}
									({true}?=>((
										{
											newCompositeNode(grammarAccess.getUiTabSheetAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
										}
										lv_i18nInfo_4_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiTabSheetRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_4_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTabSheetAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTabSheetAccess().getUnorderedGroup_2_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiTabSheetAccess().getUnorderedGroup_2_1(), 1);
						}
									({true}?=>(otherlv_5='styles'
									{
										newLeafNode(otherlv_5, grammarAccess.getUiTabSheetAccess().getStylesKeyword_2_1_1_0());
									}
									(
										(
											lv_styles_6_0=RULE_STRING
											{
												newLeafNode(lv_styles_6_0, grammarAccess.getUiTabSheetAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiTabSheetRule());
												}
												setWithLastConsumed(
													$current,
													"styles",
													lv_styles_6_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTabSheetAccess().getUnorderedGroup_2_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiTabSheetAccess().getUnorderedGroup_2_1());
					}
			)
			otherlv_7=')'
			{
				newLeafNode(otherlv_7, grammarAccess.getUiTabSheetAccess().getRightParenthesisKeyword_2_2());
			}
		)?
		(
			(
				lv_name_8_0=RULE_ID
				{
					newLeafNode(lv_name_8_0, grammarAccess.getUiTabSheetAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiTabSheetRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_8_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		otherlv_9='{'
		{
			newLeafNode(otherlv_9, grammarAccess.getUiTabSheetAccess().getLeftCurlyBracketKeyword_4());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getUiTabSheetAccess().getTabsUiTabAssignmentParserRuleCall_5_0());
				}
				lv_tabs_10_0=ruleUiTabAssignment
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiTabSheetRule());
					}
					add(
						$current,
						"tabs",
						lv_tabs_10_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiTabAssignment");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			(
				{
					newCompositeNode(grammarAccess.getUiTabSheetAccess().getBindingsUiBindingParserRuleCall_6_0());
				}
				lv_bindings_11_0=ruleUiBinding
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiTabSheetRule());
					}
					add(
						$current,
						"bindings",
						lv_bindings_11_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			(
				{
					newCompositeNode(grammarAccess.getUiTabSheetAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0());
				}
				lv_processorAssignments_12_0=ruleUiVisibilityProcessorAssignment
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiTabSheetRule());
					}
					add(
						$current,
						"processorAssignments",
						lv_processorAssignments_12_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		otherlv_13='}'
		{
			newLeafNode(otherlv_13, grammarAccess.getUiTabSheetAccess().getRightCurlyBracketKeyword_8());
		}
	)
;

// Entry rule entryRuleUiTabAssignment
entryRuleUiTabAssignment returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiTabAssignmentRule()); }
	iv_ruleUiTabAssignment=ruleUiTabAssignment
	{ $current=$iv_ruleUiTabAssignment.current; }
	EOF;

// Rule UiTabAssignment
ruleUiTabAssignment returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='tab'
		{
			newLeafNode(otherlv_0, grammarAccess.getUiTabAssignmentAccess().getTabKeyword_0());
		}
		(
			(
				lv_name_1_0=RULE_ID
				{
					newLeafNode(lv_name_1_0, grammarAccess.getUiTabAssignmentAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiTabAssignmentRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getUiTabAssignmentAccess().getElementUiEmbeddableParserRuleCall_2_0());
				}
				lv_element_2_0=ruleUiEmbeddable
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiTabAssignmentRule());
					}
					set(
						$current,
						"element",
						lv_element_2_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiEmbeddable");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleUiSplitpanel
entryRuleUiSplitpanel returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiSplitpanelRule()); }
	iv_ruleUiSplitpanel=ruleUiSplitpanel
	{ $current=$iv_ruleUiSplitpanel.current; }
	EOF;

// Rule UiSplitpanel
ruleUiSplitpanel returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='splitter'
		{
			newLeafNode(otherlv_0, grammarAccess.getUiSplitpanelAccess().getSplitterKeyword_0());
		}
		(
			(
				{ 
				  getUnorderedGroupHelper().enter(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1());
				}
				(
					(
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1(), 0)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1(), 0);
					}
								({true}?=>(otherlv_2='('
								{
									newLeafNode(otherlv_2, grammarAccess.getUiSplitpanelAccess().getLeftParenthesisKeyword_1_0_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getUiSplitpanelAccess().getI18nInfoUiI18nInfoParserRuleCall_1_0_1_0());
										}
										lv_i18nInfo_3_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiSplitpanelRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_3_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
								)?
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1(), 1)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1(), 1);
					}
								({true}?=>((
									otherlv_4='styles'
									{
										newLeafNode(otherlv_4, grammarAccess.getUiSplitpanelAccess().getStylesKeyword_1_1_0_0());
									}
									(
										(
											lv_styles_5_0=RULE_STRING
											{
												newLeafNode(lv_styles_5_0, grammarAccess.getUiSplitpanelAccess().getStylesSTRINGTerminalRuleCall_1_1_0_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiSplitpanelRule());
												}
												setWithLastConsumed(
													$current,
													"styles",
													lv_styles_5_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
								)?
								otherlv_6=')'
								{
									newLeafNode(otherlv_6, grammarAccess.getUiSplitpanelAccess().getRightParenthesisKeyword_1_1_1());
								}
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1());
					}
				)
			)
					)+
					{getUnorderedGroupHelper().canLeave(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1())}?
				)
			)
				{ 
				  getUnorderedGroupHelper().leave(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_1());
				}
		)?
		(
			(
				lv_name_7_0=RULE_ID
				{
					newLeafNode(lv_name_7_0, grammarAccess.getUiSplitpanelAccess().getNameIDTerminalRuleCall_2_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiSplitpanelRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_7_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
		otherlv_8='{'
		{
			newLeafNode(otherlv_8, grammarAccess.getUiSplitpanelAccess().getLeftCurlyBracketKeyword_3());
		}
		(
			(
				{ 
				  getUnorderedGroupHelper().enter(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4());
				}
				(
					(
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), 0)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), 0);
					}
								({true}?=>(otherlv_10='first'
								{
									newLeafNode(otherlv_10, grammarAccess.getUiSplitpanelAccess().getFirstKeyword_4_0_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getUiSplitpanelAccess().getFirstContentUiSplitpanelAssigmentParserRuleCall_4_0_1_0());
										}
										lv_firstContent_11_0=ruleUiSplitpanelAssigment
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiSplitpanelRule());
											}
											set(
												$current,
												"firstContent",
												lv_firstContent_11_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiSplitpanelAssigment");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), 1)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), 1);
					}
								({true}?=>(otherlv_12='second'
								{
									newLeafNode(otherlv_12, grammarAccess.getUiSplitpanelAccess().getSecondKeyword_4_1_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getUiSplitpanelAccess().getSecondContentUiSplitpanelAssigmentParserRuleCall_4_1_1_0());
										}
										lv_secondContent_13_0=ruleUiSplitpanelAssigment
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiSplitpanelRule());
											}
											set(
												$current,
												"secondContent",
												lv_secondContent_13_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiSplitpanelAssigment");
											afterParserOrEnumRuleCall();
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), 2)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), 2);
					}
								({true}?=>(otherlv_14='splitPos'
								{
									newLeafNode(otherlv_14, grammarAccess.getUiSplitpanelAccess().getSplitPosKeyword_4_2_0());
								}
								(
									(
										lv_splitPosition_15_0=RULE_INT
										{
											newLeafNode(lv_splitPosition_15_0, grammarAccess.getUiSplitpanelAccess().getSplitPositionINTTerminalRuleCall_4_2_1_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiSplitpanelRule());
											}
											setWithLastConsumed(
												$current,
												"splitPosition",
												lv_splitPosition_15_0,
												"org.eclipse.xtext.xbase.Xbase.INT");
										}
									)
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4());
					}
				)
			)|
			(
				{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), 3)}?=>(
					{
						getUnorderedGroupHelper().select(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4(), 3);
					}
								({true}?=>((
									lv_readonly_16_0='readonly'
									{
										newLeafNode(lv_readonly_16_0, grammarAccess.getUiSplitpanelAccess().getReadonlyReadonlyKeyword_4_3_0());
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getUiSplitpanelRule());
										}
										setWithLastConsumed($current, "readonly", true, "readonly");
									}
								)
								))
					{ 
						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4());
					}
				)
			)
					)+
					{getUnorderedGroupHelper().canLeave(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4())}?
				)
			)
				{ 
				  getUnorderedGroupHelper().leave(grammarAccess.getUiSplitpanelAccess().getUnorderedGroup_4());
				}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getUiSplitpanelAccess().getBindingsUiBindingParserRuleCall_5_0());
				}
				lv_bindings_17_0=ruleUiBinding
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiSplitpanelRule());
					}
					add(
						$current,
						"bindings",
						lv_bindings_17_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			(
				{
					newCompositeNode(grammarAccess.getUiSplitpanelAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_6_0());
				}
				lv_processorAssignments_18_0=ruleUiVisibilityProcessorAssignment
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiSplitpanelRule());
					}
					add(
						$current,
						"processorAssignments",
						lv_processorAssignments_18_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		otherlv_19='}'
		{
			newLeafNode(otherlv_19, grammarAccess.getUiSplitpanelAccess().getRightCurlyBracketKeyword_7());
		}
	)
;

// Entry rule entryRuleUiSplitpanelAssigment
entryRuleUiSplitpanelAssigment returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiSplitpanelAssigmentRule()); }
	iv_ruleUiSplitpanelAssigment=ruleUiSplitpanelAssigment
	{ $current=$iv_ruleUiSplitpanelAssigment.current; }
	EOF;

// Rule UiSplitpanelAssigment
ruleUiSplitpanelAssigment returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				newCompositeNode(grammarAccess.getUiSplitpanelAssigmentAccess().getElementUiEmbeddableParserRuleCall_0());
			}
			lv_element_0_0=ruleUiEmbeddable
			{
				if ($current==null) {
					$current = createModelElementForParent(grammarAccess.getUiSplitpanelAssigmentRule());
				}
				set(
					$current,
					"element",
					lv_element_0_0,
					"org.eclipse.osbp.ecview.dsl.UIGrammar.UiEmbeddable");
				afterParserOrEnumRuleCall();
			}
		)
	)
;

// Entry rule entryRuleUiPanel
entryRuleUiPanel returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiPanelRule()); }
	iv_ruleUiPanel=ruleUiPanel
	{ $current=$iv_ruleUiPanel.current; }
	EOF;

// Rule UiPanel
ruleUiPanel returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='panel'
		{
			newLeafNode(otherlv_0, grammarAccess.getUiPanelAccess().getPanelKeyword_0());
		}
		(
			otherlv_1='('
			{
				newLeafNode(otherlv_1, grammarAccess.getUiPanelAccess().getLeftParenthesisKeyword_1_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1(), 0);
						}
									({true}?=>((
										{
											newCompositeNode(grammarAccess.getUiPanelAccess().getI18nInfoUiI18nInfoParserRuleCall_1_1_0_0());
										}
										lv_i18nInfo_3_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiPanelRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_3_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1(), 1);
						}
									({true}?=>((
										lv_readonly_4_0='readonly'
										{
											newLeafNode(lv_readonly_4_0, grammarAccess.getUiPanelAccess().getReadonlyReadonlyKeyword_1_1_1_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiPanelRule());
											}
											setWithLastConsumed($current, "readonly", true, "readonly");
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1(), 2)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1(), 2);
						}
									({true}?=>(otherlv_5='styles'
									{
										newLeafNode(otherlv_5, grammarAccess.getUiPanelAccess().getStylesKeyword_1_1_2_0());
									}
									(
										(
											lv_styles_6_0=RULE_STRING
											{
												newLeafNode(lv_styles_6_0, grammarAccess.getUiPanelAccess().getStylesSTRINGTerminalRuleCall_1_1_2_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiPanelRule());
												}
												setWithLastConsumed(
													$current,
													"styles",
													lv_styles_6_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiPanelAccess().getUnorderedGroup_1_1());
					}
			)
			otherlv_7=')'
			{
				newLeafNode(otherlv_7, grammarAccess.getUiPanelAccess().getRightParenthesisKeyword_1_2());
			}
		)?
		(
			(
				lv_name_8_0=RULE_ID
				{
					newLeafNode(lv_name_8_0, grammarAccess.getUiPanelAccess().getNameIDTerminalRuleCall_2_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiPanelRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_8_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
		otherlv_9='{'
		{
			newLeafNode(otherlv_9, grammarAccess.getUiPanelAccess().getLeftCurlyBracketKeyword_3());
		}
		otherlv_10='content'
		{
			newLeafNode(otherlv_10, grammarAccess.getUiPanelAccess().getContentKeyword_4());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getUiPanelAccess().getContentUiEmbeddableParserRuleCall_5_0());
				}
				lv_content_11_0=ruleUiEmbeddable
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiPanelRule());
					}
					set(
						$current,
						"content",
						lv_content_11_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiEmbeddable");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getUiPanelAccess().getBindingsUiBindingParserRuleCall_6_0());
				}
				lv_bindings_12_0=ruleUiBinding
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiPanelRule());
					}
					add(
						$current,
						"bindings",
						lv_bindings_12_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			(
				{
					newCompositeNode(grammarAccess.getUiPanelAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_7_0());
				}
				lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiPanelRule());
					}
					add(
						$current,
						"processorAssignments",
						lv_processorAssignments_13_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		otherlv_14='}'
		{
			newLeafNode(otherlv_14, grammarAccess.getUiPanelAccess().getRightCurlyBracketKeyword_8());
		}
	)
;

// Entry rule entryRuleUiDialog
entryRuleUiDialog returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiDialogRule()); }
	iv_ruleUiDialog=ruleUiDialog
	{ $current=$iv_ruleUiDialog.current; }
	EOF;

// Rule UiDialog
ruleUiDialog returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiDialogAccess().getUiDialogAction_0(),
					$current);
			}
		)
		otherlv_1='dialog'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiDialogAccess().getDialogKeyword_1());
		}
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getUiDialogAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiDialogAccess().getUnorderedGroup_2_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiDialogAccess().getUnorderedGroup_2_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiDialogAccess().getUnorderedGroup_2_1(), 0);
						}
									({true}?=>((
										{
											newCompositeNode(grammarAccess.getUiDialogAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
										}
										lv_i18nInfo_4_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiDialogRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_4_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDialogAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiDialogAccess().getUnorderedGroup_2_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiDialogAccess().getUnorderedGroup_2_1(), 1);
						}
									({true}?=>(otherlv_5='styles'
									{
										newLeafNode(otherlv_5, grammarAccess.getUiDialogAccess().getStylesKeyword_2_1_1_0());
									}
									(
										(
											lv_styles_6_0=RULE_STRING
											{
												newLeafNode(lv_styles_6_0, grammarAccess.getUiDialogAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiDialogRule());
												}
												setWithLastConsumed(
													$current,
													"styles",
													lv_styles_6_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDialogAccess().getUnorderedGroup_2_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiDialogAccess().getUnorderedGroup_2_1());
					}
			)
			otherlv_7=')'
			{
				newLeafNode(otherlv_7, grammarAccess.getUiDialogAccess().getRightParenthesisKeyword_2_2());
			}
		)?
		(
			(
				lv_name_8_0=RULE_ID
				{
					newLeafNode(lv_name_8_0, grammarAccess.getUiDialogAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiDialogRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_8_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		otherlv_9='{'
		{
			newLeafNode(otherlv_9, grammarAccess.getUiDialogAccess().getLeftCurlyBracketKeyword_4());
		}
		(
			otherlv_10='type'
			{
				newLeafNode(otherlv_10, grammarAccess.getUiDialogAccess().getTypeKeyword_5_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getUiDialogAccess().getJvmTypeJvmTypeReferenceParserRuleCall_5_1_0());
					}
					lv_jvmType_11_0=ruleJvmTypeReference
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiDialogRule());
						}
						set(
							$current,
							"jvmType",
							lv_jvmType_11_0,
							"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_12=';'
				{
					newLeafNode(otherlv_12, grammarAccess.getUiDialogAccess().getSemicolonKeyword_5_2());
				}
			)?
		)?
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getUiDialogAccess().getContentUiDialogAssignmentParserRuleCall_6_0_0());
					}
					lv_content_13_0=ruleUiDialogAssignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiDialogRule());
						}
						set(
							$current,
							"content",
							lv_content_13_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiDialogAssignment");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_14=';'
				{
					newLeafNode(otherlv_14, grammarAccess.getUiDialogAccess().getSemicolonKeyword_6_1());
				}
			)?
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getUiDialogAccess().getBindingsUiBindingParserRuleCall_7_0());
				}
				lv_bindings_15_0=ruleUiBinding
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiDialogRule());
					}
					add(
						$current,
						"bindings",
						lv_bindings_15_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			(
				{
					newCompositeNode(grammarAccess.getUiDialogAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_8_0());
				}
				lv_processorAssignments_16_0=ruleUiVisibilityProcessorAssignment
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiDialogRule());
					}
					add(
						$current,
						"processorAssignments",
						lv_processorAssignments_16_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		otherlv_17='}'
		{
			newLeafNode(otherlv_17, grammarAccess.getUiDialogAccess().getRightCurlyBracketKeyword_9());
		}
	)
;

// Entry rule entryRuleUiDialogAssignment
entryRuleUiDialogAssignment returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiDialogAssignmentRule()); }
	iv_ruleUiDialogAssignment=ruleUiDialogAssignment
	{ $current=$iv_ruleUiDialogAssignment.current; }
	EOF;

// Rule UiDialogAssignment
ruleUiDialogAssignment returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				newCompositeNode(grammarAccess.getUiDialogAssignmentAccess().getElementUiEmbeddableParserRuleCall_0());
			}
			lv_element_0_0=ruleUiEmbeddable
			{
				if ($current==null) {
					$current = createModelElementForParent(grammarAccess.getUiDialogAssignmentRule());
				}
				set(
					$current,
					"element",
					lv_element_0_0,
					"org.eclipse.osbp.ecview.dsl.UIGrammar.UiEmbeddable");
				afterParserOrEnumRuleCall();
			}
		)
	)
;

// Entry rule entryRuleUiSearchDialog
entryRuleUiSearchDialog returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiSearchDialogRule()); }
	iv_ruleUiSearchDialog=ruleUiSearchDialog
	{ $current=$iv_ruleUiSearchDialog.current; }
	EOF;

// Rule UiSearchDialog
ruleUiSearchDialog returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiSearchDialogAccess().getUiSearchDialogAction_0(),
					$current);
			}
		)
		otherlv_1='searchdialog'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiSearchDialogAccess().getSearchdialogKeyword_1());
		}
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getUiSearchDialogAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiSearchDialogAccess().getUnorderedGroup_2_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSearchDialogAccess().getUnorderedGroup_2_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiSearchDialogAccess().getUnorderedGroup_2_1(), 0);
						}
									({true}?=>((
										{
											newCompositeNode(grammarAccess.getUiSearchDialogAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
										}
										lv_i18nInfo_4_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiSearchDialogRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_4_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSearchDialogAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSearchDialogAccess().getUnorderedGroup_2_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiSearchDialogAccess().getUnorderedGroup_2_1(), 1);
						}
									({true}?=>(otherlv_5='styles'
									{
										newLeafNode(otherlv_5, grammarAccess.getUiSearchDialogAccess().getStylesKeyword_2_1_1_0());
									}
									(
										(
											lv_styles_6_0=RULE_STRING
											{
												newLeafNode(lv_styles_6_0, grammarAccess.getUiSearchDialogAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiSearchDialogRule());
												}
												setWithLastConsumed(
													$current,
													"styles",
													lv_styles_6_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSearchDialogAccess().getUnorderedGroup_2_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiSearchDialogAccess().getUnorderedGroup_2_1());
					}
			)
			otherlv_7=')'
			{
				newLeafNode(otherlv_7, grammarAccess.getUiSearchDialogAccess().getRightParenthesisKeyword_2_2());
			}
		)?
		(
			(
				lv_name_8_0=RULE_ID
				{
					newLeafNode(lv_name_8_0, grammarAccess.getUiSearchDialogAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiSearchDialogRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_8_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		otherlv_9='{'
		{
			newLeafNode(otherlv_9, grammarAccess.getUiSearchDialogAccess().getLeftCurlyBracketKeyword_4());
		}
		(
			otherlv_10='type'
			{
				newLeafNode(otherlv_10, grammarAccess.getUiSearchDialogAccess().getTypeKeyword_5_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getUiSearchDialogAccess().getJvmTypeJvmTypeReferenceParserRuleCall_5_1_0());
					}
					lv_jvmType_11_0=ruleJvmTypeReference
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiSearchDialogRule());
						}
						set(
							$current,
							"jvmType",
							lv_jvmType_11_0,
							"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
		(
			otherlv_12='search'
			{
				newLeafNode(otherlv_12, grammarAccess.getUiSearchDialogAccess().getSearchKeyword_6_0());
			}
			otherlv_13='{'
			{
				newLeafNode(otherlv_13, grammarAccess.getUiSearchDialogAccess().getLeftCurlyBracketKeyword_6_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getUiSearchDialogAccess().getSearchFieldsUiDialogSearchFieldAssignmentParserRuleCall_6_2_0());
					}
					lv_searchFields_14_0=ruleUiDialogSearchFieldAssignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiSearchDialogRule());
						}
						add(
							$current,
							"searchFields",
							lv_searchFields_14_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiDialogSearchFieldAssignment");
						afterParserOrEnumRuleCall();
					}
				)
			)*
			otherlv_15='}'
			{
				newLeafNode(otherlv_15, grammarAccess.getUiSearchDialogAccess().getRightCurlyBracketKeyword_6_3());
			}
		)?
		(
			otherlv_16='content'
			{
				newLeafNode(otherlv_16, grammarAccess.getUiSearchDialogAccess().getContentKeyword_7_0());
			}
			otherlv_17='{'
			{
				newLeafNode(otherlv_17, grammarAccess.getUiSearchDialogAccess().getLeftCurlyBracketKeyword_7_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getUiSearchDialogAccess().getContentUiDialogAssignmentParserRuleCall_7_2_0());
					}
					lv_content_18_0=ruleUiDialogAssignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiSearchDialogRule());
						}
						set(
							$current,
							"content",
							lv_content_18_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiDialogAssignment");
						afterParserOrEnumRuleCall();
					}
				)
			)
			otherlv_19='}'
			{
				newLeafNode(otherlv_19, grammarAccess.getUiSearchDialogAccess().getRightCurlyBracketKeyword_7_3());
			}
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getUiSearchDialogAccess().getBindingsUiBindingParserRuleCall_8_0());
				}
				lv_bindings_20_0=ruleUiBinding
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiSearchDialogRule());
					}
					add(
						$current,
						"bindings",
						lv_bindings_20_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			(
				{
					newCompositeNode(grammarAccess.getUiSearchDialogAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_9_0());
				}
				lv_processorAssignments_21_0=ruleUiVisibilityProcessorAssignment
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiSearchDialogRule());
					}
					add(
						$current,
						"processorAssignments",
						lv_processorAssignments_21_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		otherlv_22='}'
		{
			newLeafNode(otherlv_22, grammarAccess.getUiSearchDialogAccess().getRightCurlyBracketKeyword_10());
		}
	)
;

// Entry rule entryRuleUiDialogSearchFieldAssignment
entryRuleUiDialogSearchFieldAssignment returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiDialogSearchFieldAssignmentRule()); }
	iv_ruleUiDialogSearchFieldAssignment=ruleUiDialogSearchFieldAssignment
	{ $current=$iv_ruleUiDialogSearchFieldAssignment.current; }
	EOF;

// Rule UiDialogSearchFieldAssignment
ruleUiDialogSearchFieldAssignment returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				newCompositeNode(grammarAccess.getUiDialogSearchFieldAssignmentAccess().getElementUiSearchFieldParserRuleCall_0());
			}
			lv_element_0_0=ruleUiSearchField
			{
				if ($current==null) {
					$current = createModelElementForParent(grammarAccess.getUiDialogSearchFieldAssignmentRule());
				}
				set(
					$current,
					"element",
					lv_element_0_0,
					"org.eclipse.osbp.ecview.dsl.UIGrammar.UiSearchField");
				afterParserOrEnumRuleCall();
			}
		)
	)
;

// Entry rule entryRuleUiMobileNavigationPage
entryRuleUiMobileNavigationPage returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiMobileNavigationPageRule()); }
	iv_ruleUiMobileNavigationPage=ruleUiMobileNavigationPage
	{ $current=$iv_ruleUiMobileNavigationPage.current; }
	EOF;

// Rule UiMobileNavigationPage
ruleUiMobileNavigationPage returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiMobileNavigationPageAccess().getUiMobileNavigationPageAction_0(),
					$current);
			}
		)
		otherlv_1='navPage'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiMobileNavigationPageAccess().getNavPageKeyword_1());
		}
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getUiMobileNavigationPageAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiMobileNavigationPageAccess().getUnorderedGroup_2_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileNavigationPageAccess().getUnorderedGroup_2_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiMobileNavigationPageAccess().getUnorderedGroup_2_1(), 0);
						}
									({true}?=>((
										{
											newCompositeNode(grammarAccess.getUiMobileNavigationPageAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
										}
										lv_i18nInfo_4_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiMobileNavigationPageRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_4_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileNavigationPageAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileNavigationPageAccess().getUnorderedGroup_2_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiMobileNavigationPageAccess().getUnorderedGroup_2_1(), 1);
						}
									({true}?=>(otherlv_5='styles'
									{
										newLeafNode(otherlv_5, grammarAccess.getUiMobileNavigationPageAccess().getStylesKeyword_2_1_1_0());
									}
									(
										(
											lv_styles_6_0=RULE_STRING
											{
												newLeafNode(lv_styles_6_0, grammarAccess.getUiMobileNavigationPageAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiMobileNavigationPageRule());
												}
												setWithLastConsumed(
													$current,
													"styles",
													lv_styles_6_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileNavigationPageAccess().getUnorderedGroup_2_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiMobileNavigationPageAccess().getUnorderedGroup_2_1());
					}
			)
			otherlv_7=')'
			{
				newLeafNode(otherlv_7, grammarAccess.getUiMobileNavigationPageAccess().getRightParenthesisKeyword_2_2());
			}
		)?
		(
			(
				lv_name_8_0=RULE_ID
				{
					newLeafNode(lv_name_8_0, grammarAccess.getUiMobileNavigationPageAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiMobileNavigationPageRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_8_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		otherlv_9='{'
		{
			newLeafNode(otherlv_9, grammarAccess.getUiMobileNavigationPageAccess().getLeftCurlyBracketKeyword_4());
		}
		(
			otherlv_10='type'
			{
				newLeafNode(otherlv_10, grammarAccess.getUiMobileNavigationPageAccess().getTypeKeyword_5_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getUiMobileNavigationPageAccess().getJvmTypeJvmTypeReferenceParserRuleCall_5_1_0());
					}
					lv_jvmType_11_0=ruleJvmTypeReference
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiMobileNavigationPageRule());
						}
						set(
							$current,
							"jvmType",
							lv_jvmType_11_0,
							"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_12=';'
				{
					newLeafNode(otherlv_12, grammarAccess.getUiMobileNavigationPageAccess().getSemicolonKeyword_5_2());
				}
			)?
		)?
		(
			otherlv_13='navbarActions'
			{
				newLeafNode(otherlv_13, grammarAccess.getUiMobileNavigationPageAccess().getNavbarActionsKeyword_6_0());
			}
			otherlv_14='{'
			{
				newLeafNode(otherlv_14, grammarAccess.getUiMobileNavigationPageAccess().getLeftCurlyBracketKeyword_6_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getUiMobileNavigationPageAccess().getBarActionsUiMobileNavBarActionParserRuleCall_6_2_0());
					}
					lv_barActions_15_0=ruleUiMobileNavBarAction
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiMobileNavigationPageRule());
						}
						add(
							$current,
							"barActions",
							lv_barActions_15_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileNavBarAction");
						afterParserOrEnumRuleCall();
					}
				)
			)*
			otherlv_16='}'
			{
				newLeafNode(otherlv_16, grammarAccess.getUiMobileNavigationPageAccess().getRightCurlyBracketKeyword_6_3());
			}
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getUiMobileNavigationPageAccess().getContentsUiMobileNavigationPageAssignmentParserRuleCall_7_0());
				}
				lv_contents_17_0=ruleUiMobileNavigationPageAssignment
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiMobileNavigationPageRule());
					}
					add(
						$current,
						"contents",
						lv_contents_17_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileNavigationPageAssignment");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			(
				{
					newCompositeNode(grammarAccess.getUiMobileNavigationPageAccess().getBindingsUiBindingParserRuleCall_8_0());
				}
				lv_bindings_18_0=ruleUiBinding
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiMobileNavigationPageRule());
					}
					add(
						$current,
						"bindings",
						lv_bindings_18_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			(
				{
					newCompositeNode(grammarAccess.getUiMobileNavigationPageAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_9_0());
				}
				lv_processorAssignments_19_0=ruleUiVisibilityProcessorAssignment
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiMobileNavigationPageRule());
					}
					add(
						$current,
						"processorAssignments",
						lv_processorAssignments_19_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		otherlv_20='}'
		{
			newLeafNode(otherlv_20, grammarAccess.getUiMobileNavigationPageAccess().getRightCurlyBracketKeyword_10());
		}
	)
;

// Entry rule entryRuleUiMobileNavigationPageAssignment
entryRuleUiMobileNavigationPageAssignment returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiMobileNavigationPageAssignmentRule()); }
	iv_ruleUiMobileNavigationPageAssignment=ruleUiMobileNavigationPageAssignment
	{ $current=$iv_ruleUiMobileNavigationPageAssignment.current; }
	EOF;

// Rule UiMobileNavigationPageAssignment
ruleUiMobileNavigationPageAssignment returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getUiMobileNavigationPageAssignmentAccess().getElementUiMobileEmbeddableParserRuleCall_0_0());
				}
				lv_element_0_0=ruleUiMobileEmbeddable
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiMobileNavigationPageAssignmentRule());
					}
					set(
						$current,
						"element",
						lv_element_0_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileEmbeddable");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_1='align'
			{
				newLeafNode(otherlv_1, grammarAccess.getUiMobileNavigationPageAssignmentAccess().getAlignKeyword_1_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getUiMobileNavigationPageAssignmentAccess().getAlignmentUiAlignmentEnumRuleCall_1_1_0());
					}
					lv_alignment_2_0=ruleUiAlignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiMobileNavigationPageAssignmentRule());
						}
						set(
							$current,
							"alignment",
							lv_alignment_2_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiAlignment");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
	)
;

// Entry rule entryRuleUiTextField
entryRuleUiTextField returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiTextFieldRule()); }
	iv_ruleUiTextField=ruleUiTextField
	{ $current=$iv_ruleUiTextField.current; }
	EOF;

// Rule UiTextField
ruleUiTextField returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiTextFieldAccess().getUiTextFieldAction_0(),
					$current);
			}
		)
		otherlv_1='textfield'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiTextFieldAccess().getTextfieldKeyword_1());
		}
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getUiTextFieldAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 0);
						}
									({true}?=>(otherlv_4='maxLength='
									{
										newLeafNode(otherlv_4, grammarAccess.getUiTextFieldAccess().getMaxLengthKeyword_2_1_0_0());
									}
									(
										(
											lv_maxLength_5_0=RULE_INT
											{
												newLeafNode(lv_maxLength_5_0, grammarAccess.getUiTextFieldAccess().getMaxLengthINTTerminalRuleCall_2_1_0_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiTextFieldRule());
												}
												setWithLastConsumed(
													$current,
													"maxLength",
													lv_maxLength_5_0,
													"org.eclipse.xtext.xbase.Xbase.INT");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 1);
						}
									({true}?=>(otherlv_6='minLength='
									{
										newLeafNode(otherlv_6, grammarAccess.getUiTextFieldAccess().getMinLengthKeyword_2_1_1_0());
									}
									(
										(
											lv_minLength_7_0=RULE_INT
											{
												newLeafNode(lv_minLength_7_0, grammarAccess.getUiTextFieldAccess().getMinLengthINTTerminalRuleCall_2_1_1_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiTextFieldRule());
												}
												setWithLastConsumed(
													$current,
													"minLength",
													lv_minLength_7_0,
													"org.eclipse.xtext.xbase.Xbase.INT");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 2)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 2);
						}
									({true}?=>(otherlv_8='regex='
									{
										newLeafNode(otherlv_8, grammarAccess.getUiTextFieldAccess().getRegexKeyword_2_1_2_0());
									}
									(
										(
											lv_regex_9_0=RULE_STRING
											{
												newLeafNode(lv_regex_9_0, grammarAccess.getUiTextFieldAccess().getRegexSTRINGTerminalRuleCall_2_1_2_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiTextFieldRule());
												}
												setWithLastConsumed(
													$current,
													"regex",
													lv_regex_9_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 3)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 3);
						}
									({true}?=>(otherlv_10='styles'
									{
										newLeafNode(otherlv_10, grammarAccess.getUiTextFieldAccess().getStylesKeyword_2_1_3_0());
									}
									(
										(
											lv_styles_11_0=RULE_STRING
											{
												newLeafNode(lv_styles_11_0, grammarAccess.getUiTextFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_3_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiTextFieldRule());
												}
												setWithLastConsumed(
													$current,
													"styles",
													lv_styles_11_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 4)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 4);
						}
									({true}?=>((
										{
											newCompositeNode(grammarAccess.getUiTextFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_4_0());
										}
										lv_i18nInfo_12_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiTextFieldRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_12_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 5)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1(), 5);
						}
									({true}?=>((
										lv_readonly_13_0='readonly'
										{
											newLeafNode(lv_readonly_13_0, grammarAccess.getUiTextFieldAccess().getReadonlyReadonlyKeyword_2_1_5_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiTextFieldRule());
											}
											setWithLastConsumed($current, "readonly", true, "readonly");
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiTextFieldAccess().getUnorderedGroup_2_1());
					}
			)
			otherlv_14=')'
			{
				newLeafNode(otherlv_14, grammarAccess.getUiTextFieldAccess().getRightParenthesisKeyword_2_2());
			}
		)?
		(
			(
				lv_name_15_0=RULE_ID
				{
					newLeafNode(lv_name_15_0, grammarAccess.getUiTextFieldAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiTextFieldRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_15_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		(
			otherlv_16='{'
			{
				newLeafNode(otherlv_16, grammarAccess.getUiTextFieldAccess().getLeftCurlyBracketKeyword_4_0());
			}
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getUiTextFieldAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
						}
						lv_validators_17_0=ruleUiValidator
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiTextFieldRule());
							}
							add(
								$current,
								"validators",
								lv_validators_17_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getUiTextFieldAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
						}
						lv_bindings_18_0=ruleUiBinding
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiTextFieldRule());
							}
							add(
								$current,
								"bindings",
								lv_bindings_18_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			(
				(
					{
						newCompositeNode(grammarAccess.getUiTextFieldAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
					}
					lv_processorAssignments_19_0=ruleUiVisibilityProcessorAssignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiTextFieldRule());
						}
						add(
							$current,
							"processorAssignments",
							lv_processorAssignments_19_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
						afterParserOrEnumRuleCall();
					}
				)
			)*
			otherlv_20='}'
			{
				newLeafNode(otherlv_20, grammarAccess.getUiTextFieldAccess().getRightCurlyBracketKeyword_4_3());
			}
		)?
	)
;

// Entry rule entryRuleUiPasswordField
entryRuleUiPasswordField returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiPasswordFieldRule()); }
	iv_ruleUiPasswordField=ruleUiPasswordField
	{ $current=$iv_ruleUiPasswordField.current; }
	EOF;

// Rule UiPasswordField
ruleUiPasswordField returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiPasswordFieldAccess().getUiPasswordFieldAction_0(),
					$current);
			}
		)
		otherlv_1='passwordField'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiPasswordFieldAccess().getPasswordFieldKeyword_1());
		}
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getUiPasswordFieldAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1(), 0);
						}
									({true}?=>(otherlv_4='styles'
									{
										newLeafNode(otherlv_4, grammarAccess.getUiPasswordFieldAccess().getStylesKeyword_2_1_0_0());
									}
									(
										(
											lv_styles_5_0=RULE_STRING
											{
												newLeafNode(lv_styles_5_0, grammarAccess.getUiPasswordFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_0_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiPasswordFieldRule());
												}
												setWithLastConsumed(
													$current,
													"styles",
													lv_styles_5_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1(), 1);
						}
									({true}?=>((
										{
											newCompositeNode(grammarAccess.getUiPasswordFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_1_0());
										}
										lv_i18nInfo_6_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiPasswordFieldRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_6_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1(), 2)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1(), 2);
						}
									({true}?=>((
										lv_readonly_7_0='readonly'
										{
											newLeafNode(lv_readonly_7_0, grammarAccess.getUiPasswordFieldAccess().getReadonlyReadonlyKeyword_2_1_2_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiPasswordFieldRule());
											}
											setWithLastConsumed($current, "readonly", true, "readonly");
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiPasswordFieldAccess().getUnorderedGroup_2_1());
					}
			)
			otherlv_8=')'
			{
				newLeafNode(otherlv_8, grammarAccess.getUiPasswordFieldAccess().getRightParenthesisKeyword_2_2());
			}
		)?
		(
			(
				lv_name_9_0=RULE_ID
				{
					newLeafNode(lv_name_9_0, grammarAccess.getUiPasswordFieldAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiPasswordFieldRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_9_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		(
			otherlv_10='{'
			{
				newLeafNode(otherlv_10, grammarAccess.getUiPasswordFieldAccess().getLeftCurlyBracketKeyword_4_0());
			}
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getUiPasswordFieldAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
						}
						lv_validators_11_0=ruleUiValidator
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiPasswordFieldRule());
							}
							add(
								$current,
								"validators",
								lv_validators_11_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getUiPasswordFieldAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
						}
						lv_bindings_12_0=ruleUiBinding
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiPasswordFieldRule());
							}
							add(
								$current,
								"bindings",
								lv_bindings_12_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			(
				(
					{
						newCompositeNode(grammarAccess.getUiPasswordFieldAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
					}
					lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiPasswordFieldRule());
						}
						add(
							$current,
							"processorAssignments",
							lv_processorAssignments_13_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
						afterParserOrEnumRuleCall();
					}
				)
			)*
			otherlv_14='}'
			{
				newLeafNode(otherlv_14, grammarAccess.getUiPasswordFieldAccess().getRightCurlyBracketKeyword_4_3());
			}
		)?
	)
;

// Entry rule entryRuleUiMaskedTextField
entryRuleUiMaskedTextField returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiMaskedTextFieldRule()); }
	iv_ruleUiMaskedTextField=ruleUiMaskedTextField
	{ $current=$iv_ruleUiMaskedTextField.current; }
	EOF;

// Rule UiMaskedTextField
ruleUiMaskedTextField returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiMaskedTextFieldAccess().getUiMaskedTextFieldAction_0(),
					$current);
			}
		)
		otherlv_1='maskedText'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiMaskedTextFieldAccess().getMaskedTextKeyword_1());
		}
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getUiMaskedTextFieldAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 0);
						}
									({true}?=>(otherlv_4='styles'
									{
										newLeafNode(otherlv_4, grammarAccess.getUiMaskedTextFieldAccess().getStylesKeyword_2_1_0_0());
									}
									(
										(
											lv_styles_5_0=RULE_STRING
											{
												newLeafNode(lv_styles_5_0, grammarAccess.getUiMaskedTextFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_0_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiMaskedTextFieldRule());
												}
												setWithLastConsumed(
													$current,
													"styles",
													lv_styles_5_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 1);
						}
									({true}?=>(otherlv_6='mask='
									{
										newLeafNode(otherlv_6, grammarAccess.getUiMaskedTextFieldAccess().getMaskKeyword_2_1_1_0());
									}
									(
										(
											lv_mask_7_0=RULE_STRING
											{
												newLeafNode(lv_mask_7_0, grammarAccess.getUiMaskedTextFieldAccess().getMaskSTRINGTerminalRuleCall_2_1_1_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiMaskedTextFieldRule());
												}
												setWithLastConsumed(
													$current,
													"mask",
													lv_mask_7_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 2)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 2);
						}
									({true}?=>((
										{
											newCompositeNode(grammarAccess.getUiMaskedTextFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_2_0());
										}
										lv_i18nInfo_8_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiMaskedTextFieldRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_8_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 3)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1(), 3);
						}
									({true}?=>((
										lv_readonly_9_0='readonly'
										{
											newLeafNode(lv_readonly_9_0, grammarAccess.getUiMaskedTextFieldAccess().getReadonlyReadonlyKeyword_2_1_3_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiMaskedTextFieldRule());
											}
											setWithLastConsumed($current, "readonly", true, "readonly");
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiMaskedTextFieldAccess().getUnorderedGroup_2_1());
					}
			)
			otherlv_10=')'
			{
				newLeafNode(otherlv_10, grammarAccess.getUiMaskedTextFieldAccess().getRightParenthesisKeyword_2_2());
			}
		)?
		(
			(
				lv_name_11_0=RULE_ID
				{
					newLeafNode(lv_name_11_0, grammarAccess.getUiMaskedTextFieldAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiMaskedTextFieldRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_11_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		(
			otherlv_12='{'
			{
				newLeafNode(otherlv_12, grammarAccess.getUiMaskedTextFieldAccess().getLeftCurlyBracketKeyword_4_0());
			}
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getUiMaskedTextFieldAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
						}
						lv_validators_13_0=ruleUiValidator
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiMaskedTextFieldRule());
							}
							add(
								$current,
								"validators",
								lv_validators_13_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getUiMaskedTextFieldAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
						}
						lv_bindings_14_0=ruleUiBinding
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiMaskedTextFieldRule());
							}
							add(
								$current,
								"bindings",
								lv_bindings_14_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			(
				(
					{
						newCompositeNode(grammarAccess.getUiMaskedTextFieldAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
					}
					lv_processorAssignments_15_0=ruleUiVisibilityProcessorAssignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiMaskedTextFieldRule());
						}
						add(
							$current,
							"processorAssignments",
							lv_processorAssignments_15_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
						afterParserOrEnumRuleCall();
					}
				)
			)*
			otherlv_16='}'
			{
				newLeafNode(otherlv_16, grammarAccess.getUiMaskedTextFieldAccess().getRightCurlyBracketKeyword_4_3());
			}
		)?
	)
;

// Entry rule entryRuleUiMaskedNumericField
entryRuleUiMaskedNumericField returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiMaskedNumericFieldRule()); }
	iv_ruleUiMaskedNumericField=ruleUiMaskedNumericField
	{ $current=$iv_ruleUiMaskedNumericField.current; }
	EOF;

// Rule UiMaskedNumericField
ruleUiMaskedNumericField returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiMaskedNumericFieldAccess().getUiMaskedNumericFieldAction_0(),
					$current);
			}
		)
		otherlv_1='maskedNumeric'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiMaskedNumericFieldAccess().getMaskedNumericKeyword_1());
		}
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getUiMaskedNumericFieldAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1(), 0);
						}
									({true}?=>(otherlv_4='styles'
									{
										newLeafNode(otherlv_4, grammarAccess.getUiMaskedNumericFieldAccess().getStylesKeyword_2_1_0_0());
									}
									(
										(
											lv_styles_5_0=RULE_STRING
											{
												newLeafNode(lv_styles_5_0, grammarAccess.getUiMaskedNumericFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_0_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiMaskedNumericFieldRule());
												}
												setWithLastConsumed(
													$current,
													"styles",
													lv_styles_5_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1(), 1);
						}
									({true}?=>((
										{
											newCompositeNode(grammarAccess.getUiMaskedNumericFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_1_0());
										}
										lv_i18nInfo_6_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiMaskedNumericFieldRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_6_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1(), 2)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1(), 2);
						}
									({true}?=>((
										lv_readonly_7_0='readonly'
										{
											newLeafNode(lv_readonly_7_0, grammarAccess.getUiMaskedNumericFieldAccess().getReadonlyReadonlyKeyword_2_1_2_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiMaskedNumericFieldRule());
											}
											setWithLastConsumed($current, "readonly", true, "readonly");
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiMaskedNumericFieldAccess().getUnorderedGroup_2_1());
					}
			)
			otherlv_8=')'
			{
				newLeafNode(otherlv_8, grammarAccess.getUiMaskedNumericFieldAccess().getRightParenthesisKeyword_2_2());
			}
		)?
		(
			(
				lv_name_9_0=RULE_ID
				{
					newLeafNode(lv_name_9_0, grammarAccess.getUiMaskedNumericFieldAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiMaskedNumericFieldRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_9_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		(
			otherlv_10='{'
			{
				newLeafNode(otherlv_10, grammarAccess.getUiMaskedNumericFieldAccess().getLeftCurlyBracketKeyword_4_0());
			}
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getUiMaskedNumericFieldAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
						}
						lv_validators_11_0=ruleUiValidator
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiMaskedNumericFieldRule());
							}
							add(
								$current,
								"validators",
								lv_validators_11_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getUiMaskedNumericFieldAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
						}
						lv_bindings_12_0=ruleUiBinding
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiMaskedNumericFieldRule());
							}
							add(
								$current,
								"bindings",
								lv_bindings_12_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			(
				(
					{
						newCompositeNode(grammarAccess.getUiMaskedNumericFieldAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
					}
					lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiMaskedNumericFieldRule());
						}
						add(
							$current,
							"processorAssignments",
							lv_processorAssignments_13_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
						afterParserOrEnumRuleCall();
					}
				)
			)*
			otherlv_14='}'
			{
				newLeafNode(otherlv_14, grammarAccess.getUiMaskedNumericFieldAccess().getRightCurlyBracketKeyword_4_3());
			}
		)?
	)
;

// Entry rule entryRuleUiMaskedDecimalField
entryRuleUiMaskedDecimalField returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiMaskedDecimalFieldRule()); }
	iv_ruleUiMaskedDecimalField=ruleUiMaskedDecimalField
	{ $current=$iv_ruleUiMaskedDecimalField.current; }
	EOF;

// Rule UiMaskedDecimalField
ruleUiMaskedDecimalField returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiMaskedDecimalFieldAccess().getUiMaskedDecimalFieldAction_0(),
					$current);
			}
		)
		otherlv_1='maskedDecimal'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiMaskedDecimalFieldAccess().getMaskedDecimalKeyword_1());
		}
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getUiMaskedDecimalFieldAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 0);
						}
									({true}?=>(otherlv_4='styles'
									{
										newLeafNode(otherlv_4, grammarAccess.getUiMaskedDecimalFieldAccess().getStylesKeyword_2_1_0_0());
									}
									(
										(
											lv_styles_5_0=RULE_STRING
											{
												newLeafNode(lv_styles_5_0, grammarAccess.getUiMaskedDecimalFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_0_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiMaskedDecimalFieldRule());
												}
												setWithLastConsumed(
													$current,
													"styles",
													lv_styles_5_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 1);
						}
									({true}?=>(otherlv_6='mask='
									{
										newLeafNode(otherlv_6, grammarAccess.getUiMaskedDecimalFieldAccess().getMaskKeyword_2_1_1_0());
									}
									(
										(
											lv_mask_7_0=RULE_STRING
											{
												newLeafNode(lv_mask_7_0, grammarAccess.getUiMaskedDecimalFieldAccess().getMaskSTRINGTerminalRuleCall_2_1_1_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiMaskedDecimalFieldRule());
												}
												setWithLastConsumed(
													$current,
													"mask",
													lv_mask_7_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 2)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 2);
						}
									({true}?=>((
										{
											newCompositeNode(grammarAccess.getUiMaskedDecimalFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_2_0());
										}
										lv_i18nInfo_8_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiMaskedDecimalFieldRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_8_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 3)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1(), 3);
						}
									({true}?=>((
										lv_readonly_9_0='readonly'
										{
											newLeafNode(lv_readonly_9_0, grammarAccess.getUiMaskedDecimalFieldAccess().getReadonlyReadonlyKeyword_2_1_3_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiMaskedDecimalFieldRule());
											}
											setWithLastConsumed($current, "readonly", true, "readonly");
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiMaskedDecimalFieldAccess().getUnorderedGroup_2_1());
					}
			)
			otherlv_10=')'
			{
				newLeafNode(otherlv_10, grammarAccess.getUiMaskedDecimalFieldAccess().getRightParenthesisKeyword_2_2());
			}
		)?
		(
			(
				lv_name_11_0=RULE_ID
				{
					newLeafNode(lv_name_11_0, grammarAccess.getUiMaskedDecimalFieldAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiMaskedDecimalFieldRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_11_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		(
			otherlv_12='{'
			{
				newLeafNode(otherlv_12, grammarAccess.getUiMaskedDecimalFieldAccess().getLeftCurlyBracketKeyword_4_0());
			}
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getUiMaskedDecimalFieldAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
						}
						lv_validators_13_0=ruleUiValidator
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiMaskedDecimalFieldRule());
							}
							add(
								$current,
								"validators",
								lv_validators_13_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getUiMaskedDecimalFieldAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
						}
						lv_bindings_14_0=ruleUiBinding
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiMaskedDecimalFieldRule());
							}
							add(
								$current,
								"bindings",
								lv_bindings_14_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			(
				(
					{
						newCompositeNode(grammarAccess.getUiMaskedDecimalFieldAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
					}
					lv_processorAssignments_15_0=ruleUiVisibilityProcessorAssignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiMaskedDecimalFieldRule());
						}
						add(
							$current,
							"processorAssignments",
							lv_processorAssignments_15_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
						afterParserOrEnumRuleCall();
					}
				)
			)*
			otherlv_16='}'
			{
				newLeafNode(otherlv_16, grammarAccess.getUiMaskedDecimalFieldAccess().getRightCurlyBracketKeyword_4_3());
			}
		)?
	)
;

// Entry rule entryRuleUiPrefixedMaskedTextField
entryRuleUiPrefixedMaskedTextField returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiPrefixedMaskedTextFieldRule()); }
	iv_ruleUiPrefixedMaskedTextField=ruleUiPrefixedMaskedTextField
	{ $current=$iv_ruleUiPrefixedMaskedTextField.current; }
	EOF;

// Rule UiPrefixedMaskedTextField
ruleUiPrefixedMaskedTextField returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUiPrefixedMaskedTextFieldAction_0(),
					$current);
			}
		)
		otherlv_1='maskedTextWithPrefix'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getMaskedTextWithPrefixKeyword_1());
		}
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 0);
						}
									({true}?=>(otherlv_4='styles'
									{
										newLeafNode(otherlv_4, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getStylesKeyword_2_1_0_0());
									}
									(
										(
											lv_styles_5_0=RULE_STRING
											{
												newLeafNode(lv_styles_5_0, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_0_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiPrefixedMaskedTextFieldRule());
												}
												setWithLastConsumed(
													$current,
													"styles",
													lv_styles_5_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 1);
						}
									({true}?=>(otherlv_6='mask='
									{
										newLeafNode(otherlv_6, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getMaskKeyword_2_1_1_0());
									}
									(
										(
											lv_mask_7_0=RULE_STRING
											{
												newLeafNode(lv_mask_7_0, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getMaskSTRINGTerminalRuleCall_2_1_1_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiPrefixedMaskedTextFieldRule());
												}
												setWithLastConsumed(
													$current,
													"mask",
													lv_mask_7_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 2)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 2);
						}
									({true}?=>(otherlv_8='prefixes='
									{
										newLeafNode(otherlv_8, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getPrefixesKeyword_2_1_2_0());
									}
									otherlv_9='('
									{
										newLeafNode(otherlv_9, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getLeftParenthesisKeyword_2_1_2_1());
									}
									(
										(
											{
												newCompositeNode(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getPrefixMasksUiPrefixToMaskMapEntryParserRuleCall_2_1_2_2_0());
											}
											lv_prefixMasks_10_0=ruleUiPrefixToMaskMapEntry
											{
												if ($current==null) {
													$current = createModelElementForParent(grammarAccess.getUiPrefixedMaskedTextFieldRule());
												}
												add(
													$current,
													"prefixMasks",
													lv_prefixMasks_10_0,
													"org.eclipse.osbp.ecview.dsl.UIGrammar.UiPrefixToMaskMapEntry");
												afterParserOrEnumRuleCall();
											}
										)
									)
									(
										otherlv_11=','
										{
											newLeafNode(otherlv_11, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getCommaKeyword_2_1_2_3_0());
										}
										(
											(
												{
													newCompositeNode(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getPrefixMasksUiPrefixToMaskMapEntryParserRuleCall_2_1_2_3_1_0());
												}
												lv_prefixMasks_12_0=ruleUiPrefixToMaskMapEntry
												{
													if ($current==null) {
														$current = createModelElementForParent(grammarAccess.getUiPrefixedMaskedTextFieldRule());
													}
													add(
														$current,
														"prefixMasks",
														lv_prefixMasks_12_0,
														"org.eclipse.osbp.ecview.dsl.UIGrammar.UiPrefixToMaskMapEntry");
													afterParserOrEnumRuleCall();
												}
											)
										)
									)*
									otherlv_13=')'
									{
										newLeafNode(otherlv_13, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getRightParenthesisKeyword_2_1_2_4());
									}
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 3)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 3);
						}
									({true}?=>((
										{
											newCompositeNode(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_3_0());
										}
										lv_i18nInfo_14_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiPrefixedMaskedTextFieldRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_14_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 4)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1(), 4);
						}
									({true}?=>((
										lv_readonly_15_0='readonly'
										{
											newLeafNode(lv_readonly_15_0, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getReadonlyReadonlyKeyword_2_1_4_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiPrefixedMaskedTextFieldRule());
											}
											setWithLastConsumed($current, "readonly", true, "readonly");
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getUnorderedGroup_2_1());
					}
			)
			otherlv_16=')'
			{
				newLeafNode(otherlv_16, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getRightParenthesisKeyword_2_2());
			}
		)?
		(
			(
				lv_name_17_0=RULE_ID
				{
					newLeafNode(lv_name_17_0, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiPrefixedMaskedTextFieldRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_17_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		(
			otherlv_18='{'
			{
				newLeafNode(otherlv_18, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getLeftCurlyBracketKeyword_4_0());
			}
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
						}
						lv_validators_19_0=ruleUiValidator
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiPrefixedMaskedTextFieldRule());
							}
							add(
								$current,
								"validators",
								lv_validators_19_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
						}
						lv_bindings_20_0=ruleUiBinding
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiPrefixedMaskedTextFieldRule());
							}
							add(
								$current,
								"bindings",
								lv_bindings_20_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			(
				(
					{
						newCompositeNode(grammarAccess.getUiPrefixedMaskedTextFieldAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
					}
					lv_processorAssignments_21_0=ruleUiVisibilityProcessorAssignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiPrefixedMaskedTextFieldRule());
						}
						add(
							$current,
							"processorAssignments",
							lv_processorAssignments_21_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
						afterParserOrEnumRuleCall();
					}
				)
			)*
			otherlv_22='}'
			{
				newLeafNode(otherlv_22, grammarAccess.getUiPrefixedMaskedTextFieldAccess().getRightCurlyBracketKeyword_4_3());
			}
		)?
	)
;

// Entry rule entryRuleUiPrefixToMaskMapEntry
entryRuleUiPrefixToMaskMapEntry returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiPrefixToMaskMapEntryRule()); }
	iv_ruleUiPrefixToMaskMapEntry=ruleUiPrefixToMaskMapEntry
	{ $current=$iv_ruleUiPrefixToMaskMapEntry.current; }
	EOF;

// Rule UiPrefixToMaskMapEntry
ruleUiPrefixToMaskMapEntry returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiPrefixToMaskMapEntryAccess().getUiPrefixToMaskMapEntryAction_0(),
					$current);
			}
		)
		otherlv_1='prefix'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiPrefixToMaskMapEntryAccess().getPrefixKeyword_1());
		}
		(
			(
				lv_key_2_0=RULE_STRING
				{
					newLeafNode(lv_key_2_0, grammarAccess.getUiPrefixToMaskMapEntryAccess().getKeySTRINGTerminalRuleCall_2_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiPrefixToMaskMapEntryRule());
					}
					setWithLastConsumed(
						$current,
						"key",
						lv_key_2_0,
						"org.eclipse.xtext.xbase.Xtype.STRING");
				}
			)
		)
		otherlv_3='mask'
		{
			newLeafNode(otherlv_3, grammarAccess.getUiPrefixToMaskMapEntryAccess().getMaskKeyword_3());
		}
		(
			(
				lv_value_4_0=RULE_STRING
				{
					newLeafNode(lv_value_4_0, grammarAccess.getUiPrefixToMaskMapEntryAccess().getValueSTRINGTerminalRuleCall_4_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiPrefixToMaskMapEntryRule());
					}
					setWithLastConsumed(
						$current,
						"value",
						lv_value_4_0,
						"org.eclipse.xtext.xbase.Xtype.STRING");
				}
			)
		)
	)
;

// Entry rule entryRuleUiRichTextArea
entryRuleUiRichTextArea returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiRichTextAreaRule()); }
	iv_ruleUiRichTextArea=ruleUiRichTextArea
	{ $current=$iv_ruleUiRichTextArea.current; }
	EOF;

// Rule UiRichTextArea
ruleUiRichTextArea returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiRichTextAreaAccess().getUiRichTextAreaAction_0(),
					$current);
			}
		)
		otherlv_1='richtextArea'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiRichTextAreaAccess().getRichtextAreaKeyword_1());
		}
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getUiRichTextAreaAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 0);
						}
									({true}?=>(otherlv_4='styles'
									{
										newLeafNode(otherlv_4, grammarAccess.getUiRichTextAreaAccess().getStylesKeyword_2_1_0_0());
									}
									(
										(
											lv_styles_5_0=RULE_STRING
											{
												newLeafNode(lv_styles_5_0, grammarAccess.getUiRichTextAreaAccess().getStylesSTRINGTerminalRuleCall_2_1_0_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiRichTextAreaRule());
												}
												setWithLastConsumed(
													$current,
													"styles",
													lv_styles_5_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 1);
						}
									({true}?=>((
										{
											newCompositeNode(grammarAccess.getUiRichTextAreaAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_1_0());
										}
										lv_i18nInfo_6_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiRichTextAreaRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_6_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 2)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 2);
						}
									({true}?=>((
										lv_asBlob_7_0='asBlob'
										{
											newLeafNode(lv_asBlob_7_0, grammarAccess.getUiRichTextAreaAccess().getAsBlobAsBlobKeyword_2_1_2_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiRichTextAreaRule());
											}
											setWithLastConsumed($current, "asBlob", true, "asBlob");
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 3)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1(), 3);
						}
									({true}?=>((
										lv_readonly_8_0='readonly'
										{
											newLeafNode(lv_readonly_8_0, grammarAccess.getUiRichTextAreaAccess().getReadonlyReadonlyKeyword_2_1_3_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiRichTextAreaRule());
											}
											setWithLastConsumed($current, "readonly", true, "readonly");
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiRichTextAreaAccess().getUnorderedGroup_2_1());
					}
			)
			otherlv_9=')'
			{
				newLeafNode(otherlv_9, grammarAccess.getUiRichTextAreaAccess().getRightParenthesisKeyword_2_2());
			}
		)?
		(
			(
				lv_name_10_0=RULE_ID
				{
					newLeafNode(lv_name_10_0, grammarAccess.getUiRichTextAreaAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiRichTextAreaRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_10_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		(
			otherlv_11='{'
			{
				newLeafNode(otherlv_11, grammarAccess.getUiRichTextAreaAccess().getLeftCurlyBracketKeyword_4_0());
			}
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getUiRichTextAreaAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
						}
						lv_validators_12_0=ruleUiValidator
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiRichTextAreaRule());
							}
							add(
								$current,
								"validators",
								lv_validators_12_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getUiRichTextAreaAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
						}
						lv_bindings_13_0=ruleUiBinding
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiRichTextAreaRule());
							}
							add(
								$current,
								"bindings",
								lv_bindings_13_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			(
				(
					{
						newCompositeNode(grammarAccess.getUiRichTextAreaAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
					}
					lv_processorAssignments_14_0=ruleUiVisibilityProcessorAssignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiRichTextAreaRule());
						}
						add(
							$current,
							"processorAssignments",
							lv_processorAssignments_14_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
						afterParserOrEnumRuleCall();
					}
				)
			)*
			otherlv_15='}'
			{
				newLeafNode(otherlv_15, grammarAccess.getUiRichTextAreaAccess().getRightCurlyBracketKeyword_4_3());
			}
		)?
	)
;

// Entry rule entryRuleUiSuggestTextField
entryRuleUiSuggestTextField returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiSuggestTextFieldRule()); }
	iv_ruleUiSuggestTextField=ruleUiSuggestTextField
	{ $current=$iv_ruleUiSuggestTextField.current; }
	EOF;

// Rule UiSuggestTextField
ruleUiSuggestTextField returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiSuggestTextFieldAccess().getUiSuggestTextFieldAction_0(),
					$current);
			}
		)
		otherlv_1='suggestText'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiSuggestTextFieldAccess().getSuggestTextKeyword_1());
		}
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getUiSuggestTextFieldAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_2_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_2_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_2_1(), 0);
						}
									({true}?=>((
										{
											newCompositeNode(grammarAccess.getUiSuggestTextFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
										}
										lv_i18nInfo_4_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiSuggestTextFieldRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_4_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_2_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_2_1(), 1);
						}
									({true}?=>(otherlv_5='styles'
									{
										newLeafNode(otherlv_5, grammarAccess.getUiSuggestTextFieldAccess().getStylesKeyword_2_1_1_0());
									}
									(
										(
											lv_styles_6_0=RULE_STRING
											{
												newLeafNode(lv_styles_6_0, grammarAccess.getUiSuggestTextFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiSuggestTextFieldRule());
												}
												setWithLastConsumed(
													$current,
													"styles",
													lv_styles_6_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_2_1());
					}
			)
			otherlv_7=')'
			{
				newLeafNode(otherlv_7, grammarAccess.getUiSuggestTextFieldAccess().getRightParenthesisKeyword_2_2());
			}
		)?
		(
			(
				lv_name_8_0=RULE_ID
				{
					newLeafNode(lv_name_8_0, grammarAccess.getUiSuggestTextFieldAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiSuggestTextFieldRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_8_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		(
			otherlv_9='{'
			{
				newLeafNode(otherlv_9, grammarAccess.getUiSuggestTextFieldAccess().getLeftCurlyBracketKeyword_4_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 0);
						}
									({true}?=>(otherlv_11='type'
									{
										newLeafNode(otherlv_11, grammarAccess.getUiSuggestTextFieldAccess().getTypeKeyword_4_1_0_0());
									}
									(
										(
											{
												newCompositeNode(grammarAccess.getUiSuggestTextFieldAccess().getJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0());
											}
											lv_jvmType_12_0=ruleJvmTypeReference
											{
												if ($current==null) {
													$current = createModelElementForParent(grammarAccess.getUiSuggestTextFieldRule());
												}
												set(
													$current,
													"jvmType",
													lv_jvmType_12_0,
													"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
												afterParserOrEnumRuleCall();
											}
										)
									)
									(
										otherlv_13=';'
										{
											newLeafNode(otherlv_13, grammarAccess.getUiSuggestTextFieldAccess().getSemicolonKeyword_4_1_0_2());
										}
									)?
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 1);
						}
									({true}?=>(otherlv_14='captionField'
									{
										newLeafNode(otherlv_14, grammarAccess.getUiSuggestTextFieldAccess().getCaptionFieldKeyword_4_1_1_0());
									}
									(
										(
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiSuggestTextFieldRule());
												}
											}
											otherlv_15=RULE_ID
											{
												newLeafNode(otherlv_15, grammarAccess.getUiSuggestTextFieldAccess().getItemCaptionPropertyJvmOperationCrossReference_4_1_1_1_0());
											}
										)
									)
									(
										otherlv_16=';'
										{
											newLeafNode(otherlv_16, grammarAccess.getUiSuggestTextFieldAccess().getSemicolonKeyword_4_1_1_2());
										}
									)?
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 2)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 2);
						}
									({true}?=>(otherlv_17='filterField'
									{
										newLeafNode(otherlv_17, grammarAccess.getUiSuggestTextFieldAccess().getFilterFieldKeyword_4_1_2_0());
									}
									(
										(
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiSuggestTextFieldRule());
												}
											}
											otherlv_18=RULE_ID
											{
												newLeafNode(otherlv_18, grammarAccess.getUiSuggestTextFieldAccess().getItemFilterPropertyJvmOperationCrossReference_4_1_2_1_0());
											}
										)
									)
									(
										otherlv_19=';'
										{
											newLeafNode(otherlv_19, grammarAccess.getUiSuggestTextFieldAccess().getSemicolonKeyword_4_1_2_2());
										}
									)?
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 3)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 3);
						}
									({true}?=>(otherlv_20='uuidField'
									{
										newLeafNode(otherlv_20, grammarAccess.getUiSuggestTextFieldAccess().getUuidFieldKeyword_4_1_3_0());
									}
									(
										(
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiSuggestTextFieldRule());
												}
											}
											otherlv_21=RULE_ID
											{
												newLeafNode(otherlv_21, grammarAccess.getUiSuggestTextFieldAccess().getItemUUIDPropertyJvmOperationCrossReference_4_1_3_1_0());
											}
										)
									)
									(
										otherlv_22=';'
										{
											newLeafNode(otherlv_22, grammarAccess.getUiSuggestTextFieldAccess().getSemicolonKeyword_4_1_3_2());
										}
									)?
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 4)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 4);
						}
									({true}?=>((
										lv_autoHidePopup_23_0='autoHidePopup'
										{
											newLeafNode(lv_autoHidePopup_23_0, grammarAccess.getUiSuggestTextFieldAccess().getAutoHidePopupAutoHidePopupKeyword_4_1_4_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiSuggestTextFieldRule());
											}
											setWithLastConsumed($current, "autoHidePopup", true, "autoHidePopup");
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 5)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1(), 5);
						}
									({true}?=>((
										lv_readonly_24_0='readonly'
										{
											newLeafNode(lv_readonly_24_0, grammarAccess.getUiSuggestTextFieldAccess().getReadonlyReadonlyKeyword_4_1_5_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiSuggestTextFieldRule());
											}
											setWithLastConsumed($current, "readonly", true, "readonly");
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiSuggestTextFieldAccess().getUnorderedGroup_4_1());
					}
			)
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getUiSuggestTextFieldAccess().getValidatorsUiValidatorParserRuleCall_4_2_0_0());
						}
						lv_validators_25_0=ruleUiValidator
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiSuggestTextFieldRule());
							}
							add(
								$current,
								"validators",
								lv_validators_25_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getUiSuggestTextFieldAccess().getBindingsUiBindingParserRuleCall_4_2_1_0());
						}
						lv_bindings_26_0=ruleUiBinding
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiSuggestTextFieldRule());
							}
							add(
								$current,
								"bindings",
								lv_bindings_26_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			(
				(
					{
						newCompositeNode(grammarAccess.getUiSuggestTextFieldAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0());
					}
					lv_processorAssignments_27_0=ruleUiVisibilityProcessorAssignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiSuggestTextFieldRule());
						}
						add(
							$current,
							"processorAssignments",
							lv_processorAssignments_27_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
						afterParserOrEnumRuleCall();
					}
				)
			)*
			otherlv_28='}'
			{
				newLeafNode(otherlv_28, grammarAccess.getUiSuggestTextFieldAccess().getRightCurlyBracketKeyword_4_4());
			}
		)?
	)
;

// Entry rule entryRuleUiBeanReferenceField
entryRuleUiBeanReferenceField returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiBeanReferenceFieldRule()); }
	iv_ruleUiBeanReferenceField=ruleUiBeanReferenceField
	{ $current=$iv_ruleUiBeanReferenceField.current; }
	EOF;

// Rule UiBeanReferenceField
ruleUiBeanReferenceField returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiBeanReferenceFieldAccess().getUiBeanReferenceFieldAction_0(),
					$current);
			}
		)
		otherlv_1='referenceField'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiBeanReferenceFieldAccess().getReferenceFieldKeyword_1());
		}
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getUiBeanReferenceFieldAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_2_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_2_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_2_1(), 0);
						}
									({true}?=>((
										{
											newCompositeNode(grammarAccess.getUiBeanReferenceFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
										}
										lv_i18nInfo_4_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiBeanReferenceFieldRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_4_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_2_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_2_1(), 1);
						}
									({true}?=>(otherlv_5='styles'
									{
										newLeafNode(otherlv_5, grammarAccess.getUiBeanReferenceFieldAccess().getStylesKeyword_2_1_1_0());
									}
									(
										(
											lv_styles_6_0=RULE_STRING
											{
												newLeafNode(lv_styles_6_0, grammarAccess.getUiBeanReferenceFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiBeanReferenceFieldRule());
												}
												setWithLastConsumed(
													$current,
													"styles",
													lv_styles_6_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_2_1());
					}
			)
			otherlv_7=')'
			{
				newLeafNode(otherlv_7, grammarAccess.getUiBeanReferenceFieldAccess().getRightParenthesisKeyword_2_2());
			}
		)?
		(
			(
				lv_name_8_0=RULE_ID
				{
					newLeafNode(lv_name_8_0, grammarAccess.getUiBeanReferenceFieldAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiBeanReferenceFieldRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_8_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		(
			otherlv_9='{'
			{
				newLeafNode(otherlv_9, grammarAccess.getUiBeanReferenceFieldAccess().getLeftCurlyBracketKeyword_4_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 0);
						}
									({true}?=>(otherlv_11='type'
									{
										newLeafNode(otherlv_11, grammarAccess.getUiBeanReferenceFieldAccess().getTypeKeyword_4_1_0_0());
									}
									(
										(
											{
												newCompositeNode(grammarAccess.getUiBeanReferenceFieldAccess().getJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0());
											}
											lv_jvmType_12_0=ruleJvmTypeReference
											{
												if ($current==null) {
													$current = createModelElementForParent(grammarAccess.getUiBeanReferenceFieldRule());
												}
												set(
													$current,
													"jvmType",
													lv_jvmType_12_0,
													"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
												afterParserOrEnumRuleCall();
											}
										)
									)
									(
										otherlv_13=';'
										{
											newLeafNode(otherlv_13, grammarAccess.getUiBeanReferenceFieldAccess().getSemicolonKeyword_4_1_0_2());
										}
									)?
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 1);
						}
									({true}?=>(otherlv_14='refSource'
									{
										newLeafNode(otherlv_14, grammarAccess.getUiBeanReferenceFieldAccess().getRefSourceKeyword_4_1_1_0());
									}
									(
										(
											{
												newCompositeNode(grammarAccess.getUiBeanReferenceFieldAccess().getReferenceSourceJvmTypeJvmTypeReferenceParserRuleCall_4_1_1_1_0());
											}
											lv_referenceSourceJvmType_15_0=ruleJvmTypeReference
											{
												if ($current==null) {
													$current = createModelElementForParent(grammarAccess.getUiBeanReferenceFieldRule());
												}
												set(
													$current,
													"referenceSourceJvmType",
													lv_referenceSourceJvmType_15_0,
													"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
												afterParserOrEnumRuleCall();
											}
										)
									)
									otherlv_16=':'
									{
										newLeafNode(otherlv_16, grammarAccess.getUiBeanReferenceFieldAccess().getColonKeyword_4_1_1_2());
									}
									(
										(
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiBeanReferenceFieldRule());
												}
											}
											otherlv_17=RULE_ID
											{
												newLeafNode(otherlv_17, grammarAccess.getUiBeanReferenceFieldAccess().getReferenceSourceFieldJvmFieldCrossReference_4_1_1_3_0());
											}
										)
									)
									(
										otherlv_18=';'
										{
											newLeafNode(otherlv_18, grammarAccess.getUiBeanReferenceFieldAccess().getSemicolonKeyword_4_1_1_4());
										}
									)?
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 2)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 2);
						}
									({true}?=>(otherlv_19='captionField'
									{
										newLeafNode(otherlv_19, grammarAccess.getUiBeanReferenceFieldAccess().getCaptionFieldKeyword_4_1_2_0());
									}
									(
										(
											{
												newCompositeNode(grammarAccess.getUiBeanReferenceFieldAccess().getCaptionPropertyUiNestedPropertyParserRuleCall_4_1_2_1_0());
											}
											lv_captionProperty_20_0=ruleUiNestedProperty
											{
												if ($current==null) {
													$current = createModelElementForParent(grammarAccess.getUiBeanReferenceFieldRule());
												}
												set(
													$current,
													"captionProperty",
													lv_captionProperty_20_0,
													"org.eclipse.osbp.ecview.dsl.UIGrammar.UiNestedProperty");
												afterParserOrEnumRuleCall();
											}
										)
									)
									(
										otherlv_21=';'
										{
											newLeafNode(otherlv_21, grammarAccess.getUiBeanReferenceFieldAccess().getSemicolonKeyword_4_1_2_2());
										}
									)?
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 3)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 3);
						}
									({true}?=>(otherlv_22='descriptionField'
									{
										newLeafNode(otherlv_22, grammarAccess.getUiBeanReferenceFieldAccess().getDescriptionFieldKeyword_4_1_3_0());
									}
									(
										(
											{
												newCompositeNode(grammarAccess.getUiBeanReferenceFieldAccess().getDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_3_1_0());
											}
											lv_descriptionProperty_23_0=ruleUiNestedProperty
											{
												if ($current==null) {
													$current = createModelElementForParent(grammarAccess.getUiBeanReferenceFieldRule());
												}
												set(
													$current,
													"descriptionProperty",
													lv_descriptionProperty_23_0,
													"org.eclipse.osbp.ecview.dsl.UIGrammar.UiNestedProperty");
												afterParserOrEnumRuleCall();
											}
										)
									)
									(
										otherlv_24=';'
										{
											newLeafNode(otherlv_24, grammarAccess.getUiBeanReferenceFieldAccess().getSemicolonKeyword_4_1_3_2());
										}
									)?
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 4)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 4);
						}
									({true}?=>(otherlv_25='imageField'
									{
										newLeafNode(otherlv_25, grammarAccess.getUiBeanReferenceFieldAccess().getImageFieldKeyword_4_1_4_0());
									}
									(
										(
											{
												newCompositeNode(grammarAccess.getUiBeanReferenceFieldAccess().getImagePropertyUiNestedPropertyParserRuleCall_4_1_4_1_0());
											}
											lv_imageProperty_26_0=ruleUiNestedProperty
											{
												if ($current==null) {
													$current = createModelElementForParent(grammarAccess.getUiBeanReferenceFieldRule());
												}
												set(
													$current,
													"imageProperty",
													lv_imageProperty_26_0,
													"org.eclipse.osbp.ecview.dsl.UIGrammar.UiNestedProperty");
												afterParserOrEnumRuleCall();
											}
										)
									)
									(
										otherlv_27=';'
										{
											newLeafNode(otherlv_27, grammarAccess.getUiBeanReferenceFieldAccess().getSemicolonKeyword_4_1_4_2());
										}
									)?
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 5)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1(), 5);
						}
									({true}?=>(otherlv_28='inMemoryService'
									{
										newLeafNode(otherlv_28, grammarAccess.getUiBeanReferenceFieldAccess().getInMemoryServiceKeyword_4_1_5_0());
									}
									(
										(
											{
												newCompositeNode(grammarAccess.getUiBeanReferenceFieldAccess().getInMemoryBeanProviderJvmTypeReferenceParserRuleCall_4_1_5_1_0());
											}
											lv_inMemoryBeanProvider_29_0=ruleJvmTypeReference
											{
												if ($current==null) {
													$current = createModelElementForParent(grammarAccess.getUiBeanReferenceFieldRule());
												}
												set(
													$current,
													"inMemoryBeanProvider",
													lv_inMemoryBeanProvider_29_0,
													"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
												afterParserOrEnumRuleCall();
											}
										)
									)
									(
										otherlv_30=';'
										{
											newLeafNode(otherlv_30, grammarAccess.getUiBeanReferenceFieldAccess().getSemicolonKeyword_4_1_5_2());
										}
									)?
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiBeanReferenceFieldAccess().getUnorderedGroup_4_1());
					}
			)
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getUiBeanReferenceFieldAccess().getValidatorsUiValidatorParserRuleCall_4_2_0_0());
						}
						lv_validators_31_0=ruleUiValidator
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiBeanReferenceFieldRule());
							}
							add(
								$current,
								"validators",
								lv_validators_31_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getUiBeanReferenceFieldAccess().getBindingsUiBindingParserRuleCall_4_2_1_0());
						}
						lv_bindings_32_0=ruleUiBinding
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiBeanReferenceFieldRule());
							}
							add(
								$current,
								"bindings",
								lv_bindings_32_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			(
				(
					{
						newCompositeNode(grammarAccess.getUiBeanReferenceFieldAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0());
					}
					lv_processorAssignments_33_0=ruleUiVisibilityProcessorAssignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiBeanReferenceFieldRule());
						}
						add(
							$current,
							"processorAssignments",
							lv_processorAssignments_33_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
						afterParserOrEnumRuleCall();
					}
				)
			)*
			otherlv_34='}'
			{
				newLeafNode(otherlv_34, grammarAccess.getUiBeanReferenceFieldAccess().getRightCurlyBracketKeyword_4_4());
			}
		)?
	)
;

// Entry rule entryRuleUiSearchField
entryRuleUiSearchField returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiSearchFieldRule()); }
	iv_ruleUiSearchField=ruleUiSearchField
	{ $current=$iv_ruleUiSearchField.current; }
	EOF;

// Rule UiSearchField
ruleUiSearchField returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiSearchFieldAccess().getUiSearchFieldAction_0(),
					$current);
			}
		)
		otherlv_1='searchfield'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiSearchFieldAccess().getSearchfieldKeyword_1());
		}
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getUiSearchFieldAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiSearchFieldAccess().getUnorderedGroup_2_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSearchFieldAccess().getUnorderedGroup_2_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiSearchFieldAccess().getUnorderedGroup_2_1(), 0);
						}
									({true}?=>((
										{
											newCompositeNode(grammarAccess.getUiSearchFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
										}
										lv_i18nInfo_4_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiSearchFieldRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_4_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSearchFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiSearchFieldAccess().getUnorderedGroup_2_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiSearchFieldAccess().getUnorderedGroup_2_1(), 1);
						}
									({true}?=>(otherlv_5='styles'
									{
										newLeafNode(otherlv_5, grammarAccess.getUiSearchFieldAccess().getStylesKeyword_2_1_1_0());
									}
									(
										(
											lv_styles_6_0=RULE_STRING
											{
												newLeafNode(lv_styles_6_0, grammarAccess.getUiSearchFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiSearchFieldRule());
												}
												setWithLastConsumed(
													$current,
													"styles",
													lv_styles_6_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiSearchFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiSearchFieldAccess().getUnorderedGroup_2_1());
					}
			)
			otherlv_7=')'
			{
				newLeafNode(otherlv_7, grammarAccess.getUiSearchFieldAccess().getRightParenthesisKeyword_2_2());
			}
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getUiSearchFieldAccess().getPropertyUiNestedPropertyParserRuleCall_3_0());
				}
				lv_property_8_0=ruleUiNestedProperty
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiSearchFieldRule());
					}
					set(
						$current,
						"property",
						lv_property_8_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiNestedProperty");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleUiTextArea
entryRuleUiTextArea returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiTextAreaRule()); }
	iv_ruleUiTextArea=ruleUiTextArea
	{ $current=$iv_ruleUiTextArea.current; }
	EOF;

// Rule UiTextArea
ruleUiTextArea returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiTextAreaAccess().getUiTextAreaAction_0(),
					$current);
			}
		)
		otherlv_1='textarea'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiTextAreaAccess().getTextareaKeyword_1());
		}
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getUiTextAreaAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1(), 0);
						}
									({true}?=>((
										{
											newCompositeNode(grammarAccess.getUiTextAreaAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
										}
										lv_i18nInfo_4_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiTextAreaRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_4_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1(), 1);
						}
									({true}?=>((
										lv_readonly_5_0='readonly'
										{
											newLeafNode(lv_readonly_5_0, grammarAccess.getUiTextAreaAccess().getReadonlyReadonlyKeyword_2_1_1_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiTextAreaRule());
											}
											setWithLastConsumed($current, "readonly", true, "readonly");
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1(), 2)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1(), 2);
						}
									({true}?=>(otherlv_6='styles'
									{
										newLeafNode(otherlv_6, grammarAccess.getUiTextAreaAccess().getStylesKeyword_2_1_2_0());
									}
									(
										(
											lv_styles_7_0=RULE_STRING
											{
												newLeafNode(lv_styles_7_0, grammarAccess.getUiTextAreaAccess().getStylesSTRINGTerminalRuleCall_2_1_2_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiTextAreaRule());
												}
												setWithLastConsumed(
													$current,
													"styles",
													lv_styles_7_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiTextAreaAccess().getUnorderedGroup_2_1());
					}
			)
			otherlv_8=')'
			{
				newLeafNode(otherlv_8, grammarAccess.getUiTextAreaAccess().getRightParenthesisKeyword_2_2());
			}
		)?
		(
			(
				lv_name_9_0=RULE_ID
				{
					newLeafNode(lv_name_9_0, grammarAccess.getUiTextAreaAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiTextAreaRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_9_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		(
			otherlv_10='{'
			{
				newLeafNode(otherlv_10, grammarAccess.getUiTextAreaAccess().getLeftCurlyBracketKeyword_4_0());
			}
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getUiTextAreaAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
						}
						lv_validators_11_0=ruleUiValidator
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiTextAreaRule());
							}
							add(
								$current,
								"validators",
								lv_validators_11_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getUiTextAreaAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
						}
						lv_bindings_12_0=ruleUiBinding
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiTextAreaRule());
							}
							add(
								$current,
								"bindings",
								lv_bindings_12_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			(
				(
					{
						newCompositeNode(grammarAccess.getUiTextAreaAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
					}
					lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiTextAreaRule());
						}
						add(
							$current,
							"processorAssignments",
							lv_processorAssignments_13_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
						afterParserOrEnumRuleCall();
					}
				)
			)*
			otherlv_14='}'
			{
				newLeafNode(otherlv_14, grammarAccess.getUiTextAreaAccess().getRightCurlyBracketKeyword_4_3());
			}
		)?
	)
;

// Entry rule entryRuleUiDateField
entryRuleUiDateField returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiDateFieldRule()); }
	iv_ruleUiDateField=ruleUiDateField
	{ $current=$iv_ruleUiDateField.current; }
	EOF;

// Rule UiDateField
ruleUiDateField returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiDateFieldAccess().getUiDateFieldAction_0(),
					$current);
			}
		)
		otherlv_1='datefield'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiDateFieldAccess().getDatefieldKeyword_1());
		}
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getUiDateFieldAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 0);
						}
									({true}?=>((
										{
											newCompositeNode(grammarAccess.getUiDateFieldAccess().getDateFormatUiDateFormatEnumRuleCall_2_1_0_0());
										}
										lv_dateFormat_4_0=ruleUiDateFormat
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiDateFieldRule());
											}
											set(
												$current,
												"dateFormat",
												lv_dateFormat_4_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiDateFormat");
											afterParserOrEnumRuleCall();
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 1);
						}
									({true}?=>((
										{
											newCompositeNode(grammarAccess.getUiDateFieldAccess().getResolutionUiDateTimeResolutionEnumRuleCall_2_1_1_0());
										}
										lv_resolution_5_0=ruleUiDateTimeResolution
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiDateFieldRule());
											}
											set(
												$current,
												"resolution",
												lv_resolution_5_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiDateTimeResolution");
											afterParserOrEnumRuleCall();
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 2)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 2);
						}
									({true}?=>(otherlv_6='styles'
									{
										newLeafNode(otherlv_6, grammarAccess.getUiDateFieldAccess().getStylesKeyword_2_1_2_0());
									}
									(
										(
											lv_styles_7_0=RULE_STRING
											{
												newLeafNode(lv_styles_7_0, grammarAccess.getUiDateFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_2_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiDateFieldRule());
												}
												setWithLastConsumed(
													$current,
													"styles",
													lv_styles_7_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 3)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 3);
						}
									({true}?=>((
										{
											newCompositeNode(grammarAccess.getUiDateFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_3_0());
										}
										lv_i18nInfo_8_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiDateFieldRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_8_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 4)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1(), 4);
						}
									({true}?=>((
										lv_readonly_9_0='readonly'
										{
											newLeafNode(lv_readonly_9_0, grammarAccess.getUiDateFieldAccess().getReadonlyReadonlyKeyword_2_1_4_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiDateFieldRule());
											}
											setWithLastConsumed($current, "readonly", true, "readonly");
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiDateFieldAccess().getUnorderedGroup_2_1());
					}
			)
			otherlv_10=')'
			{
				newLeafNode(otherlv_10, grammarAccess.getUiDateFieldAccess().getRightParenthesisKeyword_2_2());
			}
		)?
		(
			(
				lv_name_11_0=RULE_ID
				{
					newLeafNode(lv_name_11_0, grammarAccess.getUiDateFieldAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiDateFieldRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_11_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		(
			otherlv_12='{'
			{
				newLeafNode(otherlv_12, grammarAccess.getUiDateFieldAccess().getLeftCurlyBracketKeyword_4_0());
			}
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getUiDateFieldAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
						}
						lv_validators_13_0=ruleUiValidator
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiDateFieldRule());
							}
							add(
								$current,
								"validators",
								lv_validators_13_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getUiDateFieldAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
						}
						lv_bindings_14_0=ruleUiBinding
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiDateFieldRule());
							}
							add(
								$current,
								"bindings",
								lv_bindings_14_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			(
				(
					{
						newCompositeNode(grammarAccess.getUiDateFieldAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
					}
					lv_processorAssignments_15_0=ruleUiVisibilityProcessorAssignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiDateFieldRule());
						}
						add(
							$current,
							"processorAssignments",
							lv_processorAssignments_15_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
						afterParserOrEnumRuleCall();
					}
				)
			)*
			otherlv_16='}'
			{
				newLeafNode(otherlv_16, grammarAccess.getUiDateFieldAccess().getRightCurlyBracketKeyword_4_3());
			}
		)?
	)
;

// Entry rule entryRuleUiBrowser
entryRuleUiBrowser returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiBrowserRule()); }
	iv_ruleUiBrowser=ruleUiBrowser
	{ $current=$iv_ruleUiBrowser.current; }
	EOF;

// Rule UiBrowser
ruleUiBrowser returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiBrowserAccess().getUiBrowserAction_0(),
					$current);
			}
		)
		otherlv_1='browser'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiBrowserAccess().getBrowserKeyword_1());
		}
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getUiBrowserAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1(), 0);
						}
									({true}?=>((
										{
											newCompositeNode(grammarAccess.getUiBrowserAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
										}
										lv_i18nInfo_4_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiBrowserRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_4_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1(), 1);
						}
									({true}?=>((
										lv_readonly_5_0='readonly'
										{
											newLeafNode(lv_readonly_5_0, grammarAccess.getUiBrowserAccess().getReadonlyReadonlyKeyword_2_1_1_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiBrowserRule());
											}
											setWithLastConsumed($current, "readonly", true, "readonly");
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1(), 2)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1(), 2);
						}
									({true}?=>(otherlv_6='styles'
									{
										newLeafNode(otherlv_6, grammarAccess.getUiBrowserAccess().getStylesKeyword_2_1_2_0());
									}
									(
										(
											lv_styles_7_0=RULE_STRING
											{
												newLeafNode(lv_styles_7_0, grammarAccess.getUiBrowserAccess().getStylesSTRINGTerminalRuleCall_2_1_2_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiBrowserRule());
												}
												setWithLastConsumed(
													$current,
													"styles",
													lv_styles_7_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiBrowserAccess().getUnorderedGroup_2_1());
					}
			)
			otherlv_8=')'
			{
				newLeafNode(otherlv_8, grammarAccess.getUiBrowserAccess().getRightParenthesisKeyword_2_2());
			}
		)?
		(
			(
				lv_name_9_0=RULE_ID
				{
					newLeafNode(lv_name_9_0, grammarAccess.getUiBrowserAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiBrowserRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_9_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		(
			otherlv_10='{'
			{
				newLeafNode(otherlv_10, grammarAccess.getUiBrowserAccess().getLeftCurlyBracketKeyword_4_0());
			}
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getUiBrowserAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
						}
						lv_validators_11_0=ruleUiValidator
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiBrowserRule());
							}
							add(
								$current,
								"validators",
								lv_validators_11_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getUiBrowserAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
						}
						lv_bindings_12_0=ruleUiBinding
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiBrowserRule());
							}
							add(
								$current,
								"bindings",
								lv_bindings_12_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			(
				(
					{
						newCompositeNode(grammarAccess.getUiBrowserAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
					}
					lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiBrowserRule());
						}
						add(
							$current,
							"processorAssignments",
							lv_processorAssignments_13_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
						afterParserOrEnumRuleCall();
					}
				)
			)*
			otherlv_14='}'
			{
				newLeafNode(otherlv_14, grammarAccess.getUiBrowserAccess().getRightCurlyBracketKeyword_4_3());
			}
		)?
	)
;

// Entry rule entryRuleUiProgressBar
entryRuleUiProgressBar returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiProgressBarRule()); }
	iv_ruleUiProgressBar=ruleUiProgressBar
	{ $current=$iv_ruleUiProgressBar.current; }
	EOF;

// Rule UiProgressBar
ruleUiProgressBar returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiProgressBarAccess().getUiProgressBarAction_0(),
					$current);
			}
		)
		otherlv_1='progressbar'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiProgressBarAccess().getProgressbarKeyword_1());
		}
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getUiProgressBarAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiProgressBarAccess().getUnorderedGroup_2_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiProgressBarAccess().getUnorderedGroup_2_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiProgressBarAccess().getUnorderedGroup_2_1(), 0);
						}
									({true}?=>((
										{
											newCompositeNode(grammarAccess.getUiProgressBarAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
										}
										lv_i18nInfo_4_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiProgressBarRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_4_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiProgressBarAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiProgressBarAccess().getUnorderedGroup_2_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiProgressBarAccess().getUnorderedGroup_2_1(), 1);
						}
									({true}?=>(otherlv_5='styles'
									{
										newLeafNode(otherlv_5, grammarAccess.getUiProgressBarAccess().getStylesKeyword_2_1_1_0());
									}
									(
										(
											lv_styles_6_0=RULE_STRING
											{
												newLeafNode(lv_styles_6_0, grammarAccess.getUiProgressBarAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiProgressBarRule());
												}
												setWithLastConsumed(
													$current,
													"styles",
													lv_styles_6_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiProgressBarAccess().getUnorderedGroup_2_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiProgressBarAccess().getUnorderedGroup_2_1());
					}
			)
			otherlv_7=')'
			{
				newLeafNode(otherlv_7, grammarAccess.getUiProgressBarAccess().getRightParenthesisKeyword_2_2());
			}
		)?
		(
			(
				lv_name_8_0=RULE_ID
				{
					newLeafNode(lv_name_8_0, grammarAccess.getUiProgressBarAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiProgressBarRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_8_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		(
			otherlv_9='{'
			{
				newLeafNode(otherlv_9, grammarAccess.getUiProgressBarAccess().getLeftCurlyBracketKeyword_4_0());
			}
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getUiProgressBarAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
						}
						lv_validators_10_0=ruleUiValidator
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiProgressBarRule());
							}
							add(
								$current,
								"validators",
								lv_validators_10_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getUiProgressBarAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
						}
						lv_bindings_11_0=ruleUiBinding
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiProgressBarRule());
							}
							add(
								$current,
								"bindings",
								lv_bindings_11_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			(
				(
					{
						newCompositeNode(grammarAccess.getUiProgressBarAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
					}
					lv_processorAssignments_12_0=ruleUiVisibilityProcessorAssignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiProgressBarRule());
						}
						add(
							$current,
							"processorAssignments",
							lv_processorAssignments_12_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
						afterParserOrEnumRuleCall();
					}
				)
			)*
			otherlv_13='}'
			{
				newLeafNode(otherlv_13, grammarAccess.getUiProgressBarAccess().getRightCurlyBracketKeyword_4_3());
			}
		)?
	)
;

// Entry rule entryRuleUiImage
entryRuleUiImage returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiImageRule()); }
	iv_ruleUiImage=ruleUiImage
	{ $current=$iv_ruleUiImage.current; }
	EOF;

// Rule UiImage
ruleUiImage returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiImageAccess().getUiImageAction_0(),
					$current);
			}
		)
		otherlv_1='image'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiImageAccess().getImageKeyword_1());
		}
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getUiImageAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiImageAccess().getUnorderedGroup_2_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiImageAccess().getUnorderedGroup_2_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiImageAccess().getUnorderedGroup_2_1(), 0);
						}
									({true}?=>((
										{
											newCompositeNode(grammarAccess.getUiImageAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
										}
										lv_i18nInfo_4_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiImageRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_4_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiImageAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiImageAccess().getUnorderedGroup_2_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiImageAccess().getUnorderedGroup_2_1(), 1);
						}
									({true}?=>(otherlv_5='styles'
									{
										newLeafNode(otherlv_5, grammarAccess.getUiImageAccess().getStylesKeyword_2_1_1_0());
									}
									(
										(
											lv_styles_6_0=RULE_STRING
											{
												newLeafNode(lv_styles_6_0, grammarAccess.getUiImageAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiImageRule());
												}
												setWithLastConsumed(
													$current,
													"styles",
													lv_styles_6_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiImageAccess().getUnorderedGroup_2_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiImageAccess().getUnorderedGroup_2_1());
					}
			)
			otherlv_7=')'
			{
				newLeafNode(otherlv_7, grammarAccess.getUiImageAccess().getRightParenthesisKeyword_2_2());
			}
		)?
		(
			(
				lv_name_8_0=RULE_ID
				{
					newLeafNode(lv_name_8_0, grammarAccess.getUiImageAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiImageRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_8_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		(
			otherlv_9='{'
			{
				newLeafNode(otherlv_9, grammarAccess.getUiImageAccess().getLeftCurlyBracketKeyword_4_0());
			}
			(
				otherlv_10='iconPath'
				{
					newLeafNode(otherlv_10, grammarAccess.getUiImageAccess().getIconPathKeyword_4_1_0());
				}
				(
					(
						lv_value_11_0=RULE_STRING
						{
							newLeafNode(lv_value_11_0, grammarAccess.getUiImageAccess().getValueSTRINGTerminalRuleCall_4_1_1_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getUiImageRule());
							}
							setWithLastConsumed(
								$current,
								"value",
								lv_value_11_0,
								"org.eclipse.xtext.xbase.Xtype.STRING");
						}
					)
				)
				(
					otherlv_12=';'
					{
						newLeafNode(otherlv_12, grammarAccess.getUiImageAccess().getSemicolonKeyword_4_1_2());
					}
				)?
			)?
			(
				(
					{
						newCompositeNode(grammarAccess.getUiImageAccess().getBindingsUiBindingParserRuleCall_4_2_0());
					}
					lv_bindings_13_0=ruleUiBinding
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiImageRule());
						}
						add(
							$current,
							"bindings",
							lv_bindings_13_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
						afterParserOrEnumRuleCall();
					}
				)
			)*
			(
				(
					{
						newCompositeNode(grammarAccess.getUiImageAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0());
					}
					lv_processorAssignments_14_0=ruleUiVisibilityProcessorAssignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiImageRule());
						}
						add(
							$current,
							"processorAssignments",
							lv_processorAssignments_14_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
						afterParserOrEnumRuleCall();
					}
				)
			)*
			otherlv_15='}'
			{
				newLeafNode(otherlv_15, grammarAccess.getUiImageAccess().getRightCurlyBracketKeyword_4_4());
			}
		)?
	)
;

// Entry rule entryRuleUiTable
entryRuleUiTable returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiTableRule()); }
	iv_ruleUiTable=ruleUiTable
	{ $current=$iv_ruleUiTable.current; }
	EOF;

// Rule UiTable
ruleUiTable returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiTableAccess().getUiTableAction_0(),
					$current);
			}
		)
		otherlv_1='table'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiTableAccess().getTableKeyword_1());
		}
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getUiTableAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiTableAccess().getUnorderedGroup_2_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_2_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiTableAccess().getUnorderedGroup_2_1(), 0);
						}
									({true}?=>((
										{
											newCompositeNode(grammarAccess.getUiTableAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
										}
										lv_i18nInfo_4_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiTableRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_4_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTableAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_2_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiTableAccess().getUnorderedGroup_2_1(), 1);
						}
									({true}?=>(otherlv_5='styles'
									{
										newLeafNode(otherlv_5, grammarAccess.getUiTableAccess().getStylesKeyword_2_1_1_0());
									}
									(
										(
											lv_styles_6_0=RULE_STRING
											{
												newLeafNode(lv_styles_6_0, grammarAccess.getUiTableAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiTableRule());
												}
												setWithLastConsumed(
													$current,
													"styles",
													lv_styles_6_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTableAccess().getUnorderedGroup_2_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiTableAccess().getUnorderedGroup_2_1());
					}
			)
			otherlv_7=')'
			{
				newLeafNode(otherlv_7, grammarAccess.getUiTableAccess().getRightParenthesisKeyword_2_2());
			}
		)?
		(
			(
				lv_name_8_0=RULE_ID
				{
					newLeafNode(lv_name_8_0, grammarAccess.getUiTableAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiTableRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_8_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		(
			otherlv_9='{'
			{
				newLeafNode(otherlv_9, grammarAccess.getUiTableAccess().getLeftCurlyBracketKeyword_4_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 0);
						}
									({true}?=>(otherlv_11='type'
									{
										newLeafNode(otherlv_11, grammarAccess.getUiTableAccess().getTypeKeyword_4_1_0_0());
									}
									(
										(
											{
												newCompositeNode(grammarAccess.getUiTableAccess().getJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0());
											}
											lv_jvmType_12_0=ruleJvmTypeReference
											{
												if ($current==null) {
													$current = createModelElementForParent(grammarAccess.getUiTableRule());
												}
												set(
													$current,
													"jvmType",
													lv_jvmType_12_0,
													"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
												afterParserOrEnumRuleCall();
											}
										)
									)
									(
										otherlv_13=';'
										{
											newLeafNode(otherlv_13, grammarAccess.getUiTableAccess().getSemicolonKeyword_4_1_0_2());
										}
									)?
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 1);
						}
									({true}?=>(otherlv_14='selectionType'
									{
										newLeafNode(otherlv_14, grammarAccess.getUiTableAccess().getSelectionTypeKeyword_4_1_1_0());
									}
									(
										(
											{
												newCompositeNode(grammarAccess.getUiTableAccess().getSelectionTypeUiSelectionTypeEnumRuleCall_4_1_1_1_0());
											}
											lv_selectionType_15_0=ruleUiSelectionType
											{
												if ($current==null) {
													$current = createModelElementForParent(grammarAccess.getUiTableRule());
												}
												set(
													$current,
													"selectionType",
													lv_selectionType_15_0,
													"org.eclipse.osbp.ecview.dsl.UIGrammar.UiSelectionType");
												afterParserOrEnumRuleCall();
											}
										)
									)
									(
										otherlv_16=';'
										{
											newLeafNode(otherlv_16, grammarAccess.getUiTableAccess().getSemicolonKeyword_4_1_1_2());
										}
									)?
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 2)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 2);
						}
									({true}?=>(otherlv_17='imageField'
									{
										newLeafNode(otherlv_17, grammarAccess.getUiTableAccess().getImageFieldKeyword_4_1_2_0());
									}
									(
										(
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiTableRule());
												}
											}
											otherlv_18=RULE_ID
											{
												newLeafNode(otherlv_18, grammarAccess.getUiTableAccess().getItemImagePropertyJvmOperationCrossReference_4_1_2_1_0());
											}
										)
									)
									(
										otherlv_19=';'
										{
											newLeafNode(otherlv_19, grammarAccess.getUiTableAccess().getSemicolonKeyword_4_1_2_2());
										}
									)?
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 3)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 3);
						}
									({true}?=>((
										(
											lv_consumeBeanService_20_0='useBeanService'
											{
												newLeafNode(lv_consumeBeanService_20_0, grammarAccess.getUiTableAccess().getConsumeBeanServiceUseBeanServiceKeyword_4_1_3_0_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiTableRule());
												}
												setWithLastConsumed($current, "consumeBeanService", true, "useBeanService");
											}
										)
									)
									(
										otherlv_21=';'
										{
											newLeafNode(otherlv_21, grammarAccess.getUiTableAccess().getSemicolonKeyword_4_1_3_1());
										}
									)?
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 4)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 4);
						}
									({true}?=>((
										(
											lv_scrollToBottom_22_0='scrollToBottom'
											{
												newLeafNode(lv_scrollToBottom_22_0, grammarAccess.getUiTableAccess().getScrollToBottomScrollToBottomKeyword_4_1_4_0_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiTableRule());
												}
												setWithLastConsumed($current, "scrollToBottom", true, "scrollToBottom");
											}
										)
									)
									(
										otherlv_23=';'
										{
											newLeafNode(otherlv_23, grammarAccess.getUiTableAccess().getSemicolonKeyword_4_1_4_1());
										}
									)?
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 5)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1(), 5);
						}
									({true}?=>((
										lv_readonly_24_0='readonly'
										{
											newLeafNode(lv_readonly_24_0, grammarAccess.getUiTableAccess().getReadonlyReadonlyKeyword_4_1_5_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiTableRule());
											}
											setWithLastConsumed($current, "readonly", true, "readonly");
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiTableAccess().getUnorderedGroup_4_1());
					}
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getUiTableAccess().getColumnAssignmentUiColumnsAssignmentParserRuleCall_4_2_0());
					}
					lv_columnAssignment_25_0=ruleUiColumnsAssignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiTableRule());
						}
						set(
							$current,
							"columnAssignment",
							lv_columnAssignment_25_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiColumnsAssignment");
						afterParserOrEnumRuleCall();
					}
				)
			)?
			(
				(
					{
						newCompositeNode(grammarAccess.getUiTableAccess().getSortOrderAssignmentUiSortOrderAssignmentParserRuleCall_4_3_0());
					}
					lv_sortOrderAssignment_26_0=ruleUiSortOrderAssignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiTableRule());
						}
						set(
							$current,
							"sortOrderAssignment",
							lv_sortOrderAssignment_26_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiSortOrderAssignment");
						afterParserOrEnumRuleCall();
					}
				)
			)?
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getUiTableAccess().getValidatorsUiValidatorParserRuleCall_4_4_0_0());
						}
						lv_validators_27_0=ruleUiValidator
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiTableRule());
							}
							add(
								$current,
								"validators",
								lv_validators_27_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getUiTableAccess().getBindingsUiBindingParserRuleCall_4_4_1_0());
						}
						lv_bindings_28_0=ruleUiBinding
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiTableRule());
							}
							add(
								$current,
								"bindings",
								lv_bindings_28_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			(
				(
					{
						newCompositeNode(grammarAccess.getUiTableAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_5_0());
					}
					lv_processorAssignments_29_0=ruleUiVisibilityProcessorAssignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiTableRule());
						}
						add(
							$current,
							"processorAssignments",
							lv_processorAssignments_29_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
						afterParserOrEnumRuleCall();
					}
				)
			)*
			otherlv_30='}'
			{
				newLeafNode(otherlv_30, grammarAccess.getUiTableAccess().getRightCurlyBracketKeyword_4_6());
			}
		)?
	)
;

// Entry rule entryRuleUiComboBox
entryRuleUiComboBox returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiComboBoxRule()); }
	iv_ruleUiComboBox=ruleUiComboBox
	{ $current=$iv_ruleUiComboBox.current; }
	EOF;

// Rule UiComboBox
ruleUiComboBox returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiComboBoxAccess().getUiComboBoxAction_0(),
					$current);
			}
		)
		otherlv_1='combo'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiComboBoxAccess().getComboKeyword_1());
		}
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getUiComboBoxAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_2_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_2_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_2_1(), 0);
						}
									({true}?=>((
										{
											newCompositeNode(grammarAccess.getUiComboBoxAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
										}
										lv_i18nInfo_4_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiComboBoxRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_4_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_2_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_2_1(), 1);
						}
									({true}?=>(otherlv_5='styles'
									{
										newLeafNode(otherlv_5, grammarAccess.getUiComboBoxAccess().getStylesKeyword_2_1_1_0());
									}
									(
										(
											lv_styles_6_0=RULE_STRING
											{
												newLeafNode(lv_styles_6_0, grammarAccess.getUiComboBoxAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiComboBoxRule());
												}
												setWithLastConsumed(
													$current,
													"styles",
													lv_styles_6_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_2_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_2_1());
					}
			)
			otherlv_7=')'
			{
				newLeafNode(otherlv_7, grammarAccess.getUiComboBoxAccess().getRightParenthesisKeyword_2_2());
			}
		)?
		(
			(
				lv_name_8_0=RULE_ID
				{
					newLeafNode(lv_name_8_0, grammarAccess.getUiComboBoxAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiComboBoxRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_8_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		(
			otherlv_9='{'
			{
				newLeafNode(otherlv_9, grammarAccess.getUiComboBoxAccess().getLeftCurlyBracketKeyword_4_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 0);
						}
									({true}?=>(otherlv_11='type'
									{
										newLeafNode(otherlv_11, grammarAccess.getUiComboBoxAccess().getTypeKeyword_4_1_0_0());
									}
									(
										(
											{
												newCompositeNode(grammarAccess.getUiComboBoxAccess().getJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0());
											}
											lv_jvmType_12_0=ruleJvmTypeReference
											{
												if ($current==null) {
													$current = createModelElementForParent(grammarAccess.getUiComboBoxRule());
												}
												set(
													$current,
													"jvmType",
													lv_jvmType_12_0,
													"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
												afterParserOrEnumRuleCall();
											}
										)
									)
									(
										otherlv_13=';'
										{
											newLeafNode(otherlv_13, grammarAccess.getUiComboBoxAccess().getSemicolonKeyword_4_1_0_2());
										}
									)?
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 1);
						}
									({true}?=>(otherlv_14='captionField'
									{
										newLeafNode(otherlv_14, grammarAccess.getUiComboBoxAccess().getCaptionFieldKeyword_4_1_1_0());
									}
									(
										(
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiComboBoxRule());
												}
											}
											otherlv_15=RULE_ID
											{
												newLeafNode(otherlv_15, grammarAccess.getUiComboBoxAccess().getItemCaptionPropertyJvmOperationCrossReference_4_1_1_1_0());
											}
										)
									)
									(
										otherlv_16=';'
										{
											newLeafNode(otherlv_16, grammarAccess.getUiComboBoxAccess().getSemicolonKeyword_4_1_1_2());
										}
									)?
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 2)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 2);
						}
									({true}?=>(otherlv_17='descriptionField'
									{
										newLeafNode(otherlv_17, grammarAccess.getUiComboBoxAccess().getDescriptionFieldKeyword_4_1_2_0());
									}
									(
										(
											{
												newCompositeNode(grammarAccess.getUiComboBoxAccess().getDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_2_1_0());
											}
											lv_descriptionProperty_18_0=ruleUiNestedProperty
											{
												if ($current==null) {
													$current = createModelElementForParent(grammarAccess.getUiComboBoxRule());
												}
												set(
													$current,
													"descriptionProperty",
													lv_descriptionProperty_18_0,
													"org.eclipse.osbp.ecview.dsl.UIGrammar.UiNestedProperty");
												afterParserOrEnumRuleCall();
											}
										)
									)
									(
										otherlv_19=';'
										{
											newLeafNode(otherlv_19, grammarAccess.getUiComboBoxAccess().getSemicolonKeyword_4_1_2_2());
										}
									)?
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 3)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 3);
						}
									({true}?=>(otherlv_20='imageField'
									{
										newLeafNode(otherlv_20, grammarAccess.getUiComboBoxAccess().getImageFieldKeyword_4_1_3_0());
									}
									(
										(
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiComboBoxRule());
												}
											}
											otherlv_21=RULE_ID
											{
												newLeafNode(otherlv_21, grammarAccess.getUiComboBoxAccess().getItemImagePropertyJvmOperationCrossReference_4_1_3_1_0());
											}
										)
									)
									(
										otherlv_22=';'
										{
											newLeafNode(otherlv_22, grammarAccess.getUiComboBoxAccess().getSemicolonKeyword_4_1_3_2());
										}
									)?
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 4)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 4);
						}
									({true}?=>((
										(
											lv_consumeBeanService_23_0='useBeanService'
											{
												newLeafNode(lv_consumeBeanService_23_0, grammarAccess.getUiComboBoxAccess().getConsumeBeanServiceUseBeanServiceKeyword_4_1_4_0_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiComboBoxRule());
												}
												setWithLastConsumed($current, "consumeBeanService", true, "useBeanService");
											}
										)
									)
									(
										otherlv_24=';'
										{
											newLeafNode(otherlv_24, grammarAccess.getUiComboBoxAccess().getSemicolonKeyword_4_1_4_1());
										}
									)?
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 5)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1(), 5);
						}
									({true}?=>((
										lv_readonly_25_0='readonly'
										{
											newLeafNode(lv_readonly_25_0, grammarAccess.getUiComboBoxAccess().getReadonlyReadonlyKeyword_4_1_5_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiComboBoxRule());
											}
											setWithLastConsumed($current, "readonly", true, "readonly");
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiComboBoxAccess().getUnorderedGroup_4_1());
					}
			)
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getUiComboBoxAccess().getValidatorsUiValidatorParserRuleCall_4_2_0_0());
						}
						lv_validators_26_0=ruleUiValidator
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiComboBoxRule());
							}
							add(
								$current,
								"validators",
								lv_validators_26_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getUiComboBoxAccess().getBindingsUiBindingParserRuleCall_4_2_1_0());
						}
						lv_bindings_27_0=ruleUiBinding
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiComboBoxRule());
							}
							add(
								$current,
								"bindings",
								lv_bindings_27_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			(
				(
					{
						newCompositeNode(grammarAccess.getUiComboBoxAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0());
					}
					lv_processorAssignments_28_0=ruleUiVisibilityProcessorAssignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiComboBoxRule());
						}
						add(
							$current,
							"processorAssignments",
							lv_processorAssignments_28_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
						afterParserOrEnumRuleCall();
					}
				)
			)*
			otherlv_29='}'
			{
				newLeafNode(otherlv_29, grammarAccess.getUiComboBoxAccess().getRightCurlyBracketKeyword_4_4());
			}
		)?
	)
;

// Entry rule entryRuleUiButton
entryRuleUiButton returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiButtonRule()); }
	iv_ruleUiButton=ruleUiButton
	{ $current=$iv_ruleUiButton.current; }
	EOF;

// Rule UiButton
ruleUiButton returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiButtonAccess().getUiButtonAction_0(),
					$current);
			}
		)
		otherlv_1='button'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiButtonAccess().getButtonKeyword_1());
		}
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getUiButtonAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1(), 0);
						}
									({true}?=>((
										{
											newCompositeNode(grammarAccess.getUiButtonAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
										}
										lv_i18nInfo_4_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiButtonRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_4_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1(), 1);
						}
									({true}?=>((
										lv_readonly_5_0='readonly'
										{
											newLeafNode(lv_readonly_5_0, grammarAccess.getUiButtonAccess().getReadonlyReadonlyKeyword_2_1_1_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiButtonRule());
											}
											setWithLastConsumed($current, "readonly", true, "readonly");
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1(), 2)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1(), 2);
						}
									({true}?=>(otherlv_6='styles'
									{
										newLeafNode(otherlv_6, grammarAccess.getUiButtonAccess().getStylesKeyword_2_1_2_0());
									}
									(
										(
											lv_styles_7_0=RULE_STRING
											{
												newLeafNode(lv_styles_7_0, grammarAccess.getUiButtonAccess().getStylesSTRINGTerminalRuleCall_2_1_2_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiButtonRule());
												}
												setWithLastConsumed(
													$current,
													"styles",
													lv_styles_7_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiButtonAccess().getUnorderedGroup_2_1());
					}
			)
			otherlv_8=')'
			{
				newLeafNode(otherlv_8, grammarAccess.getUiButtonAccess().getRightParenthesisKeyword_2_2());
			}
		)?
		(
			(
				lv_name_9_0=RULE_ID
				{
					newLeafNode(lv_name_9_0, grammarAccess.getUiButtonAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiButtonRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_9_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
	)
;

// Entry rule entryRuleUiMobileNavigationButton
entryRuleUiMobileNavigationButton returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiMobileNavigationButtonRule()); }
	iv_ruleUiMobileNavigationButton=ruleUiMobileNavigationButton
	{ $current=$iv_ruleUiMobileNavigationButton.current; }
	EOF;

// Rule UiMobileNavigationButton
ruleUiMobileNavigationButton returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiMobileNavigationButtonAccess().getUiMobileNavigationButtonAction_0(),
					$current);
			}
		)
		otherlv_1='navButton'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiMobileNavigationButtonAccess().getNavButtonKeyword_1());
		}
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getUiMobileNavigationButtonAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1(), 0);
						}
									({true}?=>((
										{
											newCompositeNode(grammarAccess.getUiMobileNavigationButtonAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
										}
										lv_i18nInfo_4_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiMobileNavigationButtonRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_4_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1(), 1);
						}
									({true}?=>((
										lv_readonly_5_0='readonly'
										{
											newLeafNode(lv_readonly_5_0, grammarAccess.getUiMobileNavigationButtonAccess().getReadonlyReadonlyKeyword_2_1_1_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiMobileNavigationButtonRule());
											}
											setWithLastConsumed($current, "readonly", true, "readonly");
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1(), 2)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1(), 2);
						}
									({true}?=>(otherlv_6='styles'
									{
										newLeafNode(otherlv_6, grammarAccess.getUiMobileNavigationButtonAccess().getStylesKeyword_2_1_2_0());
									}
									(
										(
											lv_styles_7_0=RULE_STRING
											{
												newLeafNode(lv_styles_7_0, grammarAccess.getUiMobileNavigationButtonAccess().getStylesSTRINGTerminalRuleCall_2_1_2_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiMobileNavigationButtonRule());
												}
												setWithLastConsumed(
													$current,
													"styles",
													lv_styles_7_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiMobileNavigationButtonAccess().getUnorderedGroup_2_1());
					}
			)
			otherlv_8=')'
			{
				newLeafNode(otherlv_8, grammarAccess.getUiMobileNavigationButtonAccess().getRightParenthesisKeyword_2_2());
			}
		)?
		(
			(
				lv_name_9_0=RULE_ID
				{
					newLeafNode(lv_name_9_0, grammarAccess.getUiMobileNavigationButtonAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiMobileNavigationButtonRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_9_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getUiMobileNavigationButtonAccess().getTargetPageUiMobileNavigationPageParserRuleCall_4_0_0());
					}
					lv_targetPage_10_0=ruleUiMobileNavigationPage
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiMobileNavigationButtonRule());
						}
						set(
							$current,
							"targetPage",
							lv_targetPage_10_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiMobileNavigationPage");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				otherlv_11='alias'
				{
					newLeafNode(otherlv_11, grammarAccess.getUiMobileNavigationButtonAccess().getAliasKeyword_4_1_0());
				}
				(
					(
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getUiMobileNavigationButtonRule());
							}
						}
						otherlv_12=RULE_ID
						{
							newLeafNode(otherlv_12, grammarAccess.getUiMobileNavigationButtonAccess().getTargetPageAliasUiMobileNavigationPageCrossReference_4_1_1_0());
						}
					)
				)
			)
		)
	)
;

// Entry rule entryRuleUiMobileSwitch
entryRuleUiMobileSwitch returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiMobileSwitchRule()); }
	iv_ruleUiMobileSwitch=ruleUiMobileSwitch
	{ $current=$iv_ruleUiMobileSwitch.current; }
	EOF;

// Rule UiMobileSwitch
ruleUiMobileSwitch returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiMobileSwitchAccess().getUiSwitchAction_0(),
					$current);
			}
		)
		otherlv_1='switchIt'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiMobileSwitchAccess().getSwitchItKeyword_1());
		}
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getUiMobileSwitchAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1(), 0);
						}
									({true}?=>((
										{
											newCompositeNode(grammarAccess.getUiMobileSwitchAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
										}
										lv_i18nInfo_4_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiMobileSwitchRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_4_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1(), 1);
						}
									({true}?=>((
										lv_readonly_5_0='readonly'
										{
											newLeafNode(lv_readonly_5_0, grammarAccess.getUiMobileSwitchAccess().getReadonlyReadonlyKeyword_2_1_1_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiMobileSwitchRule());
											}
											setWithLastConsumed($current, "readonly", true, "readonly");
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1(), 2)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1(), 2);
						}
									({true}?=>(otherlv_6='styles'
									{
										newLeafNode(otherlv_6, grammarAccess.getUiMobileSwitchAccess().getStylesKeyword_2_1_2_0());
									}
									(
										(
											lv_styles_7_0=RULE_STRING
											{
												newLeafNode(lv_styles_7_0, grammarAccess.getUiMobileSwitchAccess().getStylesSTRINGTerminalRuleCall_2_1_2_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiMobileSwitchRule());
												}
												setWithLastConsumed(
													$current,
													"styles",
													lv_styles_7_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiMobileSwitchAccess().getUnorderedGroup_2_1());
					}
			)
			otherlv_8=')'
			{
				newLeafNode(otherlv_8, grammarAccess.getUiMobileSwitchAccess().getRightParenthesisKeyword_2_2());
			}
		)?
		(
			(
				lv_name_9_0=RULE_ID
				{
					newLeafNode(lv_name_9_0, grammarAccess.getUiMobileSwitchAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiMobileSwitchRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_9_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		(
			otherlv_10='{'
			{
				newLeafNode(otherlv_10, grammarAccess.getUiMobileSwitchAccess().getLeftCurlyBracketKeyword_4_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getUiMobileSwitchAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_1_0());
					}
					lv_processorAssignments_11_0=ruleUiVisibilityProcessorAssignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiMobileSwitchRule());
						}
						add(
							$current,
							"processorAssignments",
							lv_processorAssignments_11_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
						afterParserOrEnumRuleCall();
					}
				)
			)*
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getUiMobileSwitchAccess().getValidatorsUiValidatorParserRuleCall_4_2_0_0());
						}
						lv_validators_12_0=ruleUiValidator
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiMobileSwitchRule());
							}
							add(
								$current,
								"validators",
								lv_validators_12_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getUiMobileSwitchAccess().getBindingsUiBindingParserRuleCall_4_2_1_0());
						}
						lv_bindings_13_0=ruleUiBinding
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiMobileSwitchRule());
							}
							add(
								$current,
								"bindings",
								lv_bindings_13_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			otherlv_14='}'
			{
				newLeafNode(otherlv_14, grammarAccess.getUiMobileSwitchAccess().getRightCurlyBracketKeyword_4_3());
			}
		)?
	)
;

// Entry rule entryRuleUiLabel
entryRuleUiLabel returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiLabelRule()); }
	iv_ruleUiLabel=ruleUiLabel
	{ $current=$iv_ruleUiLabel.current; }
	EOF;

// Rule UiLabel
ruleUiLabel returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiLabelAccess().getUiLabelAction_0(),
					$current);
			}
		)
		otherlv_1='label'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiLabelAccess().getLabelKeyword_1());
		}
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getUiLabelAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiLabelAccess().getUnorderedGroup_2_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiLabelAccess().getUnorderedGroup_2_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiLabelAccess().getUnorderedGroup_2_1(), 0);
						}
									({true}?=>((
										{
											newCompositeNode(grammarAccess.getUiLabelAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
										}
										lv_i18nInfo_4_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiLabelRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_4_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiLabelAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiLabelAccess().getUnorderedGroup_2_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiLabelAccess().getUnorderedGroup_2_1(), 1);
						}
									({true}?=>(otherlv_5='styles'
									{
										newLeafNode(otherlv_5, grammarAccess.getUiLabelAccess().getStylesKeyword_2_1_1_0());
									}
									(
										(
											lv_styles_6_0=RULE_STRING
											{
												newLeafNode(lv_styles_6_0, grammarAccess.getUiLabelAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiLabelRule());
												}
												setWithLastConsumed(
													$current,
													"styles",
													lv_styles_6_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiLabelAccess().getUnorderedGroup_2_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiLabelAccess().getUnorderedGroup_2_1());
					}
			)
			otherlv_7=')'
			{
				newLeafNode(otherlv_7, grammarAccess.getUiLabelAccess().getRightParenthesisKeyword_2_2());
			}
		)?
		(
			(
				lv_name_8_0=RULE_ID
				{
					newLeafNode(lv_name_8_0, grammarAccess.getUiLabelAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiLabelRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_8_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		(
			otherlv_9='{'
			{
				newLeafNode(otherlv_9, grammarAccess.getUiLabelAccess().getLeftCurlyBracketKeyword_4_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getUiLabelAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_1_0());
					}
					lv_processorAssignments_10_0=ruleUiVisibilityProcessorAssignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiLabelRule());
						}
						add(
							$current,
							"processorAssignments",
							lv_processorAssignments_10_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
						afterParserOrEnumRuleCall();
					}
				)
			)*
			(
				(
					{
						newCompositeNode(grammarAccess.getUiLabelAccess().getBindingsUiBindingParserRuleCall_4_2_0());
					}
					lv_bindings_11_0=ruleUiBinding
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiLabelRule());
						}
						add(
							$current,
							"bindings",
							lv_bindings_11_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
						afterParserOrEnumRuleCall();
					}
				)
			)*
			otherlv_12='}'
			{
				newLeafNode(otherlv_12, grammarAccess.getUiLabelAccess().getRightCurlyBracketKeyword_4_3());
			}
		)?
	)
;

// Entry rule entryRuleUiDecimalField
entryRuleUiDecimalField returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiDecimalFieldRule()); }
	iv_ruleUiDecimalField=ruleUiDecimalField
	{ $current=$iv_ruleUiDecimalField.current; }
	EOF;

// Rule UiDecimalField
ruleUiDecimalField returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiDecimalFieldAccess().getUiDecimalFieldAction_0(),
					$current);
			}
		)
		otherlv_1='decimalField'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiDecimalFieldAccess().getDecimalFieldKeyword_1());
		}
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getUiDecimalFieldAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 0);
						}
									({true}?=>((
										lv_noGrouping_4_0='noGrouping'
										{
											newLeafNode(lv_noGrouping_4_0, grammarAccess.getUiDecimalFieldAccess().getNoGroupingNoGroupingKeyword_2_1_0_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiDecimalFieldRule());
											}
											setWithLastConsumed($current, "noGrouping", true, "noGrouping");
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 1);
						}
									({true}?=>((
										lv_noMarkNegative_5_0='noMarkNegative'
										{
											newLeafNode(lv_noMarkNegative_5_0, grammarAccess.getUiDecimalFieldAccess().getNoMarkNegativeNoMarkNegativeKeyword_2_1_1_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiDecimalFieldRule());
											}
											setWithLastConsumed($current, "noMarkNegative", true, "noMarkNegative");
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 2)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 2);
						}
									({true}?=>(otherlv_6='styles'
									{
										newLeafNode(otherlv_6, grammarAccess.getUiDecimalFieldAccess().getStylesKeyword_2_1_2_0());
									}
									(
										(
											lv_styles_7_0=RULE_STRING
											{
												newLeafNode(lv_styles_7_0, grammarAccess.getUiDecimalFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_2_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiDecimalFieldRule());
												}
												setWithLastConsumed(
													$current,
													"styles",
													lv_styles_7_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 3)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 3);
						}
									({true}?=>(otherlv_8='precision='
									{
										newLeafNode(otherlv_8, grammarAccess.getUiDecimalFieldAccess().getPrecisionKeyword_2_1_3_0());
									}
									(
										(
											lv_precision_9_0=RULE_INT
											{
												newLeafNode(lv_precision_9_0, grammarAccess.getUiDecimalFieldAccess().getPrecisionINTTerminalRuleCall_2_1_3_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiDecimalFieldRule());
												}
												setWithLastConsumed(
													$current,
													"precision",
													lv_precision_9_0,
													"org.eclipse.xtext.xbase.Xbase.INT");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 4)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 4);
						}
									({true}?=>((
										{
											newCompositeNode(grammarAccess.getUiDecimalFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_4_0());
										}
										lv_i18nInfo_10_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiDecimalFieldRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_10_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 5)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1(), 5);
						}
									({true}?=>((
										lv_readonly_11_0='readonly'
										{
											newLeafNode(lv_readonly_11_0, grammarAccess.getUiDecimalFieldAccess().getReadonlyReadonlyKeyword_2_1_5_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiDecimalFieldRule());
											}
											setWithLastConsumed($current, "readonly", true, "readonly");
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiDecimalFieldAccess().getUnorderedGroup_2_1());
					}
			)
			otherlv_12=')'
			{
				newLeafNode(otherlv_12, grammarAccess.getUiDecimalFieldAccess().getRightParenthesisKeyword_2_2());
			}
		)?
		(
			(
				lv_name_13_0=RULE_ID
				{
					newLeafNode(lv_name_13_0, grammarAccess.getUiDecimalFieldAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiDecimalFieldRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_13_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		(
			otherlv_14='{'
			{
				newLeafNode(otherlv_14, grammarAccess.getUiDecimalFieldAccess().getLeftCurlyBracketKeyword_4_0());
			}
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getUiDecimalFieldAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
						}
						lv_validators_15_0=ruleUiValidator
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiDecimalFieldRule());
							}
							add(
								$current,
								"validators",
								lv_validators_15_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getUiDecimalFieldAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
						}
						lv_bindings_16_0=ruleUiBinding
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiDecimalFieldRule());
							}
							add(
								$current,
								"bindings",
								lv_bindings_16_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			(
				(
					{
						newCompositeNode(grammarAccess.getUiDecimalFieldAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
					}
					lv_processorAssignments_17_0=ruleUiVisibilityProcessorAssignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiDecimalFieldRule());
						}
						add(
							$current,
							"processorAssignments",
							lv_processorAssignments_17_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
						afterParserOrEnumRuleCall();
					}
				)
			)*
			otherlv_18='}'
			{
				newLeafNode(otherlv_18, grammarAccess.getUiDecimalFieldAccess().getRightCurlyBracketKeyword_4_3());
			}
		)?
	)
;

// Entry rule entryRuleUiOptionsGroup
entryRuleUiOptionsGroup returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiOptionsGroupRule()); }
	iv_ruleUiOptionsGroup=ruleUiOptionsGroup
	{ $current=$iv_ruleUiOptionsGroup.current; }
	EOF;

// Rule UiOptionsGroup
ruleUiOptionsGroup returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiOptionsGroupAccess().getUiOptionsGroupAction_0(),
					$current);
			}
		)
		otherlv_1='optionsgroup'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiOptionsGroupAccess().getOptionsgroupKeyword_1());
		}
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getUiOptionsGroupAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_2_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_2_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_2_1(), 0);
						}
									({true}?=>((
										{
											newCompositeNode(grammarAccess.getUiOptionsGroupAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
										}
										lv_i18nInfo_4_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiOptionsGroupRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_4_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_2_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_2_1(), 1);
						}
									({true}?=>(otherlv_5='styles'
									{
										newLeafNode(otherlv_5, grammarAccess.getUiOptionsGroupAccess().getStylesKeyword_2_1_1_0());
									}
									(
										(
											lv_styles_6_0=RULE_STRING
											{
												newLeafNode(lv_styles_6_0, grammarAccess.getUiOptionsGroupAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiOptionsGroupRule());
												}
												setWithLastConsumed(
													$current,
													"styles",
													lv_styles_6_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_2_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_2_1());
					}
			)
			otherlv_7=')'
			{
				newLeafNode(otherlv_7, grammarAccess.getUiOptionsGroupAccess().getRightParenthesisKeyword_2_2());
			}
		)?
		(
			(
				lv_name_8_0=RULE_ID
				{
					newLeafNode(lv_name_8_0, grammarAccess.getUiOptionsGroupAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiOptionsGroupRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_8_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		(
			otherlv_9='{'
			{
				newLeafNode(otherlv_9, grammarAccess.getUiOptionsGroupAccess().getLeftCurlyBracketKeyword_4_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 0);
						}
									({true}?=>(otherlv_11='type'
									{
										newLeafNode(otherlv_11, grammarAccess.getUiOptionsGroupAccess().getTypeKeyword_4_1_0_0());
									}
									(
										(
											{
												newCompositeNode(grammarAccess.getUiOptionsGroupAccess().getJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0());
											}
											lv_jvmType_12_0=ruleJvmTypeReference
											{
												if ($current==null) {
													$current = createModelElementForParent(grammarAccess.getUiOptionsGroupRule());
												}
												set(
													$current,
													"jvmType",
													lv_jvmType_12_0,
													"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
												afterParserOrEnumRuleCall();
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 1);
						}
									({true}?=>(otherlv_13='selectionType'
									{
										newLeafNode(otherlv_13, grammarAccess.getUiOptionsGroupAccess().getSelectionTypeKeyword_4_1_1_0());
									}
									(
										(
											{
												newCompositeNode(grammarAccess.getUiOptionsGroupAccess().getSelectionTypeUiSelectionTypeEnumRuleCall_4_1_1_1_0());
											}
											lv_selectionType_14_0=ruleUiSelectionType
											{
												if ($current==null) {
													$current = createModelElementForParent(grammarAccess.getUiOptionsGroupRule());
												}
												set(
													$current,
													"selectionType",
													lv_selectionType_14_0,
													"org.eclipse.osbp.ecview.dsl.UIGrammar.UiSelectionType");
												afterParserOrEnumRuleCall();
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 2)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 2);
						}
									({true}?=>(otherlv_15='captionField'
									{
										newLeafNode(otherlv_15, grammarAccess.getUiOptionsGroupAccess().getCaptionFieldKeyword_4_1_2_0());
									}
									(
										(
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiOptionsGroupRule());
												}
											}
											otherlv_16=RULE_ID
											{
												newLeafNode(otherlv_16, grammarAccess.getUiOptionsGroupAccess().getItemCaptionPropertyJvmOperationCrossReference_4_1_2_1_0());
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 3)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 3);
						}
									({true}?=>(otherlv_17='descriptionField'
									{
										newLeafNode(otherlv_17, grammarAccess.getUiOptionsGroupAccess().getDescriptionFieldKeyword_4_1_3_0());
									}
									(
										(
											{
												newCompositeNode(grammarAccess.getUiOptionsGroupAccess().getDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_3_1_0());
											}
											lv_descriptionProperty_18_0=ruleUiNestedProperty
											{
												if ($current==null) {
													$current = createModelElementForParent(grammarAccess.getUiOptionsGroupRule());
												}
												set(
													$current,
													"descriptionProperty",
													lv_descriptionProperty_18_0,
													"org.eclipse.osbp.ecview.dsl.UIGrammar.UiNestedProperty");
												afterParserOrEnumRuleCall();
											}
										)
									)
									(
										otherlv_19=';'
										{
											newLeafNode(otherlv_19, grammarAccess.getUiOptionsGroupAccess().getSemicolonKeyword_4_1_3_2());
										}
									)?
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 4)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 4);
						}
									({true}?=>(otherlv_20='imageField'
									{
										newLeafNode(otherlv_20, grammarAccess.getUiOptionsGroupAccess().getImageFieldKeyword_4_1_4_0());
									}
									(
										(
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiOptionsGroupRule());
												}
											}
											otherlv_21=RULE_ID
											{
												newLeafNode(otherlv_21, grammarAccess.getUiOptionsGroupAccess().getItemImagePropertyJvmOperationCrossReference_4_1_4_1_0());
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 5)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 5);
						}
									({true}?=>((
										(
											lv_consumeBeanService_22_0='useBeanService'
											{
												newLeafNode(lv_consumeBeanService_22_0, grammarAccess.getUiOptionsGroupAccess().getConsumeBeanServiceUseBeanServiceKeyword_4_1_5_0_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiOptionsGroupRule());
												}
												setWithLastConsumed($current, "consumeBeanService", true, "useBeanService");
											}
										)
									)
									(
										otherlv_23=';'
										{
											newLeafNode(otherlv_23, grammarAccess.getUiOptionsGroupAccess().getSemicolonKeyword_4_1_5_1());
										}
									)?
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 6)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1(), 6);
						}
									({true}?=>((
										lv_readonly_24_0='readonly'
										{
											newLeafNode(lv_readonly_24_0, grammarAccess.getUiOptionsGroupAccess().getReadonlyReadonlyKeyword_4_1_6_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiOptionsGroupRule());
											}
											setWithLastConsumed($current, "readonly", true, "readonly");
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiOptionsGroupAccess().getUnorderedGroup_4_1());
					}
			)
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getUiOptionsGroupAccess().getValidatorsUiValidatorParserRuleCall_4_2_0_0());
						}
						lv_validators_25_0=ruleUiValidator
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiOptionsGroupRule());
							}
							add(
								$current,
								"validators",
								lv_validators_25_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getUiOptionsGroupAccess().getBindingsUiBindingParserRuleCall_4_2_1_0());
						}
						lv_bindings_26_0=ruleUiBinding
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiOptionsGroupRule());
							}
							add(
								$current,
								"bindings",
								lv_bindings_26_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			(
				(
					{
						newCompositeNode(grammarAccess.getUiOptionsGroupAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0());
					}
					lv_processorAssignments_27_0=ruleUiVisibilityProcessorAssignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiOptionsGroupRule());
						}
						add(
							$current,
							"processorAssignments",
							lv_processorAssignments_27_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
						afterParserOrEnumRuleCall();
					}
				)
			)*
			otherlv_28='}'
			{
				newLeafNode(otherlv_28, grammarAccess.getUiOptionsGroupAccess().getRightCurlyBracketKeyword_4_4());
			}
		)?
	)
;

// Entry rule entryRuleUiList
entryRuleUiList returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiListRule()); }
	iv_ruleUiList=ruleUiList
	{ $current=$iv_ruleUiList.current; }
	EOF;

// Rule UiList
ruleUiList returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiListAccess().getUiListAction_0(),
					$current);
			}
		)
		otherlv_1='listSelect'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiListAccess().getListSelectKeyword_1());
		}
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getUiListAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiListAccess().getUnorderedGroup_2_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_2_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiListAccess().getUnorderedGroup_2_1(), 0);
						}
									({true}?=>((
										{
											newCompositeNode(grammarAccess.getUiListAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
										}
										lv_i18nInfo_4_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiListRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_4_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiListAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_2_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiListAccess().getUnorderedGroup_2_1(), 1);
						}
									({true}?=>(otherlv_5='styles'
									{
										newLeafNode(otherlv_5, grammarAccess.getUiListAccess().getStylesKeyword_2_1_1_0());
									}
									(
										(
											lv_styles_6_0=RULE_STRING
											{
												newLeafNode(lv_styles_6_0, grammarAccess.getUiListAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiListRule());
												}
												setWithLastConsumed(
													$current,
													"styles",
													lv_styles_6_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiListAccess().getUnorderedGroup_2_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiListAccess().getUnorderedGroup_2_1());
					}
			)
			otherlv_7=')'
			{
				newLeafNode(otherlv_7, grammarAccess.getUiListAccess().getRightParenthesisKeyword_2_2());
			}
		)?
		(
			(
				lv_name_8_0=RULE_ID
				{
					newLeafNode(lv_name_8_0, grammarAccess.getUiListAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiListRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_8_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		(
			otherlv_9='{'
			{
				newLeafNode(otherlv_9, grammarAccess.getUiListAccess().getLeftCurlyBracketKeyword_4_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiListAccess().getUnorderedGroup_4_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 0);
						}
									({true}?=>(otherlv_11='type'
									{
										newLeafNode(otherlv_11, grammarAccess.getUiListAccess().getTypeKeyword_4_1_0_0());
									}
									(
										(
											{
												newCompositeNode(grammarAccess.getUiListAccess().getJvmTypeJvmTypeReferenceParserRuleCall_4_1_0_1_0());
											}
											lv_jvmType_12_0=ruleJvmTypeReference
											{
												if ($current==null) {
													$current = createModelElementForParent(grammarAccess.getUiListRule());
												}
												set(
													$current,
													"jvmType",
													lv_jvmType_12_0,
													"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
												afterParserOrEnumRuleCall();
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiListAccess().getUnorderedGroup_4_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 1);
						}
									({true}?=>(otherlv_13='selectionType'
									{
										newLeafNode(otherlv_13, grammarAccess.getUiListAccess().getSelectionTypeKeyword_4_1_1_0());
									}
									(
										(
											{
												newCompositeNode(grammarAccess.getUiListAccess().getSelectionTypeUiSelectionTypeEnumRuleCall_4_1_1_1_0());
											}
											lv_selectionType_14_0=ruleUiSelectionType
											{
												if ($current==null) {
													$current = createModelElementForParent(grammarAccess.getUiListRule());
												}
												set(
													$current,
													"selectionType",
													lv_selectionType_14_0,
													"org.eclipse.osbp.ecview.dsl.UIGrammar.UiSelectionType");
												afterParserOrEnumRuleCall();
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiListAccess().getUnorderedGroup_4_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 2)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 2);
						}
									({true}?=>(otherlv_15='captionField'
									{
										newLeafNode(otherlv_15, grammarAccess.getUiListAccess().getCaptionFieldKeyword_4_1_2_0());
									}
									(
										(
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiListRule());
												}
											}
											otherlv_16=RULE_ID
											{
												newLeafNode(otherlv_16, grammarAccess.getUiListAccess().getItemCaptionPropertyJvmOperationCrossReference_4_1_2_1_0());
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiListAccess().getUnorderedGroup_4_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 3)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 3);
						}
									({true}?=>(otherlv_17='descriptionField'
									{
										newLeafNode(otherlv_17, grammarAccess.getUiListAccess().getDescriptionFieldKeyword_4_1_3_0());
									}
									(
										(
											{
												newCompositeNode(grammarAccess.getUiListAccess().getDescriptionPropertyUiNestedPropertyParserRuleCall_4_1_3_1_0());
											}
											lv_descriptionProperty_18_0=ruleUiNestedProperty
											{
												if ($current==null) {
													$current = createModelElementForParent(grammarAccess.getUiListRule());
												}
												set(
													$current,
													"descriptionProperty",
													lv_descriptionProperty_18_0,
													"org.eclipse.osbp.ecview.dsl.UIGrammar.UiNestedProperty");
												afterParserOrEnumRuleCall();
											}
										)
									)
									(
										otherlv_19=';'
										{
											newLeafNode(otherlv_19, grammarAccess.getUiListAccess().getSemicolonKeyword_4_1_3_2());
										}
									)?
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiListAccess().getUnorderedGroup_4_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 4)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 4);
						}
									({true}?=>(otherlv_20='imageField'
									{
										newLeafNode(otherlv_20, grammarAccess.getUiListAccess().getImageFieldKeyword_4_1_4_0());
									}
									(
										(
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiListRule());
												}
											}
											otherlv_21=RULE_ID
											{
												newLeafNode(otherlv_21, grammarAccess.getUiListAccess().getItemImagePropertyJvmOperationCrossReference_4_1_4_1_0());
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiListAccess().getUnorderedGroup_4_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 5)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 5);
						}
									({true}?=>((
										(
											lv_consumeBeanService_22_0='useBeanService'
											{
												newLeafNode(lv_consumeBeanService_22_0, grammarAccess.getUiListAccess().getConsumeBeanServiceUseBeanServiceKeyword_4_1_5_0_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiListRule());
												}
												setWithLastConsumed($current, "consumeBeanService", true, "useBeanService");
											}
										)
									)
									(
										otherlv_23=';'
										{
											newLeafNode(otherlv_23, grammarAccess.getUiListAccess().getSemicolonKeyword_4_1_5_1());
										}
									)?
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiListAccess().getUnorderedGroup_4_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 6)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiListAccess().getUnorderedGroup_4_1(), 6);
						}
									({true}?=>((
										lv_readonly_24_0='readonly'
										{
											newLeafNode(lv_readonly_24_0, grammarAccess.getUiListAccess().getReadonlyReadonlyKeyword_4_1_6_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiListRule());
											}
											setWithLastConsumed($current, "readonly", true, "readonly");
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiListAccess().getUnorderedGroup_4_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiListAccess().getUnorderedGroup_4_1());
					}
			)
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getUiListAccess().getValidatorsUiValidatorParserRuleCall_4_2_0_0());
						}
						lv_validators_25_0=ruleUiValidator
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiListRule());
							}
							add(
								$current,
								"validators",
								lv_validators_25_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getUiListAccess().getBindingsUiBindingParserRuleCall_4_2_1_0());
						}
						lv_bindings_26_0=ruleUiBinding
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiListRule());
							}
							add(
								$current,
								"bindings",
								lv_bindings_26_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			(
				(
					{
						newCompositeNode(grammarAccess.getUiListAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_3_0());
					}
					lv_processorAssignments_27_0=ruleUiVisibilityProcessorAssignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiListRule());
						}
						add(
							$current,
							"processorAssignments",
							lv_processorAssignments_27_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
						afterParserOrEnumRuleCall();
					}
				)
			)*
			otherlv_28='}'
			{
				newLeafNode(otherlv_28, grammarAccess.getUiListAccess().getRightCurlyBracketKeyword_4_4());
			}
		)?
	)
;

// Entry rule entryRuleUiColumnsAssignment
entryRuleUiColumnsAssignment returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiColumnsAssignmentRule()); }
	iv_ruleUiColumnsAssignment=ruleUiColumnsAssignment
	{ $current=$iv_ruleUiColumnsAssignment.current; }
	EOF;

// Rule UiColumnsAssignment
ruleUiColumnsAssignment returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiColumnsAssignmentAccess().getUiColumnsAssignmentAction_0(),
					$current);
			}
		)
		otherlv_1='columns'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiColumnsAssignmentAccess().getColumnsKeyword_1());
		}
		otherlv_2='{'
		{
			newLeafNode(otherlv_2, grammarAccess.getUiColumnsAssignmentAccess().getLeftCurlyBracketKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getUiColumnsAssignmentAccess().getColumnsUiColumnParserRuleCall_3_0());
				}
				lv_columns_3_0=ruleUiColumn
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiColumnsAssignmentRule());
					}
					add(
						$current,
						"columns",
						lv_columns_3_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiColumn");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		otherlv_4='}'
		{
			newLeafNode(otherlv_4, grammarAccess.getUiColumnsAssignmentAccess().getRightCurlyBracketKeyword_4());
		}
	)
;

// Entry rule entryRuleUiSortOrderAssignment
entryRuleUiSortOrderAssignment returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiSortOrderAssignmentRule()); }
	iv_ruleUiSortOrderAssignment=ruleUiSortOrderAssignment
	{ $current=$iv_ruleUiSortOrderAssignment.current; }
	EOF;

// Rule UiSortOrderAssignment
ruleUiSortOrderAssignment returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiSortOrderAssignmentAccess().getUiSortOrderAssignmentAction_0(),
					$current);
			}
		)
		otherlv_1='sort'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiSortOrderAssignmentAccess().getSortKeyword_1());
		}
		otherlv_2='{'
		{
			newLeafNode(otherlv_2, grammarAccess.getUiSortOrderAssignmentAccess().getLeftCurlyBracketKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getUiSortOrderAssignmentAccess().getColumnsUiSortOrderParserRuleCall_3_0());
				}
				lv_columns_3_0=ruleUiSortOrder
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiSortOrderAssignmentRule());
					}
					add(
						$current,
						"columns",
						lv_columns_3_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiSortOrder");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		otherlv_4='}'
		{
			newLeafNode(otherlv_4, grammarAccess.getUiSortOrderAssignmentAccess().getRightCurlyBracketKeyword_4());
		}
	)
;

// Entry rule entryRuleUiSortOrder
entryRuleUiSortOrder returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiSortOrderRule()); }
	iv_ruleUiSortOrder=ruleUiSortOrder
	{ $current=$iv_ruleUiSortOrder.current; }
	EOF;

// Rule UiSortOrder
ruleUiSortOrder returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='column'
		{
			newLeafNode(otherlv_0, grammarAccess.getUiSortOrderAccess().getColumnKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getUiSortOrderAccess().getPropertyUiNestedPropertyParserRuleCall_1_0());
				}
				lv_property_1_0=ruleUiNestedProperty
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiSortOrderRule());
					}
					set(
						$current,
						"property",
						lv_property_1_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiNestedProperty");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_2='desc'
			{
				newLeafNode(otherlv_2, grammarAccess.getUiSortOrderAccess().getDescKeyword_2_0());
			}
			    |
			(
				(
					lv_asc_3_0='asc'
					{
						newLeafNode(lv_asc_3_0, grammarAccess.getUiSortOrderAccess().getAscAscKeyword_2_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getUiSortOrderRule());
						}
						setWithLastConsumed($current, "asc", true, "asc");
					}
				)
			)
		)?
		(
			otherlv_4=';'
			{
				newLeafNode(otherlv_4, grammarAccess.getUiSortOrderAccess().getSemicolonKeyword_3());
			}
		)?
	)
;

// Entry rule entryRuleUiColumn
entryRuleUiColumn returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiColumnRule()); }
	iv_ruleUiColumn=ruleUiColumn
	{ $current=$iv_ruleUiColumn.current; }
	EOF;

// Rule UiColumn
ruleUiColumn returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiColumnAccess().getUiColumnAction_0(),
					$current);
			}
		)
		otherlv_1='column'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiColumnAccess().getColumnKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getUiColumnAccess().getPropertyUiNestedPropertyParserRuleCall_2_0());
				}
				lv_property_2_0=ruleUiNestedProperty
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiColumnRule());
					}
					set(
						$current,
						"property",
						lv_property_2_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiNestedProperty");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			otherlv_3='icon'
			{
				newLeafNode(otherlv_3, grammarAccess.getUiColumnAccess().getIconKeyword_3_0());
			}
			(
				(
					lv_iconName_4_0=RULE_STRING
					{
						newLeafNode(lv_iconName_4_0, grammarAccess.getUiColumnAccess().getIconNameSTRINGTerminalRuleCall_3_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getUiColumnRule());
						}
						setWithLastConsumed(
							$current,
							"iconName",
							lv_iconName_4_0,
							"org.eclipse.xtext.xbase.Xtype.STRING");
					}
				)
			)
		)?
		(
			otherlv_5=';'
			{
				newLeafNode(otherlv_5, grammarAccess.getUiColumnAccess().getSemicolonKeyword_4());
			}
		)?
	)
;

// Entry rule entryRuleUiEmbeddable
entryRuleUiEmbeddable returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiEmbeddableRule()); }
	iv_ruleUiEmbeddable=ruleUiEmbeddable
	{ $current=$iv_ruleUiEmbeddable.current; }
	EOF;

// Rule UiEmbeddable
ruleUiEmbeddable returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getUiEmbeddableAccess().getUiLayoutParserRuleCall_0());
		}
		this_UiLayout_0=ruleUiLayout
		{
			$current = $this_UiLayout_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiEmbeddableAccess().getUiFieldParserRuleCall_1());
		}
		this_UiField_1=ruleUiField
		{
			$current = $this_UiField_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiEmbeddableAccess().getUiActionParserRuleCall_2());
		}
		this_UiAction_2=ruleUiAction
		{
			$current = $this_UiAction_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiEmbeddableAccess().getUiTabSheetParserRuleCall_3());
		}
		this_UiTabSheet_3=ruleUiTabSheet
		{
			$current = $this_UiTabSheet_3.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleUiMobileEmbeddable
entryRuleUiMobileEmbeddable returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiMobileEmbeddableRule()); }
	iv_ruleUiMobileEmbeddable=ruleUiMobileEmbeddable
	{ $current=$iv_ruleUiMobileEmbeddable.current; }
	EOF;

// Rule UiMobileEmbeddable
ruleUiMobileEmbeddable returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getUiMobileEmbeddableAccess().getUiMobileLayoutParserRuleCall_0());
		}
		this_UiMobileLayout_0=ruleUiMobileLayout
		{
			$current = $this_UiMobileLayout_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiMobileEmbeddableAccess().getUiMobileFieldParserRuleCall_1());
		}
		this_UiMobileField_1=ruleUiMobileField
		{
			$current = $this_UiMobileField_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiMobileEmbeddableAccess().getUiMobileTabSheetParserRuleCall_2());
		}
		this_UiMobileTabSheet_2=ruleUiMobileTabSheet
		{
			$current = $this_UiMobileTabSheet_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiMobileEmbeddableAccess().getUiMobileActionParserRuleCall_3());
		}
		this_UiMobileAction_3=ruleUiMobileAction
		{
			$current = $this_UiMobileAction_3.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleUiMobileLayout
entryRuleUiMobileLayout returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiMobileLayoutRule()); }
	iv_ruleUiMobileLayout=ruleUiMobileLayout
	{ $current=$iv_ruleUiMobileLayout.current; }
	EOF;

// Rule UiMobileLayout
ruleUiMobileLayout returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getUiMobileLayoutAccess().getUiMobileHorizontalButtonGroupParserRuleCall_0());
		}
		this_UiMobileHorizontalButtonGroup_0=ruleUiMobileHorizontalButtonGroup
		{
			$current = $this_UiMobileHorizontalButtonGroup_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiMobileLayoutAccess().getUiMobileVerticalComponentGroupParserRuleCall_1());
		}
		this_UiMobileVerticalComponentGroup_1=ruleUiMobileVerticalComponentGroup
		{
			$current = $this_UiMobileVerticalComponentGroup_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiMobileLayoutAccess().getUiMobileNavigationPageParserRuleCall_2());
		}
		this_UiMobileNavigationPage_2=ruleUiMobileNavigationPage
		{
			$current = $this_UiMobileNavigationPage_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiMobileLayoutAccess().getUiMobileHorizontalLayoutParserRuleCall_3());
		}
		this_UiMobileHorizontalLayout_3=ruleUiMobileHorizontalLayout
		{
			$current = $this_UiMobileHorizontalLayout_3.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiMobileLayoutAccess().getUiMobileVerticalLayoutParserRuleCall_4());
		}
		this_UiMobileVerticalLayout_4=ruleUiMobileVerticalLayout
		{
			$current = $this_UiMobileVerticalLayout_4.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiMobileLayoutAccess().getUiMobileSearchPanelParserRuleCall_5());
		}
		this_UiMobileSearchPanel_5=ruleUiMobileSearchPanel
		{
			$current = $this_UiMobileSearchPanel_5.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiMobileLayoutAccess().getUiMobileNavigationRootParserRuleCall_6());
		}
		this_UiMobileNavigationRoot_6=ruleUiMobileNavigationRoot
		{
			$current = $this_UiMobileNavigationRoot_6.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleUiMobileField
entryRuleUiMobileField returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiMobileFieldRule()); }
	iv_ruleUiMobileField=ruleUiMobileField
	{ $current=$iv_ruleUiMobileField.current; }
	EOF;

// Rule UiMobileField
ruleUiMobileField returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiMobileSwitchParserRuleCall_0());
		}
		this_UiMobileSwitch_0=ruleUiMobileSwitch
		{
			$current = $this_UiMobileSwitch_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiTextFieldParserRuleCall_1());
		}
		this_UiTextField_1=ruleUiTextField
		{
			$current = $this_UiTextField_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiMaskedTextFieldParserRuleCall_2());
		}
		this_UiMaskedTextField_2=ruleUiMaskedTextField
		{
			$current = $this_UiMaskedTextField_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiMaskedNumericFieldParserRuleCall_3());
		}
		this_UiMaskedNumericField_3=ruleUiMaskedNumericField
		{
			$current = $this_UiMaskedNumericField_3.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiMaskedDecimalFieldParserRuleCall_4());
		}
		this_UiMaskedDecimalField_4=ruleUiMaskedDecimalField
		{
			$current = $this_UiMaskedDecimalField_4.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiPrefixedMaskedTextFieldParserRuleCall_5());
		}
		this_UiPrefixedMaskedTextField_5=ruleUiPrefixedMaskedTextField
		{
			$current = $this_UiPrefixedMaskedTextField_5.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiRichTextAreaParserRuleCall_6());
		}
		this_UiRichTextArea_6=ruleUiRichTextArea
		{
			$current = $this_UiRichTextArea_6.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiPasswordFieldParserRuleCall_7());
		}
		this_UiPasswordField_7=ruleUiPasswordField
		{
			$current = $this_UiPasswordField_7.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiSuggestTextFieldParserRuleCall_8());
		}
		this_UiSuggestTextField_8=ruleUiSuggestTextField
		{
			$current = $this_UiSuggestTextField_8.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiNumericFieldParserRuleCall_9());
		}
		this_UiNumericField_9=ruleUiNumericField
		{
			$current = $this_UiNumericField_9.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiTableParserRuleCall_10());
		}
		this_UiTable_10=ruleUiTable
		{
			$current = $this_UiTable_10.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiComboBoxParserRuleCall_11());
		}
		this_UiComboBox_11=ruleUiComboBox
		{
			$current = $this_UiComboBox_11.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiImageParserRuleCall_12());
		}
		this_UiImage_12=ruleUiImage
		{
			$current = $this_UiImage_12.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiSearchFieldParserRuleCall_13());
		}
		this_UiSearchField_13=ruleUiSearchField
		{
			$current = $this_UiSearchField_13.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiLabelParserRuleCall_14());
		}
		this_UiLabel_14=ruleUiLabel
		{
			$current = $this_UiLabel_14.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiDecimalFieldParserRuleCall_15());
		}
		this_UiDecimalField_15=ruleUiDecimalField
		{
			$current = $this_UiDecimalField_15.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiTextAreaParserRuleCall_16());
		}
		this_UiTextArea_16=ruleUiTextArea
		{
			$current = $this_UiTextArea_16.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiDateFieldParserRuleCall_17());
		}
		this_UiDateField_17=ruleUiDateField
		{
			$current = $this_UiDateField_17.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiBrowserParserRuleCall_18());
		}
		this_UiBrowser_18=ruleUiBrowser
		{
			$current = $this_UiBrowser_18.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiProgressBarParserRuleCall_19());
		}
		this_UiProgressBar_19=ruleUiProgressBar
		{
			$current = $this_UiProgressBar_19.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiMobileFieldAccess().getUiOptionsGroupParserRuleCall_20());
		}
		this_UiOptionsGroup_20=ruleUiOptionsGroup
		{
			$current = $this_UiOptionsGroup_20.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleUiLayout
entryRuleUiLayout returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiLayoutRule()); }
	iv_ruleUiLayout=ruleUiLayout
	{ $current=$iv_ruleUiLayout.current; }
	EOF;

// Rule UiLayout
ruleUiLayout returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getUiLayoutAccess().getUiGridLayoutParserRuleCall_0());
		}
		this_UiGridLayout_0=ruleUiGridLayout
		{
			$current = $this_UiGridLayout_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiLayoutAccess().getUiFormLayoutParserRuleCall_1());
		}
		this_UiFormLayout_1=ruleUiFormLayout
		{
			$current = $this_UiFormLayout_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiLayoutAccess().getUiHorizontalLayoutParserRuleCall_2());
		}
		this_UiHorizontalLayout_2=ruleUiHorizontalLayout
		{
			$current = $this_UiHorizontalLayout_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiLayoutAccess().getUiVerticalLayoutParserRuleCall_3());
		}
		this_UiVerticalLayout_3=ruleUiVerticalLayout
		{
			$current = $this_UiVerticalLayout_3.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiLayoutAccess().getUiSplitpanelParserRuleCall_4());
		}
		this_UiSplitpanel_4=ruleUiSplitpanel
		{
			$current = $this_UiSplitpanel_4.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiLayoutAccess().getUiPanelParserRuleCall_5());
		}
		this_UiPanel_5=ruleUiPanel
		{
			$current = $this_UiPanel_5.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiLayoutAccess().getUiSearchPanelParserRuleCall_6());
		}
		this_UiSearchPanel_6=ruleUiSearchPanel
		{
			$current = $this_UiSearchPanel_6.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleUiField
entryRuleUiField returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiFieldRule()); }
	iv_ruleUiField=ruleUiField
	{ $current=$iv_ruleUiField.current; }
	EOF;

// Rule UiField
ruleUiField returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getUiFieldAccess().getUiTextFieldParserRuleCall_0());
		}
		this_UiTextField_0=ruleUiTextField
		{
			$current = $this_UiTextField_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiFieldAccess().getUiMaskedTextFieldParserRuleCall_1());
		}
		this_UiMaskedTextField_1=ruleUiMaskedTextField
		{
			$current = $this_UiMaskedTextField_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiFieldAccess().getUiMaskedNumericFieldParserRuleCall_2());
		}
		this_UiMaskedNumericField_2=ruleUiMaskedNumericField
		{
			$current = $this_UiMaskedNumericField_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiFieldAccess().getUiMaskedDecimalFieldParserRuleCall_3());
		}
		this_UiMaskedDecimalField_3=ruleUiMaskedDecimalField
		{
			$current = $this_UiMaskedDecimalField_3.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiFieldAccess().getUiPrefixedMaskedTextFieldParserRuleCall_4());
		}
		this_UiPrefixedMaskedTextField_4=ruleUiPrefixedMaskedTextField
		{
			$current = $this_UiPrefixedMaskedTextField_4.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiFieldAccess().getUiRichTextAreaParserRuleCall_5());
		}
		this_UiRichTextArea_5=ruleUiRichTextArea
		{
			$current = $this_UiRichTextArea_5.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiFieldAccess().getUiPasswordFieldParserRuleCall_6());
		}
		this_UiPasswordField_6=ruleUiPasswordField
		{
			$current = $this_UiPasswordField_6.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiFieldAccess().getUiSuggestTextFieldParserRuleCall_7());
		}
		this_UiSuggestTextField_7=ruleUiSuggestTextField
		{
			$current = $this_UiSuggestTextField_7.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiFieldAccess().getUiListParserRuleCall_8());
		}
		this_UiList_8=ruleUiList
		{
			$current = $this_UiList_8.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiFieldAccess().getUiNumericFieldParserRuleCall_9());
		}
		this_UiNumericField_9=ruleUiNumericField
		{
			$current = $this_UiNumericField_9.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiFieldAccess().getUiCheckBoxParserRuleCall_10());
		}
		this_UiCheckBox_10=ruleUiCheckBox
		{
			$current = $this_UiCheckBox_10.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiFieldAccess().getUiTableParserRuleCall_11());
		}
		this_UiTable_11=ruleUiTable
		{
			$current = $this_UiTable_11.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiFieldAccess().getUiComboBoxParserRuleCall_12());
		}
		this_UiComboBox_12=ruleUiComboBox
		{
			$current = $this_UiComboBox_12.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiFieldAccess().getUiImageParserRuleCall_13());
		}
		this_UiImage_13=ruleUiImage
		{
			$current = $this_UiImage_13.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiFieldAccess().getUiSearchFieldParserRuleCall_14());
		}
		this_UiSearchField_14=ruleUiSearchField
		{
			$current = $this_UiSearchField_14.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiFieldAccess().getUiLabelParserRuleCall_15());
		}
		this_UiLabel_15=ruleUiLabel
		{
			$current = $this_UiLabel_15.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiFieldAccess().getUiDecimalFieldParserRuleCall_16());
		}
		this_UiDecimalField_16=ruleUiDecimalField
		{
			$current = $this_UiDecimalField_16.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiFieldAccess().getUiTextAreaParserRuleCall_17());
		}
		this_UiTextArea_17=ruleUiTextArea
		{
			$current = $this_UiTextArea_17.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiFieldAccess().getUiDateFieldParserRuleCall_18());
		}
		this_UiDateField_18=ruleUiDateField
		{
			$current = $this_UiDateField_18.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiFieldAccess().getUiBrowserParserRuleCall_19());
		}
		this_UiBrowser_19=ruleUiBrowser
		{
			$current = $this_UiBrowser_19.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiFieldAccess().getUiProgressBarParserRuleCall_20());
		}
		this_UiProgressBar_20=ruleUiProgressBar
		{
			$current = $this_UiProgressBar_20.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiFieldAccess().getUiOptionsGroupParserRuleCall_21());
		}
		this_UiOptionsGroup_21=ruleUiOptionsGroup
		{
			$current = $this_UiOptionsGroup_21.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiFieldAccess().getUiBeanReferenceFieldParserRuleCall_22());
		}
		this_UiBeanReferenceField_22=ruleUiBeanReferenceField
		{
			$current = $this_UiBeanReferenceField_22.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleUiAction
entryRuleUiAction returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiActionRule()); }
	iv_ruleUiAction=ruleUiAction
	{ $current=$iv_ruleUiAction.current; }
	EOF;

// Rule UiAction
ruleUiAction returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	{
		newCompositeNode(grammarAccess.getUiActionAccess().getUiButtonParserRuleCall());
	}
	this_UiButton_0=ruleUiButton
	{
		$current = $this_UiButton_0.current;
		afterParserOrEnumRuleCall();
	}
;

// Entry rule entryRuleUiMobileAction
entryRuleUiMobileAction returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiMobileActionRule()); }
	iv_ruleUiMobileAction=ruleUiMobileAction
	{ $current=$iv_ruleUiMobileAction.current; }
	EOF;

// Rule UiMobileAction
ruleUiMobileAction returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getUiMobileActionAccess().getUiMobileNavigationButtonParserRuleCall_0());
		}
		this_UiMobileNavigationButton_0=ruleUiMobileNavigationButton
		{
			$current = $this_UiMobileNavigationButton_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiMobileActionAccess().getUiButtonParserRuleCall_1());
		}
		this_UiButton_1=ruleUiButton
		{
			$current = $this_UiButton_1.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleUiNumericField
entryRuleUiNumericField returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiNumericFieldRule()); }
	iv_ruleUiNumericField=ruleUiNumericField
	{ $current=$iv_ruleUiNumericField.current; }
	EOF;

// Rule UiNumericField
ruleUiNumericField returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiNumericFieldAccess().getUiNumericFieldAction_0(),
					$current);
			}
		)
		otherlv_1='numericField'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiNumericFieldAccess().getNumericFieldKeyword_1());
		}
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getUiNumericFieldAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 0);
						}
									({true}?=>((
										lv_noGrouping_4_0='noGrouping'
										{
											newLeafNode(lv_noGrouping_4_0, grammarAccess.getUiNumericFieldAccess().getNoGroupingNoGroupingKeyword_2_1_0_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiNumericFieldRule());
											}
											setWithLastConsumed($current, "noGrouping", true, "noGrouping");
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 1);
						}
									({true}?=>(otherlv_5='styles'
									{
										newLeafNode(otherlv_5, grammarAccess.getUiNumericFieldAccess().getStylesKeyword_2_1_1_0());
									}
									(
										(
											lv_styles_6_0=RULE_STRING
											{
												newLeafNode(lv_styles_6_0, grammarAccess.getUiNumericFieldAccess().getStylesSTRINGTerminalRuleCall_2_1_1_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiNumericFieldRule());
												}
												setWithLastConsumed(
													$current,
													"styles",
													lv_styles_6_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 2)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 2);
						}
									({true}?=>((
										lv_noMarkNegative_7_0='noMarkNegative'
										{
											newLeafNode(lv_noMarkNegative_7_0, grammarAccess.getUiNumericFieldAccess().getNoMarkNegativeNoMarkNegativeKeyword_2_1_2_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiNumericFieldRule());
											}
											setWithLastConsumed($current, "noMarkNegative", true, "noMarkNegative");
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 3)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 3);
						}
									({true}?=>((
										{
											newCompositeNode(grammarAccess.getUiNumericFieldAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_3_0());
										}
										lv_i18nInfo_8_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiNumericFieldRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_8_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 4)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1(), 4);
						}
									({true}?=>((
										lv_readonly_9_0='readonly'
										{
											newLeafNode(lv_readonly_9_0, grammarAccess.getUiNumericFieldAccess().getReadonlyReadonlyKeyword_2_1_4_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiNumericFieldRule());
											}
											setWithLastConsumed($current, "readonly", true, "readonly");
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiNumericFieldAccess().getUnorderedGroup_2_1());
					}
			)
			otherlv_10=')'
			{
				newLeafNode(otherlv_10, grammarAccess.getUiNumericFieldAccess().getRightParenthesisKeyword_2_2());
			}
		)?
		(
			(
				lv_name_11_0=RULE_ID
				{
					newLeafNode(lv_name_11_0, grammarAccess.getUiNumericFieldAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiNumericFieldRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_11_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		(
			otherlv_12='{'
			{
				newLeafNode(otherlv_12, grammarAccess.getUiNumericFieldAccess().getLeftCurlyBracketKeyword_4_0());
			}
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getUiNumericFieldAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
						}
						lv_validators_13_0=ruleUiValidator
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiNumericFieldRule());
							}
							add(
								$current,
								"validators",
								lv_validators_13_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getUiNumericFieldAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
						}
						lv_bindings_14_0=ruleUiBinding
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiNumericFieldRule());
							}
							add(
								$current,
								"bindings",
								lv_bindings_14_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			(
				(
					{
						newCompositeNode(grammarAccess.getUiNumericFieldAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
					}
					lv_processorAssignments_15_0=ruleUiVisibilityProcessorAssignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiNumericFieldRule());
						}
						add(
							$current,
							"processorAssignments",
							lv_processorAssignments_15_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
						afterParserOrEnumRuleCall();
					}
				)
			)*
			otherlv_16='}'
			{
				newLeafNode(otherlv_16, grammarAccess.getUiNumericFieldAccess().getRightCurlyBracketKeyword_4_3());
			}
		)?
	)
;

// Entry rule entryRuleUiCheckBox
entryRuleUiCheckBox returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiCheckBoxRule()); }
	iv_ruleUiCheckBox=ruleUiCheckBox
	{ $current=$iv_ruleUiCheckBox.current; }
	EOF;

// Rule UiCheckBox
ruleUiCheckBox returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiCheckBoxAccess().getUiCheckBoxAction_0(),
					$current);
			}
		)
		otherlv_1='checkbox'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiCheckBoxAccess().getCheckboxKeyword_1());
		}
		(
			otherlv_2='('
			{
				newLeafNode(otherlv_2, grammarAccess.getUiCheckBoxAccess().getLeftParenthesisKeyword_2_0());
			}
			(
				(
					{ 
					  getUnorderedGroupHelper().enter(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1());
					}
					(
						(
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1(), 0)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1(), 0);
						}
									({true}?=>((
										{
											newCompositeNode(grammarAccess.getUiCheckBoxAccess().getI18nInfoUiI18nInfoParserRuleCall_2_1_0_0());
										}
										lv_i18nInfo_4_0=ruleUiI18nInfo
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getUiCheckBoxRule());
											}
											set(
												$current,
												"i18nInfo",
												lv_i18nInfo_4_0,
												"org.eclipse.osbp.ecview.dsl.UIGrammar.UiI18nInfo");
											afterParserOrEnumRuleCall();
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1(), 1)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1(), 1);
						}
									({true}?=>((
										lv_readonly_5_0='readonly'
										{
											newLeafNode(lv_readonly_5_0, grammarAccess.getUiCheckBoxAccess().getReadonlyReadonlyKeyword_2_1_1_0());
										}
										{
											if ($current==null) {
												$current = createModelElement(grammarAccess.getUiCheckBoxRule());
											}
											setWithLastConsumed($current, "readonly", true, "readonly");
										}
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1());
						}
					)
				)|
				(
					{getUnorderedGroupHelper().canSelect(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1(), 2)}?=>(
						{
							getUnorderedGroupHelper().select(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1(), 2);
						}
									({true}?=>(otherlv_6='styles'
									{
										newLeafNode(otherlv_6, grammarAccess.getUiCheckBoxAccess().getStylesKeyword_2_1_2_0());
									}
									(
										(
											lv_styles_7_0=RULE_STRING
											{
												newLeafNode(lv_styles_7_0, grammarAccess.getUiCheckBoxAccess().getStylesSTRINGTerminalRuleCall_2_1_2_1_0());
											}
											{
												if ($current==null) {
													$current = createModelElement(grammarAccess.getUiCheckBoxRule());
												}
												setWithLastConsumed(
													$current,
													"styles",
													lv_styles_7_0,
													"org.eclipse.xtext.xbase.Xtype.STRING");
											}
										)
									)
									))
						{ 
							getUnorderedGroupHelper().returnFromSelection(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1());
						}
					)
				)
						)*
					)
				)
					{ 
					  getUnorderedGroupHelper().leave(grammarAccess.getUiCheckBoxAccess().getUnorderedGroup_2_1());
					}
			)
			otherlv_8=')'
			{
				newLeafNode(otherlv_8, grammarAccess.getUiCheckBoxAccess().getRightParenthesisKeyword_2_2());
			}
		)?
		(
			(
				lv_name_9_0=RULE_ID
				{
					newLeafNode(lv_name_9_0, grammarAccess.getUiCheckBoxAccess().getNameIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiCheckBoxRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_9_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		(
			otherlv_10='{'
			{
				newLeafNode(otherlv_10, grammarAccess.getUiCheckBoxAccess().getLeftCurlyBracketKeyword_4_0());
			}
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getUiCheckBoxAccess().getValidatorsUiValidatorParserRuleCall_4_1_0_0());
						}
						lv_validators_11_0=ruleUiValidator
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiCheckBoxRule());
							}
							add(
								$current,
								"validators",
								lv_validators_11_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiValidator");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getUiCheckBoxAccess().getBindingsUiBindingParserRuleCall_4_1_1_0());
						}
						lv_bindings_12_0=ruleUiBinding
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getUiCheckBoxRule());
							}
							add(
								$current,
								"bindings",
								lv_bindings_12_0,
								"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBinding");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			(
				(
					{
						newCompositeNode(grammarAccess.getUiCheckBoxAccess().getProcessorAssignmentsUiVisibilityProcessorAssignmentParserRuleCall_4_2_0());
					}
					lv_processorAssignments_13_0=ruleUiVisibilityProcessorAssignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiCheckBoxRule());
						}
						add(
							$current,
							"processorAssignments",
							lv_processorAssignments_13_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiVisibilityProcessorAssignment");
						afterParserOrEnumRuleCall();
					}
				)
			)*
			otherlv_14='}'
			{
				newLeafNode(otherlv_14, grammarAccess.getUiCheckBoxAccess().getRightCurlyBracketKeyword_4_3());
			}
		)?
	)
;

// Entry rule entryRuleUiValidator
entryRuleUiValidator returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiValidatorRule()); }
	iv_ruleUiValidator=ruleUiValidator
	{ $current=$iv_ruleUiValidator.current; }
	EOF;

// Rule UiValidator
ruleUiValidator returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getUiValidatorAccess().getUiMaxLengthValidatorParserRuleCall_0());
		}
		this_UiMaxLengthValidator_0=ruleUiMaxLengthValidator
		{
			$current = $this_UiMaxLengthValidator_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiValidatorAccess().getUiMinLengthValidatorParserRuleCall_1());
		}
		this_UiMinLengthValidator_1=ruleUiMinLengthValidator
		{
			$current = $this_UiMinLengthValidator_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiValidatorAccess().getUiRegexpValidatorParserRuleCall_2());
		}
		this_UiRegexpValidator_2=ruleUiRegexpValidator
		{
			$current = $this_UiRegexpValidator_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiValidatorAccess().getUiXbaseValidatorParserRuleCall_3());
		}
		this_UiXbaseValidator_3=ruleUiXbaseValidator
		{
			$current = $this_UiXbaseValidator_3.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getUiValidatorAccess().getUiBeanValidationValidatorParserRuleCall_4());
		}
		this_UiBeanValidationValidator_4=ruleUiBeanValidationValidator
		{
			$current = $this_UiBeanValidationValidator_4.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleUiMaxLengthValidator
entryRuleUiMaxLengthValidator returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiMaxLengthValidatorRule()); }
	iv_ruleUiMaxLengthValidator=ruleUiMaxLengthValidator
	{ $current=$iv_ruleUiMaxLengthValidator.current; }
	EOF;

// Rule UiMaxLengthValidator
ruleUiMaxLengthValidator returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiMaxLengthValidatorAccess().getUiMaxLengthValidatorAction_0(),
					$current);
			}
		)
		otherlv_1='MaxLengthValidator'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiMaxLengthValidatorAccess().getMaxLengthValidatorKeyword_1());
		}
		(
			(
				lv_name_2_0=RULE_ID
				{
					newLeafNode(lv_name_2_0, grammarAccess.getUiMaxLengthValidatorAccess().getNameIDTerminalRuleCall_2_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiMaxLengthValidatorRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_2_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		otherlv_3='('
		{
			newLeafNode(otherlv_3, grammarAccess.getUiMaxLengthValidatorAccess().getLeftParenthesisKeyword_3());
		}
		(
			(
				lv_maxLength_4_0=RULE_INT
				{
					newLeafNode(lv_maxLength_4_0, grammarAccess.getUiMaxLengthValidatorAccess().getMaxLengthINTTerminalRuleCall_4_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiMaxLengthValidatorRule());
					}
					setWithLastConsumed(
						$current,
						"maxLength",
						lv_maxLength_4_0,
						"org.eclipse.xtext.xbase.Xbase.INT");
				}
			)
		)
		otherlv_5=')'
		{
			newLeafNode(otherlv_5, grammarAccess.getUiMaxLengthValidatorAccess().getRightParenthesisKeyword_5());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getUiMaxLengthValidatorAccess().getErrorCodeUiErrorCodeParserRuleCall_6_0());
				}
				lv_errorCode_6_0=ruleUiErrorCode
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiMaxLengthValidatorRule());
					}
					set(
						$current,
						"errorCode",
						lv_errorCode_6_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiErrorCode");
					afterParserOrEnumRuleCall();
				}
			)
		)?
	)
;

// Entry rule entryRuleUiMinLengthValidator
entryRuleUiMinLengthValidator returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiMinLengthValidatorRule()); }
	iv_ruleUiMinLengthValidator=ruleUiMinLengthValidator
	{ $current=$iv_ruleUiMinLengthValidator.current; }
	EOF;

// Rule UiMinLengthValidator
ruleUiMinLengthValidator returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiMinLengthValidatorAccess().getUiMinLengthValidatorAction_0(),
					$current);
			}
		)
		otherlv_1='MinLengthValidator'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiMinLengthValidatorAccess().getMinLengthValidatorKeyword_1());
		}
		(
			(
				lv_name_2_0=RULE_ID
				{
					newLeafNode(lv_name_2_0, grammarAccess.getUiMinLengthValidatorAccess().getNameIDTerminalRuleCall_2_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiMinLengthValidatorRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_2_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		otherlv_3='('
		{
			newLeafNode(otherlv_3, grammarAccess.getUiMinLengthValidatorAccess().getLeftParenthesisKeyword_3());
		}
		(
			(
				lv_minLength_4_0=RULE_INT
				{
					newLeafNode(lv_minLength_4_0, grammarAccess.getUiMinLengthValidatorAccess().getMinLengthINTTerminalRuleCall_4_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiMinLengthValidatorRule());
					}
					setWithLastConsumed(
						$current,
						"minLength",
						lv_minLength_4_0,
						"org.eclipse.xtext.xbase.Xbase.INT");
				}
			)
		)
		otherlv_5=')'
		{
			newLeafNode(otherlv_5, grammarAccess.getUiMinLengthValidatorAccess().getRightParenthesisKeyword_5());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getUiMinLengthValidatorAccess().getErrorCodeUiErrorCodeParserRuleCall_6_0());
				}
				lv_errorCode_6_0=ruleUiErrorCode
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiMinLengthValidatorRule());
					}
					set(
						$current,
						"errorCode",
						lv_errorCode_6_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiErrorCode");
					afterParserOrEnumRuleCall();
				}
			)
		)?
	)
;

// Entry rule entryRuleUiRegexpValidator
entryRuleUiRegexpValidator returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiRegexpValidatorRule()); }
	iv_ruleUiRegexpValidator=ruleUiRegexpValidator
	{ $current=$iv_ruleUiRegexpValidator.current; }
	EOF;

// Rule UiRegexpValidator
ruleUiRegexpValidator returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiRegexpValidatorAccess().getUiRegexpValidatorAction_0(),
					$current);
			}
		)
		otherlv_1='RegexValidator'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiRegexpValidatorAccess().getRegexValidatorKeyword_1());
		}
		(
			(
				lv_name_2_0=RULE_ID
				{
					newLeafNode(lv_name_2_0, grammarAccess.getUiRegexpValidatorAccess().getNameIDTerminalRuleCall_2_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiRegexpValidatorRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_2_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
		otherlv_3='('
		{
			newLeafNode(otherlv_3, grammarAccess.getUiRegexpValidatorAccess().getLeftParenthesisKeyword_3());
		}
		(
			(
				lv_regExpression_4_0=RULE_STRING
				{
					newLeafNode(lv_regExpression_4_0, grammarAccess.getUiRegexpValidatorAccess().getRegExpressionSTRINGTerminalRuleCall_4_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiRegexpValidatorRule());
					}
					setWithLastConsumed(
						$current,
						"regExpression",
						lv_regExpression_4_0,
						"org.eclipse.xtext.xbase.Xtype.STRING");
				}
			)
		)
		otherlv_5=')'
		{
			newLeafNode(otherlv_5, grammarAccess.getUiRegexpValidatorAccess().getRightParenthesisKeyword_5());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getUiRegexpValidatorAccess().getErrorCodeUiErrorCodeParserRuleCall_6_0());
				}
				lv_errorCode_6_0=ruleUiErrorCode
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiRegexpValidatorRule());
					}
					set(
						$current,
						"errorCode",
						lv_errorCode_6_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiErrorCode");
					afterParserOrEnumRuleCall();
				}
			)
		)?
	)
;

// Entry rule entryRuleUiXbaseValidator
entryRuleUiXbaseValidator returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiXbaseValidatorRule()); }
	iv_ruleUiXbaseValidator=ruleUiXbaseValidator
	{ $current=$iv_ruleUiXbaseValidator.current; }
	EOF;

// Rule UiXbaseValidator
ruleUiXbaseValidator returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiXbaseValidatorAccess().getUiXbaseValidatorAction_0(),
					$current);
			}
		)
		otherlv_1='Expression'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiXbaseValidatorAccess().getExpressionKeyword_1());
		}
		(
			(
				lv_name_2_0=RULE_ID
				{
					newLeafNode(lv_name_2_0, grammarAccess.getUiXbaseValidatorAccess().getNameIDTerminalRuleCall_2_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiXbaseValidatorRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_2_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
		otherlv_3='('
		{
			newLeafNode(otherlv_3, grammarAccess.getUiXbaseValidatorAccess().getLeftParenthesisKeyword_3());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getUiXbaseValidatorAccess().getJvmTypeJvmTypeReferenceParserRuleCall_4_0());
				}
				lv_jvmType_4_0=ruleJvmTypeReference
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiXbaseValidatorRule());
					}
					set(
						$current,
						"jvmType",
						lv_jvmType_4_0,
						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_5=')'
		{
			newLeafNode(otherlv_5, grammarAccess.getUiXbaseValidatorAccess().getRightParenthesisKeyword_5());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getUiXbaseValidatorAccess().getErrorCodesUiErrorCodeParserRuleCall_6_0());
				}
				lv_errorCodes_6_0=ruleUiErrorCode
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiXbaseValidatorRule());
					}
					add(
						$current,
						"errorCodes",
						lv_errorCodes_6_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiErrorCode");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			(
				{
					newCompositeNode(grammarAccess.getUiXbaseValidatorAccess().getExpressionXBlockExpressionParserRuleCall_7_0());
				}
				lv_expression_7_0=ruleXBlockExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiXbaseValidatorRule());
					}
					set(
						$current,
						"expression",
						lv_expression_7_0,
						"org.eclipse.xtext.xbase.Xbase.XBlockExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)?
	)
;

// Entry rule entryRuleUiBeanValidationValidator
entryRuleUiBeanValidationValidator returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiBeanValidationValidatorRule()); }
	iv_ruleUiBeanValidationValidator=ruleUiBeanValidationValidator
	{ $current=$iv_ruleUiBeanValidationValidator.current; }
	EOF;

// Rule UiBeanValidationValidator
ruleUiBeanValidationValidator returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiBeanValidationValidatorAccess().getUiBeanValidationValidatorAction_0(),
					$current);
			}
		)
		otherlv_1='BeanValidationValidator'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiBeanValidationValidatorAccess().getBeanValidationValidatorKeyword_1());
		}
		(
			(
				lv_name_2_0=RULE_ID
				{
					newLeafNode(lv_name_2_0, grammarAccess.getUiBeanValidationValidatorAccess().getNameIDTerminalRuleCall_2_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiBeanValidationValidatorRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_2_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)?
	)
;

// Entry rule entryRuleUiErrorCode
entryRuleUiErrorCode returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiErrorCodeRule()); }
	iv_ruleUiErrorCode=ruleUiErrorCode
	{ $current=$iv_ruleUiErrorCode.current; }
	EOF;

// Rule UiErrorCode
ruleUiErrorCode returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='code'
		{
			newLeafNode(otherlv_0, grammarAccess.getUiErrorCodeAccess().getCodeKeyword_0());
		}
		(
			(
				lv_name_1_0=RULE_ID
				{
					newLeafNode(lv_name_1_0, grammarAccess.getUiErrorCodeAccess().getNameIDTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiErrorCodeRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
		(
			(
				lv_defaultMessage_2_0=RULE_STRING
				{
					newLeafNode(lv_defaultMessage_2_0, grammarAccess.getUiErrorCodeAccess().getDefaultMessageSTRINGTerminalRuleCall_2_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiErrorCodeRule());
					}
					setWithLastConsumed(
						$current,
						"defaultMessage",
						lv_defaultMessage_2_0,
						"org.eclipse.xtext.xbase.Xtype.STRING");
				}
			)
		)?
	)
;

// Entry rule entryRuleUiVisibilityProcessor
entryRuleUiVisibilityProcessor returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiVisibilityProcessorRule()); }
	iv_ruleUiVisibilityProcessor=ruleUiVisibilityProcessor
	{ $current=$iv_ruleUiVisibilityProcessor.current; }
	EOF;

// Rule UiVisibilityProcessor
ruleUiVisibilityProcessor returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getUiVisibilityProcessorAccess().getUiVisibilityProcessorAction_0(),
					$current);
			}
		)
		otherlv_1='visibility'
		{
			newLeafNode(otherlv_1, grammarAccess.getUiVisibilityProcessorAccess().getVisibilityKeyword_1());
		}
		(
			(
				lv_name_2_0=RULE_ID
				{
					newLeafNode(lv_name_2_0, grammarAccess.getUiVisibilityProcessorAccess().getNameIDTerminalRuleCall_2_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiVisibilityProcessorRule());
					}
					setWithLastConsumed(
						$current,
						"name",
						lv_name_2_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
		otherlv_3='{'
		{
			newLeafNode(otherlv_3, grammarAccess.getUiVisibilityProcessorAccess().getLeftCurlyBracketKeyword_3());
		}
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getUiVisibilityProcessorAccess().getDataUsedUiBindingEndpointAliasParserRuleCall_4_0_0());
					}
					lv_dataUsed_4_0=ruleUiBindingEndpointAlias
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiVisibilityProcessorRule());
						}
						add(
							$current,
							"dataUsed",
							lv_dataUsed_4_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAlias");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getUiVisibilityProcessorAccess().getChangeTriggersUiChangeTriggerParserRuleCall_4_1_0());
					}
					lv_changeTriggers_5_0=ruleUiChangeTrigger
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiVisibilityProcessorRule());
						}
						add(
							$current,
							"changeTriggers",
							lv_changeTriggers_5_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiChangeTrigger");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getUiVisibilityProcessorAccess().getImportedElementsUiTypedBindableRawTypeAliasParserRuleCall_4_2_0());
					}
					lv_importedElements_6_0=ruleUiTypedBindableRawTypeAlias
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getUiVisibilityProcessorRule());
						}
						add(
							$current,
							"importedElements",
							lv_importedElements_6_0,
							"org.eclipse.osbp.ecview.dsl.UIGrammar.UiTypedBindableRawTypeAlias");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
		(
			(
				{
					newCompositeNode(grammarAccess.getUiVisibilityProcessorAccess().getRuleUiXbaseVisibilityRuleParserRuleCall_5_0());
				}
				lv_rule_7_0=ruleUiXbaseVisibilityRule
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiVisibilityProcessorRule());
					}
					set(
						$current,
						"rule",
						lv_rule_7_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiXbaseVisibilityRule");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		otherlv_8='}'
		{
			newLeafNode(otherlv_8, grammarAccess.getUiVisibilityProcessorAccess().getRightCurlyBracketKeyword_6());
		}
	)
;

// Entry rule entryRuleUiXbaseVisibilityRule
entryRuleUiXbaseVisibilityRule returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiXbaseVisibilityRuleRule()); }
	iv_ruleUiXbaseVisibilityRule=ruleUiXbaseVisibilityRule
	{ $current=$iv_ruleUiXbaseVisibilityRule.current; }
	EOF;

// Rule UiXbaseVisibilityRule
ruleUiXbaseVisibilityRule returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				newCompositeNode(grammarAccess.getUiXbaseVisibilityRuleAccess().getExpressionXBlockExpressionParserRuleCall_0());
			}
			lv_expression_0_0=ruleXBlockExpression
			{
				if ($current==null) {
					$current = createModelElementForParent(grammarAccess.getUiXbaseVisibilityRuleRule());
				}
				set(
					$current,
					"expression",
					lv_expression_0_0,
					"org.eclipse.xtext.xbase.Xbase.XBlockExpression");
				afterParserOrEnumRuleCall();
			}
		)
	)
;

// Entry rule entryRuleUiChangeTrigger
entryRuleUiChangeTrigger returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getUiChangeTriggerRule()); }
	iv_ruleUiChangeTrigger=ruleUiChangeTrigger
	{ $current=$iv_ruleUiChangeTrigger.current; }
	EOF;

// Rule UiChangeTrigger
ruleUiChangeTrigger returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='fireOn'
		{
			newLeafNode(otherlv_0, grammarAccess.getUiChangeTriggerAccess().getFireOnKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getUiChangeTriggerAccess().getEndpointUiBindingEndpointAssignmentParserRuleCall_1_0());
				}
				lv_endpoint_1_0=ruleUiBindingEndpointAssignment
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getUiChangeTriggerRule());
					}
					set(
						$current,
						"endpoint",
						lv_endpoint_1_0,
						"org.eclipse.osbp.ecview.dsl.UIGrammar.UiBindingEndpointAssignment");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_2='as'
		{
			newLeafNode(otherlv_2, grammarAccess.getUiChangeTriggerAccess().getAsKeyword_2());
		}
		(
			(
				lv_alias_3_0=RULE_ID
				{
					newLeafNode(lv_alias_3_0, grammarAccess.getUiChangeTriggerAccess().getAliasIDTerminalRuleCall_3_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getUiChangeTriggerRule());
					}
					setWithLastConsumed(
						$current,
						"alias",
						lv_alias_3_0,
						"org.eclipse.xtext.xbase.Xtype.ID");
				}
			)
		)
		(
			otherlv_4=';'
			{
				newLeafNode(otherlv_4, grammarAccess.getUiChangeTriggerAccess().getSemicolonKeyword_4());
			}
		)?
	)
;

// Entry rule entryRuleXImportDeclaration
entryRuleXImportDeclaration returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXImportDeclarationRule()); }
	iv_ruleXImportDeclaration=ruleXImportDeclaration
	{ $current=$iv_ruleXImportDeclaration.current; }
	EOF;

// Rule XImportDeclaration
ruleXImportDeclaration returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXImportDeclarationAccess().getOXImportDeclarationAction_0(),
					$current);
			}
		)
		otherlv_1='import'
		{
			newLeafNode(otherlv_1, grammarAccess.getXImportDeclarationAccess().getImportKeyword_1());
		}
		(
			(
				(
					(
						lv_static_2_0='static'
						{
							newLeafNode(lv_static_2_0, grammarAccess.getXImportDeclarationAccess().getStaticStaticKeyword_2_0_0_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getXImportDeclarationRule());
							}
							setWithLastConsumed($current, "static", true, "static");
						}
					)
				)
				(
					(
						lv_extension_3_0='extension'
						{
							newLeafNode(lv_extension_3_0, grammarAccess.getXImportDeclarationAccess().getExtensionExtensionKeyword_2_0_1_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getXImportDeclarationRule());
							}
							setWithLastConsumed($current, "extension", true, "extension");
						}
					)
				)?
				(
					(
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getXImportDeclarationRule());
							}
						}
						{
							newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_2_0_2_0());
						}
						ruleQualifiedNameInStaticImport
						{
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					(
						(
							lv_wildcard_5_0='*'
							{
								newLeafNode(lv_wildcard_5_0, grammarAccess.getXImportDeclarationAccess().getWildcardAsteriskKeyword_2_0_3_0_0());
							}
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getXImportDeclarationRule());
								}
								setWithLastConsumed($current, "wildcard", true, "*");
							}
						)
					)
					    |
					(
						(
							{
								newCompositeNode(grammarAccess.getXImportDeclarationAccess().getMemberNameValidIDParserRuleCall_2_0_3_1_0());
							}
							lv_memberName_6_0=ruleValidID
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXImportDeclarationRule());
								}
								set(
									$current,
									"memberName",
									lv_memberName_6_0,
									"org.eclipse.xtext.xbase.Xtype.ValidID");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)
			)
			    |
			(
				(
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getXImportDeclarationRule());
						}
					}
					{
						newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_2_1_0());
					}
					ruleQualifiedName
					{
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceQualifiedNameWithWildcardParserRuleCall_2_2_0());
					}
					lv_importedNamespace_8_0=ruleQualifiedNameWithWildcard
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXImportDeclarationRule());
						}
						set(
							$current,
							"importedNamespace",
							lv_importedNamespace_8_0,
							"org.eclipse.xtext.xbase.Xtype.QualifiedNameWithWildcard");
						afterParserOrEnumRuleCall();
					}
				)
			)
			    |
			(
				(
					(
						lv_fqnImport_9_0='ns'
						{
							newLeafNode(lv_fqnImport_9_0, grammarAccess.getXImportDeclarationAccess().getFqnImportNsKeyword_2_3_0_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getXImportDeclarationRule());
							}
							setWithLastConsumed($current, "fqnImport", true, "ns");
						}
					)
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedFullyQualifiedNameQualifiedNameParserRuleCall_2_3_1_0());
						}
						lv_importedFullyQualifiedName_10_0=ruleQualifiedName
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXImportDeclarationRule());
							}
							set(
								$current,
								"importedFullyQualifiedName",
								lv_importedFullyQualifiedName_10_0,
								"org.eclipse.xtext.xbase.Xbase.QualifiedName");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
		)
		(
			otherlv_11=';'
			{
				newLeafNode(otherlv_11, grammarAccess.getXImportDeclarationAccess().getSemicolonKeyword_3());
			}
		)?
	)
;

// Entry rule entryRuleXAnnotation
entryRuleXAnnotation returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXAnnotationRule()); }
	iv_ruleXAnnotation=ruleXAnnotation
	{ $current=$iv_ruleXAnnotation.current; }
	EOF;

// Rule XAnnotation
ruleXAnnotation returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXAnnotationAccess().getXAnnotationAction_0(),
					$current);
			}
		)
		otherlv_1='@'
		{
			newLeafNode(otherlv_1, grammarAccess.getXAnnotationAccess().getCommercialAtKeyword_1());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getXAnnotationRule());
					}
				}
				{
					newCompositeNode(grammarAccess.getXAnnotationAccess().getAnnotationTypeJvmAnnotationTypeCrossReference_2_0());
				}
				ruleQualifiedName
				{
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				('(')=>
				otherlv_3='('
				{
					newLeafNode(otherlv_3, grammarAccess.getXAnnotationAccess().getLeftParenthesisKeyword_3_0());
				}
			)
			(
				(
					(
						((
							(
								(
									ruleValidID
								)
							)
							'='
						)
						)=>
						(
							{
								newCompositeNode(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_0_0());
							}
							lv_elementValuePairs_4_0=ruleXAnnotationElementValuePair
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXAnnotationRule());
								}
								add(
									$current,
									"elementValuePairs",
									lv_elementValuePairs_4_0,
									"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationElementValuePair");
								afterParserOrEnumRuleCall();
							}
						)
					)
					(
						otherlv_5=','
						{
							newLeafNode(otherlv_5, grammarAccess.getXAnnotationAccess().getCommaKeyword_3_1_0_1_0());
						}
						(
							((
								(
									(
										ruleValidID
									)
								)
								'='
							)
							)=>
							(
								{
									newCompositeNode(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_1_1_0());
								}
								lv_elementValuePairs_6_0=ruleXAnnotationElementValuePair
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getXAnnotationRule());
									}
									add(
										$current,
										"elementValuePairs",
										lv_elementValuePairs_6_0,
										"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationElementValuePair");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)*
				)
				    |
				(
					(
						{
							newCompositeNode(grammarAccess.getXAnnotationAccess().getValueXAnnotationElementValueOrCommaListParserRuleCall_3_1_1_0());
						}
						lv_value_7_0=ruleXAnnotationElementValueOrCommaList
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXAnnotationRule());
							}
							set(
								$current,
								"value",
								lv_value_7_0,
								"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationElementValueOrCommaList");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)?
			otherlv_8=')'
			{
				newLeafNode(otherlv_8, grammarAccess.getXAnnotationAccess().getRightParenthesisKeyword_3_2());
			}
		)?
	)
;

// Entry rule entryRuleXAnnotationElementValuePair
entryRuleXAnnotationElementValuePair returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXAnnotationElementValuePairRule()); }
	iv_ruleXAnnotationElementValuePair=ruleXAnnotationElementValuePair
	{ $current=$iv_ruleXAnnotationElementValuePair.current; }
	EOF;

// Rule XAnnotationElementValuePair
ruleXAnnotationElementValuePair returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			((
				(
					(
						ruleValidID
					)
				)
				'='
			)
			)=>
			(
				(
					(
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getXAnnotationElementValuePairRule());
							}
						}
						{
							newCompositeNode(grammarAccess.getXAnnotationElementValuePairAccess().getElementJvmOperationCrossReference_0_0_0_0());
						}
						ruleValidID
						{
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_1='='
				{
					newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValuePairAccess().getEqualsSignKeyword_0_0_1());
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getXAnnotationElementValuePairAccess().getValueXAnnotationElementValueParserRuleCall_1_0());
				}
				lv_value_2_0=ruleXAnnotationElementValue
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXAnnotationElementValuePairRule());
					}
					set(
						$current,
						"value",
						lv_value_2_0,
						"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationElementValue");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleXAnnotationElementValueOrCommaList
entryRuleXAnnotationElementValueOrCommaList returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListRule()); }
	iv_ruleXAnnotationElementValueOrCommaList=ruleXAnnotationElementValueOrCommaList
	{ $current=$iv_ruleXAnnotationElementValueOrCommaList.current; }
	EOF;

// Rule XAnnotationElementValueOrCommaList
ruleXAnnotationElementValueOrCommaList returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				((
					(
					)
					'#'
					'['
				)
				)=>
				(
					(
						{
							$current = forceCreateModelElement(
								grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralAction_0_0_0_0(),
								$current);
						}
					)
					otherlv_1='#'
					{
						newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getNumberSignKeyword_0_0_0_1());
					}
					otherlv_2='['
					{
						newLeafNode(otherlv_2, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getLeftSquareBracketKeyword_0_0_0_2());
					}
				)
			)
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0());
						}
						lv_elements_3_0=ruleXAnnotationOrExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXAnnotationElementValueOrCommaListRule());
							}
							add(
								$current,
								"elements",
								lv_elements_3_0,
								"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					otherlv_4=','
					{
						newLeafNode(otherlv_4, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_0_1_1_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0());
							}
							lv_elements_5_0=ruleXAnnotationOrExpression
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXAnnotationElementValueOrCommaListRule());
								}
								add(
									$current,
									"elements",
									lv_elements_5_0,
									"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
			)?
			otherlv_6=']'
			{
				newLeafNode(otherlv_6, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getRightSquareBracketKeyword_0_2());
			}
		)
		    |
		(
			{
				newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXAnnotationOrExpressionParserRuleCall_1_0());
			}
			this_XAnnotationOrExpression_7=ruleXAnnotationOrExpression
			{
				$current = $this_XAnnotationOrExpression_7.current;
				afterParserOrEnumRuleCall();
			}
			(
				(
					{
						$current = forceCreateModelElementAndAdd(
							grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0(),
							$current);
					}
				)
				(
					otherlv_9=','
					{
						newLeafNode(otherlv_9, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_1_1_1_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_1_1_1_1_0());
							}
							lv_elements_10_0=ruleXAnnotationOrExpression
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXAnnotationElementValueOrCommaListRule());
								}
								add(
									$current,
									"elements",
									lv_elements_10_0,
									"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)+
			)?
		)
	)
;

// Entry rule entryRuleXAnnotationElementValue
entryRuleXAnnotationElementValue returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXAnnotationElementValueRule()); }
	iv_ruleXAnnotationElementValue=ruleXAnnotationElementValue
	{ $current=$iv_ruleXAnnotationElementValue.current; }
	EOF;

// Rule XAnnotationElementValue
ruleXAnnotationElementValue returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				((
					(
					)
					'#'
					'['
				)
				)=>
				(
					(
						{
							$current = forceCreateModelElement(
								grammarAccess.getXAnnotationElementValueAccess().getXListLiteralAction_0_0_0_0(),
								$current);
						}
					)
					otherlv_1='#'
					{
						newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValueAccess().getNumberSignKeyword_0_0_0_1());
					}
					otherlv_2='['
					{
						newLeafNode(otherlv_2, grammarAccess.getXAnnotationElementValueAccess().getLeftSquareBracketKeyword_0_0_0_2());
					}
				)
			)
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0());
						}
						lv_elements_3_0=ruleXAnnotationOrExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXAnnotationElementValueRule());
							}
							add(
								$current,
								"elements",
								lv_elements_3_0,
								"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					otherlv_4=','
					{
						newLeafNode(otherlv_4, grammarAccess.getXAnnotationElementValueAccess().getCommaKeyword_0_1_1_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0());
							}
							lv_elements_5_0=ruleXAnnotationOrExpression
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXAnnotationElementValueRule());
								}
								add(
									$current,
									"elements",
									lv_elements_5_0,
									"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationOrExpression");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
			)?
			otherlv_6=']'
			{
				newLeafNode(otherlv_6, grammarAccess.getXAnnotationElementValueAccess().getRightSquareBracketKeyword_0_2());
			}
		)
		    |
		{
			newCompositeNode(grammarAccess.getXAnnotationElementValueAccess().getXAnnotationOrExpressionParserRuleCall_1());
		}
		this_XAnnotationOrExpression_7=ruleXAnnotationOrExpression
		{
			$current = $this_XAnnotationOrExpression_7.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleXAnnotationOrExpression
entryRuleXAnnotationOrExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXAnnotationOrExpressionRule()); }
	iv_ruleXAnnotationOrExpression=ruleXAnnotationOrExpression
	{ $current=$iv_ruleXAnnotationOrExpression.current; }
	EOF;

// Rule XAnnotationOrExpression
ruleXAnnotationOrExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXAnnotationOrExpressionAccess().getXAnnotationParserRuleCall_0());
		}
		this_XAnnotation_0=ruleXAnnotation
		{
			$current = $this_XAnnotation_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXAnnotationOrExpressionAccess().getXExpressionParserRuleCall_1());
		}
		this_XExpression_1=ruleXExpression
		{
			$current = $this_XExpression_1.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleXExpression
entryRuleXExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXExpressionRule()); }
	iv_ruleXExpression=ruleXExpression
	{ $current=$iv_ruleXExpression.current; }
	EOF;

// Rule XExpression
ruleXExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	{
		newCompositeNode(grammarAccess.getXExpressionAccess().getXAssignmentParserRuleCall());
	}
	this_XAssignment_0=ruleXAssignment
	{
		$current = $this_XAssignment_0.current;
		afterParserOrEnumRuleCall();
	}
;

// Entry rule entryRuleXAssignment
entryRuleXAssignment returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXAssignmentRule()); }
	iv_ruleXAssignment=ruleXAssignment
	{ $current=$iv_ruleXAssignment.current; }
	EOF;

// Rule XAssignment
ruleXAssignment returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					$current = forceCreateModelElement(
						grammarAccess.getXAssignmentAccess().getXAssignmentAction_0_0(),
						$current);
				}
			)
			(
				(
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getXAssignmentRule());
						}
					}
					{
						newCompositeNode(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_0_1_0());
					}
					ruleFeatureCallID
					{
						afterParserOrEnumRuleCall();
					}
				)
			)
			{
				newCompositeNode(grammarAccess.getXAssignmentAccess().getOpSingleAssignParserRuleCall_0_2());
			}
			ruleOpSingleAssign
			{
				afterParserOrEnumRuleCall();
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getXAssignmentAccess().getValueXAssignmentParserRuleCall_0_3_0());
					}
					lv_value_3_0=ruleXAssignment
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXAssignmentRule());
						}
						set(
							$current,
							"value",
							lv_value_3_0,
							"org.eclipse.xtext.xbase.Xbase.XAssignment");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)
		    |
		(
			{
				newCompositeNode(grammarAccess.getXAssignmentAccess().getXOrExpressionParserRuleCall_1_0());
			}
			this_XOrExpression_4=ruleXOrExpression
			{
				$current = $this_XOrExpression_4.current;
				afterParserOrEnumRuleCall();
			}
			(
				(
					((
						(
						)
						(
							(
								ruleOpMultiAssign
							)
						)
					)
					)=>
					(
						(
							{
								$current = forceCreateModelElementAndSet(
									grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0(),
									$current);
							}
						)
						(
							(
								{
									if ($current==null) {
										$current = createModelElement(grammarAccess.getXAssignmentRule());
									}
								}
								{
									newCompositeNode(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0());
								}
								ruleOpMultiAssign
								{
									afterParserOrEnumRuleCall();
								}
							)
						)
					)
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getXAssignmentAccess().getRightOperandXAssignmentParserRuleCall_1_1_1_0());
						}
						lv_rightOperand_7_0=ruleXAssignment
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXAssignmentRule());
							}
							set(
								$current,
								"rightOperand",
								lv_rightOperand_7_0,
								"org.eclipse.xtext.xbase.Xbase.XAssignment");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)?
		)
	)
;

// Entry rule entryRuleOpSingleAssign
entryRuleOpSingleAssign returns [String current=null]:
	{ newCompositeNode(grammarAccess.getOpSingleAssignRule()); }
	iv_ruleOpSingleAssign=ruleOpSingleAssign
	{ $current=$iv_ruleOpSingleAssign.current.getText(); }
	EOF;

// Rule OpSingleAssign
ruleOpSingleAssign returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	kw='='
	{
		$current.merge(kw);
		newLeafNode(kw, grammarAccess.getOpSingleAssignAccess().getEqualsSignKeyword());
	}
;

// Entry rule entryRuleOpMultiAssign
entryRuleOpMultiAssign returns [String current=null]:
	{ newCompositeNode(grammarAccess.getOpMultiAssignRule()); }
	iv_ruleOpMultiAssign=ruleOpMultiAssign
	{ $current=$iv_ruleOpMultiAssign.current.getText(); }
	EOF;

// Rule OpMultiAssign
ruleOpMultiAssign returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		kw='+='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0());
		}
		    |
		kw='-='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getHyphenMinusEqualsSignKeyword_1());
		}
		    |
		kw='*='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getAsteriskEqualsSignKeyword_2());
		}
		    |
		kw='/='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getSolidusEqualsSignKeyword_3());
		}
		    |
		kw='%='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getPercentSignEqualsSignKeyword_4());
		}
		    |
		(
			kw='<'
			{
				$current.merge(kw);
				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_0());
			}
			kw='<'
			{
				$current.merge(kw);
				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_1());
			}
			kw='='
			{
				$current.merge(kw);
				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getEqualsSignKeyword_5_2());
			}
		)
		    |
		(
			kw='>'
			{
				$current.merge(kw);
				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_0());
			}
			(
				kw='>'
				{
					$current.merge(kw);
					newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_1());
				}
			)?
			kw='>='
			{
				$current.merge(kw);
				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignEqualsSignKeyword_6_2());
			}
		)
	)
;

// Entry rule entryRuleXOrExpression
entryRuleXOrExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXOrExpressionRule()); }
	iv_ruleXOrExpression=ruleXOrExpression
	{ $current=$iv_ruleXOrExpression.current; }
	EOF;

// Rule XOrExpression
ruleXOrExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXOrExpressionAccess().getXAndExpressionParserRuleCall_0());
		}
		this_XAndExpression_0=ruleXAndExpression
		{
			$current = $this_XAndExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				((
					(
					)
					(
						(
							ruleOpOr
						)
					)
				)
				)=>
				(
					(
						{
							$current = forceCreateModelElementAndSet(
								grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
								$current);
						}
					)
					(
						(
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getXOrExpressionRule());
								}
							}
							{
								newCompositeNode(grammarAccess.getXOrExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
							}
							ruleOpOr
							{
								afterParserOrEnumRuleCall();
							}
						)
					)
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getXOrExpressionAccess().getRightOperandXAndExpressionParserRuleCall_1_1_0());
					}
					lv_rightOperand_3_0=ruleXAndExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXOrExpressionRule());
						}
						set(
							$current,
							"rightOperand",
							lv_rightOperand_3_0,
							"org.eclipse.xtext.xbase.Xbase.XAndExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleOpOr
entryRuleOpOr returns [String current=null]:
	{ newCompositeNode(grammarAccess.getOpOrRule()); }
	iv_ruleOpOr=ruleOpOr
	{ $current=$iv_ruleOpOr.current.getText(); }
	EOF;

// Rule OpOr
ruleOpOr returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	kw='||'
	{
		$current.merge(kw);
		newLeafNode(kw, grammarAccess.getOpOrAccess().getVerticalLineVerticalLineKeyword());
	}
;

// Entry rule entryRuleXAndExpression
entryRuleXAndExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXAndExpressionRule()); }
	iv_ruleXAndExpression=ruleXAndExpression
	{ $current=$iv_ruleXAndExpression.current; }
	EOF;

// Rule XAndExpression
ruleXAndExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXAndExpressionAccess().getXEqualityExpressionParserRuleCall_0());
		}
		this_XEqualityExpression_0=ruleXEqualityExpression
		{
			$current = $this_XEqualityExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				((
					(
					)
					(
						(
							ruleOpAnd
						)
					)
				)
				)=>
				(
					(
						{
							$current = forceCreateModelElementAndSet(
								grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
								$current);
						}
					)
					(
						(
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getXAndExpressionRule());
								}
							}
							{
								newCompositeNode(grammarAccess.getXAndExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
							}
							ruleOpAnd
							{
								afterParserOrEnumRuleCall();
							}
						)
					)
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getXAndExpressionAccess().getRightOperandXEqualityExpressionParserRuleCall_1_1_0());
					}
					lv_rightOperand_3_0=ruleXEqualityExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXAndExpressionRule());
						}
						set(
							$current,
							"rightOperand",
							lv_rightOperand_3_0,
							"org.eclipse.xtext.xbase.Xbase.XEqualityExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleOpAnd
entryRuleOpAnd returns [String current=null]:
	{ newCompositeNode(grammarAccess.getOpAndRule()); }
	iv_ruleOpAnd=ruleOpAnd
	{ $current=$iv_ruleOpAnd.current.getText(); }
	EOF;

// Rule OpAnd
ruleOpAnd returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	kw='&&'
	{
		$current.merge(kw);
		newLeafNode(kw, grammarAccess.getOpAndAccess().getAmpersandAmpersandKeyword());
	}
;

// Entry rule entryRuleXEqualityExpression
entryRuleXEqualityExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXEqualityExpressionRule()); }
	iv_ruleXEqualityExpression=ruleXEqualityExpression
	{ $current=$iv_ruleXEqualityExpression.current; }
	EOF;

// Rule XEqualityExpression
ruleXEqualityExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getXRelationalExpressionParserRuleCall_0());
		}
		this_XRelationalExpression_0=ruleXRelationalExpression
		{
			$current = $this_XRelationalExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				((
					(
					)
					(
						(
							ruleOpEquality
						)
					)
				)
				)=>
				(
					(
						{
							$current = forceCreateModelElementAndSet(
								grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
								$current);
						}
					)
					(
						(
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getXEqualityExpressionRule());
								}
							}
							{
								newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
							}
							ruleOpEquality
							{
								afterParserOrEnumRuleCall();
							}
						)
					)
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getRightOperandXRelationalExpressionParserRuleCall_1_1_0());
					}
					lv_rightOperand_3_0=ruleXRelationalExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXEqualityExpressionRule());
						}
						set(
							$current,
							"rightOperand",
							lv_rightOperand_3_0,
							"org.eclipse.xtext.xbase.Xbase.XRelationalExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleOpEquality
entryRuleOpEquality returns [String current=null]:
	{ newCompositeNode(grammarAccess.getOpEqualityRule()); }
	iv_ruleOpEquality=ruleOpEquality
	{ $current=$iv_ruleOpEquality.current.getText(); }
	EOF;

// Rule OpEquality
ruleOpEquality returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		kw='=='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignKeyword_0());
		}
		    |
		kw='!='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignKeyword_1());
		}
		    |
		kw='==='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignEqualsSignKeyword_2());
		}
		    |
		kw='!=='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignEqualsSignKeyword_3());
		}
	)
;

// Entry rule entryRuleXRelationalExpression
entryRuleXRelationalExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXRelationalExpressionRule()); }
	iv_ruleXRelationalExpression=ruleXRelationalExpression
	{ $current=$iv_ruleXRelationalExpression.current; }
	EOF;

// Rule XRelationalExpression
ruleXRelationalExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getXOtherOperatorExpressionParserRuleCall_0());
		}
		this_XOtherOperatorExpression_0=ruleXOtherOperatorExpression
		{
			$current = $this_XOtherOperatorExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				(
					((
						(
						)
						'instanceof'
					)
					)=>
					(
						(
							{
								$current = forceCreateModelElementAndSet(
									grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0(),
									$current);
							}
						)
						otherlv_2='instanceof'
						{
							newLeafNode(otherlv_2, grammarAccess.getXRelationalExpressionAccess().getInstanceofKeyword_1_0_0_0_1());
						}
					)
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_0_1_0());
						}
						lv_type_3_0=ruleJvmTypeReference
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXRelationalExpressionRule());
							}
							set(
								$current,
								"type",
								lv_type_3_0,
								"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
			    |
			(
				(
					((
						(
						)
						(
							(
								ruleOpCompare
							)
						)
					)
					)=>
					(
						(
							{
								$current = forceCreateModelElementAndSet(
									grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0(),
									$current);
							}
						)
						(
							(
								{
									if ($current==null) {
										$current = createModelElement(grammarAccess.getXRelationalExpressionRule());
									}
								}
								{
									newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0());
								}
								ruleOpCompare
								{
									afterParserOrEnumRuleCall();
								}
							)
						)
					)
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getRightOperandXOtherOperatorExpressionParserRuleCall_1_1_1_0());
						}
						lv_rightOperand_6_0=ruleXOtherOperatorExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXRelationalExpressionRule());
							}
							set(
								$current,
								"rightOperand",
								lv_rightOperand_6_0,
								"org.eclipse.xtext.xbase.Xbase.XOtherOperatorExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
		)*
	)
;

// Entry rule entryRuleOpCompare
entryRuleOpCompare returns [String current=null]:
	{ newCompositeNode(grammarAccess.getOpCompareRule()); }
	iv_ruleOpCompare=ruleOpCompare
	{ $current=$iv_ruleOpCompare.current.getText(); }
	EOF;

// Rule OpCompare
ruleOpCompare returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		kw='>='
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpCompareAccess().getGreaterThanSignEqualsSignKeyword_0());
		}
		    |
		(
			kw='<'
			{
				$current.merge(kw);
				newLeafNode(kw, grammarAccess.getOpCompareAccess().getLessThanSignKeyword_1_0());
			}
			kw='='
			{
				$current.merge(kw);
				newLeafNode(kw, grammarAccess.getOpCompareAccess().getEqualsSignKeyword_1_1());
			}
		)
		    |
		kw='>'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpCompareAccess().getGreaterThanSignKeyword_2());
		}
		    |
		kw='<'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpCompareAccess().getLessThanSignKeyword_3());
		}
	)
;

// Entry rule entryRuleXOtherOperatorExpression
entryRuleXOtherOperatorExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXOtherOperatorExpressionRule()); }
	iv_ruleXOtherOperatorExpression=ruleXOtherOperatorExpression
	{ $current=$iv_ruleXOtherOperatorExpression.current; }
	EOF;

// Rule XOtherOperatorExpression
ruleXOtherOperatorExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getXAdditiveExpressionParserRuleCall_0());
		}
		this_XAdditiveExpression_0=ruleXAdditiveExpression
		{
			$current = $this_XAdditiveExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				((
					(
					)
					(
						(
							ruleOpOther
						)
					)
				)
				)=>
				(
					(
						{
							$current = forceCreateModelElementAndSet(
								grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
								$current);
						}
					)
					(
						(
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getXOtherOperatorExpressionRule());
								}
							}
							{
								newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
							}
							ruleOpOther
							{
								afterParserOrEnumRuleCall();
							}
						)
					)
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getRightOperandXAdditiveExpressionParserRuleCall_1_1_0());
					}
					lv_rightOperand_3_0=ruleXAdditiveExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXOtherOperatorExpressionRule());
						}
						set(
							$current,
							"rightOperand",
							lv_rightOperand_3_0,
							"org.eclipse.xtext.xbase.Xbase.XAdditiveExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleOpOther
entryRuleOpOther returns [String current=null]:
	{ newCompositeNode(grammarAccess.getOpOtherRule()); }
	iv_ruleOpOther=ruleOpOther
	{ $current=$iv_ruleOpOther.current.getText(); }
	EOF;

// Rule OpOther
ruleOpOther returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		kw='->'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpOtherAccess().getHyphenMinusGreaterThanSignKeyword_0());
		}
		    |
		kw='..<'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopLessThanSignKeyword_1());
		}
		    |
		(
			kw='>'
			{
				$current.merge(kw);
				newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_2_0());
			}
			kw='..'
			{
				$current.merge(kw);
				newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_2_1());
			}
		)
		    |
		kw='..'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_3());
		}
		    |
		kw='=>'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_4());
		}
		    |
		(
			kw='>'
			{
				$current.merge(kw);
				newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_0());
			}
			(
				(
					((
						'>'
						'>'
					)
					)=>
					(
						kw='>'
						{
							$current.merge(kw);
							newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_0());
						}
						kw='>'
						{
							$current.merge(kw);
							newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_1());
						}
					)
				)
				    |
				kw='>'
				{
					$current.merge(kw);
					newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_1());
				}
			)
		)
		    |
		(
			kw='<'
			{
				$current.merge(kw);
				newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_0());
			}
			(
				(
					((
						'<'
						'<'
					)
					)=>
					(
						kw='<'
						{
							$current.merge(kw);
							newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_0());
						}
						kw='<'
						{
							$current.merge(kw);
							newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_1());
						}
					)
				)
				    |
				kw='<'
				{
					$current.merge(kw);
					newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_1());
				}
				    |
				kw='=>'
				{
					$current.merge(kw);
					newLeafNode(kw, grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_6_1_2());
				}
			)
		)
		    |
		kw='<>'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignGreaterThanSignKeyword_7());
		}
		    |
		kw='?:'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpOtherAccess().getQuestionMarkColonKeyword_8());
		}
	)
;

// Entry rule entryRuleXAdditiveExpression
entryRuleXAdditiveExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXAdditiveExpressionRule()); }
	iv_ruleXAdditiveExpression=ruleXAdditiveExpression
	{ $current=$iv_ruleXAdditiveExpression.current; }
	EOF;

// Rule XAdditiveExpression
ruleXAdditiveExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getXMultiplicativeExpressionParserRuleCall_0());
		}
		this_XMultiplicativeExpression_0=ruleXMultiplicativeExpression
		{
			$current = $this_XMultiplicativeExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				((
					(
					)
					(
						(
							ruleOpAdd
						)
					)
				)
				)=>
				(
					(
						{
							$current = forceCreateModelElementAndSet(
								grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
								$current);
						}
					)
					(
						(
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getXAdditiveExpressionRule());
								}
							}
							{
								newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
							}
							ruleOpAdd
							{
								afterParserOrEnumRuleCall();
							}
						)
					)
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getRightOperandXMultiplicativeExpressionParserRuleCall_1_1_0());
					}
					lv_rightOperand_3_0=ruleXMultiplicativeExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXAdditiveExpressionRule());
						}
						set(
							$current,
							"rightOperand",
							lv_rightOperand_3_0,
							"org.eclipse.xtext.xbase.Xbase.XMultiplicativeExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleOpAdd
entryRuleOpAdd returns [String current=null]:
	{ newCompositeNode(grammarAccess.getOpAddRule()); }
	iv_ruleOpAdd=ruleOpAdd
	{ $current=$iv_ruleOpAdd.current.getText(); }
	EOF;

// Rule OpAdd
ruleOpAdd returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		kw='+'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpAddAccess().getPlusSignKeyword_0());
		}
		    |
		kw='-'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpAddAccess().getHyphenMinusKeyword_1());
		}
	)
;

// Entry rule entryRuleXMultiplicativeExpression
entryRuleXMultiplicativeExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXMultiplicativeExpressionRule()); }
	iv_ruleXMultiplicativeExpression=ruleXMultiplicativeExpression
	{ $current=$iv_ruleXMultiplicativeExpression.current; }
	EOF;

// Rule XMultiplicativeExpression
ruleXMultiplicativeExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getXUnaryOperationParserRuleCall_0());
		}
		this_XUnaryOperation_0=ruleXUnaryOperation
		{
			$current = $this_XUnaryOperation_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				((
					(
					)
					(
						(
							ruleOpMulti
						)
					)
				)
				)=>
				(
					(
						{
							$current = forceCreateModelElementAndSet(
								grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0(),
								$current);
						}
					)
					(
						(
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getXMultiplicativeExpressionRule());
								}
							}
							{
								newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
							}
							ruleOpMulti
							{
								afterParserOrEnumRuleCall();
							}
						)
					)
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getRightOperandXUnaryOperationParserRuleCall_1_1_0());
					}
					lv_rightOperand_3_0=ruleXUnaryOperation
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXMultiplicativeExpressionRule());
						}
						set(
							$current,
							"rightOperand",
							lv_rightOperand_3_0,
							"org.eclipse.xtext.xbase.Xbase.XUnaryOperation");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleOpMulti
entryRuleOpMulti returns [String current=null]:
	{ newCompositeNode(grammarAccess.getOpMultiRule()); }
	iv_ruleOpMulti=ruleOpMulti
	{ $current=$iv_ruleOpMulti.current.getText(); }
	EOF;

// Rule OpMulti
ruleOpMulti returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		kw='*'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpMultiAccess().getAsteriskKeyword_0());
		}
		    |
		kw='**'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpMultiAccess().getAsteriskAsteriskKeyword_1());
		}
		    |
		kw='/'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpMultiAccess().getSolidusKeyword_2());
		}
		    |
		kw='%'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpMultiAccess().getPercentSignKeyword_3());
		}
	)
;

// Entry rule entryRuleXUnaryOperation
entryRuleXUnaryOperation returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXUnaryOperationRule()); }
	iv_ruleXUnaryOperation=ruleXUnaryOperation
	{ $current=$iv_ruleXUnaryOperation.current; }
	EOF;

// Rule XUnaryOperation
ruleXUnaryOperation returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					$current = forceCreateModelElement(
						grammarAccess.getXUnaryOperationAccess().getXUnaryOperationAction_0_0(),
						$current);
				}
			)
			(
				(
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getXUnaryOperationRule());
						}
					}
					{
						newCompositeNode(grammarAccess.getXUnaryOperationAccess().getFeatureJvmIdentifiableElementCrossReference_0_1_0());
					}
					ruleOpUnary
					{
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getXUnaryOperationAccess().getOperandXUnaryOperationParserRuleCall_0_2_0());
					}
					lv_operand_2_0=ruleXUnaryOperation
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXUnaryOperationRule());
						}
						set(
							$current,
							"operand",
							lv_operand_2_0,
							"org.eclipse.xtext.xbase.Xbase.XUnaryOperation");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)
		    |
		{
			newCompositeNode(grammarAccess.getXUnaryOperationAccess().getXCastedExpressionParserRuleCall_1());
		}
		this_XCastedExpression_3=ruleXCastedExpression
		{
			$current = $this_XCastedExpression_3.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleOpUnary
entryRuleOpUnary returns [String current=null]:
	{ newCompositeNode(grammarAccess.getOpUnaryRule()); }
	iv_ruleOpUnary=ruleOpUnary
	{ $current=$iv_ruleOpUnary.current.getText(); }
	EOF;

// Rule OpUnary
ruleOpUnary returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		kw='!'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpUnaryAccess().getExclamationMarkKeyword_0());
		}
		    |
		kw='-'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpUnaryAccess().getHyphenMinusKeyword_1());
		}
		    |
		kw='+'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpUnaryAccess().getPlusSignKeyword_2());
		}
	)
;

// Entry rule entryRuleXCastedExpression
entryRuleXCastedExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXCastedExpressionRule()); }
	iv_ruleXCastedExpression=ruleXCastedExpression
	{ $current=$iv_ruleXCastedExpression.current; }
	EOF;

// Rule XCastedExpression
ruleXCastedExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXCastedExpressionAccess().getXPostfixOperationParserRuleCall_0());
		}
		this_XPostfixOperation_0=ruleXPostfixOperation
		{
			$current = $this_XPostfixOperation_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				((
					(
					)
					'as'
				)
				)=>
				(
					(
						{
							$current = forceCreateModelElementAndSet(
								grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0(),
								$current);
						}
					)
					otherlv_2='as'
					{
						newLeafNode(otherlv_2, grammarAccess.getXCastedExpressionAccess().getAsKeyword_1_0_0_1());
					}
				)
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getXCastedExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_1_0());
					}
					lv_type_3_0=ruleJvmTypeReference
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXCastedExpressionRule());
						}
						set(
							$current,
							"type",
							lv_type_3_0,
							"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)*
	)
;

// Entry rule entryRuleXPostfixOperation
entryRuleXPostfixOperation returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXPostfixOperationRule()); }
	iv_ruleXPostfixOperation=ruleXPostfixOperation
	{ $current=$iv_ruleXPostfixOperation.current; }
	EOF;

// Rule XPostfixOperation
ruleXPostfixOperation returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXPostfixOperationAccess().getXMemberFeatureCallParserRuleCall_0());
		}
		this_XMemberFeatureCall_0=ruleXMemberFeatureCall
		{
			$current = $this_XMemberFeatureCall_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			((
				(
				)
				(
					(
						ruleOpPostfix
					)
				)
			)
			)=>
			(
				(
					{
						$current = forceCreateModelElementAndSet(
							grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0(),
							$current);
					}
				)
				(
					(
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getXPostfixOperationRule());
							}
						}
						{
							newCompositeNode(grammarAccess.getXPostfixOperationAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_1_0());
						}
						ruleOpPostfix
						{
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
		)?
	)
;

// Entry rule entryRuleOpPostfix
entryRuleOpPostfix returns [String current=null]:
	{ newCompositeNode(grammarAccess.getOpPostfixRule()); }
	iv_ruleOpPostfix=ruleOpPostfix
	{ $current=$iv_ruleOpPostfix.current.getText(); }
	EOF;

// Rule OpPostfix
ruleOpPostfix returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		kw='++'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpPostfixAccess().getPlusSignPlusSignKeyword_0());
		}
		    |
		kw='--'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getOpPostfixAccess().getHyphenMinusHyphenMinusKeyword_1());
		}
	)
;

// Entry rule entryRuleXMemberFeatureCall
entryRuleXMemberFeatureCall returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXMemberFeatureCallRule()); }
	iv_ruleXMemberFeatureCall=ruleXMemberFeatureCall
	{ $current=$iv_ruleXMemberFeatureCall.current; }
	EOF;

// Rule XMemberFeatureCall
ruleXMemberFeatureCall returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getXPrimaryExpressionParserRuleCall_0());
		}
		this_XPrimaryExpression_0=ruleXPrimaryExpression
		{
			$current = $this_XPrimaryExpression_0.current;
			afterParserOrEnumRuleCall();
		}
		(
			(
				(
					((
						(
						)
						(
							'.'
							    |
							(
								(
									'::'
								)
							)
						)
						(
							(
								ruleFeatureCallID
							)
						)
						ruleOpSingleAssign
					)
					)=>
					(
						(
							{
								$current = forceCreateModelElementAndSet(
									grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0(),
									$current);
							}
						)
						(
							otherlv_2='.'
							{
								newLeafNode(otherlv_2, grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_0_0_0_1_0());
							}
							    |
							(
								(
									lv_explicitStatic_3_0='::'
									{
										newLeafNode(lv_explicitStatic_3_0, grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_0_0_0_1_1_0());
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
										}
										setWithLastConsumed($current, "explicitStatic", true, "::");
									}
								)
							)
						)
						(
							(
								{
									if ($current==null) {
										$current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
									}
								}
								{
									newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_0_2_0());
								}
								ruleFeatureCallID
								{
									afterParserOrEnumRuleCall();
								}
							)
						)
						{
							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getOpSingleAssignParserRuleCall_1_0_0_0_3());
						}
						ruleOpSingleAssign
						{
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getValueXAssignmentParserRuleCall_1_0_1_0());
						}
						lv_value_6_0=ruleXAssignment
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
							}
							set(
								$current,
								"value",
								lv_value_6_0,
								"org.eclipse.xtext.xbase.Xbase.XAssignment");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
			    |
			(
				(
					((
						(
						)
						(
							'.'
							    |
							(
								(
									'?.'
								)
							)
							    |
							(
								(
									'::'
								)
							)
						)
					)
					)=>
					(
						(
							{
								$current = forceCreateModelElementAndSet(
									grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0(),
									$current);
							}
						)
						(
							otherlv_8='.'
							{
								newLeafNode(otherlv_8, grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_1_0_0_1_0());
							}
							    |
							(
								(
									lv_nullSafe_9_0='?.'
									{
										newLeafNode(lv_nullSafe_9_0, grammarAccess.getXMemberFeatureCallAccess().getNullSafeQuestionMarkFullStopKeyword_1_1_0_0_1_1_0());
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
										}
										setWithLastConsumed($current, "nullSafe", true, "?.");
									}
								)
							)
							    |
							(
								(
									lv_explicitStatic_10_0='::'
									{
										newLeafNode(lv_explicitStatic_10_0, grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_1_0_0_1_2_0());
									}
									{
										if ($current==null) {
											$current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
										}
										setWithLastConsumed($current, "explicitStatic", true, "::");
									}
								)
							)
						)
					)
				)
				(
					otherlv_11='<'
					{
						newLeafNode(otherlv_11, grammarAccess.getXMemberFeatureCallAccess().getLessThanSignKeyword_1_1_1_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_1_0());
							}
							lv_typeArguments_12_0=ruleJvmArgumentTypeReference
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
								}
								add(
									$current,
									"typeArguments",
									lv_typeArguments_12_0,
									"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
								afterParserOrEnumRuleCall();
							}
						)
					)
					(
						otherlv_13=','
						{
							newLeafNode(otherlv_13, grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_1_2_0());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_2_1_0());
								}
								lv_typeArguments_14_0=ruleJvmArgumentTypeReference
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
									}
									add(
										$current,
										"typeArguments",
										lv_typeArguments_14_0,
										"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)*
					otherlv_15='>'
					{
						newLeafNode(otherlv_15, grammarAccess.getXMemberFeatureCallAccess().getGreaterThanSignKeyword_1_1_1_3());
					}
				)?
				(
					(
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
							}
						}
						{
							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_2_0());
						}
						ruleIdOrSuper
						{
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					(
						((
							'('
						)
						)=>
						(
							lv_explicitOperationCall_17_0='('
							{
								newLeafNode(lv_explicitOperationCall_17_0, grammarAccess.getXMemberFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_1_1_3_0_0());
							}
							{
								if ($current==null) {
									$current = createModelElement(grammarAccess.getXMemberFeatureCallRule());
								}
								setWithLastConsumed($current, "explicitOperationCall", true, "(");
							}
						)
					)
					(
						(
							((
								(
								)
								(
									(
										(
											ruleJvmFormalParameter
										)
									)
									(
										','
										(
											(
												ruleJvmFormalParameter
											)
										)
									)*
								)?
								(
									(
										'|'
									)
								)
							)
							)=>
							(
								{
									newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXShortClosureParserRuleCall_1_1_3_1_0_0());
								}
								lv_memberCallArguments_18_0=ruleXShortClosure
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
									}
									add(
										$current,
										"memberCallArguments",
										lv_memberCallArguments_18_0,
										"org.eclipse.xtext.xbase.Xbase.XShortClosure");
									afterParserOrEnumRuleCall();
								}
							)
						)
						    |
						(
							(
								(
									{
										newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_0_0());
									}
									lv_memberCallArguments_19_0=ruleXExpression
									{
										if ($current==null) {
											$current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
										}
										add(
											$current,
											"memberCallArguments",
											lv_memberCallArguments_19_0,
											"org.eclipse.xtext.xbase.Xbase.XExpression");
										afterParserOrEnumRuleCall();
									}
								)
							)
							(
								otherlv_20=','
								{
									newLeafNode(otherlv_20, grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_3_1_1_1_0());
								}
								(
									(
										{
											newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_1_1_0());
										}
										lv_memberCallArguments_21_0=ruleXExpression
										{
											if ($current==null) {
												$current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
											}
											add(
												$current,
												"memberCallArguments",
												lv_memberCallArguments_21_0,
												"org.eclipse.xtext.xbase.Xbase.XExpression");
											afterParserOrEnumRuleCall();
										}
									)
								)
							)*
						)
					)?
					otherlv_22=')'
					{
						newLeafNode(otherlv_22, grammarAccess.getXMemberFeatureCallAccess().getRightParenthesisKeyword_1_1_3_2());
					}
				)?
				(
					((
						(
						)
						'['
					)
					)=>
					(
						{
							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXClosureParserRuleCall_1_1_4_0());
						}
						lv_memberCallArguments_23_0=ruleXClosure
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXMemberFeatureCallRule());
							}
							add(
								$current,
								"memberCallArguments",
								lv_memberCallArguments_23_0,
								"org.eclipse.xtext.xbase.Xbase.XClosure");
							afterParserOrEnumRuleCall();
						}
					)
				)?
			)
		)*
	)
;

// Entry rule entryRuleXPrimaryExpression
entryRuleXPrimaryExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXPrimaryExpressionRule()); }
	iv_ruleXPrimaryExpression=ruleXPrimaryExpression
	{ $current=$iv_ruleXPrimaryExpression.current; }
	EOF;

// Rule XPrimaryExpression
ruleXPrimaryExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXConstructorCallParserRuleCall_0());
		}
		this_XConstructorCall_0=ruleXConstructorCall
		{
			$current = $this_XConstructorCall_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXBlockExpressionParserRuleCall_1());
		}
		this_XBlockExpression_1=ruleXBlockExpression
		{
			$current = $this_XBlockExpression_1.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXSwitchExpressionParserRuleCall_2());
		}
		this_XSwitchExpression_2=ruleXSwitchExpression
		{
			$current = $this_XSwitchExpression_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		(
			((
				(
				)
				'synchronized'
				'('
			)
			)=>
			{
				newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXSynchronizedExpressionParserRuleCall_3());
			}
			this_XSynchronizedExpression_3=ruleXSynchronizedExpression
			{
				$current = $this_XSynchronizedExpression_3.current;
				afterParserOrEnumRuleCall();
			}
		)
		    |
		{
			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXFeatureCallParserRuleCall_4());
		}
		this_XFeatureCall_4=ruleXFeatureCall
		{
			$current = $this_XFeatureCall_4.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXLiteralParserRuleCall_5());
		}
		this_XLiteral_5=ruleXLiteral
		{
			$current = $this_XLiteral_5.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXIfExpressionParserRuleCall_6());
		}
		this_XIfExpression_6=ruleXIfExpression
		{
			$current = $this_XIfExpression_6.current;
			afterParserOrEnumRuleCall();
		}
		    |
		(
			((
				(
				)
				'for'
				'('
				(
					(
						ruleJvmFormalParameter
					)
				)
				':'
			)
			)=>
			{
				newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXForLoopExpressionParserRuleCall_7());
			}
			this_XForLoopExpression_7=ruleXForLoopExpression
			{
				$current = $this_XForLoopExpression_7.current;
				afterParserOrEnumRuleCall();
			}
		)
		    |
		{
			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXBasicForLoopExpressionParserRuleCall_8());
		}
		this_XBasicForLoopExpression_8=ruleXBasicForLoopExpression
		{
			$current = $this_XBasicForLoopExpression_8.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXWhileExpressionParserRuleCall_9());
		}
		this_XWhileExpression_9=ruleXWhileExpression
		{
			$current = $this_XWhileExpression_9.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXDoWhileExpressionParserRuleCall_10());
		}
		this_XDoWhileExpression_10=ruleXDoWhileExpression
		{
			$current = $this_XDoWhileExpression_10.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXThrowExpressionParserRuleCall_11());
		}
		this_XThrowExpression_11=ruleXThrowExpression
		{
			$current = $this_XThrowExpression_11.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXReturnExpressionParserRuleCall_12());
		}
		this_XReturnExpression_12=ruleXReturnExpression
		{
			$current = $this_XReturnExpression_12.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXTryCatchFinallyExpressionParserRuleCall_13());
		}
		this_XTryCatchFinallyExpression_13=ruleXTryCatchFinallyExpression
		{
			$current = $this_XTryCatchFinallyExpression_13.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXPrimaryExpressionAccess().getXParenthesizedExpressionParserRuleCall_14());
		}
		this_XParenthesizedExpression_14=ruleXParenthesizedExpression
		{
			$current = $this_XParenthesizedExpression_14.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleXLiteral
entryRuleXLiteral returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXLiteralRule()); }
	iv_ruleXLiteral=ruleXLiteral
	{ $current=$iv_ruleXLiteral.current; }
	EOF;

// Rule XLiteral
ruleXLiteral returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXLiteralAccess().getXCollectionLiteralParserRuleCall_0());
		}
		this_XCollectionLiteral_0=ruleXCollectionLiteral
		{
			$current = $this_XCollectionLiteral_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		(
			((
				(
				)
				'['
			)
			)=>
			{
				newCompositeNode(grammarAccess.getXLiteralAccess().getXClosureParserRuleCall_1());
			}
			this_XClosure_1=ruleXClosure
			{
				$current = $this_XClosure_1.current;
				afterParserOrEnumRuleCall();
			}
		)
		    |
		{
			newCompositeNode(grammarAccess.getXLiteralAccess().getXBooleanLiteralParserRuleCall_2());
		}
		this_XBooleanLiteral_2=ruleXBooleanLiteral
		{
			$current = $this_XBooleanLiteral_2.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXLiteralAccess().getXNumberLiteralParserRuleCall_3());
		}
		this_XNumberLiteral_3=ruleXNumberLiteral
		{
			$current = $this_XNumberLiteral_3.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXLiteralAccess().getXNullLiteralParserRuleCall_4());
		}
		this_XNullLiteral_4=ruleXNullLiteral
		{
			$current = $this_XNullLiteral_4.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXLiteralAccess().getXStringLiteralParserRuleCall_5());
		}
		this_XStringLiteral_5=ruleXStringLiteral
		{
			$current = $this_XStringLiteral_5.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXLiteralAccess().getXTypeLiteralParserRuleCall_6());
		}
		this_XTypeLiteral_6=ruleXTypeLiteral
		{
			$current = $this_XTypeLiteral_6.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleXCollectionLiteral
entryRuleXCollectionLiteral returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXCollectionLiteralRule()); }
	iv_ruleXCollectionLiteral=ruleXCollectionLiteral
	{ $current=$iv_ruleXCollectionLiteral.current; }
	EOF;

// Rule XCollectionLiteral
ruleXCollectionLiteral returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXCollectionLiteralAccess().getXSetLiteralParserRuleCall_0());
		}
		this_XSetLiteral_0=ruleXSetLiteral
		{
			$current = $this_XSetLiteral_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXCollectionLiteralAccess().getXListLiteralParserRuleCall_1());
		}
		this_XListLiteral_1=ruleXListLiteral
		{
			$current = $this_XListLiteral_1.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleXSetLiteral
entryRuleXSetLiteral returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXSetLiteralRule()); }
	iv_ruleXSetLiteral=ruleXSetLiteral
	{ $current=$iv_ruleXSetLiteral.current; }
	EOF;

// Rule XSetLiteral
ruleXSetLiteral returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXSetLiteralAccess().getXSetLiteralAction_0(),
					$current);
			}
		)
		otherlv_1='#'
		{
			newLeafNode(otherlv_1, grammarAccess.getXSetLiteralAccess().getNumberSignKeyword_1());
		}
		otherlv_2='{'
		{
			newLeafNode(otherlv_2, grammarAccess.getXSetLiteralAccess().getLeftCurlyBracketKeyword_2());
		}
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0());
					}
					lv_elements_3_0=ruleXExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXSetLiteralRule());
						}
						add(
							$current,
							"elements",
							lv_elements_3_0,
							"org.eclipse.xtext.xbase.Xbase.XExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_4=','
				{
					newLeafNode(otherlv_4, grammarAccess.getXSetLiteralAccess().getCommaKeyword_3_1_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0());
						}
						lv_elements_5_0=ruleXExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXSetLiteralRule());
							}
							add(
								$current,
								"elements",
								lv_elements_5_0,
								"org.eclipse.xtext.xbase.Xbase.XExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
		)?
		otherlv_6='}'
		{
			newLeafNode(otherlv_6, grammarAccess.getXSetLiteralAccess().getRightCurlyBracketKeyword_4());
		}
	)
;

// Entry rule entryRuleXListLiteral
entryRuleXListLiteral returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXListLiteralRule()); }
	iv_ruleXListLiteral=ruleXListLiteral
	{ $current=$iv_ruleXListLiteral.current; }
	EOF;

// Rule XListLiteral
ruleXListLiteral returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXListLiteralAccess().getXListLiteralAction_0(),
					$current);
			}
		)
		otherlv_1='#'
		{
			newLeafNode(otherlv_1, grammarAccess.getXListLiteralAccess().getNumberSignKeyword_1());
		}
		otherlv_2='['
		{
			newLeafNode(otherlv_2, grammarAccess.getXListLiteralAccess().getLeftSquareBracketKeyword_2());
		}
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0());
					}
					lv_elements_3_0=ruleXExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXListLiteralRule());
						}
						add(
							$current,
							"elements",
							lv_elements_3_0,
							"org.eclipse.xtext.xbase.Xbase.XExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_4=','
				{
					newLeafNode(otherlv_4, grammarAccess.getXListLiteralAccess().getCommaKeyword_3_1_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0());
						}
						lv_elements_5_0=ruleXExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXListLiteralRule());
							}
							add(
								$current,
								"elements",
								lv_elements_5_0,
								"org.eclipse.xtext.xbase.Xbase.XExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
		)?
		otherlv_6=']'
		{
			newLeafNode(otherlv_6, grammarAccess.getXListLiteralAccess().getRightSquareBracketKeyword_4());
		}
	)
;

// Entry rule entryRuleXClosure
entryRuleXClosure returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXClosureRule()); }
	iv_ruleXClosure=ruleXClosure
	{ $current=$iv_ruleXClosure.current; }
	EOF;

// Rule XClosure
ruleXClosure returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			((
				(
				)
				'['
			)
			)=>
			(
				(
					{
						$current = forceCreateModelElement(
							grammarAccess.getXClosureAccess().getXClosureAction_0_0_0(),
							$current);
					}
				)
				otherlv_1='['
				{
					newLeafNode(otherlv_1, grammarAccess.getXClosureAccess().getLeftSquareBracketKeyword_0_0_1());
				}
			)
		)
		(
			((
				(
					(
						(
							ruleJvmFormalParameter
						)
					)
					(
						','
						(
							(
								ruleJvmFormalParameter
							)
						)
					)*
				)?
				(
					(
						'|'
					)
				)
			)
			)=>
			(
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_0_0());
							}
							lv_declaredFormalParameters_2_0=ruleJvmFormalParameter
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXClosureRule());
								}
								add(
									$current,
									"declaredFormalParameters",
									lv_declaredFormalParameters_2_0,
									"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
								afterParserOrEnumRuleCall();
							}
						)
					)
					(
						otherlv_3=','
						{
							newLeafNode(otherlv_3, grammarAccess.getXClosureAccess().getCommaKeyword_1_0_0_1_0());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_1_1_0());
								}
								lv_declaredFormalParameters_4_0=ruleJvmFormalParameter
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getXClosureRule());
									}
									add(
										$current,
										"declaredFormalParameters",
										lv_declaredFormalParameters_4_0,
										"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)*
				)?
				(
					(
						lv_explicitSyntax_5_0='|'
						{
							newLeafNode(lv_explicitSyntax_5_0, grammarAccess.getXClosureAccess().getExplicitSyntaxVerticalLineKeyword_1_0_1_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getXClosureRule());
							}
							setWithLastConsumed($current, "explicitSyntax", true, "|");
						}
					)
				)
			)
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getXClosureAccess().getExpressionXExpressionInClosureParserRuleCall_2_0());
				}
				lv_expression_6_0=ruleXExpressionInClosure
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXClosureRule());
					}
					set(
						$current,
						"expression",
						lv_expression_6_0,
						"org.eclipse.xtext.xbase.Xbase.XExpressionInClosure");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_7=']'
		{
			newLeafNode(otherlv_7, grammarAccess.getXClosureAccess().getRightSquareBracketKeyword_3());
		}
	)
;

// Entry rule entryRuleXExpressionInClosure
entryRuleXExpressionInClosure returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXExpressionInClosureRule()); }
	iv_ruleXExpressionInClosure=ruleXExpressionInClosure
	{ $current=$iv_ruleXExpressionInClosure.current; }
	EOF;

// Rule XExpressionInClosure
ruleXExpressionInClosure returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXExpressionInClosureAccess().getXBlockExpressionAction_0(),
					$current);
			}
		)
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getXExpressionInClosureAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_1_0_0());
					}
					lv_expressions_1_0=ruleXExpressionOrVarDeclaration
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXExpressionInClosureRule());
						}
						add(
							$current,
							"expressions",
							lv_expressions_1_0,
							"org.eclipse.xtext.xbase.Xbase.XExpressionOrVarDeclaration");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_2=';'
				{
					newLeafNode(otherlv_2, grammarAccess.getXExpressionInClosureAccess().getSemicolonKeyword_1_1());
				}
			)?
		)*
	)
;

// Entry rule entryRuleXShortClosure
entryRuleXShortClosure returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXShortClosureRule()); }
	iv_ruleXShortClosure=ruleXShortClosure
	{ $current=$iv_ruleXShortClosure.current; }
	EOF;

// Rule XShortClosure
ruleXShortClosure returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			((
				(
				)
				(
					(
						(
							ruleJvmFormalParameter
						)
					)
					(
						','
						(
							(
								ruleJvmFormalParameter
							)
						)
					)*
				)?
				(
					(
						'|'
					)
				)
			)
			)=>
			(
				(
					{
						$current = forceCreateModelElement(
							grammarAccess.getXShortClosureAccess().getXClosureAction_0_0_0(),
							$current);
					}
				)
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_0_0());
							}
							lv_declaredFormalParameters_1_0=ruleJvmFormalParameter
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXShortClosureRule());
								}
								add(
									$current,
									"declaredFormalParameters",
									lv_declaredFormalParameters_1_0,
									"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
								afterParserOrEnumRuleCall();
							}
						)
					)
					(
						otherlv_2=','
						{
							newLeafNode(otherlv_2, grammarAccess.getXShortClosureAccess().getCommaKeyword_0_0_1_1_0());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_1_1_0());
								}
								lv_declaredFormalParameters_3_0=ruleJvmFormalParameter
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getXShortClosureRule());
									}
									add(
										$current,
										"declaredFormalParameters",
										lv_declaredFormalParameters_3_0,
										"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)*
				)?
				(
					(
						lv_explicitSyntax_4_0='|'
						{
							newLeafNode(lv_explicitSyntax_4_0, grammarAccess.getXShortClosureAccess().getExplicitSyntaxVerticalLineKeyword_0_0_2_0());
						}
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getXShortClosureRule());
							}
							setWithLastConsumed($current, "explicitSyntax", true, "|");
						}
					)
				)
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getXShortClosureAccess().getExpressionXExpressionParserRuleCall_1_0());
				}
				lv_expression_5_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXShortClosureRule());
					}
					set(
						$current,
						"expression",
						lv_expression_5_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleXParenthesizedExpression
entryRuleXParenthesizedExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXParenthesizedExpressionRule()); }
	iv_ruleXParenthesizedExpression=ruleXParenthesizedExpression
	{ $current=$iv_ruleXParenthesizedExpression.current; }
	EOF;

// Rule XParenthesizedExpression
ruleXParenthesizedExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='('
		{
			newLeafNode(otherlv_0, grammarAccess.getXParenthesizedExpressionAccess().getLeftParenthesisKeyword_0());
		}
		{
			newCompositeNode(grammarAccess.getXParenthesizedExpressionAccess().getXExpressionParserRuleCall_1());
		}
		this_XExpression_1=ruleXExpression
		{
			$current = $this_XExpression_1.current;
			afterParserOrEnumRuleCall();
		}
		otherlv_2=')'
		{
			newLeafNode(otherlv_2, grammarAccess.getXParenthesizedExpressionAccess().getRightParenthesisKeyword_2());
		}
	)
;

// Entry rule entryRuleXIfExpression
entryRuleXIfExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXIfExpressionRule()); }
	iv_ruleXIfExpression=ruleXIfExpression
	{ $current=$iv_ruleXIfExpression.current; }
	EOF;

// Rule XIfExpression
ruleXIfExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXIfExpressionAccess().getXIfExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='if'
		{
			newLeafNode(otherlv_1, grammarAccess.getXIfExpressionAccess().getIfKeyword_1());
		}
		otherlv_2='('
		{
			newLeafNode(otherlv_2, grammarAccess.getXIfExpressionAccess().getLeftParenthesisKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXIfExpressionAccess().getIfXExpressionParserRuleCall_3_0());
				}
				lv_if_3_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXIfExpressionRule());
					}
					set(
						$current,
						"if",
						lv_if_3_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_4=')'
		{
			newLeafNode(otherlv_4, grammarAccess.getXIfExpressionAccess().getRightParenthesisKeyword_4());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXIfExpressionAccess().getThenXExpressionParserRuleCall_5_0());
				}
				lv_then_5_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXIfExpressionRule());
					}
					set(
						$current,
						"then",
						lv_then_5_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				('else')=>
				otherlv_6='else'
				{
					newLeafNode(otherlv_6, grammarAccess.getXIfExpressionAccess().getElseKeyword_6_0());
				}
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getXIfExpressionAccess().getElseXExpressionParserRuleCall_6_1_0());
					}
					lv_else_7_0=ruleXExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXIfExpressionRule());
						}
						set(
							$current,
							"else",
							lv_else_7_0,
							"org.eclipse.xtext.xbase.Xbase.XExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
	)
;

// Entry rule entryRuleXSwitchExpression
entryRuleXSwitchExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXSwitchExpressionRule()); }
	iv_ruleXSwitchExpression=ruleXSwitchExpression
	{ $current=$iv_ruleXSwitchExpression.current; }
	EOF;

// Rule XSwitchExpression
ruleXSwitchExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXSwitchExpressionAccess().getXSwitchExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='switch'
		{
			newLeafNode(otherlv_1, grammarAccess.getXSwitchExpressionAccess().getSwitchKeyword_1());
		}
		(
			(
				(
					((
						'('
						(
							(
								ruleJvmFormalParameter
							)
						)
						':'
					)
					)=>
					(
						otherlv_2='('
						{
							newLeafNode(otherlv_2, grammarAccess.getXSwitchExpressionAccess().getLeftParenthesisKeyword_2_0_0_0_0());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_0_0_0_1_0());
								}
								lv_declaredParam_3_0=ruleJvmFormalParameter
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
									}
									set(
										$current,
										"declaredParam",
										lv_declaredParam_3_0,
										"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
									afterParserOrEnumRuleCall();
								}
							)
						)
						otherlv_4=':'
						{
							newLeafNode(otherlv_4, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_0_0_0_2());
						}
					)
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_0_1_0());
						}
						lv_switch_5_0=ruleXExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
							}
							set(
								$current,
								"switch",
								lv_switch_5_0,
								"org.eclipse.xtext.xbase.Xbase.XExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_6=')'
				{
					newLeafNode(otherlv_6, grammarAccess.getXSwitchExpressionAccess().getRightParenthesisKeyword_2_0_2());
				}
			)
			    |
			(
				(
					((
						(
							(
								ruleJvmFormalParameter
							)
						)
						':'
					)
					)=>
					(
						(
							(
								{
									newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_1_0_0_0_0());
								}
								lv_declaredParam_7_0=ruleJvmFormalParameter
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
									}
									set(
										$current,
										"declaredParam",
										lv_declaredParam_7_0,
										"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
									afterParserOrEnumRuleCall();
								}
							)
						)
						otherlv_8=':'
						{
							newLeafNode(otherlv_8, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_1_0_0_1());
						}
					)
				)?
				(
					(
						{
							newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_1_1_0());
						}
						lv_switch_9_0=ruleXExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
							}
							set(
								$current,
								"switch",
								lv_switch_9_0,
								"org.eclipse.xtext.xbase.Xbase.XExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
		)
		otherlv_10='{'
		{
			newLeafNode(otherlv_10, grammarAccess.getXSwitchExpressionAccess().getLeftCurlyBracketKeyword_3());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getCasesXCasePartParserRuleCall_4_0());
				}
				lv_cases_11_0=ruleXCasePart
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
					}
					add(
						$current,
						"cases",
						lv_cases_11_0,
						"org.eclipse.xtext.xbase.Xbase.XCasePart");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		(
			otherlv_12='default'
			{
				newLeafNode(otherlv_12, grammarAccess.getXSwitchExpressionAccess().getDefaultKeyword_5_0());
			}
			otherlv_13=':'
			{
				newLeafNode(otherlv_13, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_5_1());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDefaultXExpressionParserRuleCall_5_2_0());
					}
					lv_default_14_0=ruleXExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXSwitchExpressionRule());
						}
						set(
							$current,
							"default",
							lv_default_14_0,
							"org.eclipse.xtext.xbase.Xbase.XExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
		otherlv_15='}'
		{
			newLeafNode(otherlv_15, grammarAccess.getXSwitchExpressionAccess().getRightCurlyBracketKeyword_6());
		}
	)
;

// Entry rule entryRuleXCasePart
entryRuleXCasePart returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXCasePartRule()); }
	iv_ruleXCasePart=ruleXCasePart
	{ $current=$iv_ruleXCasePart.current; }
	EOF;

// Rule XCasePart
ruleXCasePart returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXCasePartAccess().getXCasePartAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getXCasePartAccess().getTypeGuardJvmTypeReferenceParserRuleCall_1_0());
				}
				lv_typeGuard_1_0=ruleJvmTypeReference
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXCasePartRule());
					}
					set(
						$current,
						"typeGuard",
						lv_typeGuard_1_0,
						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			otherlv_2='case'
			{
				newLeafNode(otherlv_2, grammarAccess.getXCasePartAccess().getCaseKeyword_2_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getXCasePartAccess().getCaseXExpressionParserRuleCall_2_1_0());
					}
					lv_case_3_0=ruleXExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXCasePartRule());
						}
						set(
							$current,
							"case",
							lv_case_3_0,
							"org.eclipse.xtext.xbase.Xbase.XExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
		(
			(
				otherlv_4=':'
				{
					newLeafNode(otherlv_4, grammarAccess.getXCasePartAccess().getColonKeyword_3_0_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getXCasePartAccess().getThenXExpressionParserRuleCall_3_0_1_0());
						}
						lv_then_5_0=ruleXExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXCasePartRule());
							}
							set(
								$current,
								"then",
								lv_then_5_0,
								"org.eclipse.xtext.xbase.Xbase.XExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
			    |
			(
				(
					lv_fallThrough_6_0=','
					{
						newLeafNode(lv_fallThrough_6_0, grammarAccess.getXCasePartAccess().getFallThroughCommaKeyword_3_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getXCasePartRule());
						}
						setWithLastConsumed($current, "fallThrough", true, ",");
					}
				)
			)
		)
	)
;

// Entry rule entryRuleXForLoopExpression
entryRuleXForLoopExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXForLoopExpressionRule()); }
	iv_ruleXForLoopExpression=ruleXForLoopExpression
	{ $current=$iv_ruleXForLoopExpression.current; }
	EOF;

// Rule XForLoopExpression
ruleXForLoopExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			((
				(
				)
				'for'
				'('
				(
					(
						ruleJvmFormalParameter
					)
				)
				':'
			)
			)=>
			(
				(
					{
						$current = forceCreateModelElement(
							grammarAccess.getXForLoopExpressionAccess().getXForLoopExpressionAction_0_0_0(),
							$current);
					}
				)
				otherlv_1='for'
				{
					newLeafNode(otherlv_1, grammarAccess.getXForLoopExpressionAccess().getForKeyword_0_0_1());
				}
				otherlv_2='('
				{
					newLeafNode(otherlv_2, grammarAccess.getXForLoopExpressionAccess().getLeftParenthesisKeyword_0_0_2());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_0_0_3_0());
						}
						lv_declaredParam_3_0=ruleJvmFormalParameter
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXForLoopExpressionRule());
							}
							set(
								$current,
								"declaredParam",
								lv_declaredParam_3_0,
								"org.eclipse.xtext.xbase.Xbase.JvmFormalParameter");
							afterParserOrEnumRuleCall();
						}
					)
				)
				otherlv_4=':'
				{
					newLeafNode(otherlv_4, grammarAccess.getXForLoopExpressionAccess().getColonKeyword_0_0_4());
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getForExpressionXExpressionParserRuleCall_1_0());
				}
				lv_forExpression_5_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXForLoopExpressionRule());
					}
					set(
						$current,
						"forExpression",
						lv_forExpression_5_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_6=')'
		{
			newLeafNode(otherlv_6, grammarAccess.getXForLoopExpressionAccess().getRightParenthesisKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getEachExpressionXExpressionParserRuleCall_3_0());
				}
				lv_eachExpression_7_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXForLoopExpressionRule());
					}
					set(
						$current,
						"eachExpression",
						lv_eachExpression_7_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleXBasicForLoopExpression
entryRuleXBasicForLoopExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXBasicForLoopExpressionRule()); }
	iv_ruleXBasicForLoopExpression=ruleXBasicForLoopExpression
	{ $current=$iv_ruleXBasicForLoopExpression.current; }
	EOF;

// Rule XBasicForLoopExpression
ruleXBasicForLoopExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXBasicForLoopExpressionAccess().getXBasicForLoopExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='for'
		{
			newLeafNode(otherlv_1, grammarAccess.getXBasicForLoopExpressionAccess().getForKeyword_1());
		}
		otherlv_2='('
		{
			newLeafNode(otherlv_2, grammarAccess.getXBasicForLoopExpressionAccess().getLeftParenthesisKeyword_2());
		}
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_0_0());
					}
					lv_initExpressions_3_0=ruleXExpressionOrVarDeclaration
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
						}
						add(
							$current,
							"initExpressions",
							lv_initExpressions_3_0,
							"org.eclipse.xtext.xbase.Xbase.XExpressionOrVarDeclaration");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_4=','
				{
					newLeafNode(otherlv_4, grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_3_1_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_1_1_0());
						}
						lv_initExpressions_5_0=ruleXExpressionOrVarDeclaration
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
							}
							add(
								$current,
								"initExpressions",
								lv_initExpressions_5_0,
								"org.eclipse.xtext.xbase.Xbase.XExpressionOrVarDeclaration");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
		)?
		otherlv_6=';'
		{
			newLeafNode(otherlv_6, grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_4());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getExpressionXExpressionParserRuleCall_5_0());
				}
				lv_expression_7_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
					}
					set(
						$current,
						"expression",
						lv_expression_7_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		otherlv_8=';'
		{
			newLeafNode(otherlv_8, grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_6());
		}
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_0_0());
					}
					lv_updateExpressions_9_0=ruleXExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
						}
						add(
							$current,
							"updateExpressions",
							lv_updateExpressions_9_0,
							"org.eclipse.xtext.xbase.Xbase.XExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_10=','
				{
					newLeafNode(otherlv_10, grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_7_1_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_1_1_0());
						}
						lv_updateExpressions_11_0=ruleXExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
							}
							add(
								$current,
								"updateExpressions",
								lv_updateExpressions_11_0,
								"org.eclipse.xtext.xbase.Xbase.XExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
		)?
		otherlv_12=')'
		{
			newLeafNode(otherlv_12, grammarAccess.getXBasicForLoopExpressionAccess().getRightParenthesisKeyword_8());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getEachExpressionXExpressionParserRuleCall_9_0());
				}
				lv_eachExpression_13_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXBasicForLoopExpressionRule());
					}
					set(
						$current,
						"eachExpression",
						lv_eachExpression_13_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleXWhileExpression
entryRuleXWhileExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXWhileExpressionRule()); }
	iv_ruleXWhileExpression=ruleXWhileExpression
	{ $current=$iv_ruleXWhileExpression.current; }
	EOF;

// Rule XWhileExpression
ruleXWhileExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXWhileExpressionAccess().getXWhileExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='while'
		{
			newLeafNode(otherlv_1, grammarAccess.getXWhileExpressionAccess().getWhileKeyword_1());
		}
		otherlv_2='('
		{
			newLeafNode(otherlv_2, grammarAccess.getXWhileExpressionAccess().getLeftParenthesisKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXWhileExpressionAccess().getPredicateXExpressionParserRuleCall_3_0());
				}
				lv_predicate_3_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXWhileExpressionRule());
					}
					set(
						$current,
						"predicate",
						lv_predicate_3_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_4=')'
		{
			newLeafNode(otherlv_4, grammarAccess.getXWhileExpressionAccess().getRightParenthesisKeyword_4());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXWhileExpressionAccess().getBodyXExpressionParserRuleCall_5_0());
				}
				lv_body_5_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXWhileExpressionRule());
					}
					set(
						$current,
						"body",
						lv_body_5_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleXDoWhileExpression
entryRuleXDoWhileExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXDoWhileExpressionRule()); }
	iv_ruleXDoWhileExpression=ruleXDoWhileExpression
	{ $current=$iv_ruleXDoWhileExpression.current; }
	EOF;

// Rule XDoWhileExpression
ruleXDoWhileExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXDoWhileExpressionAccess().getXDoWhileExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='do'
		{
			newLeafNode(otherlv_1, grammarAccess.getXDoWhileExpressionAccess().getDoKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXDoWhileExpressionAccess().getBodyXExpressionParserRuleCall_2_0());
				}
				lv_body_2_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXDoWhileExpressionRule());
					}
					set(
						$current,
						"body",
						lv_body_2_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_3='while'
		{
			newLeafNode(otherlv_3, grammarAccess.getXDoWhileExpressionAccess().getWhileKeyword_3());
		}
		otherlv_4='('
		{
			newLeafNode(otherlv_4, grammarAccess.getXDoWhileExpressionAccess().getLeftParenthesisKeyword_4());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXDoWhileExpressionAccess().getPredicateXExpressionParserRuleCall_5_0());
				}
				lv_predicate_5_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXDoWhileExpressionRule());
					}
					set(
						$current,
						"predicate",
						lv_predicate_5_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_6=')'
		{
			newLeafNode(otherlv_6, grammarAccess.getXDoWhileExpressionAccess().getRightParenthesisKeyword_6());
		}
	)
;

// Entry rule entryRuleXBlockExpression
entryRuleXBlockExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXBlockExpressionRule()); }
	iv_ruleXBlockExpression=ruleXBlockExpression
	{ $current=$iv_ruleXBlockExpression.current; }
	EOF;

// Rule XBlockExpression
ruleXBlockExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXBlockExpressionAccess().getXBlockExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='{'
		{
			newLeafNode(otherlv_1, grammarAccess.getXBlockExpressionAccess().getLeftCurlyBracketKeyword_1());
		}
		(
			(
				(
					{
						newCompositeNode(grammarAccess.getXBlockExpressionAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_2_0_0());
					}
					lv_expressions_2_0=ruleXExpressionOrVarDeclaration
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXBlockExpressionRule());
						}
						add(
							$current,
							"expressions",
							lv_expressions_2_0,
							"org.eclipse.xtext.xbase.Xbase.XExpressionOrVarDeclaration");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_3=';'
				{
					newLeafNode(otherlv_3, grammarAccess.getXBlockExpressionAccess().getSemicolonKeyword_2_1());
				}
			)?
		)*
		otherlv_4='}'
		{
			newLeafNode(otherlv_4, grammarAccess.getXBlockExpressionAccess().getRightCurlyBracketKeyword_3());
		}
	)
;

// Entry rule entryRuleXExpressionOrVarDeclaration
entryRuleXExpressionOrVarDeclaration returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXExpressionOrVarDeclarationRule()); }
	iv_ruleXExpressionOrVarDeclaration=ruleXExpressionOrVarDeclaration
	{ $current=$iv_ruleXExpressionOrVarDeclaration.current; }
	EOF;

// Rule XExpressionOrVarDeclaration
ruleXExpressionOrVarDeclaration returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getXExpressionOrVarDeclarationAccess().getXVariableDeclarationParserRuleCall_0());
		}
		this_XVariableDeclaration_0=ruleXVariableDeclaration
		{
			$current = $this_XVariableDeclaration_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getXExpressionOrVarDeclarationAccess().getXExpressionParserRuleCall_1());
		}
		this_XExpression_1=ruleXExpression
		{
			$current = $this_XExpression_1.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleXVariableDeclaration
entryRuleXVariableDeclaration returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXVariableDeclarationRule()); }
	iv_ruleXVariableDeclaration=ruleXVariableDeclaration
	{ $current=$iv_ruleXVariableDeclaration.current; }
	EOF;

// Rule XVariableDeclaration
ruleXVariableDeclaration returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXVariableDeclarationAccess().getXVariableDeclarationAction_0(),
					$current);
			}
		)
		(
			(
				(
					lv_writeable_1_0='var'
					{
						newLeafNode(lv_writeable_1_0, grammarAccess.getXVariableDeclarationAccess().getWriteableVarKeyword_1_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getXVariableDeclarationRule());
						}
						setWithLastConsumed($current, "writeable", true, "var");
					}
				)
			)
			    |
			otherlv_2='val'
			{
				newLeafNode(otherlv_2, grammarAccess.getXVariableDeclarationAccess().getValKeyword_1_1());
			}
		)
		(
			(
				((
					(
						(
							ruleJvmTypeReference
						)
					)
					(
						(
							ruleValidID
						)
					)
				)
				)=>
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getTypeJvmTypeReferenceParserRuleCall_2_0_0_0_0());
							}
							lv_type_3_0=ruleJvmTypeReference
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXVariableDeclarationRule());
								}
								set(
									$current,
									"type",
									lv_type_3_0,
									"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
								afterParserOrEnumRuleCall();
							}
						)
					)
					(
						(
							{
								newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_0_0_1_0());
							}
							lv_name_4_0=ruleValidID
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXVariableDeclarationRule());
								}
								set(
									$current,
									"name",
									lv_name_4_0,
									"org.eclipse.xtext.xbase.Xtype.ValidID");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)
			)
			    |
			(
				(
					{
						newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_1_0());
					}
					lv_name_5_0=ruleValidID
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXVariableDeclarationRule());
						}
						set(
							$current,
							"name",
							lv_name_5_0,
							"org.eclipse.xtext.xbase.Xtype.ValidID");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)
		(
			otherlv_6='='
			{
				newLeafNode(otherlv_6, grammarAccess.getXVariableDeclarationAccess().getEqualsSignKeyword_3_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getRightXExpressionParserRuleCall_3_1_0());
					}
					lv_right_7_0=ruleXExpression
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXVariableDeclarationRule());
						}
						set(
							$current,
							"right",
							lv_right_7_0,
							"org.eclipse.xtext.xbase.Xbase.XExpression");
						afterParserOrEnumRuleCall();
					}
				)
			)
		)?
	)
;

// Entry rule entryRuleJvmFormalParameter
entryRuleJvmFormalParameter returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getJvmFormalParameterRule()); }
	iv_ruleJvmFormalParameter=ruleJvmFormalParameter
	{ $current=$iv_ruleJvmFormalParameter.current; }
	EOF;

// Rule JvmFormalParameter
ruleJvmFormalParameter returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getJvmFormalParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0());
				}
				lv_parameterType_0_0=ruleJvmTypeReference
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getJvmFormalParameterRule());
					}
					set(
						$current,
						"parameterType",
						lv_parameterType_0_0,
						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
					afterParserOrEnumRuleCall();
				}
			)
		)?
		(
			(
				{
					newCompositeNode(grammarAccess.getJvmFormalParameterAccess().getNameValidIDParserRuleCall_1_0());
				}
				lv_name_1_0=ruleValidID
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getJvmFormalParameterRule());
					}
					set(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.xtext.xbase.Xtype.ValidID");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleFullJvmFormalParameter
entryRuleFullJvmFormalParameter returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getFullJvmFormalParameterRule()); }
	iv_ruleFullJvmFormalParameter=ruleFullJvmFormalParameter
	{ $current=$iv_ruleFullJvmFormalParameter.current; }
	EOF;

// Rule FullJvmFormalParameter
ruleFullJvmFormalParameter returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					newCompositeNode(grammarAccess.getFullJvmFormalParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0());
				}
				lv_parameterType_0_0=ruleJvmTypeReference
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFullJvmFormalParameterRule());
					}
					set(
						$current,
						"parameterType",
						lv_parameterType_0_0,
						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getFullJvmFormalParameterAccess().getNameValidIDParserRuleCall_1_0());
				}
				lv_name_1_0=ruleValidID
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getFullJvmFormalParameterRule());
					}
					set(
						$current,
						"name",
						lv_name_1_0,
						"org.eclipse.xtext.xbase.Xtype.ValidID");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleXFeatureCall
entryRuleXFeatureCall returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXFeatureCallRule()); }
	iv_ruleXFeatureCall=ruleXFeatureCall
	{ $current=$iv_ruleXFeatureCall.current; }
	EOF;

// Rule XFeatureCall
ruleXFeatureCall returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXFeatureCallAccess().getXFeatureCallAction_0(),
					$current);
			}
		)
		(
			otherlv_1='<'
			{
				newLeafNode(otherlv_1, grammarAccess.getXFeatureCallAccess().getLessThanSignKeyword_1_0());
			}
			(
				(
					{
						newCompositeNode(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0());
					}
					lv_typeArguments_2_0=ruleJvmArgumentTypeReference
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
						}
						add(
							$current,
							"typeArguments",
							lv_typeArguments_2_0,
							"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_3=','
				{
					newLeafNode(otherlv_3, grammarAccess.getXFeatureCallAccess().getCommaKeyword_1_2_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0());
						}
						lv_typeArguments_4_0=ruleJvmArgumentTypeReference
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
							}
							add(
								$current,
								"typeArguments",
								lv_typeArguments_4_0,
								"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			otherlv_5='>'
			{
				newLeafNode(otherlv_5, grammarAccess.getXFeatureCallAccess().getGreaterThanSignKeyword_1_3());
			}
		)?
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getXFeatureCallRule());
					}
				}
				{
					newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_2_0());
				}
				ruleIdOrSuper
				{
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				((
					'('
				)
				)=>
				(
					lv_explicitOperationCall_7_0='('
					{
						newLeafNode(lv_explicitOperationCall_7_0, grammarAccess.getXFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_3_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getXFeatureCallRule());
						}
						setWithLastConsumed($current, "explicitOperationCall", true, "(");
					}
				)
			)
			(
				(
					((
						(
						)
						(
							(
								(
									ruleJvmFormalParameter
								)
							)
							(
								','
								(
									(
										ruleJvmFormalParameter
									)
								)
							)*
						)?
						(
							(
								'|'
							)
						)
					)
					)=>
					(
						{
							newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXShortClosureParserRuleCall_3_1_0_0());
						}
						lv_featureCallArguments_8_0=ruleXShortClosure
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
							}
							add(
								$current,
								"featureCallArguments",
								lv_featureCallArguments_8_0,
								"org.eclipse.xtext.xbase.Xbase.XShortClosure");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_0_0());
							}
							lv_featureCallArguments_9_0=ruleXExpression
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
								}
								add(
									$current,
									"featureCallArguments",
									lv_featureCallArguments_9_0,
									"org.eclipse.xtext.xbase.Xbase.XExpression");
								afterParserOrEnumRuleCall();
							}
						)
					)
					(
						otherlv_10=','
						{
							newLeafNode(otherlv_10, grammarAccess.getXFeatureCallAccess().getCommaKeyword_3_1_1_1_0());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_1_1_0());
								}
								lv_featureCallArguments_11_0=ruleXExpression
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
									}
									add(
										$current,
										"featureCallArguments",
										lv_featureCallArguments_11_0,
										"org.eclipse.xtext.xbase.Xbase.XExpression");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)*
				)
			)?
			otherlv_12=')'
			{
				newLeafNode(otherlv_12, grammarAccess.getXFeatureCallAccess().getRightParenthesisKeyword_3_2());
			}
		)?
		(
			((
				(
				)
				'['
			)
			)=>
			(
				{
					newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXClosureParserRuleCall_4_0());
				}
				lv_featureCallArguments_13_0=ruleXClosure
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXFeatureCallRule());
					}
					add(
						$current,
						"featureCallArguments",
						lv_featureCallArguments_13_0,
						"org.eclipse.xtext.xbase.Xbase.XClosure");
					afterParserOrEnumRuleCall();
				}
			)
		)?
	)
;

// Entry rule entryRuleFeatureCallID
entryRuleFeatureCallID returns [String current=null]:
	{ newCompositeNode(grammarAccess.getFeatureCallIDRule()); }
	iv_ruleFeatureCallID=ruleFeatureCallID
	{ $current=$iv_ruleFeatureCallID.current.getText(); }
	EOF;

// Rule FeatureCallID
ruleFeatureCallID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getFeatureCallIDAccess().getValidIDParserRuleCall_0());
		}
		this_ValidID_0=ruleValidID
		{
			$current.merge(this_ValidID_0);
		}
		{
			afterParserOrEnumRuleCall();
		}
		    |
		kw='extends'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getExtendsKeyword_1());
		}
		    |
		kw='static'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getStaticKeyword_2());
		}
		    |
		kw='import'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getImportKeyword_3());
		}
		    |
		kw='extension'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getFeatureCallIDAccess().getExtensionKeyword_4());
		}
	)
;

// Entry rule entryRuleIdOrSuper
entryRuleIdOrSuper returns [String current=null]:
	{ newCompositeNode(grammarAccess.getIdOrSuperRule()); }
	iv_ruleIdOrSuper=ruleIdOrSuper
	{ $current=$iv_ruleIdOrSuper.current.getText(); }
	EOF;

// Rule IdOrSuper
ruleIdOrSuper returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getIdOrSuperAccess().getFeatureCallIDParserRuleCall_0());
		}
		this_FeatureCallID_0=ruleFeatureCallID
		{
			$current.merge(this_FeatureCallID_0);
		}
		{
			afterParserOrEnumRuleCall();
		}
		    |
		kw='super'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getIdOrSuperAccess().getSuperKeyword_1());
		}
	)
;

// Entry rule entryRuleXConstructorCall
entryRuleXConstructorCall returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXConstructorCallRule()); }
	iv_ruleXConstructorCall=ruleXConstructorCall
	{ $current=$iv_ruleXConstructorCall.current; }
	EOF;

// Rule XConstructorCall
ruleXConstructorCall returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXConstructorCallAccess().getXConstructorCallAction_0(),
					$current);
			}
		)
		otherlv_1='new'
		{
			newLeafNode(otherlv_1, grammarAccess.getXConstructorCallAccess().getNewKeyword_1());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getXConstructorCallRule());
					}
				}
				{
					newCompositeNode(grammarAccess.getXConstructorCallAccess().getConstructorJvmConstructorCrossReference_2_0());
				}
				ruleQualifiedName
				{
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				('<')=>
				otherlv_3='<'
				{
					newLeafNode(otherlv_3, grammarAccess.getXConstructorCallAccess().getLessThanSignKeyword_3_0());
				}
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_1_0());
					}
					lv_typeArguments_4_0=ruleJvmArgumentTypeReference
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
						}
						add(
							$current,
							"typeArguments",
							lv_typeArguments_4_0,
							"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_5=','
				{
					newLeafNode(otherlv_5, grammarAccess.getXConstructorCallAccess().getCommaKeyword_3_2_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_2_1_0());
						}
						lv_typeArguments_6_0=ruleJvmArgumentTypeReference
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
							}
							add(
								$current,
								"typeArguments",
								lv_typeArguments_6_0,
								"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			otherlv_7='>'
			{
				newLeafNode(otherlv_7, grammarAccess.getXConstructorCallAccess().getGreaterThanSignKeyword_3_3());
			}
		)?
		(
			(
				((
					'('
				)
				)=>
				(
					lv_explicitConstructorCall_8_0='('
					{
						newLeafNode(lv_explicitConstructorCall_8_0, grammarAccess.getXConstructorCallAccess().getExplicitConstructorCallLeftParenthesisKeyword_4_0_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getXConstructorCallRule());
						}
						setWithLastConsumed($current, "explicitConstructorCall", true, "(");
					}
				)
			)
			(
				(
					((
						(
						)
						(
							(
								(
									ruleJvmFormalParameter
								)
							)
							(
								','
								(
									(
										ruleJvmFormalParameter
									)
								)
							)*
						)?
						(
							(
								'|'
							)
						)
					)
					)=>
					(
						{
							newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXShortClosureParserRuleCall_4_1_0_0());
						}
						lv_arguments_9_0=ruleXShortClosure
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
							}
							add(
								$current,
								"arguments",
								lv_arguments_9_0,
								"org.eclipse.xtext.xbase.Xbase.XShortClosure");
							afterParserOrEnumRuleCall();
						}
					)
				)
				    |
				(
					(
						(
							{
								newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_0_0());
							}
							lv_arguments_10_0=ruleXExpression
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
								}
								add(
									$current,
									"arguments",
									lv_arguments_10_0,
									"org.eclipse.xtext.xbase.Xbase.XExpression");
								afterParserOrEnumRuleCall();
							}
						)
					)
					(
						otherlv_11=','
						{
							newLeafNode(otherlv_11, grammarAccess.getXConstructorCallAccess().getCommaKeyword_4_1_1_1_0());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_1_1_0());
								}
								lv_arguments_12_0=ruleXExpression
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
									}
									add(
										$current,
										"arguments",
										lv_arguments_12_0,
										"org.eclipse.xtext.xbase.Xbase.XExpression");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)*
				)
			)?
			otherlv_13=')'
			{
				newLeafNode(otherlv_13, grammarAccess.getXConstructorCallAccess().getRightParenthesisKeyword_4_2());
			}
		)?
		(
			((
				(
				)
				'['
			)
			)=>
			(
				{
					newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXClosureParserRuleCall_5_0());
				}
				lv_arguments_14_0=ruleXClosure
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXConstructorCallRule());
					}
					add(
						$current,
						"arguments",
						lv_arguments_14_0,
						"org.eclipse.xtext.xbase.Xbase.XClosure");
					afterParserOrEnumRuleCall();
				}
			)
		)?
	)
;

// Entry rule entryRuleXBooleanLiteral
entryRuleXBooleanLiteral returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXBooleanLiteralRule()); }
	iv_ruleXBooleanLiteral=ruleXBooleanLiteral
	{ $current=$iv_ruleXBooleanLiteral.current; }
	EOF;

// Rule XBooleanLiteral
ruleXBooleanLiteral returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXBooleanLiteralAccess().getXBooleanLiteralAction_0(),
					$current);
			}
		)
		(
			otherlv_1='false'
			{
				newLeafNode(otherlv_1, grammarAccess.getXBooleanLiteralAccess().getFalseKeyword_1_0());
			}
			    |
			(
				(
					lv_isTrue_2_0='true'
					{
						newLeafNode(lv_isTrue_2_0, grammarAccess.getXBooleanLiteralAccess().getIsTrueTrueKeyword_1_1_0());
					}
					{
						if ($current==null) {
							$current = createModelElement(grammarAccess.getXBooleanLiteralRule());
						}
						setWithLastConsumed($current, "isTrue", true, "true");
					}
				)
			)
		)
	)
;

// Entry rule entryRuleXNullLiteral
entryRuleXNullLiteral returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXNullLiteralRule()); }
	iv_ruleXNullLiteral=ruleXNullLiteral
	{ $current=$iv_ruleXNullLiteral.current; }
	EOF;

// Rule XNullLiteral
ruleXNullLiteral returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXNullLiteralAccess().getXNullLiteralAction_0(),
					$current);
			}
		)
		otherlv_1='null'
		{
			newLeafNode(otherlv_1, grammarAccess.getXNullLiteralAccess().getNullKeyword_1());
		}
	)
;

// Entry rule entryRuleXNumberLiteral
entryRuleXNumberLiteral returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXNumberLiteralRule()); }
	iv_ruleXNumberLiteral=ruleXNumberLiteral
	{ $current=$iv_ruleXNumberLiteral.current; }
	EOF;

// Rule XNumberLiteral
ruleXNumberLiteral returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXNumberLiteralAccess().getXNumberLiteralAction_0(),
					$current);
			}
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getXNumberLiteralAccess().getValueNumberParserRuleCall_1_0());
				}
				lv_value_1_0=ruleNumber
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXNumberLiteralRule());
					}
					set(
						$current,
						"value",
						lv_value_1_0,
						"org.eclipse.xtext.xbase.Xbase.Number");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleXStringLiteral
entryRuleXStringLiteral returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXStringLiteralRule()); }
	iv_ruleXStringLiteral=ruleXStringLiteral
	{ $current=$iv_ruleXStringLiteral.current; }
	EOF;

// Rule XStringLiteral
ruleXStringLiteral returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXStringLiteralAccess().getXStringLiteralAction_0(),
					$current);
			}
		)
		(
			(
				lv_value_1_0=RULE_STRING
				{
					newLeafNode(lv_value_1_0, grammarAccess.getXStringLiteralAccess().getValueSTRINGTerminalRuleCall_1_0());
				}
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getXStringLiteralRule());
					}
					setWithLastConsumed(
						$current,
						"value",
						lv_value_1_0,
						"org.eclipse.xtext.xbase.Xtype.STRING");
				}
			)
		)
	)
;

// Entry rule entryRuleXTypeLiteral
entryRuleXTypeLiteral returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXTypeLiteralRule()); }
	iv_ruleXTypeLiteral=ruleXTypeLiteral
	{ $current=$iv_ruleXTypeLiteral.current; }
	EOF;

// Rule XTypeLiteral
ruleXTypeLiteral returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXTypeLiteralAccess().getXTypeLiteralAction_0(),
					$current);
			}
		)
		otherlv_1='typeof'
		{
			newLeafNode(otherlv_1, grammarAccess.getXTypeLiteralAccess().getTypeofKeyword_1());
		}
		otherlv_2='('
		{
			newLeafNode(otherlv_2, grammarAccess.getXTypeLiteralAccess().getLeftParenthesisKeyword_2());
		}
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getXTypeLiteralRule());
					}
				}
				{
					newCompositeNode(grammarAccess.getXTypeLiteralAccess().getTypeJvmTypeCrossReference_3_0());
				}
				ruleQualifiedName
				{
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getXTypeLiteralAccess().getArrayDimensionsArrayBracketsParserRuleCall_4_0());
				}
				lv_arrayDimensions_4_0=ruleArrayBrackets
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXTypeLiteralRule());
					}
					add(
						$current,
						"arrayDimensions",
						lv_arrayDimensions_4_0,
						"org.eclipse.xtext.xbase.Xtype.ArrayBrackets");
					afterParserOrEnumRuleCall();
				}
			)
		)*
		otherlv_5=')'
		{
			newLeafNode(otherlv_5, grammarAccess.getXTypeLiteralAccess().getRightParenthesisKeyword_5());
		}
	)
;

// Entry rule entryRuleXThrowExpression
entryRuleXThrowExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXThrowExpressionRule()); }
	iv_ruleXThrowExpression=ruleXThrowExpression
	{ $current=$iv_ruleXThrowExpression.current; }
	EOF;

// Rule XThrowExpression
ruleXThrowExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXThrowExpressionAccess().getXThrowExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='throw'
		{
			newLeafNode(otherlv_1, grammarAccess.getXThrowExpressionAccess().getThrowKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXThrowExpressionAccess().getExpressionXExpressionParserRuleCall_2_0());
				}
				lv_expression_2_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXThrowExpressionRule());
					}
					set(
						$current,
						"expression",
						lv_expression_2_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleXReturnExpression
entryRuleXReturnExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXReturnExpressionRule()); }
	iv_ruleXReturnExpression=ruleXReturnExpression
	{ $current=$iv_ruleXReturnExpression.current; }
	EOF;

// Rule XReturnExpression
ruleXReturnExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXReturnExpressionAccess().getXReturnExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='return'
		{
			newLeafNode(otherlv_1, grammarAccess.getXReturnExpressionAccess().getReturnKeyword_1());
		}
		(
			('extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING)=>
			(
				{
					newCompositeNode(grammarAccess.getXReturnExpressionAccess().getExpressionXExpressionParserRuleCall_2_0());
				}
				lv_expression_2_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXReturnExpressionRule());
					}
					set(
						$current,
						"expression",
						lv_expression_2_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)?
	)
;

// Entry rule entryRuleXTryCatchFinallyExpression
entryRuleXTryCatchFinallyExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionRule()); }
	iv_ruleXTryCatchFinallyExpression=ruleXTryCatchFinallyExpression
	{ $current=$iv_ruleXTryCatchFinallyExpression.current; }
	EOF;

// Rule XTryCatchFinallyExpression
ruleXTryCatchFinallyExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getXTryCatchFinallyExpressionAccess().getXTryCatchFinallyExpressionAction_0(),
					$current);
			}
		)
		otherlv_1='try'
		{
			newLeafNode(otherlv_1, grammarAccess.getXTryCatchFinallyExpressionAccess().getTryKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getExpressionXExpressionParserRuleCall_2_0());
				}
				lv_expression_2_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
					}
					set(
						$current,
						"expression",
						lv_expression_2_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				(
					('catch')=>
					(
						{
							newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getCatchClausesXCatchClauseParserRuleCall_3_0_0_0());
						}
						lv_catchClauses_3_0=ruleXCatchClause
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
							}
							add(
								$current,
								"catchClauses",
								lv_catchClauses_3_0,
								"org.eclipse.xtext.xbase.Xbase.XCatchClause");
							afterParserOrEnumRuleCall();
						}
					)
				)+
				(
					(
						('finally')=>
						otherlv_4='finally'
						{
							newLeafNode(otherlv_4, grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_0_1_0());
						}
					)
					(
						(
							{
								newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionXExpressionParserRuleCall_3_0_1_1_0());
							}
							lv_finallyExpression_5_0=ruleXExpression
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
								}
								set(
									$current,
									"finallyExpression",
									lv_finallyExpression_5_0,
									"org.eclipse.xtext.xbase.Xbase.XExpression");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)?
			)
			    |
			(
				otherlv_6='finally'
				{
					newLeafNode(otherlv_6, grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_1_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionXExpressionParserRuleCall_3_1_1_0());
						}
						lv_finallyExpression_7_0=ruleXExpression
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXTryCatchFinallyExpressionRule());
							}
							set(
								$current,
								"finallyExpression",
								lv_finallyExpression_7_0,
								"org.eclipse.xtext.xbase.Xbase.XExpression");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)
		)
	)
;

// Entry rule entryRuleXSynchronizedExpression
entryRuleXSynchronizedExpression returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXSynchronizedExpressionRule()); }
	iv_ruleXSynchronizedExpression=ruleXSynchronizedExpression
	{ $current=$iv_ruleXSynchronizedExpression.current; }
	EOF;

// Rule XSynchronizedExpression
ruleXSynchronizedExpression returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			((
				(
				)
				'synchronized'
				'('
			)
			)=>
			(
				(
					{
						$current = forceCreateModelElement(
							grammarAccess.getXSynchronizedExpressionAccess().getXSynchronizedExpressionAction_0_0_0(),
							$current);
					}
				)
				otherlv_1='synchronized'
				{
					newLeafNode(otherlv_1, grammarAccess.getXSynchronizedExpressionAccess().getSynchronizedKeyword_0_0_1());
				}
				otherlv_2='('
				{
					newLeafNode(otherlv_2, grammarAccess.getXSynchronizedExpressionAccess().getLeftParenthesisKeyword_0_0_2());
				}
			)
		)
		(
			(
				{
					newCompositeNode(grammarAccess.getXSynchronizedExpressionAccess().getParamXExpressionParserRuleCall_1_0());
				}
				lv_param_3_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXSynchronizedExpressionRule());
					}
					set(
						$current,
						"param",
						lv_param_3_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_4=')'
		{
			newLeafNode(otherlv_4, grammarAccess.getXSynchronizedExpressionAccess().getRightParenthesisKeyword_2());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXSynchronizedExpressionAccess().getExpressionXExpressionParserRuleCall_3_0());
				}
				lv_expression_5_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXSynchronizedExpressionRule());
					}
					set(
						$current,
						"expression",
						lv_expression_5_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleXCatchClause
entryRuleXCatchClause returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXCatchClauseRule()); }
	iv_ruleXCatchClause=ruleXCatchClause
	{ $current=$iv_ruleXCatchClause.current; }
	EOF;

// Rule XCatchClause
ruleXCatchClause returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			('catch')=>
			otherlv_0='catch'
			{
				newLeafNode(otherlv_0, grammarAccess.getXCatchClauseAccess().getCatchKeyword_0());
			}
		)
		otherlv_1='('
		{
			newLeafNode(otherlv_1, grammarAccess.getXCatchClauseAccess().getLeftParenthesisKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXCatchClauseAccess().getDeclaredParamFullJvmFormalParameterParserRuleCall_2_0());
				}
				lv_declaredParam_2_0=ruleFullJvmFormalParameter
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXCatchClauseRule());
					}
					set(
						$current,
						"declaredParam",
						lv_declaredParam_2_0,
						"org.eclipse.xtext.xbase.Xbase.FullJvmFormalParameter");
					afterParserOrEnumRuleCall();
				}
			)
		)
		otherlv_3=')'
		{
			newLeafNode(otherlv_3, grammarAccess.getXCatchClauseAccess().getRightParenthesisKeyword_3());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXCatchClauseAccess().getExpressionXExpressionParserRuleCall_4_0());
				}
				lv_expression_4_0=ruleXExpression
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXCatchClauseRule());
					}
					set(
						$current,
						"expression",
						lv_expression_4_0,
						"org.eclipse.xtext.xbase.Xbase.XExpression");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleQualifiedName
entryRuleQualifiedName returns [String current=null]:
	{ newCompositeNode(grammarAccess.getQualifiedNameRule()); }
	iv_ruleQualifiedName=ruleQualifiedName
	{ $current=$iv_ruleQualifiedName.current.getText(); }
	EOF;

// Rule QualifiedName
ruleQualifiedName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_0());
		}
		this_ValidID_0=ruleValidID
		{
			$current.merge(this_ValidID_0);
		}
		{
			afterParserOrEnumRuleCall();
		}
		(
			(
				('.')=>
				kw='.'
				{
					$current.merge(kw);
					newLeafNode(kw, grammarAccess.getQualifiedNameAccess().getFullStopKeyword_1_0());
				}
			)
			{
				newCompositeNode(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_1_1());
			}
			this_ValidID_2=ruleValidID
			{
				$current.merge(this_ValidID_2);
			}
			{
				afterParserOrEnumRuleCall();
			}
		)*
	)
;

// Entry rule entryRuleNumber
entryRuleNumber returns [String current=null]@init {
	HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
}:
	{ newCompositeNode(grammarAccess.getNumberRule()); }
	iv_ruleNumber=ruleNumber
	{ $current=$iv_ruleNumber.current.getText(); }
	EOF;
finally {
	myHiddenTokenState.restore();
}

// Rule Number
ruleNumber returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
	HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
}
@after {
	leaveRule();
}:
	(
		this_HEX_0=RULE_HEX
		{
			$current.merge(this_HEX_0);
		}
		{
			newLeafNode(this_HEX_0, grammarAccess.getNumberAccess().getHEXTerminalRuleCall_0());
		}
		    |
		(
			(
				this_INT_1=RULE_INT
				{
					$current.merge(this_INT_1);
				}
				{
					newLeafNode(this_INT_1, grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_0_0());
				}
				    |
				this_DECIMAL_2=RULE_DECIMAL
				{
					$current.merge(this_DECIMAL_2);
				}
				{
					newLeafNode(this_DECIMAL_2, grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_0_1());
				}
			)
			(
				kw='.'
				{
					$current.merge(kw);
					newLeafNode(kw, grammarAccess.getNumberAccess().getFullStopKeyword_1_1_0());
				}
				(
					this_INT_4=RULE_INT
					{
						$current.merge(this_INT_4);
					}
					{
						newLeafNode(this_INT_4, grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_1_1_0());
					}
					    |
					this_DECIMAL_5=RULE_DECIMAL
					{
						$current.merge(this_DECIMAL_5);
					}
					{
						newLeafNode(this_DECIMAL_5, grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_1_1_1());
					}
				)
			)?
		)
	)
;
finally {
	myHiddenTokenState.restore();
}

// Entry rule entryRuleJvmTypeReference
entryRuleJvmTypeReference returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getJvmTypeReferenceRule()); }
	iv_ruleJvmTypeReference=ruleJvmTypeReference
	{ $current=$iv_ruleJvmTypeReference.current; }
	EOF;

// Rule JvmTypeReference
ruleJvmTypeReference returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getJvmParameterizedTypeReferenceParserRuleCall_0_0());
			}
			this_JvmParameterizedTypeReference_0=ruleJvmParameterizedTypeReference
			{
				$current = $this_JvmParameterizedTypeReference_0.current;
				afterParserOrEnumRuleCall();
			}
			(
				((
					(
					)
					ruleArrayBrackets
				)
				)=>
				(
					(
						{
							$current = forceCreateModelElementAndSet(
								grammarAccess.getJvmTypeReferenceAccess().getJvmGenericArrayTypeReferenceComponentTypeAction_0_1_0_0(),
								$current);
						}
					)
					{
						newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getArrayBracketsParserRuleCall_0_1_0_1());
					}
					ruleArrayBrackets
					{
						afterParserOrEnumRuleCall();
					}
				)
			)*
		)
		    |
		{
			newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getXFunctionTypeRefParserRuleCall_1());
		}
		this_XFunctionTypeRef_3=ruleXFunctionTypeRef
		{
			$current = $this_XFunctionTypeRef_3.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleArrayBrackets
entryRuleArrayBrackets returns [String current=null]:
	{ newCompositeNode(grammarAccess.getArrayBracketsRule()); }
	iv_ruleArrayBrackets=ruleArrayBrackets
	{ $current=$iv_ruleArrayBrackets.current.getText(); }
	EOF;

// Rule ArrayBrackets
ruleArrayBrackets returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		kw='['
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getArrayBracketsAccess().getLeftSquareBracketKeyword_0());
		}
		kw=']'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getArrayBracketsAccess().getRightSquareBracketKeyword_1());
		}
	)
;

// Entry rule entryRuleXFunctionTypeRef
entryRuleXFunctionTypeRef returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXFunctionTypeRefRule()); }
	iv_ruleXFunctionTypeRef=ruleXFunctionTypeRef
	{ $current=$iv_ruleXFunctionTypeRef.current; }
	EOF;

// Rule XFunctionTypeRef
ruleXFunctionTypeRef returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			otherlv_0='('
			{
				newLeafNode(otherlv_0, grammarAccess.getXFunctionTypeRefAccess().getLeftParenthesisKeyword_0_0());
			}
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_0_0());
						}
						lv_paramTypes_1_0=ruleJvmTypeReference
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getXFunctionTypeRefRule());
							}
							add(
								$current,
								"paramTypes",
								lv_paramTypes_1_0,
								"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					otherlv_2=','
					{
						newLeafNode(otherlv_2, grammarAccess.getXFunctionTypeRefAccess().getCommaKeyword_0_1_1_0());
					}
					(
						(
							{
								newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_1_1_0());
							}
							lv_paramTypes_3_0=ruleJvmTypeReference
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getXFunctionTypeRefRule());
								}
								add(
									$current,
									"paramTypes",
									lv_paramTypes_3_0,
									"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
								afterParserOrEnumRuleCall();
							}
						)
					)
				)*
			)?
			otherlv_4=')'
			{
				newLeafNode(otherlv_4, grammarAccess.getXFunctionTypeRefAccess().getRightParenthesisKeyword_0_2());
			}
		)?
		otherlv_5='=>'
		{
			newLeafNode(otherlv_5, grammarAccess.getXFunctionTypeRefAccess().getEqualsSignGreaterThanSignKeyword_1());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getReturnTypeJvmTypeReferenceParserRuleCall_2_0());
				}
				lv_returnType_6_0=ruleJvmTypeReference
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getXFunctionTypeRefRule());
					}
					set(
						$current,
						"returnType",
						lv_returnType_6_0,
						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleJvmParameterizedTypeReference
entryRuleJvmParameterizedTypeReference returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceRule()); }
	iv_ruleJvmParameterizedTypeReference=ruleJvmParameterizedTypeReference
	{ $current=$iv_ruleJvmParameterizedTypeReference.current; }
	EOF;

// Rule JvmParameterizedTypeReference
ruleJvmParameterizedTypeReference returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			(
				{
					if ($current==null) {
						$current = createModelElement(grammarAccess.getJvmParameterizedTypeReferenceRule());
					}
				}
				{
					newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_0_0());
				}
				ruleQualifiedName
				{
					afterParserOrEnumRuleCall();
				}
			)
		)
		(
			(
				('<')=>
				otherlv_1='<'
				{
					newLeafNode(otherlv_1, grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_0());
				}
			)
			(
				(
					{
						newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0());
					}
					lv_arguments_2_0=ruleJvmArgumentTypeReference
					{
						if ($current==null) {
							$current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
						}
						add(
							$current,
							"arguments",
							lv_arguments_2_0,
							"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
						afterParserOrEnumRuleCall();
					}
				)
			)
			(
				otherlv_3=','
				{
					newLeafNode(otherlv_3, grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_2_0());
				}
				(
					(
						{
							newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0());
						}
						lv_arguments_4_0=ruleJvmArgumentTypeReference
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
							}
							add(
								$current,
								"arguments",
								lv_arguments_4_0,
								"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
							afterParserOrEnumRuleCall();
						}
					)
				)
			)*
			otherlv_5='>'
			{
				newLeafNode(otherlv_5, grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_3());
			}
			(
				(
					((
						(
						)
						'.'
					)
					)=>
					(
						(
							{
								$current = forceCreateModelElementAndSet(
									grammarAccess.getJvmParameterizedTypeReferenceAccess().getJvmInnerTypeReferenceOuterAction_1_4_0_0_0(),
									$current);
							}
						)
						otherlv_7='.'
						{
							newLeafNode(otherlv_7, grammarAccess.getJvmParameterizedTypeReferenceAccess().getFullStopKeyword_1_4_0_0_1());
						}
					)
				)
				(
					(
						{
							if ($current==null) {
								$current = createModelElement(grammarAccess.getJvmParameterizedTypeReferenceRule());
							}
						}
						{
							newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_1_4_1_0());
						}
						ruleValidID
						{
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					(
						('<')=>
						otherlv_9='<'
						{
							newLeafNode(otherlv_9, grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_4_2_0());
						}
					)
					(
						(
							{
								newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_1_0());
							}
							lv_arguments_10_0=ruleJvmArgumentTypeReference
							{
								if ($current==null) {
									$current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
								}
								add(
									$current,
									"arguments",
									lv_arguments_10_0,
									"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
								afterParserOrEnumRuleCall();
							}
						)
					)
					(
						otherlv_11=','
						{
							newLeafNode(otherlv_11, grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_4_2_2_0());
						}
						(
							(
								{
									newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_2_1_0());
								}
								lv_arguments_12_0=ruleJvmArgumentTypeReference
								{
									if ($current==null) {
										$current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
									}
									add(
										$current,
										"arguments",
										lv_arguments_12_0,
										"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
									afterParserOrEnumRuleCall();
								}
							)
						)
					)*
					otherlv_13='>'
					{
						newLeafNode(otherlv_13, grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_4_2_3());
					}
				)?
			)*
		)?
	)
;

// Entry rule entryRuleJvmArgumentTypeReference
entryRuleJvmArgumentTypeReference returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getJvmArgumentTypeReferenceRule()); }
	iv_ruleJvmArgumentTypeReference=ruleJvmArgumentTypeReference
	{ $current=$iv_ruleJvmArgumentTypeReference.current; }
	EOF;

// Rule JvmArgumentTypeReference
ruleJvmArgumentTypeReference returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmTypeReferenceParserRuleCall_0());
		}
		this_JvmTypeReference_0=ruleJvmTypeReference
		{
			$current = $this_JvmTypeReference_0.current;
			afterParserOrEnumRuleCall();
		}
		    |
		{
			newCompositeNode(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmWildcardTypeReferenceParserRuleCall_1());
		}
		this_JvmWildcardTypeReference_1=ruleJvmWildcardTypeReference
		{
			$current = $this_JvmWildcardTypeReference_1.current;
			afterParserOrEnumRuleCall();
		}
	)
;

// Entry rule entryRuleJvmWildcardTypeReference
entryRuleJvmWildcardTypeReference returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceRule()); }
	iv_ruleJvmWildcardTypeReference=ruleJvmWildcardTypeReference
	{ $current=$iv_ruleJvmWildcardTypeReference.current; }
	EOF;

// Rule JvmWildcardTypeReference
ruleJvmWildcardTypeReference returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				$current = forceCreateModelElement(
					grammarAccess.getJvmWildcardTypeReferenceAccess().getJvmWildcardTypeReferenceAction_0(),
					$current);
			}
		)
		otherlv_1='?'
		{
			newLeafNode(otherlv_1, grammarAccess.getJvmWildcardTypeReferenceAccess().getQuestionMarkKeyword_1());
		}
		(
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundParserRuleCall_2_0_0_0());
						}
						lv_constraints_2_0=ruleJvmUpperBound
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
							}
							add(
								$current,
								"constraints",
								lv_constraints_2_0,
								"org.eclipse.xtext.xbase.Xtype.JvmUpperBound");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundAndedParserRuleCall_2_0_1_0());
						}
						lv_constraints_3_0=ruleJvmUpperBoundAnded
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
							}
							add(
								$current,
								"constraints",
								lv_constraints_3_0,
								"org.eclipse.xtext.xbase.Xtype.JvmUpperBoundAnded");
							afterParserOrEnumRuleCall();
						}
					)
				)*
			)
			    |
			(
				(
					(
						{
							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundParserRuleCall_2_1_0_0());
						}
						lv_constraints_4_0=ruleJvmLowerBound
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
							}
							add(
								$current,
								"constraints",
								lv_constraints_4_0,
								"org.eclipse.xtext.xbase.Xtype.JvmLowerBound");
							afterParserOrEnumRuleCall();
						}
					)
				)
				(
					(
						{
							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundAndedParserRuleCall_2_1_1_0());
						}
						lv_constraints_5_0=ruleJvmLowerBoundAnded
						{
							if ($current==null) {
								$current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
							}
							add(
								$current,
								"constraints",
								lv_constraints_5_0,
								"org.eclipse.xtext.xbase.Xtype.JvmLowerBoundAnded");
							afterParserOrEnumRuleCall();
						}
					)
				)*
			)
		)?
	)
;

// Entry rule entryRuleJvmUpperBound
entryRuleJvmUpperBound returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getJvmUpperBoundRule()); }
	iv_ruleJvmUpperBound=ruleJvmUpperBound
	{ $current=$iv_ruleJvmUpperBound.current; }
	EOF;

// Rule JvmUpperBound
ruleJvmUpperBound returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='extends'
		{
			newLeafNode(otherlv_0, grammarAccess.getJvmUpperBoundAccess().getExtendsKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getJvmUpperBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0());
				}
				lv_typeReference_1_0=ruleJvmTypeReference
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getJvmUpperBoundRule());
					}
					set(
						$current,
						"typeReference",
						lv_typeReference_1_0,
						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleJvmUpperBoundAnded
entryRuleJvmUpperBoundAnded returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getJvmUpperBoundAndedRule()); }
	iv_ruleJvmUpperBoundAnded=ruleJvmUpperBoundAnded
	{ $current=$iv_ruleJvmUpperBoundAnded.current; }
	EOF;

// Rule JvmUpperBoundAnded
ruleJvmUpperBoundAnded returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='&'
		{
			newLeafNode(otherlv_0, grammarAccess.getJvmUpperBoundAndedAccess().getAmpersandKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getJvmUpperBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0());
				}
				lv_typeReference_1_0=ruleJvmTypeReference
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getJvmUpperBoundAndedRule());
					}
					set(
						$current,
						"typeReference",
						lv_typeReference_1_0,
						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleJvmLowerBound
entryRuleJvmLowerBound returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getJvmLowerBoundRule()); }
	iv_ruleJvmLowerBound=ruleJvmLowerBound
	{ $current=$iv_ruleJvmLowerBound.current; }
	EOF;

// Rule JvmLowerBound
ruleJvmLowerBound returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='super'
		{
			newLeafNode(otherlv_0, grammarAccess.getJvmLowerBoundAccess().getSuperKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getJvmLowerBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0());
				}
				lv_typeReference_1_0=ruleJvmTypeReference
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getJvmLowerBoundRule());
					}
					set(
						$current,
						"typeReference",
						lv_typeReference_1_0,
						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleJvmLowerBoundAnded
entryRuleJvmLowerBoundAnded returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getJvmLowerBoundAndedRule()); }
	iv_ruleJvmLowerBoundAnded=ruleJvmLowerBoundAnded
	{ $current=$iv_ruleJvmLowerBoundAnded.current; }
	EOF;

// Rule JvmLowerBoundAnded
ruleJvmLowerBoundAnded returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		otherlv_0='&'
		{
			newLeafNode(otherlv_0, grammarAccess.getJvmLowerBoundAndedAccess().getAmpersandKeyword_0());
		}
		(
			(
				{
					newCompositeNode(grammarAccess.getJvmLowerBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0());
				}
				lv_typeReference_1_0=ruleJvmTypeReference
				{
					if ($current==null) {
						$current = createModelElementForParent(grammarAccess.getJvmLowerBoundAndedRule());
					}
					set(
						$current,
						"typeReference",
						lv_typeReference_1_0,
						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
					afterParserOrEnumRuleCall();
				}
			)
		)
	)
;

// Entry rule entryRuleQualifiedNameWithWildcard
entryRuleQualifiedNameWithWildcard returns [String current=null]:
	{ newCompositeNode(grammarAccess.getQualifiedNameWithWildcardRule()); }
	iv_ruleQualifiedNameWithWildcard=ruleQualifiedNameWithWildcard
	{ $current=$iv_ruleQualifiedNameWithWildcard.current.getText(); }
	EOF;

// Rule QualifiedNameWithWildcard
ruleQualifiedNameWithWildcard returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getQualifiedNameWithWildcardAccess().getQualifiedNameParserRuleCall_0());
		}
		this_QualifiedName_0=ruleQualifiedName
		{
			$current.merge(this_QualifiedName_0);
		}
		{
			afterParserOrEnumRuleCall();
		}
		kw='.'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getQualifiedNameWithWildcardAccess().getFullStopKeyword_1());
		}
		kw='*'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getQualifiedNameWithWildcardAccess().getAsteriskKeyword_2());
		}
	)
;

// Entry rule entryRuleValidID
entryRuleValidID returns [String current=null]:
	{ newCompositeNode(grammarAccess.getValidIDRule()); }
	iv_ruleValidID=ruleValidID
	{ $current=$iv_ruleValidID.current.getText(); }
	EOF;

// Rule ValidID
ruleValidID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	this_ID_0=RULE_ID
	{
		$current.merge(this_ID_0);
	}
	{
		newLeafNode(this_ID_0, grammarAccess.getValidIDAccess().getIDTerminalRuleCall());
	}
;

// Entry rule entryRuleXImportSection
entryRuleXImportSection returns [EObject current=null]:
	{ newCompositeNode(grammarAccess.getXImportSectionRule()); }
	iv_ruleXImportSection=ruleXImportSection
	{ $current=$iv_ruleXImportSection.current; }
	EOF;

// Rule XImportSection
ruleXImportSection returns [EObject current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			{
				newCompositeNode(grammarAccess.getXImportSectionAccess().getImportDeclarationsXImportDeclarationParserRuleCall_0());
			}
			lv_importDeclarations_0_0=ruleXImportDeclaration
			{
				if ($current==null) {
					$current = createModelElementForParent(grammarAccess.getXImportSectionRule());
				}
				add(
					$current,
					"importDeclarations",
					lv_importDeclarations_0_0,
					"org.eclipse.osbp.xtext.oxtype.OXtype.XImportDeclaration");
				afterParserOrEnumRuleCall();
			}
		)
	)+
;

// Entry rule entryRuleQualifiedNameInStaticImport
entryRuleQualifiedNameInStaticImport returns [String current=null]:
	{ newCompositeNode(grammarAccess.getQualifiedNameInStaticImportRule()); }
	iv_ruleQualifiedNameInStaticImport=ruleQualifiedNameInStaticImport
	{ $current=$iv_ruleQualifiedNameInStaticImport.current.getText(); }
	EOF;

// Rule QualifiedNameInStaticImport
ruleQualifiedNameInStaticImport returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		{
			newCompositeNode(grammarAccess.getQualifiedNameInStaticImportAccess().getValidIDParserRuleCall_0());
		}
		this_ValidID_0=ruleValidID
		{
			$current.merge(this_ValidID_0);
		}
		{
			afterParserOrEnumRuleCall();
		}
		kw='.'
		{
			$current.merge(kw);
			newLeafNode(kw, grammarAccess.getQualifiedNameInStaticImportAccess().getFullStopKeyword_1());
		}
	)+
;

// Rule UiDateFormat
ruleUiDateFormat returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='date'
			{
				$current = grammarAccess.getUiDateFormatAccess().getDATEEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getUiDateFormatAccess().getDATEEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='datetime'
			{
				$current = grammarAccess.getUiDateFormatAccess().getDATE_TIMEEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getUiDateFormatAccess().getDATE_TIMEEnumLiteralDeclaration_1());
			}
		)
		    |
		(
			enumLiteral_2='time'
			{
				$current = grammarAccess.getUiDateFormatAccess().getTIMEEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_2, grammarAccess.getUiDateFormatAccess().getTIMEEnumLiteralDeclaration_2());
			}
		)
	)
;

// Rule UiDateTimeResolution
ruleUiDateTimeResolution returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='undefined'
			{
				$current = grammarAccess.getUiDateTimeResolutionAccess().getUNDEFINEDEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getUiDateTimeResolutionAccess().getUNDEFINEDEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='second'
			{
				$current = grammarAccess.getUiDateTimeResolutionAccess().getSECONDEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getUiDateTimeResolutionAccess().getSECONDEnumLiteralDeclaration_1());
			}
		)
		    |
		(
			enumLiteral_2='minute'
			{
				$current = grammarAccess.getUiDateTimeResolutionAccess().getMINUTEEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_2, grammarAccess.getUiDateTimeResolutionAccess().getMINUTEEnumLiteralDeclaration_2());
			}
		)
		    |
		(
			enumLiteral_3='hour'
			{
				$current = grammarAccess.getUiDateTimeResolutionAccess().getHOUREnumLiteralDeclaration_3().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_3, grammarAccess.getUiDateTimeResolutionAccess().getHOUREnumLiteralDeclaration_3());
			}
		)
		    |
		(
			enumLiteral_4='day'
			{
				$current = grammarAccess.getUiDateTimeResolutionAccess().getDAYEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_4, grammarAccess.getUiDateTimeResolutionAccess().getDAYEnumLiteralDeclaration_4());
			}
		)
		    |
		(
			enumLiteral_5='month'
			{
				$current = grammarAccess.getUiDateTimeResolutionAccess().getMONTHEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_5, grammarAccess.getUiDateTimeResolutionAccess().getMONTHEnumLiteralDeclaration_5());
			}
		)
		    |
		(
			enumLiteral_6='year'
			{
				$current = grammarAccess.getUiDateTimeResolutionAccess().getYEAREnumLiteralDeclaration_6().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_6, grammarAccess.getUiDateTimeResolutionAccess().getYEAREnumLiteralDeclaration_6());
			}
		)
	)
;

// Rule UiSelectionType
ruleUiSelectionType returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='single'
			{
				$current = grammarAccess.getUiSelectionTypeAccess().getSINGLEEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getUiSelectionTypeAccess().getSINGLEEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='multi'
			{
				$current = grammarAccess.getUiSelectionTypeAccess().getMULTIEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getUiSelectionTypeAccess().getMULTIEnumLiteralDeclaration_1());
			}
		)
		    |
		(
			enumLiteral_2='none'
			{
				$current = grammarAccess.getUiSelectionTypeAccess().getNONEEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_2, grammarAccess.getUiSelectionTypeAccess().getNONEEnumLiteralDeclaration_2());
			}
		)
	)
;

// Rule UiAlignment
ruleUiAlignment returns [Enumerator current=null]
@init {
	enterRule();
}
@after {
	leaveRule();
}:
	(
		(
			enumLiteral_0='undefined'
			{
				$current = grammarAccess.getUiAlignmentAccess().getUNDEFINEDEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_0, grammarAccess.getUiAlignmentAccess().getUNDEFINEDEnumLiteralDeclaration_0());
			}
		)
		    |
		(
			enumLiteral_1='bottom-center'
			{
				$current = grammarAccess.getUiAlignmentAccess().getBOTTOM_CENTEREnumLiteralDeclaration_1().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_1, grammarAccess.getUiAlignmentAccess().getBOTTOM_CENTEREnumLiteralDeclaration_1());
			}
		)
		    |
		(
			enumLiteral_2='bottom-left'
			{
				$current = grammarAccess.getUiAlignmentAccess().getBOTTOM_LEFTEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_2, grammarAccess.getUiAlignmentAccess().getBOTTOM_LEFTEnumLiteralDeclaration_2());
			}
		)
		    |
		(
			enumLiteral_3='bottom-right'
			{
				$current = grammarAccess.getUiAlignmentAccess().getBOTTOM_RIGHTEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_3, grammarAccess.getUiAlignmentAccess().getBOTTOM_RIGHTEnumLiteralDeclaration_3());
			}
		)
		    |
		(
			enumLiteral_4='bottom-fill'
			{
				$current = grammarAccess.getUiAlignmentAccess().getBOTTOM_FILLEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_4, grammarAccess.getUiAlignmentAccess().getBOTTOM_FILLEnumLiteralDeclaration_4());
			}
		)
		    |
		(
			enumLiteral_5='middle-center'
			{
				$current = grammarAccess.getUiAlignmentAccess().getMIDDLE_CENTEREnumLiteralDeclaration_5().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_5, grammarAccess.getUiAlignmentAccess().getMIDDLE_CENTEREnumLiteralDeclaration_5());
			}
		)
		    |
		(
			enumLiteral_6='middle-left'
			{
				$current = grammarAccess.getUiAlignmentAccess().getMIDDLE_LEFTEnumLiteralDeclaration_6().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_6, grammarAccess.getUiAlignmentAccess().getMIDDLE_LEFTEnumLiteralDeclaration_6());
			}
		)
		    |
		(
			enumLiteral_7='middle-right'
			{
				$current = grammarAccess.getUiAlignmentAccess().getMIDDLE_RIGHTEnumLiteralDeclaration_7().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_7, grammarAccess.getUiAlignmentAccess().getMIDDLE_RIGHTEnumLiteralDeclaration_7());
			}
		)
		    |
		(
			enumLiteral_8='middle-fill'
			{
				$current = grammarAccess.getUiAlignmentAccess().getMIDDLE_FILLEnumLiteralDeclaration_8().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_8, grammarAccess.getUiAlignmentAccess().getMIDDLE_FILLEnumLiteralDeclaration_8());
			}
		)
		    |
		(
			enumLiteral_9='top-center'
			{
				$current = grammarAccess.getUiAlignmentAccess().getTOP_CENTEREnumLiteralDeclaration_9().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_9, grammarAccess.getUiAlignmentAccess().getTOP_CENTEREnumLiteralDeclaration_9());
			}
		)
		    |
		(
			enumLiteral_10='top-left'
			{
				$current = grammarAccess.getUiAlignmentAccess().getTOP_LEFTEnumLiteralDeclaration_10().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_10, grammarAccess.getUiAlignmentAccess().getTOP_LEFTEnumLiteralDeclaration_10());
			}
		)
		    |
		(
			enumLiteral_11='top-right'
			{
				$current = grammarAccess.getUiAlignmentAccess().getTOP_RIGHTEnumLiteralDeclaration_11().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_11, grammarAccess.getUiAlignmentAccess().getTOP_RIGHTEnumLiteralDeclaration_11());
			}
		)
		    |
		(
			enumLiteral_12='top-fill'
			{
				$current = grammarAccess.getUiAlignmentAccess().getTOP_FILLEnumLiteralDeclaration_12().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_12, grammarAccess.getUiAlignmentAccess().getTOP_FILLEnumLiteralDeclaration_12());
			}
		)
		    |
		(
			enumLiteral_13='fill-center'
			{
				$current = grammarAccess.getUiAlignmentAccess().getFILL_CENTEREnumLiteralDeclaration_13().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_13, grammarAccess.getUiAlignmentAccess().getFILL_CENTEREnumLiteralDeclaration_13());
			}
		)
		    |
		(
			enumLiteral_14='fill-left'
			{
				$current = grammarAccess.getUiAlignmentAccess().getFILL_LEFTEnumLiteralDeclaration_14().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_14, grammarAccess.getUiAlignmentAccess().getFILL_LEFTEnumLiteralDeclaration_14());
			}
		)
		    |
		(
			enumLiteral_15='fill-right'
			{
				$current = grammarAccess.getUiAlignmentAccess().getFILL_RIGHTEnumLiteralDeclaration_15().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_15, grammarAccess.getUiAlignmentAccess().getFILL_RIGHTEnumLiteralDeclaration_15());
			}
		)
		    |
		(
			enumLiteral_16='fill-fill'
			{
				$current = grammarAccess.getUiAlignmentAccess().getFILL_FILLEnumLiteralDeclaration_16().getEnumLiteral().getInstance();
				newLeafNode(enumLiteral_16, grammarAccess.getUiAlignmentAccess().getFILL_FILLEnumLiteralDeclaration_16());
			}
		)
	)
;

RULE_HEX : ('0x'|'0X') ('0'..'9'|'a'..'f'|'A'..'F'|'_')+ ('#' (('b'|'B') ('i'|'I')|('l'|'L')))?;

RULE_INT : '0'..'9' ('0'..'9'|'_')*;

RULE_DECIMAL : RULE_INT (('e'|'E') ('+'|'-')? RULE_INT)? (('b'|'B') ('i'|'I'|'d'|'D')|('l'|'L'|'d'|'D'|'f'|'F'))?;

RULE_ID : '^'? ('a'..'z'|'A'..'Z'|'$'|'_') ('a'..'z'|'A'..'Z'|'$'|'_'|'0'..'9')*;

RULE_STRING : ('"' ('\\' .|~(('\\'|'"')))* '"'?|'\'' ('\\' .|~(('\\'|'\'')))* '\''?);

RULE_ML_COMMENT : '/*' ( options {greedy=false;} : . )*'*/';

RULE_SL_COMMENT : '//' ~(('\n'|'\r'))* ('\r'? '\n')?;

RULE_WS : (' '|'\t'|'\r'|'\n')+;

RULE_ANY_OTHER : .;
