/** \file
 *  This C source file was generated by $ANTLR version 3.4
 *
 *     -  From the grammar source file : /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g
 *     -                            On : 2017-05-30 09:21:52
 *     -                for the parser : fmlParserParser
 *
 * Editing it, at least manually, is not wise.
 *
 * C language generator and runtime by Jim Idle, jimi|hereisanat|idle|dotgoeshere|ws.
 *
 *
*/
// [The "BSD license"]
// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
// http://www.temporal-wave.com
// http://www.linkedin.com/in/jimidle
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
// 1. Redistributions of source code must retain the above copyright
//    notice, this list of conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright
//    notice, this list of conditions and the following disclaimer in the
//    documentation and/or other materials provided with the distribution.
// 3. The name of the author may not be used to endorse or promote products
//    derived from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


/* =============================================================================
 * This is what the grammar programmer asked us to put at the top of every file.
 */


#include <parser/model/ParserUtil.h>

#include <common/BF.h>

#include <collection/BFContainer.h>

#include <fml/common/BehavioralElement.h>
#include <fml/common/ModifierElement.h>
#include <fml/common/SpecifierElement.h>

#include <fml/executable/ExecutableLib.h>

#include <fml/expression/AvmCode.h>
#include <fml/expression/BuiltinArray.h>
#include <fml/expression/ExpressionConstant.h>
#include <fml/expression/ExpressionConstructor.h>
#include <fml/expression/StatementConstructor.h>

#include <fml/lib/IComPoint.h>

#include <fml/operator/Operator.h>
#include <fml/operator/OperatorManager.h>

#include <fml/template/TemplateFactory.h>

#include <fml/type/TypeSpecifier.h>

#include <fml/type/TypeManager.h>

#include <fml/infrastructure/Buffer.h>
#include <fml/infrastructure/Channel.h>
#include <fml/infrastructure/ComPoint.h>
#include <fml/infrastructure/ComProtocol.h>
#include <fml/infrastructure/ComRoute.h>
#include <fml/infrastructure/Connector.h>

// extern "C" and C++ template incompatibility !!!
//#include <fml/infrastructure/PropertyPart.h>

#include <fml/infrastructure/DataType.h>
#include <fml/infrastructure/Machine.h>
#include <fml/infrastructure/Package.h>
#include <fml/infrastructure/Port.h>
#include <fml/infrastructure/Routine.h>
#include <fml/infrastructure/System.h>
#include <fml/infrastructure/Transition.h>
#include <fml/infrastructure/Variable.h>

#include <fml/infrastructure/BehavioralPart.h>
#include <fml/infrastructure/CompositePart.h>
#include <fml/infrastructure/InstanceSpecifierPart.h>
#include <fml/infrastructure/InteractionPart.h>
#include <fml/infrastructure/ModelOfComputationPart.h>

// extern "C" and C++ template incompatibility !!!
//#include <fml/infrastructure/PropertyPart.h>

#include <fml/workflow/Query.h>
#include <fml/workflow/UniFormIdentifier.h>
#include <fml/workflow/WObject.h>


//void fmlDisplayRecognitionError(
//		pANTLR3_BASE_RECOGNIZER recognizer, pANTLR3_UINT8 * tokenNames);


/* End of Header action.
 * =============================================================================
 */

/* -----------------------------------------
 * Include the ANTLR3 generated header file.
 */
#include    "fmlParser.h"
/* ----------------------------------------- */





/* MACROS that hide the C interface implementations from the
 * generated code, which makes it a little more understandable to the human eye.
 * I am very much against using C pre-processor macros for function calls and bits
 * of code as you cannot see what is happening when single stepping in debuggers
 * and so on. The exception (in my book at least) is for generated code, where you are
 * not maintaining it, but may wish to read and understand it. If you single step it, you know that input()
 * hides some indirect calls, but is always referring to the input stream. This is
 * probably more readable than ctx->input->istream->input(snarfle0->blarg) and allows me to rejig
 * the runtime interfaces without changing the generated code too often, without
 * confusing the reader of the generated output, who may not wish to know the gory
 * details of the interface inheritance.
 */

#define		CTX	ctx

/* Aids in accessing scopes for grammar programmers
 */
#undef	SCOPE_TYPE
#undef	SCOPE_STACK
#undef	SCOPE_TOP
#define	SCOPE_TYPE(scope)   pfmlParser_##scope##_SCOPE
#define SCOPE_STACK(scope)  pfmlParser_##scope##Stack
#define	SCOPE_TOP(scope)    ctx->pfmlParser_##scope##Top
#define	SCOPE_SIZE(scope)		ctx->pfmlParser_##scope##Stack_limit
#define SCOPE_INSTANCE(scope, i)	(ctx->SCOPE_STACK(scope)->get(ctx->SCOPE_STACK(scope),i))

/* Macros for accessing things in the parser
 */

#undef	    PARSER
#undef	    RECOGNIZER
#undef	    HAVEPARSEDRULE
#undef		MEMOIZE
#undef	    INPUT
#undef	    STRSTREAM
#undef	    HASEXCEPTION
#undef	    EXCEPTION
#undef	    MATCHT
#undef	    MATCHANYT
#undef	    FOLLOWSTACK
#undef	    FOLLOWPUSH
#undef	    FOLLOWPOP
#undef	    PRECOVER
#undef	    PREPORTERROR
#undef	    LA
#undef	    LT
#undef	    CONSTRUCTEX
#undef	    CONSUME
#undef	    MARK
#undef	    REWIND
#undef	    REWINDLAST
#undef	    PERRORRECOVERY
#undef	    HASFAILED
#undef	    FAILEDFLAG
#undef	    RECOVERFROMMISMATCHEDSET
#undef	    RECOVERFROMMISMATCHEDELEMENT
#undef		INDEX
#undef      ADAPTOR
#undef		SEEK
#undef	    RULEMEMO
#undef		DBG

#define	    PARSER				ctx->pParser
#define	    RECOGNIZER				PARSER->rec
#define	    PSRSTATE				RECOGNIZER->state
#define	    HAVEPARSEDRULE(r)			RECOGNIZER->alreadyParsedRule(RECOGNIZER, r)
#define	    MEMOIZE(ri,si)			RECOGNIZER->memoize(RECOGNIZER, ri, si)
#define	    INPUT				PARSER->tstream
#define	    STRSTREAM				INPUT
#define	    ISTREAM				INPUT->istream
#define	    INDEX()				ISTREAM->index(INPUT->istream)
#define	    HASEXCEPTION()			(PSRSTATE->error == ANTLR3_TRUE)
#define	    EXCEPTION				PSRSTATE->exception
#define	    MATCHT(t, fs)			RECOGNIZER->match(RECOGNIZER, t, fs)
#define	    MATCHANYT()				RECOGNIZER->matchAny(RECOGNIZER)
#define	    FOLLOWSTACK				PSRSTATE->following
#ifdef  SKIP_FOLLOW_SETS
#define	    FOLLOWPUSH(x)
#define	    FOLLOWPOP()
#else
#define	    FOLLOWPUSH(x)			FOLLOWSTACK->push(FOLLOWSTACK, ((void *)(&(x))), NULL)
#define	    FOLLOWPOP()				FOLLOWSTACK->pop(FOLLOWSTACK)
#endif
#define	    PRECOVER()				RECOGNIZER->recover(RECOGNIZER)
#define	    PREPORTERROR()			RECOGNIZER->reportError(RECOGNIZER)
#define	    LA(n)				INPUT->istream->_LA(ISTREAM, n)
#define	    LT(n)				INPUT->_LT(INPUT, n)
#define	    CONSTRUCTEX()			RECOGNIZER->exConstruct(RECOGNIZER)
#define	    CONSUME()				ISTREAM->consume(ISTREAM)
#define	    MARK()				ISTREAM->mark(ISTREAM)
#define	    REWIND(m)				ISTREAM->rewind(ISTREAM, m)
#define	    REWINDLAST()			ISTREAM->rewindLast(ISTREAM)
#define	    SEEK(n)				ISTREAM->seek(ISTREAM, n)
#define	    PERRORRECOVERY			PSRSTATE->errorRecovery
#define	    FAILEDFLAG				PSRSTATE->failed
#define	    HASFAILED()				(FAILEDFLAG == ANTLR3_TRUE)
#define	    BACKTRACKING			PSRSTATE->backtracking
#define	    RECOVERFROMMISMATCHEDSET(s)		RECOGNIZER->recoverFromMismatchedSet(RECOGNIZER, s)
#define	    RECOVERFROMMISMATCHEDELEMENT(e)	RECOGNIZER->recoverFromMismatchedElement(RECOGNIZER, s)
#define     ADAPTOR                         ctx->adaptor
#define		RULEMEMO						PSRSTATE->ruleMemo
#define		DBG								RECOGNIZER->debugger


#define		TOKTEXT(tok, txt)				tok, (pANTLR3_UINT8)txt

/* The 4 tokens defined below may well clash with your own #defines or token types. If so
 * then for the present you must use different names for your defines as these are hard coded
 * in the code generator. It would be better not to use such names internally, and maybe
 * we can change this in a forthcoming release. I deliberately do not #undef these
 * here as this will at least give you a redefined error somewhere if they clash.
 */
#define	    UP	    ANTLR3_TOKEN_UP
#define	    DOWN    ANTLR3_TOKEN_DOWN
#define	    EOR	    ANTLR3_TOKEN_EOR
#define	    INVALID ANTLR3_TOKEN_INVALID


/* =============================================================================
 * Functions to create and destroy scopes. First come the rule scopes, followed
 * by the global declared scopes.
 */



/* ============================================================================= */

/* =============================================================================
 * Start of recognizer
 */


/** \brief Table of all token names in symbolic order, mainly used for
 *         error reporting.
 */
pANTLR3_UINT8   fmlParserTokenNames[414+4]
     = {
        (pANTLR3_UINT8) "<invalid>",       /* String to print to indicate an invalid token */
        (pANTLR3_UINT8) "<EOR>",
        (pANTLR3_UINT8) "<DOWN>",
        (pANTLR3_UINT8) "<UP>",
        (pANTLR3_UINT8) "ASSIGN",
        (pANTLR3_UINT8) "ASSIGN_AFTER",
        (pANTLR3_UINT8) "ASSIGN_MACRO",
        (pANTLR3_UINT8) "ASSIGN_REF",
        (pANTLR3_UINT8) "AT_ID",
        (pANTLR3_UINT8) "BAND",
        (pANTLR3_UINT8) "BAND_ASSIGN",
        (pANTLR3_UINT8) "BAND_ASSIGN_AFTER",
        (pANTLR3_UINT8) "BAR_RBRACKET",
        (pANTLR3_UINT8) "BNOT",
        (pANTLR3_UINT8) "BOR",
        (pANTLR3_UINT8) "BOR_ASSIGN",
        (pANTLR3_UINT8) "BOR_ASSIGN_AFTER",
        (pANTLR3_UINT8) "BXOR",
        (pANTLR3_UINT8) "BXOR_ASSIGN",
        (pANTLR3_UINT8) "BXOR_ASSIGN_AFTER",
        (pANTLR3_UINT8) "Binary",
        (pANTLR3_UINT8) "COLON",
        (pANTLR3_UINT8) "COLONx2",
        (pANTLR3_UINT8) "COMMA",
        (pANTLR3_UINT8) "COMMENT",
        (pANTLR3_UINT8) "CharLiteral",
        (pANTLR3_UINT8) "DECR",
        (pANTLR3_UINT8) "DIESE",
        (pANTLR3_UINT8) "DIV",
        (pANTLR3_UINT8) "DIV_ASSIGN",
        (pANTLR3_UINT8) "DIV_ASSIGN_AFTER",
        (pANTLR3_UINT8) "DOLLAR",
        (pANTLR3_UINT8) "DOLLAR_LCURLY",
        (pANTLR3_UINT8) "DOT",
        (pANTLR3_UINT8) "DOTDOT",
        (pANTLR3_UINT8) "Decimal",
        (pANTLR3_UINT8) "DecimalDigit",
        (pANTLR3_UINT8) "DecimalDigits",
        (pANTLR3_UINT8) "DecimalExponent",
        (pANTLR3_UINT8) "EQUAL",
        (pANTLR3_UINT8) "ESC_SEQ",
        (pANTLR3_UINT8) "EXPONENT",
        (pANTLR3_UINT8) "Float",
        (pANTLR3_UINT8) "FloatLiteral",
        (pANTLR3_UINT8) "FloatTypeSuffix",
        (pANTLR3_UINT8) "GT",
        (pANTLR3_UINT8) "GTE",
        (pANTLR3_UINT8) "HEX_DIGIT",
        (pANTLR3_UINT8) "HexDigit",
        (pANTLR3_UINT8) "Hexadecimal",
        (pANTLR3_UINT8) "ID",
        (pANTLR3_UINT8) "INCR",
        (pANTLR3_UINT8) "ImaginarySuffix",
        (pANTLR3_UINT8) "IntSuffix",
        (pANTLR3_UINT8) "Integer",
        (pANTLR3_UINT8) "IntegerLiteral",
        (pANTLR3_UINT8) "LAND",
        (pANTLR3_UINT8) "LAND_ASSIGN",
        (pANTLR3_UINT8) "LAND_ASSIGN_AFTER",
        (pANTLR3_UINT8) "LAND_THEN",
        (pANTLR3_UINT8) "LBRACKET",
        (pANTLR3_UINT8) "LBRACKET_BAR",
        (pANTLR3_UINT8) "LBRACKET_EXCEPT",
        (pANTLR3_UINT8) "LBRACKET_LCURLY",
        (pANTLR3_UINT8) "LCURLY",
        (pANTLR3_UINT8) "LCURLY_INVOKE",
        (pANTLR3_UINT8) "LNOT",
        (pANTLR3_UINT8) "LOR",
        (pANTLR3_UINT8) "LOR_ASSIGN",
        (pANTLR3_UINT8) "LOR_ASSIGN_AFTER",
        (pANTLR3_UINT8) "LOR_ELSE",
        (pANTLR3_UINT8) "LPAREN",
        (pANTLR3_UINT8) "LPAREN_INVOKE",
        (pANTLR3_UINT8) "LSHIFT",
        (pANTLR3_UINT8) "LSHIFT_ASSIGN",
        (pANTLR3_UINT8) "LSHIFT_ASSIGN_AFTER",
        (pANTLR3_UINT8) "LTE",
        (pANTLR3_UINT8) "LT_",
        (pANTLR3_UINT8) "LXOR",
        (pANTLR3_UINT8) "MINUS",
        (pANTLR3_UINT8) "MINUS_ASSIGN",
        (pANTLR3_UINT8) "MINUS_ASSIGN_AFTER",
        (pANTLR3_UINT8) "MOD",
        (pANTLR3_UINT8) "MOD_ASSIGN",
        (pANTLR3_UINT8) "MOD_ASSIGN_AFTER",
        (pANTLR3_UINT8) "NEQUAL",
        (pANTLR3_UINT8) "NSEQUAL",
        (pANTLR3_UINT8) "NumberLiteral",
        (pANTLR3_UINT8) "OCTAL_ESC",
        (pANTLR3_UINT8) "OP_ASSIGN_TOP",
        (pANTLR3_UINT8) "OP_ATOMIC_SEQUENCE",
        (pANTLR3_UINT8) "OP_CONCURRENCY_AND",
        (pANTLR3_UINT8) "OP_CONCURRENCY_ASYNC",
        (pANTLR3_UINT8) "OP_CONCURRENCY_INTERLEAVING",
        (pANTLR3_UINT8) "OP_CONCURRENCY_OR",
        (pANTLR3_UINT8) "OP_CONCURRENCY_PARALLEL",
        (pANTLR3_UINT8) "OP_CONCURRENCY_RDV_AND",
        (pANTLR3_UINT8) "OP_CONCURRENCY_RDV_ASYNC",
        (pANTLR3_UINT8) "OP_CONCURRENCY_RDV_INTERLEAVING",
        (pANTLR3_UINT8) "OP_CONCURRENCY_RDV_OR",
        (pANTLR3_UINT8) "OP_CONCURRENCY_RDV_PARALLEL",
        (pANTLR3_UINT8) "OP_FORK",
        (pANTLR3_UINT8) "OP_JOIN",
        (pANTLR3_UINT8) "OP_NON_DETERMINISM",
        (pANTLR3_UINT8) "OP_POP",
        (pANTLR3_UINT8) "OP_PUSH",
        (pANTLR3_UINT8) "OP_SCHEDULE_AND_THEN",
        (pANTLR3_UINT8) "OP_SCHEDULE_GT",
        (pANTLR3_UINT8) "OP_SCHEDULE_LT",
        (pANTLR3_UINT8) "OP_SCHEDULE_OR_ELSE",
        (pANTLR3_UINT8) "OP_SCHEDULE_XOR",
        (pANTLR3_UINT8) "OP_SEQUENCE",
        (pANTLR3_UINT8) "OP_SEQUENCE_SIDE",
        (pANTLR3_UINT8) "OP_SEQUENCE_WEAK",
        (pANTLR3_UINT8) "OP_TOP",
        (pANTLR3_UINT8) "Octal",
        (pANTLR3_UINT8) "OctalDigit",
        (pANTLR3_UINT8) "PERCENT_LCURLY",
        (pANTLR3_UINT8) "PERCENT_LPAREN",
        (pANTLR3_UINT8) "PERCENT_LPAREN_INVOKE",
        (pANTLR3_UINT8) "PLUS",
        (pANTLR3_UINT8) "PLUS_ASSIGN",
        (pANTLR3_UINT8) "PLUS_ASSIGN_AFTER",
        (pANTLR3_UINT8) "QUESTION",
        (pANTLR3_UINT8) "RBRACKET",
        (pANTLR3_UINT8) "RCURLY",
        (pANTLR3_UINT8) "RCURLY_DOLLAR",
        (pANTLR3_UINT8) "RCURLY_PERCENT",
        (pANTLR3_UINT8) "RCURLY_RBRACKET",
        (pANTLR3_UINT8) "RPAREN",
        (pANTLR3_UINT8) "RPAREN_PERCENT",
        (pANTLR3_UINT8) "RSHIFT",
        (pANTLR3_UINT8) "RSHIFT_ASSIGN",
        (pANTLR3_UINT8) "RSHIFT_ASSIGN_AFTER",
        (pANTLR3_UINT8) "RationalLiteral",
        (pANTLR3_UINT8) "SEMI",
        (pANTLR3_UINT8) "SEQUAL",
        (pANTLR3_UINT8) "STAR",
        (pANTLR3_UINT8) "STAR_ASSIGN",
        (pANTLR3_UINT8) "STAR_ASSIGN_AFTER",
        (pANTLR3_UINT8) "STATEMENT_PROMPT",
        (pANTLR3_UINT8) "StringLiteral",
        (pANTLR3_UINT8) "UNICODE_ESC",
        (pANTLR3_UINT8) "WS",
        (pANTLR3_UINT8) "'#dhistory'",
        (pANTLR3_UINT8) "'#final'",
        (pANTLR3_UINT8) "'#init'",
        (pANTLR3_UINT8) "'#initial'",
        (pANTLR3_UINT8) "'#return'",
        (pANTLR3_UINT8) "'#shistory'",
        (pANTLR3_UINT8) "'#start'",
        (pANTLR3_UINT8) "'#stf'",
        (pANTLR3_UINT8) "'#sts'",
        (pANTLR3_UINT8) "'#terminal'",
        (pANTLR3_UINT8) "'$:comment'",
        (pANTLR3_UINT8) "'$:debug'",
        (pANTLR3_UINT8) "'$:informal'",
        (pANTLR3_UINT8) "'$:trace'",
        (pANTLR3_UINT8) "'$env'",
        (pANTLR3_UINT8) "'$parent'",
        (pANTLR3_UINT8) "'$self'",
        (pANTLR3_UINT8) "'$super'",
        (pANTLR3_UINT8) "'$this'",
        (pANTLR3_UINT8) "'-->'",
        (pANTLR3_UINT8) "'->'",
        (pANTLR3_UINT8) "'<--'",
        (pANTLR3_UINT8) "'<->'",
        (pANTLR3_UINT8) "'<=='",
        (pANTLR3_UINT8) "'==>'",
        (pANTLR3_UINT8) "'@'",
        (pANTLR3_UINT8) "'@abort'",
        (pANTLR3_UINT8) "'@behavior:'",
        (pANTLR3_UINT8) "'@com:'",
        (pANTLR3_UINT8) "'@composite'",
        (pANTLR3_UINT8) "'@composite:'",
        (pANTLR3_UINT8) "'@concurrency'",
        (pANTLR3_UINT8) "'@constraint'",
        (pANTLR3_UINT8) "'@create'",
        (pANTLR3_UINT8) "'@declaration:'",
        (pANTLR3_UINT8) "'@disable'",
        (pANTLR3_UINT8) "'@diversity'",
        (pANTLR3_UINT8) "'@effect:'",
        (pANTLR3_UINT8) "'@enable'",
        (pANTLR3_UINT8) "'@executable:'",
        (pANTLR3_UINT8) "'@final'",
        (pANTLR3_UINT8) "'@fml'",
        (pANTLR3_UINT8) "'@formalml'",
        (pANTLR3_UINT8) "'@guard:'",
        (pANTLR3_UINT8) "'@header:'",
        (pANTLR3_UINT8) "'@iabort'",
        (pANTLR3_UINT8) "'@idisable'",
        (pANTLR3_UINT8) "'@ienable'",
        (pANTLR3_UINT8) "'@import:'",
        (pANTLR3_UINT8) "'@include'",
        (pANTLR3_UINT8) "'@init'",
        (pANTLR3_UINT8) "'@inout:'",
        (pANTLR3_UINT8) "'@input:'",
        (pANTLR3_UINT8) "'@instance:'",
        (pANTLR3_UINT8) "'@interaction:'",
        (pANTLR3_UINT8) "'@irun'",
        (pANTLR3_UINT8) "'@machine:'",
        (pANTLR3_UINT8) "'@macro:'",
        (pANTLR3_UINT8) "'@moc:'",
        (pANTLR3_UINT8) "'@model:'",
        (pANTLR3_UINT8) "'@moe:'",
        (pANTLR3_UINT8) "'@on_write'",
        (pANTLR3_UINT8) "'@options'",
        (pANTLR3_UINT8) "'@output:'",
        (pANTLR3_UINT8) "'@package'",
        (pANTLR3_UINT8) "'@param:'",
        (pANTLR3_UINT8) "'@parameter:'",
        (pANTLR3_UINT8) "'@private:'",
        (pANTLR3_UINT8) "'@procedure:'",
        (pANTLR3_UINT8) "'@property:'",
        (pANTLR3_UINT8) "'@protected:'",
        (pANTLR3_UINT8) "'@prototype:'",
        (pANTLR3_UINT8) "'@public:'",
        (pANTLR3_UINT8) "'@region:'",
        (pANTLR3_UINT8) "'@return'",
        (pANTLR3_UINT8) "'@return:'",
        (pANTLR3_UINT8) "'@returns:'",
        (pANTLR3_UINT8) "'@routine'",
        (pANTLR3_UINT8) "'@routine:'",
        (pANTLR3_UINT8) "'@rtc'",
        (pANTLR3_UINT8) "'@run'",
        (pANTLR3_UINT8) "'@schedule'",
        (pANTLR3_UINT8) "'@start'",
        (pANTLR3_UINT8) "'@statemachine:'",
        (pANTLR3_UINT8) "'@stop'",
        (pANTLR3_UINT8) "'@system'",
        (pANTLR3_UINT8) "'@tguard:'",
        (pANTLR3_UINT8) "'@transition:'",
        (pANTLR3_UINT8) "'@trigger:'",
        (pANTLR3_UINT8) "'@xfml'",
        (pANTLR3_UINT8) "'@xfsp'",
        (pANTLR3_UINT8) "'@xlia'",
        (pANTLR3_UINT8) "'abort'",
        (pANTLR3_UINT8) "'absent'",
        (pANTLR3_UINT8) "'activity:'",
        (pANTLR3_UINT8) "'and'",
        (pANTLR3_UINT8) "'anycast'",
        (pANTLR3_UINT8) "'array'",
        (pANTLR3_UINT8) "'avmcode'",
        (pANTLR3_UINT8) "'bind'",
        (pANTLR3_UINT8) "'bind:'",
        (pANTLR3_UINT8) "'bool'",
        (pANTLR3_UINT8) "'boolean'",
        (pANTLR3_UINT8) "'break'",
        (pANTLR3_UINT8) "'broadcast'",
        (pANTLR3_UINT8) "'buffer'",
        (pANTLR3_UINT8) "'call'",
        (pANTLR3_UINT8) "'changed#to'",
        (pANTLR3_UINT8) "'changed'",
        (pANTLR3_UINT8) "'channel'",
        (pANTLR3_UINT8) "'char'",
        (pANTLR3_UINT8) "'character'",
        (pANTLR3_UINT8) "'checksat'",
        (pANTLR3_UINT8) "'choice'",
        (pANTLR3_UINT8) "'class'",
        (pANTLR3_UINT8) "'clock'",
        (pANTLR3_UINT8) "'connect'",
        (pANTLR3_UINT8) "'connector'",
        (pANTLR3_UINT8) "'const'",
        (pANTLR3_UINT8) "'continue'",
        (pANTLR3_UINT8) "'ctime'",
        (pANTLR3_UINT8) "'ctor'",
        (pANTLR3_UINT8) "'ctx:'",
        (pANTLR3_UINT8) "'destroy'",
        (pANTLR3_UINT8) "'disable'",
        (pANTLR3_UINT8) "'do'",
        (pANTLR3_UINT8) "'double'",
        (pANTLR3_UINT8) "'dtime'",
        (pANTLR3_UINT8) "'dynamic'",
        (pANTLR3_UINT8) "'else'",
        (pANTLR3_UINT8) "'elseif'",
        (pANTLR3_UINT8) "'enable'",
        (pANTLR3_UINT8) "'enum'",
        (pANTLR3_UINT8) "'env'",
        (pANTLR3_UINT8) "'event'",
        (pANTLR3_UINT8) "'exit'",
        (pANTLR3_UINT8) "'false'",
        (pANTLR3_UINT8) "'fifo'",
        (pANTLR3_UINT8) "'final'",
        (pANTLR3_UINT8) "'float'",
        (pANTLR3_UINT8) "'flow'",
        (pANTLR3_UINT8) "'for'",
        (pANTLR3_UINT8) "'fork'",
        (pANTLR3_UINT8) "'from:'",
        (pANTLR3_UINT8) "'fun'",
        (pANTLR3_UINT8) "'goto'",
        (pANTLR3_UINT8) "'guard'",
        (pANTLR3_UINT8) "'iabort'",
        (pANTLR3_UINT8) "'idisable'",
        (pANTLR3_UINT8) "'ienable'",
        (pANTLR3_UINT8) "'if'",
        (pANTLR3_UINT8) "'in'",
        (pANTLR3_UINT8) "'init'",
        (pANTLR3_UINT8) "'init:'",
        (pANTLR3_UINT8) "'inout'",
        (pANTLR3_UINT8) "'input#buffer'",
        (pANTLR3_UINT8) "'input#env'",
        (pANTLR3_UINT8) "'input#flow'",
        (pANTLR3_UINT8) "'input#rdv'",
        (pANTLR3_UINT8) "'input#save'",
        (pANTLR3_UINT8) "'input#var'",
        (pANTLR3_UINT8) "'input'",
        (pANTLR3_UINT8) "'input_enabled'",
        (pANTLR3_UINT8) "'instance'",
        (pANTLR3_UINT8) "'instance:'",
        (pANTLR3_UINT8) "'int'",
        (pANTLR3_UINT8) "'integer'",
        (pANTLR3_UINT8) "'interval'",
        (pANTLR3_UINT8) "'join'",
        (pANTLR3_UINT8) "'lambda'",
        (pANTLR3_UINT8) "'lifeline'",
        (pANTLR3_UINT8) "'lifo'",
        (pANTLR3_UINT8) "'list'",
        (pANTLR3_UINT8) "'machine'",
        (pANTLR3_UINT8) "'macro'",
        (pANTLR3_UINT8) "'max:'",
        (pANTLR3_UINT8) "'message'",
        (pANTLR3_UINT8) "'moc:'",
        (pANTLR3_UINT8) "'model'",
        (pANTLR3_UINT8) "'model:'",
        (pANTLR3_UINT8) "'multicast'",
        (pANTLR3_UINT8) "'multififo'",
        (pANTLR3_UINT8) "'multilifo'",
        (pANTLR3_UINT8) "'multiplicity:'",
        (pANTLR3_UINT8) "'multirdv'",
        (pANTLR3_UINT8) "'multiset'",
        (pANTLR3_UINT8) "'new'",
        (pANTLR3_UINT8) "'null'",
        (pANTLR3_UINT8) "'null<'",
        (pANTLR3_UINT8) "'operator'",
        (pANTLR3_UINT8) "'or'",
        (pANTLR3_UINT8) "'out'",
        (pANTLR3_UINT8) "'output#buffer'",
        (pANTLR3_UINT8) "'output#env'",
        (pANTLR3_UINT8) "'output#flow'",
        (pANTLR3_UINT8) "'output#rdv'",
        (pANTLR3_UINT8) "'output#var'",
        (pANTLR3_UINT8) "'output'",
        (pANTLR3_UINT8) "'package'",
        (pANTLR3_UINT8) "'parent'",
        (pANTLR3_UINT8) "'port'",
        (pANTLR3_UINT8) "'pos_int'",
        (pANTLR3_UINT8) "'pos_integer'",
        (pANTLR3_UINT8) "'present'",
        (pANTLR3_UINT8) "'prior:'",
        (pANTLR3_UINT8) "'private'",
        (pANTLR3_UINT8) "'proba:'",
        (pANTLR3_UINT8) "'procedure'",
        (pANTLR3_UINT8) "'protected'",
        (pANTLR3_UINT8) "'prototype'",
        (pANTLR3_UINT8) "'provided:'",
        (pANTLR3_UINT8) "'public'",
        (pANTLR3_UINT8) "'ram'",
        (pANTLR3_UINT8) "'rat'",
        (pANTLR3_UINT8) "'rational'",
        (pANTLR3_UINT8) "'rdv'",
        (pANTLR3_UINT8) "'real'",
        (pANTLR3_UINT8) "'ref'",
        (pANTLR3_UINT8) "'restart'",
        (pANTLR3_UINT8) "'resume'",
        (pANTLR3_UINT8) "'return'",
        (pANTLR3_UINT8) "'returns:'",
        (pANTLR3_UINT8) "'route'",
        (pANTLR3_UINT8) "'routine'",
        (pANTLR3_UINT8) "'rtc'",
        (pANTLR3_UINT8) "'run'",
        (pANTLR3_UINT8) "'rvector'",
        (pANTLR3_UINT8) "'schedule'",
        (pANTLR3_UINT8) "'self'",
        (pANTLR3_UINT8) "'set'",
        (pANTLR3_UINT8) "'signal'",
        (pANTLR3_UINT8) "'size:'",
        (pANTLR3_UINT8) "'solver:'",
        (pANTLR3_UINT8) "'start'",
        (pANTLR3_UINT8) "'state'",
        (pANTLR3_UINT8) "'statemachine'",
        (pANTLR3_UINT8) "'static'",
        (pANTLR3_UINT8) "'status#being'",
        (pANTLR3_UINT8) "'status#is'",
        (pANTLR3_UINT8) "'status#was'",
        (pANTLR3_UINT8) "'status#will'",
        (pANTLR3_UINT8) "'step_mark'",
        (pANTLR3_UINT8) "'stop'",
        (pANTLR3_UINT8) "'string'",
        (pANTLR3_UINT8) "'struct'",
        (pANTLR3_UINT8) "'suspend'",
        (pANTLR3_UINT8) "'system'",
        (pANTLR3_UINT8) "'tguard'",
        (pANTLR3_UINT8) "'time'",
        (pANTLR3_UINT8) "'timed'",
        (pANTLR3_UINT8) "'to:'",
        (pANTLR3_UINT8) "'transient'",
        (pANTLR3_UINT8) "'transition'",
        (pANTLR3_UINT8) "'true'",
        (pANTLR3_UINT8) "'type'",
        (pANTLR3_UINT8) "'udouble'",
        (pANTLR3_UINT8) "'ufloat'",
        (pANTLR3_UINT8) "'uint'",
        (pANTLR3_UINT8) "'uinteger'",
        (pANTLR3_UINT8) "'unicast'",
        (pANTLR3_UINT8) "'union'",
        (pANTLR3_UINT8) "'universal'",
        (pANTLR3_UINT8) "'unsafe'",
        (pANTLR3_UINT8) "'urat'",
        (pANTLR3_UINT8) "'urational'",
        (pANTLR3_UINT8) "'ureal'",
        (pANTLR3_UINT8) "'val'",
        (pANTLR3_UINT8) "'var'",
        (pANTLR3_UINT8) "'vector'",
        (pANTLR3_UINT8) "'via'",
        (pANTLR3_UINT8) "'volatile'",
        (pANTLR3_UINT8) "'wait'",
        (pANTLR3_UINT8) "'while'",
        (pANTLR3_UINT8) "'|=>'"
       };



// Forward declare the locally static matching functions we have generated.
//
static 
 sep::System *
	formalML    (pfmlParser ctx, sep::WObjectManager & aWObjectManager);
static 
 void
	prologue_fml    (pfmlParser ctx);
static 
 void
	prologue_attribute    (pfmlParser ctx);
static 
 void
	prologue_options    (pfmlParser ctx);
static 
 sep::Modifier
	modifier_declaration    (pfmlParser ctx);
static 
 sep::Modifier
	modifier_direction    (pfmlParser ctx);
static 
 sep::Modifier
	modifier_direction_text    (pfmlParser ctx);
static 
 void
	modifier_set_direction_strict_text    (pfmlParser ctx, sep::Modifier & mdfr);
static 
 sep::Modifier
	modifier_direction_symbol    (pfmlParser ctx);
static 
 sep::Modifier
	modifier_param    (pfmlParser ctx);
static 
 fmlParser_procedure_modifier_specifier_return
	procedure_modifier_specifier    (pfmlParser ctx);
static 
 fmlParser_executable_modifier_specifier_return
	executable_modifier_specifier    (pfmlParser ctx);
static 
 fmlParser_instance_modifier_specifier_return
	instance_modifier_specifier    (pfmlParser ctx);
static 
 fmlParser_modifier_transition_return
	modifier_transition    (pfmlParser ctx);
static 
 sep::Package *
	def_package    (pfmlParser ctx);
static 
 sep::System *
	def_system    (pfmlParser ctx);
static 
 fmlParser_qualifiedNameID_return
	qualifiedNameID    (pfmlParser ctx);
static 
 sep::avm_size_t
	integer_constant    (pfmlParser ctx);
static 
 sep::avm_float_t
	float_constant    (pfmlParser ctx);
static 
 void
	section_header    (pfmlParser ctx, sep::Machine * container);
static 
 void
	section_import    (pfmlParser ctx, sep::Machine * container);
static 
 void
	include_package    (pfmlParser ctx);
static 
 void
	section_procedure    (pfmlParser ctx, sep::Machine * container);
static 
 sep::Machine *
	def_procedure    (pfmlParser ctx, sep::Machine * container);
static 
 void
	def_machine_parameters    (pfmlParser ctx, sep::Machine * machine);
static 
 void
	def_machine_variable_parameter_atom    (pfmlParser ctx, sep::PropertyPart & paramDecl, sep::Modifier mdfr, sep::avm_offset_t offset);
static 
 void
	def_machine_returns    (pfmlParser ctx, sep::Machine * machine, sep::Modifier mdfr);
static 
 void
	def_machine_variable_return_atom    (pfmlParser ctx, sep::PropertyPart & paramDecl, sep::Modifier mdfr, sep::avm_offset_t offset);
static 
 void
	def_body_procedure    (pfmlParser ctx, sep::Machine * procedure);
static 
 void
	def_body_procedure_section    (pfmlParser ctx, sep::Machine * procedure);
static 
 void
	def_body_procedure_simplif    (pfmlParser ctx, sep::Machine * procedure);
static 
 void
	section_composite_structure    (pfmlParser ctx, sep::Machine * container);
static 
 void
	section_composite_generic    (pfmlParser ctx, sep::Machine * container);
static 
 void
	section_machine_model    (pfmlParser ctx, sep::Machine * container);
static 
 void
	section_machine_prototype    (pfmlParser ctx, sep::Machine * container);
static 
 void
	section_machine_instance    (pfmlParser ctx, sep::Machine * container);
static 
 sep::Machine *
	executable_machine    (pfmlParser ctx, sep::Machine * container);
static 
 sep::Machine *
	executable_model_definiton    (pfmlParser ctx, sep::Machine * container, sep::Modifier mdfr, sep::Specifier spcfr);
static 
 sep::Machine *
	executable_instance_definiton    (pfmlParser ctx, sep::Machine * container);
static 
 sep::Machine *
	decl_instance    (pfmlParser ctx, sep::Machine * container, sep::Modifier mdfr, sep::Specifier spcfr);
static 
 void
	def_instance_on_new_activity    (pfmlParser ctx, sep::Machine * instance);
static 
 void
	def_instance_on_new_activity_parameter    (pfmlParser ctx, sep::Machine * instance, sep::avm_size_t position);
static 
 sep::Operator *
	op_assign_param    (pfmlParser ctx);
static 
 void
	def_instance_activity    (pfmlParser ctx, sep::Machine * instance);
static 
 void
	section_behavior    (pfmlParser ctx, sep::Machine * container);
static 
 void
	def_instance_count    (pfmlParser ctx, sep::avm_size_t & initial, sep::avm_size_t & maximal);
static 
 void
	def_instance_count_atom    (pfmlParser ctx, sep::avm_size_t & initial, sep::avm_size_t & maximal);
static 
 sep::Machine *
	def_machine    (pfmlParser ctx, sep::Machine * container, sep::Modifier mdfr, sep::Specifier spcfr);
static 
 void
	def_body_machine_using_section_header_predicat    (pfmlParser ctx);
static 
 void
	def_body_machine_using_section_import_predicat    (pfmlParser ctx);
static 
 void
	def_body_machine_using_section_parameter_predicat    (pfmlParser ctx);
static 
 void
	def_body_machine_using_section_property_predicat    (pfmlParser ctx);
static 
 void
	def_body_machine_using_section_predicat    (pfmlParser ctx);
static 
 void
	def_body_machine    (pfmlParser ctx, sep::Machine * machine);
static 
 void
	def_body_machine_section    (pfmlParser ctx, sep::Machine * machine);
static 
 void
	def_body_machine_simplif    (pfmlParser ctx, sep::Machine * machine);
static 
 sep::Machine *
	any_def_statemachine    (pfmlParser ctx, sep::Machine * container, sep::Modifier mdfr, sep::Specifier spcfr);
static 
 sep::Machine *
	def_statemachine    (pfmlParser ctx, sep::Machine * container, sep::Modifier mdfr, sep::Specifier spcfr);
static 
 void
	def_body_statemachine    (pfmlParser ctx, sep::Machine * machine);
static 
 void
	section_region    (pfmlParser ctx, sep::Machine * container);
static 
 void
	section_statemachine    (pfmlParser ctx, sep::Machine * container);
static 
 sep::Machine *
	def_state    (pfmlParser ctx, sep::Machine * container, sep::Modifier mdfr, sep::Specifier spcfr);
static 
 std::string
	state_kw_id    (pfmlParser ctx);
static 
 std::string
	state_id    (pfmlParser ctx);
static 
 sep::Machine *
	def_state_singleton    (pfmlParser ctx, sep::Machine * container, sep::Modifier mdfr, sep::Specifier spcfr);
static 
 void
	executable_specifier    (pfmlParser ctx, sep::Specifier & spcfr);
static 
 void
	executable_specifier_atom    (pfmlParser ctx, sep::Specifier & spcfr);
static 
 sep::BF
	instance_machine_model    (pfmlParser ctx);
static 
 void
	def_body_state    (pfmlParser ctx, sep::Machine * state);
static 
 void
	def_body_state_section    (pfmlParser ctx, sep::Machine * machine);
static 
 void
	def_body_state_simplif    (pfmlParser ctx, sep::Machine * state);
static 
 void
	section_transition    (pfmlParser ctx, sep::Machine * state);
static 
 void
	def_transition    (pfmlParser ctx, sep::Machine * state, sep::Modifier mdfr, sep::Specifier spcfr);
static 
 sep::Transition::MOC_KIND
	kind_transition    (pfmlParser ctx);
static 
 sep::Transition::moc_kind_t
	moc_transition_attribute    (pfmlParser ctx);
static 
 void
	moc_transition    (pfmlParser ctx, sep::Transition * trans);
static 
 void
	moc_transition_atom    (pfmlParser ctx, sep::Transition * trans);
static 
 void
	moe_transition    (pfmlParser ctx, sep::Transition * trans);
static 
 sep::BFCode
	transition_statement    (pfmlParser ctx);
static 
 void
	transition_trigger    (pfmlParser ctx, sep::BFCode & ac);
static 
 void
	transition_guard    (pfmlParser ctx, sep::BFCode & ac);
static 
 void
	transition_timed_guard    (pfmlParser ctx, sep::BFCode & ac);
static 
 void
	transition_effect    (pfmlParser ctx, sep::BFCode & ac);
static 
 sep::BF
	target_state_id    (pfmlParser ctx);
static 
 std::string
	target_state_kw_id    (pfmlParser ctx);
static 
 void
	def_state_activity    (pfmlParser ctx, sep::Machine * state);
static 
 void
	section_header_import_parameter_property    (pfmlParser ctx, sep::Machine * container);
static 
 void
	section_parameter    (pfmlParser ctx, sep::Machine * container);
static 
 void
	section_property    (pfmlParser ctx, sep::Machine * container);
static 
 void
	section_property_free_declaration    (pfmlParser ctx, sep::Machine * container);
static 
 void
	property_declaration    (pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr);
static 
 void
	decl_property_element    (pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr);
static 
 fmlParser_labelled_argument_return
	labelled_argument    (pfmlParser ctx);
static 
 void
	decl_instance_machine_params    (pfmlParser ctx, sep::Machine * machine);
static 
 void
	decl_instance_machine_returns    (pfmlParser ctx, sep::Machine * machine);
static 
 void
	activity_machine_param_return    (pfmlParser ctx, const sep::BF & argMachine, sep::BFCode & ac);
static 
 void
	decl_port    (pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr);
static 
 void
	decl_port_impl    (pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr, sep::IComPoint::ENUM_IO_NATURE nature);
static 
 void
	decl_signal    (pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr);
static 
 void
	decl_signal_impl    (pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr, sep::IComPoint::ENUM_IO_NATURE nature);
static 
 void
	type_param_com    (pfmlParser ctx, sep::Port * port);
static 
 void
	param_com_atom    (pfmlParser ctx, sep::Port * port, sep::avm_offset_t offset);
static 
 void
	decl_buffer    (pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr);
static 
 void
	decl_buffer_impl    (pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr);
static 
 fmlParser_def_buffer_return
	def_buffer    (pfmlParser ctx);
static 
 sep::avm_type_specifier_kind_t
	policy_buffer    (pfmlParser ctx);
static 
 sep::BF
	ref_buffer    (pfmlParser ctx, sep::Machine * machine);
static 
 void
	initial_buffer_contents    (pfmlParser ctx, const sep::Buffer * buffer);
static 
 void
	decl_channel    (pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr);
static 
 void
	decl_channel_port    (pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr);
static 
 void
	decl_channel_var    (pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr);
static 
 void
	decl_variable    (pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr);
static 
 void
	decl_variable_time_clock_impl    (pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr);
static 
 void
	decl_variable_impl    (pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr);
static 
 void
	decl_variable_atom_impl    (pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr);
static 
 void
	decl_typed_variable_atom_impl    (pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr, const sep::BF & type);
static 
 sep::BF
	initial_value    (pfmlParser ctx);
static 
 sep::BF
	type_var    (pfmlParser ctx);
static 
 sep::BF
	def_type_array    (pfmlParser ctx, sep::BF baseT, const std::string & tid);
static 
 int
	def_type_array_size    (pfmlParser ctx);
static 
 sep::BF
	def_type_container    (pfmlParser ctx, const std::string & tid);
static 
 sep::avm_type_specifier_kind_t
	specifier_buffer    (pfmlParser ctx);
static 
 sep::BF
	def_type_interval    (pfmlParser ctx, const std::string & tid);
static 
 sep::BF
	base_type_var    (pfmlParser ctx);
static 
 sep::TypeSpecifier
	primitive_type    (pfmlParser ctx);
static 
 int
	bit_field_size    (pfmlParser ctx);
static 
 fmlParser_string_field_size_return
	string_field_size    (pfmlParser ctx);
static 
 fmlParser_range_constant_return
	range_constant    (pfmlParser ctx);
static 
 void
	on_write_var_routine_def    (pfmlParser ctx, sep::Variable * var);
static 
 void
	var_routine_def    (pfmlParser ctx, sep::Variable * var);
static 
 void
	routine_single_param    (pfmlParser ctx, sep::Routine & routine, const sep::BF & dftType);
static 
 void
	def_enum    (pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr);
static 
 void
	def_enum_impl    (pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr, const std::string & tid);
static 
 void
	def_struct    (pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr);
static 
 void
	def_class_structure_impl    (pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr, const std::string & tid);
static 
 void
	def_choice    (pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr);
static 
 void
	def_choice_impl    (pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr, const std::string & tid);
static 
 void
	def_union    (pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr);
static 
 void
	def_union_impl    (pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr, const std::string & tid);
static 
 void
	def_method    (pfmlParser ctx, sep::PropertyPart & declProperty);
static 
 void
	decl_parameters    (pfmlParser ctx);
static 
 void
	def_type    (pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr);
static 
 void
	def_type_impl    (pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr);
static 
 void
	def_type_atom_impl    (pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr);
static 
 void
	def_typedef_constraint    (pfmlParser ctx, sep::DataType * aliasT);
static 
 sep::TypeSpecifier
	time_type    (pfmlParser ctx);
static 
 sep::TypeSpecifier
	time_clock_type    (pfmlParser ctx);
static 
 sep::TypeSpecifier
	time_type_domain    (pfmlParser ctx);
static 
 void
	section_model_of_computation    (pfmlParser ctx, sep::Machine * container);
static 
 void
	section_routine    (pfmlParser ctx, sep::Machine * container);
static 
 void
	def_routine_model    (pfmlParser ctx, sep::Machine * container, sep::Modifier mdfr, sep::Specifier spcfr);
static 
 void
	def_routine_model_impl    (pfmlParser ctx, sep::Machine * container, sep::Modifier mdfr, sep::Specifier spcfr);
static 
 void
	def_routine_parameters    (pfmlParser ctx, sep::Routine & routine);
static 
 void
	def_routine_param_atom    (pfmlParser ctx, sep::Routine & routine, sep::avm_size_t offset);
static 
 void
	def_routine_returns    (pfmlParser ctx, sep::Routine & routine);
static 
 void
	def_routine_returns_atom    (pfmlParser ctx, sep::Routine & routine, sep::avm_size_t offset);
static 
 void
	section_model_of_execution    (pfmlParser ctx, sep::Machine * container);
static 
 void
	def_moe_primitive    (pfmlParser ctx, sep::Machine * container);
static 
 void
	def_routine_seq    (pfmlParser ctx, sep::Routine & routine);
static 
 void
	section_model_of_interaction    (pfmlParser ctx, sep::Machine * machine);
static 
 void
	com_protocol    (pfmlParser ctx, sep::Machine * machine, sep::ComProtocol * cp);
static 
 void
	com_cast    (pfmlParser ctx, sep::ComProtocol * cp);
static 
 sep::BF
	buffer_com    (pfmlParser ctx, sep::Machine * machine);
static 
 void
	com_connect    (pfmlParser ctx, sep::Machine * machine, sep::InteractionPart * anInteraction);
static 
 void
	com_route    (pfmlParser ctx, sep::Machine * machine, sep::Connector * aConnector);
static 
 void
	com_port    (pfmlParser ctx, sep::Machine * machine, sep::ComRoute * comRoute);
static 
 sep::BF
	com_port_id    (pfmlParser ctx, sep::Machine * machine, sep::Machine * comMachine);
static 
 sep::BFCode
	statement    (pfmlParser ctx);
static 
 sep::BFCode
	block_statement    (pfmlParser ctx);
static 
 sep::Operator *
	op_block    (pfmlParser ctx);
static 
 sep::Operator *
	op_sequence    (pfmlParser ctx);
static 
 sep::Operator *
	op_scheduling    (pfmlParser ctx);
static 
 sep::Operator *
	op_concurrency    (pfmlParser ctx);
static 
 sep::Operator *
	op_invokable    (pfmlParser ctx);
static 
 sep::BFCode
	prefix_statement    (pfmlParser ctx);
static 
 sep::BFCode
	prefix_expression    (pfmlParser ctx);
static 
 sep::Operator *
	avm_operator    (pfmlParser ctx);
static 
 sep::BFCode
	statement_invoke_method    (pfmlParser ctx);
static 
 sep::BFCode
	statement_invoke    (pfmlParser ctx);
static 
 sep::BFCode
	expression_invoke    (pfmlParser ctx);
static 
 sep::BFCode
	statement_activity_new    (pfmlParser ctx);
static 
 void
	decl_instance_dynamic_impl    (pfmlParser ctx, sep::Machine * container, sep::Machine * ptrInstance);
static 
 sep::BFCode
	expression_activity_new    (pfmlParser ctx);
static 
 sep::BFCode
	statement_prompt    (pfmlParser ctx);
static 
 sep::BFCode
	statement_prompt_impl    (pfmlParser ctx);
static 
 sep::BFCode
	statement_prompt_obs    (pfmlParser ctx);
static 
 sep::BFCode
	statement_prompt_obs_com    (pfmlParser ctx, const sep::BF & varMachine);
static 
 sep::BFCode
	meta_statement    (pfmlParser ctx);
static 
 sep::BFCode
	statement_assign    (pfmlParser ctx);
static 
 sep::BF
	lvalue    (pfmlParser ctx);
static 
 void
	parameters    (pfmlParser ctx, const sep::BFCode & ac);
static 
 sep::BFCode
	statement_com    (pfmlParser ctx);
static 
 sep::BFCode
	statement_com_input    (pfmlParser ctx);
static 
 sep::BFCode
	statement_com_output    (pfmlParser ctx);
static 
 void
	parameters_port    (pfmlParser ctx, sep::Port * port, const sep::BFCode & ac);
static 
 sep::BFCode
	expression_com    (pfmlParser ctx);
static 
 sep::BFCode
	statement_constraint    (pfmlParser ctx);
static 
 sep::BFCode
	statement_guard    (pfmlParser ctx);
static 
 sep::BFCode
	statement_timed_guard    (pfmlParser ctx);
static 
 sep::BFCode
	statement_checksat    (pfmlParser ctx);
static 
 sep::BFCode
	expression_guard    (pfmlParser ctx);
static 
 sep::BFCode
	statement_ite    (pfmlParser ctx);
static 
 sep::BFCode
	expression_ite    (pfmlParser ctx);
static 
 sep::BFCode
	statement_iteration    (pfmlParser ctx);
static 
 sep::BFCode
	for_assign_header    (pfmlParser ctx);
static 
 sep::BFCode
	statement_jump    (pfmlParser ctx);
static 
 sep::BFCode
	expression_lambda    (pfmlParser ctx);
static 
 sep::BFCode
	expression_status    (pfmlParser ctx);
static 
 sep::Operator *
	op_activity    (pfmlParser ctx);
static 
 sep::BFCode
	statement_activity    (pfmlParser ctx);
static 
 sep::BFCode
	statement_init_flow    (pfmlParser ctx, const sep::BF & flowTarget);
static 
 sep::BFCode
	statement_invoke_routine    (pfmlParser ctx);
static 
 void
	invoke_routine_params    (pfmlParser ctx, sep::Routine * invokeRoutine);
static 
 void
	invoke_routine_returns    (pfmlParser ctx, sep::Routine * invokeRoutine);
static 
 sep::BFCode
	statement_moc    (pfmlParser ctx);
static 
 sep::BF
	expression    (pfmlParser ctx);
static 
 sep::BF
	conditionalExpression    (pfmlParser ctx);
static 
 sep::BF
	scheduleExpression    (pfmlParser ctx);
static 
 sep::BF
	conditionalOrExpression    (pfmlParser ctx);
static 
 sep::BF
	conditionalAndExpression    (pfmlParser ctx);
static 
 sep::BF
	bitwiseOrExpression    (pfmlParser ctx);
static 
 sep::BF
	bitwiseXorExpression    (pfmlParser ctx);
static 
 sep::BF
	bitwiseAndExpression    (pfmlParser ctx);
static 
 sep::BF
	equalityExpression    (pfmlParser ctx);
static 
 sep::Operator *
	equalOp    (pfmlParser ctx);
static 
 sep::BF
	relationalExpression    (pfmlParser ctx);
static 
 sep::Operator *
	relationalOp    (pfmlParser ctx);
static 
 sep::BF
	shiftExpression    (pfmlParser ctx);
static 
 sep::Operator *
	shiftOp    (pfmlParser ctx);
static 
 sep::BF
	additiveExpression    (pfmlParser ctx);
static 
 sep::BF
	multiplicativeExpression    (pfmlParser ctx);
static 
 sep::BF
	unaryExpression    (pfmlParser ctx);
static 
 sep::BFCode
	ctorExpression    (pfmlParser ctx);
static 
 sep::BFCode
	quote_expression    (pfmlParser ctx);
static 
 sep::BFCode
	meta_eval_expression    (pfmlParser ctx);
static 
 sep::BF
	primary    (pfmlParser ctx);
static 
 sep::BF
	primary_ufid    (pfmlParser ctx, const std::string & mainId);
static 
 sep::BF
	primary_ufi    (pfmlParser ctx, const std::string & locatorId);
static 
 sep::BF
	primary_invoke    (pfmlParser ctx, const std::string & mainId);
static 
 sep::BF
	literal    (pfmlParser ctx);
static 
 sep::BF
	collection_of_expression    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred21_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred56_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred57_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred58_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred59_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred60_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred61_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred62_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred95_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred115_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred126_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred127_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred138_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred153_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred170_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred296_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred304_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred324_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred326_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred329_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred340_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred341_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred343_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred344_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred366_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred370_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred373_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred375_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred407_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred412_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred417_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred419_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred426_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred431_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred438_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred446_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred493_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred514_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred517_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred520_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred531_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred535_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred537_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred539_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred555_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred559_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred574_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred609_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred636_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred643_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred705_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred709_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred714_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred778_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred779_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred780_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred781_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred802_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred804_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred861_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred872_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred891_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred894_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred896_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred897_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred898_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred946_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred947_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred948_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred949_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred950_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred951_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred952_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred953_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred954_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred955_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred956_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred957_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred958_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred959_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred960_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred961_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred962_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred963_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred964_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred965_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred966_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred967_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred968_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred969_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred970_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred971_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred972_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred973_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred974_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred975_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred976_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred977_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred980_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred981_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred982_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred983_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred984_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred985_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred986_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred987_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred991_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred992_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred997_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred1000_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred1003_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred1020_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred1021_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred1027_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred1029_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred1030_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred1033_fml    (pfmlParser ctx);
static 
 ANTLR3_BOOLEAN
	synpred1035_fml    (pfmlParser ctx);
static void	fmlParserFree(pfmlParser ctx);
static void     fmlParserReset (pfmlParser ctx);

/* For use in tree output where we are accumulating rule labels via label += ruleRef
 * we need a function that knows how to free a return scope when the list is destroyed.
 * We cannot just use ANTLR3_FREE because in debug tracking mode, this is a macro.
 */
static	void ANTLR3_CDECL freeScope(void * scope)
{
    ANTLR3_FREE(scope);
}

/** \brief Name of the grammar file that generated this code
 */
static const char fileName[] = "/home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g";

/** \brief Return the name of the grammar file that generated this code.
 */
static const char * getGrammarFileName()
{
	return fileName;
}
/** \brief Create a new fmlParser parser and return a context for it.
 *
 * \param[in] instream Pointer to an input stream interface.
 *
 * \return Pointer to new parser context upon success.
 */
ANTLR3_API pfmlParser
fmlParserNew   (pANTLR3_COMMON_TOKEN_STREAM instream)
{
	// See if we can create a new parser with the standard constructor
	//
	return fmlParserNewSSD(instream, NULL);
}

/** \brief Create a new fmlParser parser and return a context for it.
 *
 * \param[in] instream Pointer to an input stream interface.
 *
 * \return Pointer to new parser context upon success.
 */
ANTLR3_API pfmlParser
fmlParserNewSSD   (pANTLR3_COMMON_TOKEN_STREAM instream, pANTLR3_RECOGNIZER_SHARED_STATE state)
{
    pfmlParser ctx;	    /* Context structure we will build and return   */

    ctx	= (pfmlParser) ANTLR3_CALLOC(1, sizeof(fmlParser));

    if	(ctx == NULL)
    {
		// Failed to allocate memory for parser context
		//
        return  NULL;
    }

    /* -------------------------------------------------------------------
     * Memory for basic structure is allocated, now to fill in
     * the base ANTLR3 structures. We initialize the function pointers
     * for the standard ANTLR3 parser function set, but upon return
     * from here, the programmer may set the pointers to provide custom
     * implementations of each function.
     *
     * We don't use the macros defined in fmlParser.h here, in order that you can get a sense
     * of what goes where.
     */

    /* Create a base parser/recognizer, using the supplied token stream
     */
    ctx->pParser	    = antlr3ParserNewStream(ANTLR3_SIZE_HINT, instream->tstream, state);
    /* Install the implementation of our fmlParser interface
     */
    ctx->formalML	= formalML;
    ctx->prologue_fml	= prologue_fml;
    ctx->prologue_attribute	= prologue_attribute;
    ctx->prologue_options	= prologue_options;
    ctx->modifier_declaration	= modifier_declaration;
    ctx->modifier_direction	= modifier_direction;
    ctx->modifier_direction_text	= modifier_direction_text;
    ctx->modifier_set_direction_strict_text	= modifier_set_direction_strict_text;
    ctx->modifier_direction_symbol	= modifier_direction_symbol;
    ctx->modifier_param	= modifier_param;
    ctx->procedure_modifier_specifier	= procedure_modifier_specifier;
    ctx->executable_modifier_specifier	= executable_modifier_specifier;
    ctx->instance_modifier_specifier	= instance_modifier_specifier;
    ctx->modifier_transition	= modifier_transition;
    ctx->def_package	= def_package;
    ctx->def_system	= def_system;
    ctx->qualifiedNameID	= qualifiedNameID;
    ctx->integer_constant	= integer_constant;
    ctx->float_constant	= float_constant;
    ctx->section_header	= section_header;
    ctx->section_import	= section_import;
    ctx->include_package	= include_package;
    ctx->section_procedure	= section_procedure;
    ctx->def_procedure	= def_procedure;
    ctx->def_machine_parameters	= def_machine_parameters;
    ctx->def_machine_variable_parameter_atom	= def_machine_variable_parameter_atom;
    ctx->def_machine_returns	= def_machine_returns;
    ctx->def_machine_variable_return_atom	= def_machine_variable_return_atom;
    ctx->def_body_procedure	= def_body_procedure;
    ctx->def_body_procedure_section	= def_body_procedure_section;
    ctx->def_body_procedure_simplif	= def_body_procedure_simplif;
    ctx->section_composite_structure	= section_composite_structure;
    ctx->section_composite_generic	= section_composite_generic;
    ctx->section_machine_model	= section_machine_model;
    ctx->section_machine_prototype	= section_machine_prototype;
    ctx->section_machine_instance	= section_machine_instance;
    ctx->executable_machine	= executable_machine;
    ctx->executable_model_definiton	= executable_model_definiton;
    ctx->executable_instance_definiton	= executable_instance_definiton;
    ctx->decl_instance	= decl_instance;
    ctx->def_instance_on_new_activity	= def_instance_on_new_activity;
    ctx->def_instance_on_new_activity_parameter	= def_instance_on_new_activity_parameter;
    ctx->op_assign_param	= op_assign_param;
    ctx->def_instance_activity	= def_instance_activity;
    ctx->section_behavior	= section_behavior;
    ctx->def_instance_count	= def_instance_count;
    ctx->def_instance_count_atom	= def_instance_count_atom;
    ctx->def_machine	= def_machine;
    ctx->def_body_machine_using_section_header_predicat	= def_body_machine_using_section_header_predicat;
    ctx->def_body_machine_using_section_import_predicat	= def_body_machine_using_section_import_predicat;
    ctx->def_body_machine_using_section_parameter_predicat	= def_body_machine_using_section_parameter_predicat;
    ctx->def_body_machine_using_section_property_predicat	= def_body_machine_using_section_property_predicat;
    ctx->def_body_machine_using_section_predicat	= def_body_machine_using_section_predicat;
    ctx->def_body_machine	= def_body_machine;
    ctx->def_body_machine_section	= def_body_machine_section;
    ctx->def_body_machine_simplif	= def_body_machine_simplif;
    ctx->any_def_statemachine	= any_def_statemachine;
    ctx->def_statemachine	= def_statemachine;
    ctx->def_body_statemachine	= def_body_statemachine;
    ctx->section_region	= section_region;
    ctx->section_statemachine	= section_statemachine;
    ctx->def_state	= def_state;
    ctx->state_kw_id	= state_kw_id;
    ctx->state_id	= state_id;
    ctx->def_state_singleton	= def_state_singleton;
    ctx->executable_specifier	= executable_specifier;
    ctx->executable_specifier_atom	= executable_specifier_atom;
    ctx->instance_machine_model	= instance_machine_model;
    ctx->def_body_state	= def_body_state;
    ctx->def_body_state_section	= def_body_state_section;
    ctx->def_body_state_simplif	= def_body_state_simplif;
    ctx->section_transition	= section_transition;
    ctx->def_transition	= def_transition;
    ctx->kind_transition	= kind_transition;
    ctx->moc_transition_attribute	= moc_transition_attribute;
    ctx->moc_transition	= moc_transition;
    ctx->moc_transition_atom	= moc_transition_atom;
    ctx->moe_transition	= moe_transition;
    ctx->transition_statement	= transition_statement;
    ctx->transition_trigger	= transition_trigger;
    ctx->transition_guard	= transition_guard;
    ctx->transition_timed_guard	= transition_timed_guard;
    ctx->transition_effect	= transition_effect;
    ctx->target_state_id	= target_state_id;
    ctx->target_state_kw_id	= target_state_kw_id;
    ctx->def_state_activity	= def_state_activity;
    ctx->section_header_import_parameter_property	= section_header_import_parameter_property;
    ctx->section_parameter	= section_parameter;
    ctx->section_property	= section_property;
    ctx->section_property_free_declaration	= section_property_free_declaration;
    ctx->property_declaration	= property_declaration;
    ctx->decl_property_element	= decl_property_element;
    ctx->labelled_argument	= labelled_argument;
    ctx->decl_instance_machine_params	= decl_instance_machine_params;
    ctx->decl_instance_machine_returns	= decl_instance_machine_returns;
    ctx->activity_machine_param_return	= activity_machine_param_return;
    ctx->decl_port	= decl_port;
    ctx->decl_port_impl	= decl_port_impl;
    ctx->decl_signal	= decl_signal;
    ctx->decl_signal_impl	= decl_signal_impl;
    ctx->type_param_com	= type_param_com;
    ctx->param_com_atom	= param_com_atom;
    ctx->decl_buffer	= decl_buffer;
    ctx->decl_buffer_impl	= decl_buffer_impl;
    ctx->def_buffer	= def_buffer;
    ctx->policy_buffer	= policy_buffer;
    ctx->ref_buffer	= ref_buffer;
    ctx->initial_buffer_contents	= initial_buffer_contents;
    ctx->decl_channel	= decl_channel;
    ctx->decl_channel_port	= decl_channel_port;
    ctx->decl_channel_var	= decl_channel_var;
    ctx->decl_variable	= decl_variable;
    ctx->decl_variable_time_clock_impl	= decl_variable_time_clock_impl;
    ctx->decl_variable_impl	= decl_variable_impl;
    ctx->decl_variable_atom_impl	= decl_variable_atom_impl;
    ctx->decl_typed_variable_atom_impl	= decl_typed_variable_atom_impl;
    ctx->initial_value	= initial_value;
    ctx->type_var	= type_var;
    ctx->def_type_array	= def_type_array;
    ctx->def_type_array_size	= def_type_array_size;
    ctx->def_type_container	= def_type_container;
    ctx->specifier_buffer	= specifier_buffer;
    ctx->def_type_interval	= def_type_interval;
    ctx->base_type_var	= base_type_var;
    ctx->primitive_type	= primitive_type;
    ctx->bit_field_size	= bit_field_size;
    ctx->string_field_size	= string_field_size;
    ctx->range_constant	= range_constant;
    ctx->on_write_var_routine_def	= on_write_var_routine_def;
    ctx->var_routine_def	= var_routine_def;
    ctx->routine_single_param	= routine_single_param;
    ctx->def_enum	= def_enum;
    ctx->def_enum_impl	= def_enum_impl;
    ctx->def_struct	= def_struct;
    ctx->def_class_structure_impl	= def_class_structure_impl;
    ctx->def_choice	= def_choice;
    ctx->def_choice_impl	= def_choice_impl;
    ctx->def_union	= def_union;
    ctx->def_union_impl	= def_union_impl;
    ctx->def_method	= def_method;
    ctx->decl_parameters	= decl_parameters;
    ctx->def_type	= def_type;
    ctx->def_type_impl	= def_type_impl;
    ctx->def_type_atom_impl	= def_type_atom_impl;
    ctx->def_typedef_constraint	= def_typedef_constraint;
    ctx->time_type	= time_type;
    ctx->time_clock_type	= time_clock_type;
    ctx->time_type_domain	= time_type_domain;
    ctx->section_model_of_computation	= section_model_of_computation;
    ctx->section_routine	= section_routine;
    ctx->def_routine_model	= def_routine_model;
    ctx->def_routine_model_impl	= def_routine_model_impl;
    ctx->def_routine_parameters	= def_routine_parameters;
    ctx->def_routine_param_atom	= def_routine_param_atom;
    ctx->def_routine_returns	= def_routine_returns;
    ctx->def_routine_returns_atom	= def_routine_returns_atom;
    ctx->section_model_of_execution	= section_model_of_execution;
    ctx->def_moe_primitive	= def_moe_primitive;
    ctx->def_routine_seq	= def_routine_seq;
    ctx->section_model_of_interaction	= section_model_of_interaction;
    ctx->com_protocol	= com_protocol;
    ctx->com_cast	= com_cast;
    ctx->buffer_com	= buffer_com;
    ctx->com_connect	= com_connect;
    ctx->com_route	= com_route;
    ctx->com_port	= com_port;
    ctx->com_port_id	= com_port_id;
    ctx->statement	= statement;
    ctx->block_statement	= block_statement;
    ctx->op_block	= op_block;
    ctx->op_sequence	= op_sequence;
    ctx->op_scheduling	= op_scheduling;
    ctx->op_concurrency	= op_concurrency;
    ctx->op_invokable	= op_invokable;
    ctx->prefix_statement	= prefix_statement;
    ctx->prefix_expression	= prefix_expression;
    ctx->avm_operator	= avm_operator;
    ctx->statement_invoke_method	= statement_invoke_method;
    ctx->statement_invoke	= statement_invoke;
    ctx->expression_invoke	= expression_invoke;
    ctx->statement_activity_new	= statement_activity_new;
    ctx->decl_instance_dynamic_impl	= decl_instance_dynamic_impl;
    ctx->expression_activity_new	= expression_activity_new;
    ctx->statement_prompt	= statement_prompt;
    ctx->statement_prompt_impl	= statement_prompt_impl;
    ctx->statement_prompt_obs	= statement_prompt_obs;
    ctx->statement_prompt_obs_com	= statement_prompt_obs_com;
    ctx->meta_statement	= meta_statement;
    ctx->statement_assign	= statement_assign;
    ctx->lvalue	= lvalue;
    ctx->parameters	= parameters;
    ctx->statement_com	= statement_com;
    ctx->statement_com_input	= statement_com_input;
    ctx->statement_com_output	= statement_com_output;
    ctx->parameters_port	= parameters_port;
    ctx->expression_com	= expression_com;
    ctx->statement_constraint	= statement_constraint;
    ctx->statement_guard	= statement_guard;
    ctx->statement_timed_guard	= statement_timed_guard;
    ctx->statement_checksat	= statement_checksat;
    ctx->expression_guard	= expression_guard;
    ctx->statement_ite	= statement_ite;
    ctx->expression_ite	= expression_ite;
    ctx->statement_iteration	= statement_iteration;
    ctx->for_assign_header	= for_assign_header;
    ctx->statement_jump	= statement_jump;
    ctx->expression_lambda	= expression_lambda;
    ctx->expression_status	= expression_status;
    ctx->op_activity	= op_activity;
    ctx->statement_activity	= statement_activity;
    ctx->statement_init_flow	= statement_init_flow;
    ctx->statement_invoke_routine	= statement_invoke_routine;
    ctx->invoke_routine_params	= invoke_routine_params;
    ctx->invoke_routine_returns	= invoke_routine_returns;
    ctx->statement_moc	= statement_moc;
    ctx->expression	= expression;
    ctx->conditionalExpression	= conditionalExpression;
    ctx->scheduleExpression	= scheduleExpression;
    ctx->conditionalOrExpression	= conditionalOrExpression;
    ctx->conditionalAndExpression	= conditionalAndExpression;
    ctx->bitwiseOrExpression	= bitwiseOrExpression;
    ctx->bitwiseXorExpression	= bitwiseXorExpression;
    ctx->bitwiseAndExpression	= bitwiseAndExpression;
    ctx->equalityExpression	= equalityExpression;
    ctx->equalOp	= equalOp;
    ctx->relationalExpression	= relationalExpression;
    ctx->relationalOp	= relationalOp;
    ctx->shiftExpression	= shiftExpression;
    ctx->shiftOp	= shiftOp;
    ctx->additiveExpression	= additiveExpression;
    ctx->multiplicativeExpression	= multiplicativeExpression;
    ctx->unaryExpression	= unaryExpression;
    ctx->ctorExpression	= ctorExpression;
    ctx->quote_expression	= quote_expression;
    ctx->meta_eval_expression	= meta_eval_expression;
    ctx->primary	= primary;
    ctx->primary_ufid	= primary_ufid;
    ctx->primary_ufi	= primary_ufi;
    ctx->primary_invoke	= primary_invoke;
    ctx->literal	= literal;
    ctx->collection_of_expression	= collection_of_expression;
    ctx->synpred21_fml	= synpred21_fml;
    ctx->synpred56_fml	= synpred56_fml;
    ctx->synpred57_fml	= synpred57_fml;
    ctx->synpred58_fml	= synpred58_fml;
    ctx->synpred59_fml	= synpred59_fml;
    ctx->synpred60_fml	= synpred60_fml;
    ctx->synpred61_fml	= synpred61_fml;
    ctx->synpred62_fml	= synpred62_fml;
    ctx->synpred95_fml	= synpred95_fml;
    ctx->synpred115_fml	= synpred115_fml;
    ctx->synpred126_fml	= synpred126_fml;
    ctx->synpred127_fml	= synpred127_fml;
    ctx->synpred138_fml	= synpred138_fml;
    ctx->synpred153_fml	= synpred153_fml;
    ctx->synpred170_fml	= synpred170_fml;
    ctx->synpred296_fml	= synpred296_fml;
    ctx->synpred304_fml	= synpred304_fml;
    ctx->synpred324_fml	= synpred324_fml;
    ctx->synpred326_fml	= synpred326_fml;
    ctx->synpred329_fml	= synpred329_fml;
    ctx->synpred340_fml	= synpred340_fml;
    ctx->synpred341_fml	= synpred341_fml;
    ctx->synpred343_fml	= synpred343_fml;
    ctx->synpred344_fml	= synpred344_fml;
    ctx->synpred366_fml	= synpred366_fml;
    ctx->synpred370_fml	= synpred370_fml;
    ctx->synpred373_fml	= synpred373_fml;
    ctx->synpred375_fml	= synpred375_fml;
    ctx->synpred407_fml	= synpred407_fml;
    ctx->synpred412_fml	= synpred412_fml;
    ctx->synpred417_fml	= synpred417_fml;
    ctx->synpred419_fml	= synpred419_fml;
    ctx->synpred426_fml	= synpred426_fml;
    ctx->synpred431_fml	= synpred431_fml;
    ctx->synpred438_fml	= synpred438_fml;
    ctx->synpred446_fml	= synpred446_fml;
    ctx->synpred493_fml	= synpred493_fml;
    ctx->synpred514_fml	= synpred514_fml;
    ctx->synpred517_fml	= synpred517_fml;
    ctx->synpred520_fml	= synpred520_fml;
    ctx->synpred531_fml	= synpred531_fml;
    ctx->synpred535_fml	= synpred535_fml;
    ctx->synpred537_fml	= synpred537_fml;
    ctx->synpred539_fml	= synpred539_fml;
    ctx->synpred555_fml	= synpred555_fml;
    ctx->synpred559_fml	= synpred559_fml;
    ctx->synpred574_fml	= synpred574_fml;
    ctx->synpred609_fml	= synpred609_fml;
    ctx->synpred636_fml	= synpred636_fml;
    ctx->synpred643_fml	= synpred643_fml;
    ctx->synpred705_fml	= synpred705_fml;
    ctx->synpred709_fml	= synpred709_fml;
    ctx->synpred714_fml	= synpred714_fml;
    ctx->synpred778_fml	= synpred778_fml;
    ctx->synpred779_fml	= synpred779_fml;
    ctx->synpred780_fml	= synpred780_fml;
    ctx->synpred781_fml	= synpred781_fml;
    ctx->synpred802_fml	= synpred802_fml;
    ctx->synpred804_fml	= synpred804_fml;
    ctx->synpred861_fml	= synpred861_fml;
    ctx->synpred872_fml	= synpred872_fml;
    ctx->synpred891_fml	= synpred891_fml;
    ctx->synpred894_fml	= synpred894_fml;
    ctx->synpred896_fml	= synpred896_fml;
    ctx->synpred897_fml	= synpred897_fml;
    ctx->synpred898_fml	= synpred898_fml;
    ctx->synpred946_fml	= synpred946_fml;
    ctx->synpred947_fml	= synpred947_fml;
    ctx->synpred948_fml	= synpred948_fml;
    ctx->synpred949_fml	= synpred949_fml;
    ctx->synpred950_fml	= synpred950_fml;
    ctx->synpred951_fml	= synpred951_fml;
    ctx->synpred952_fml	= synpred952_fml;
    ctx->synpred953_fml	= synpred953_fml;
    ctx->synpred954_fml	= synpred954_fml;
    ctx->synpred955_fml	= synpred955_fml;
    ctx->synpred956_fml	= synpred956_fml;
    ctx->synpred957_fml	= synpred957_fml;
    ctx->synpred958_fml	= synpred958_fml;
    ctx->synpred959_fml	= synpred959_fml;
    ctx->synpred960_fml	= synpred960_fml;
    ctx->synpred961_fml	= synpred961_fml;
    ctx->synpred962_fml	= synpred962_fml;
    ctx->synpred963_fml	= synpred963_fml;
    ctx->synpred964_fml	= synpred964_fml;
    ctx->synpred965_fml	= synpred965_fml;
    ctx->synpred966_fml	= synpred966_fml;
    ctx->synpred967_fml	= synpred967_fml;
    ctx->synpred968_fml	= synpred968_fml;
    ctx->synpred969_fml	= synpred969_fml;
    ctx->synpred970_fml	= synpred970_fml;
    ctx->synpred971_fml	= synpred971_fml;
    ctx->synpred972_fml	= synpred972_fml;
    ctx->synpred973_fml	= synpred973_fml;
    ctx->synpred974_fml	= synpred974_fml;
    ctx->synpred975_fml	= synpred975_fml;
    ctx->synpred976_fml	= synpred976_fml;
    ctx->synpred977_fml	= synpred977_fml;
    ctx->synpred980_fml	= synpred980_fml;
    ctx->synpred981_fml	= synpred981_fml;
    ctx->synpred982_fml	= synpred982_fml;
    ctx->synpred983_fml	= synpred983_fml;
    ctx->synpred984_fml	= synpred984_fml;
    ctx->synpred985_fml	= synpred985_fml;
    ctx->synpred986_fml	= synpred986_fml;
    ctx->synpred987_fml	= synpred987_fml;
    ctx->synpred991_fml	= synpred991_fml;
    ctx->synpred992_fml	= synpred992_fml;
    ctx->synpred997_fml	= synpred997_fml;
    ctx->synpred1000_fml	= synpred1000_fml;
    ctx->synpred1003_fml	= synpred1003_fml;
    ctx->synpred1020_fml	= synpred1020_fml;
    ctx->synpred1021_fml	= synpred1021_fml;
    ctx->synpred1027_fml	= synpred1027_fml;
    ctx->synpred1029_fml	= synpred1029_fml;
    ctx->synpred1030_fml	= synpred1030_fml;
    ctx->synpred1033_fml	= synpred1033_fml;
    ctx->synpred1035_fml	= synpred1035_fml;
    ctx->free			= fmlParserFree;
    ctx->reset			= fmlParserReset;
    ctx->getGrammarFileName	= getGrammarFileName;

    /* Install the scope pushing methods.
     */

    /* Create a LIST for recording rule memos.
     */
     RULEMEMO    = antlr3IntTrieNew(15);	/* 16 bit depth is enough for 32768 rules! */

    /* Install the token table
     */
    PSRSTATE->tokenNames   = fmlParserTokenNames;


    /* Return the newly built parser to the caller
     */
    return  ctx;
}

static void
fmlParserReset (pfmlParser ctx)
{
    RECOGNIZER->reset(RECOGNIZER);
}

/** Free the parser resources
 */
 static void
 fmlParserFree(pfmlParser ctx)
 {
    /* Free any scope memory
     */

	if	(RULEMEMO != NULL)
	{
		RULEMEMO->free(RULEMEMO);
		RULEMEMO = NULL;
	}
	// Free this parser
	//
    ctx->pParser->free(ctx->pParser);


    ANTLR3_FREE(ctx);

    /* Everything is released, so we can return
     */
    return;
 }

/** Return token names used by this 
parser

 *
 * The returned pointer is used as an index into the token names table (using the token
 * number as the index).
 *
 * \return Pointer to first char * in the table.
 */
static pANTLR3_UINT8    *getTokenNames()
{
        return fmlParserTokenNames;
}



    // extern "C" and C++ Template incompatibility !!!
    #include <fml/infrastructure/PropertyPart.h>


    ////////////////////////////////////////////////////////////////////////////////
    // SET LOCATION IN TRACEABLE FORM
    ////////////////////////////////////////////////////////////////////////////////

    #define SAVE_RULE_BEGIN_LOCATION  sep::avm_size_t bLine = LT(1)->getLine(LT(1))

    #define SET_RULE_LOCATION(form)   \
    		sep::ParserUtil::setLocation(form, bLine, LT(-1)->getLine(LT(-1)))



    ////////////////////////////////////////////////////////////////////////////////
    // XLIA or XFSP MACRO
    ////////////////////////////////////////////////////////////////////////////////

    #define OP(op)            sep::OperatorManager::OPERATOR_##op

    #define NEW_EXPR(e)       sep::ExpressionConstructor::newExpr(e)

    #define NEW_BOOL(b)       sep::ExpressionConstructor::newBoolean((bool) b)
    #define NEW_INTEGER(i)    sep::ExpressionConstructor::newInteger(i)
    #define NEW_RATIONAL(q)   sep::ExpressionConstructor::newRational(q)
    #define NEW_FLOAT(f)      sep::ExpressionConstructor::newFloat(f)
    #define NEW_CHAR(c)       sep::ExpressionConstructor::newChar(c)
    #define NEW_STRING(s)     sep::ExpressionConstructor::newString(s)

    #define NEW_ID(id)        sep::ExpressionConstructor::newIdentifier(id)
    #define NEW_QID(id)       sep::ExpressionConstructor::newQualifiedIdentifier(id)
    #define NEW_QNID(id, nb)  ( (nb > 1)? NEW_QID(id) : NEW_ID(id) )


    #define NEW_INSTANCE_UFID(machine, var)  \
    		sep::ExpressionConstructor::newQualifiedIdentifier(  \
    			sep::OSS() << machine->getNameID() << '.' << var->getNameID() )


    #define NEW_CODE(op)               sep::ExpressionConstructor::newCode(op)
    #define NEW_CODE1(op, e)           sep::ExpressionConstructor::newCode(op, e)
    #define NEW_CODE2(op, e1, e2)      sep::ExpressionConstructor::newCode(op, e1, e2)
    #define NEW_CODE3(op, e1, e2, e3)  sep::ExpressionConstructor::newCode(op, e1, e2, e3)

    #define NEW_CODE_FLAT(op, e1, e2)  sep::ExpressionConstructor::newCodeFlat(op, e1, e2)

    #define NEW_STMT(op)               sep::StatementConstructor::newCode(op)
    #define NEW_STMT1(op, s)           sep::StatementConstructor::newCode(op, s)
    #define NEW_STMT2(op, s1, s2)      sep::StatementConstructor::newCode(op, s1, s2)
    #define NEW_STMT3(op, s1, s2, s3)  sep::StatementConstructor::newCode(op, s1, s2, s3)


    #define NEW_STMT_ASSIGN_OP(op, lv, e)  \
    					NEW_STMT2(OP(ASSIGN_OP), lv, NEW_CODE1(op, e))

    #define NEW_STMT_ASSIGN_OP_AFTER(op, lv, e)  \
    					NEW_STMT2(OP(ASSIGN_OP_AFTER), lv, NEW_CODE1(op, e))


    #define  NUM_INT(s)    std::atoi((const char*)(s))
    #define  NUM_FLOAT(s)  std::atof((const char*)(s))

    #define  CHAR(s)      ( *((const char*)(s)) )

    #define  STR(s)       std::string((const char*)(s))

    #define  STR_ID(s)    std::string((const char*)((s->getText(s))->chars))


    sep::BF new_uminus_expr(sep::BF & arg)
    {
    	if( arg.isNumeric() )
    	{
    		return( sep::ExpressionConstructor::uminusExpr(arg) );
    	}
    	return( NEW_CODE1(OP(UMINUS), arg) );
    }

    sep::BF new_not_expr(sep::BF & arg)
    {
    	if( arg.isBoolean() )
    	{
    		return( sep::ExpressionConstructor::notExpr(arg) );
    	}
    	return( NEW_CODE1(OP(NOT), arg) );
    }


    ////////////////////////////////////////////////////////////////////////////////
    // PARSER GLOBAL VARIABLE
    ////////////////////////////////////////////////////////////////////////////////

    // WObject Manager
    sep::WObjectManager * mWObjectManager = NULL;

    // Current Diversity prologue specification
    sep::WObject * DIVERITY_PROLOG = sep::WObject::_NULL_;


    // Current Parse System
    static sep::System * _SYSTEM_ = NULL;

    // Current Parse Machine
    static sep::Machine * _CPM_ = NULL;

    #define PUSH_CTX_CPM( cpm )   sep::ParserUtil::pushCTX( _CPM_ = cpm )

    #define PUSH_CTX_NEW( cpm )   sep::ParserUtil::pushDynamicCTX( _CPM_ = cpm )


    // Current Parse Routine
    static sep::Routine * _CPR_ = NULL;

    #define PUSH_CTX_CPR( cpr )   sep::ParserUtil::pushCTX( _CPR_ = cpr )

    // Pop old local parse context & update current machine & routine
    #define POP_CTX               sep::ParserUtil::popCTX( _CPM_ , _CPR_ )

    #define POP_CTX_IF( cpm )   \
    		if( _CPM_ == cpm ) { sep::ParserUtil::popCTX( _CPM_ , _CPR_ ); }

    // Current Parse Routine | Machine | System
    #define _CPRMS_  ( ( _CPR_ != NULL )  \
    		? static_cast< sep::BehavioralElement * >(_CPR_)  \
    		: ( ( _CPM_ != NULL )  \
    				? static_cast< sep::BehavioralElement * >(_CPM_)  \
    				: static_cast< sep::BehavioralElement * >(_SYSTEM_) ) )


    // Current Parse [ [ Fully ] Qualified ] Name ID
    std::string cpLOCATOR;
    std::vector< std::string > cpQNID;


    ////////////////////////////////////////////////////////////////////////////////
    // DEFAULT STATE  #final, #terminal, #return
    ////////////////////////////////////////////////////////////////////////////////

    static sep::ListOfMachine needDefaultStateFinal;

    static sep::ListOfMachine needDefaultStateTerminal;

    static sep::ListOfMachine needDefaultStateReturn;


    ////////////////////////////////////////////////////////////////////////////////
    // TRANSITION ID
    ////////////////////////////////////////////////////////////////////////////////

    static sep::avm_size_t transition_id = 0;

    static void resetTransitionID()
    {
    	transition_id = 0;
    }

    static std::string newTransitionID(
    		const std::string & id, const std::string & prefix = "t")
    {
    	return( id.empty() ?
    			(sep::OSS() << prefix << '#' << transition_id++).str() : id );
    }


    static int mInvokeNewInstanceCount = 0;

    static std::string newInvokeNewInstanceNameID(
    		sep::Machine * container, const std::string modelNameID)
    {
    	return( sep::OSS() << modelNameID << '#' << mInvokeNewInstanceCount++ );
    }



    static int mProcedureCallCount = 0;



    ////////////////////////////////////////////////////////////////////////////////
    // CONNECT ID
    ////////////////////////////////////////////////////////////////////////////////

    static sep::avm_size_t buffer_id = 0;

    static void resetBufferID()
    {
    	buffer_id = 0;
    }

    static std::string newBufferID(const std::string & prefix = sep::Buffer::ANONYM_ID)
    {
    	return( sep::OSS() << prefix << '#' << buffer_id++ );
    }


    ////////////////////////////////////////////////////////////////////////////////
    // CONNECT ID
    ////////////////////////////////////////////////////////////////////////////////

    static sep::avm_size_t connector_id = 0;

    static void resetConnectID()
    {
    	connector_id = 0;
    }

    static std::string newConnectID(const std::string & id,
    		const std::string & prefix = sep::Connector::ANONYM_ID)
    {
    	return( id.empty() ?
    			(sep::OSS() << prefix << '#' << connector_id++).str() : id );
    }


    ////////////////////////////////////////////////////////////////////////////////
    // PARSER MACRO FOR SEMANTIC PREDICATE FOR KEYWORD DETECTION
    ////////////////////////////////////////////////////////////////////////////////

    #define IS_KEYWORD(kw)   \
    	( (STR(LT(1)->getText(LT(1))->chars) == kw)? ANTLR3_TRUE : ANTLR3_FALSE )



    void fmlDisplayRecognitionError(
    		pANTLR3_BASE_RECOGNIZER recognizer, pANTLR3_UINT8 * tokenNames)
    {
    	pANTLR3_PARSER			parser;
    	pANTLR3_TREE_PARSER	    tparser;
    	pANTLR3_INT_STREAM	    is;
    	pANTLR3_STRING			ttext;
    	pANTLR3_STRING			ftext;
    	pANTLR3_EXCEPTION	    ex;
    	pANTLR3_COMMON_TOKEN    theToken;
    	pANTLR3_BASE_TREE	    theBaseTree;
    	pANTLR3_COMMON_TREE	    theCommonTree;

    	// Retrieve some info for easy reading.
    	//
    	ex	    =		recognizer->state->exception;
    	ttext   =		NULL;

    	// See if there is a 'filename' we can use
    	//
    	if	(ex->streamName == NULL)
    	{
    		if	(((pANTLR3_COMMON_TOKEN)(ex->token))->type == ANTLR3_TOKEN_EOF)
    		{
    			ANTLR3_FPRINTF(stderr, "-end of input-(");
    		}
    		else
    		{
    			ANTLR3_FPRINTF(stderr, "-unknown source-(");
    		}
    	}
    	else
    	{
    		ftext = ex->streamName->to8(ex->streamName);
    		ANTLR3_FPRINTF(stderr, "%s(", ftext->chars);
    	}

    	// Next comes the line number
    	//

    	ANTLR3_FPRINTF(stderr, "%d) ", recognizer->state->exception->line);
    	ANTLR3_FPRINTF(stderr, " : error %d : %s",
    										recognizer->state->exception->type,
    					(pANTLR3_UINT8)	   (recognizer->state->exception->message));


    	// How we determine the next piece is dependent on which thing raised the
    	// error.
    	//
    	switch	(recognizer->type)
    	{
    	case	ANTLR3_TYPE_PARSER:

    		// Prepare the knowledge we know we have
    		//
    		parser	    = (pANTLR3_PARSER) (recognizer->super);
    		tparser	    = NULL;
    		is			= parser->tstream->istream;
    		theToken    = (pANTLR3_COMMON_TOKEN)(recognizer->state->exception->token);
    		ttext	    = theToken->toString(theToken);

    		ANTLR3_FPRINTF(stderr, ", at offset %d", recognizer->state->exception->charPositionInLine);
    		if  (theToken != NULL)
    		{
    			if (theToken->type == ANTLR3_TOKEN_EOF)
    			{
    				ANTLR3_FPRINTF(stderr, ", at <EOF>");
    			}
    			else
    			{
    				// Guard against null text in a token
    				//
    				ANTLR3_FPRINTF(stderr, "\n    NEAR %s\n    ", ttext == NULL ? (pANTLR3_UINT8)"<no text for the token>" : ttext->chars);
    			}
    		}
    		break;

    	case	ANTLR3_TYPE_TREE_PARSER:

    		tparser		= (pANTLR3_TREE_PARSER) (recognizer->super);
    		parser		= NULL;
    		is			= tparser->ctnstream->tnstream->istream;
    		theBaseTree	= (pANTLR3_BASE_TREE)(recognizer->state->exception->token);
    		ttext		= theBaseTree->toStringTree(theBaseTree);

    		if  (theBaseTree != NULL)
    		{
    			theCommonTree	= (pANTLR3_COMMON_TREE)	    theBaseTree->super;

    			if	(theCommonTree != NULL)
    			{
    				theToken	= (pANTLR3_COMMON_TOKEN)    theBaseTree->getToken(theBaseTree);
    			}
    			ANTLR3_FPRINTF(stderr, ", at offset %d", theBaseTree->getCharPositionInLine(theBaseTree));
    			ANTLR3_FPRINTF(stderr, ", near %s", ttext->chars);
    		}
    		break;

    	default:

    		ANTLR3_FPRINTF(stderr, "Base recognizer function displayRecognitionError called by unknown parser type - provide override for this function\n");
    		return;
    		break;
    	}

    	// Although this function should generally be provided by the implementation, this one
    	// should be as helpful as possible for grammar developers and serve as an example
    	// of what you can do with each exception type. In general, when you make up your
    	// 'real' handler, you should debug the routine with all possible errors you expect
    	// which will then let you be as specific as possible about all circumstances.
    	//
    	// Note that in the general case, errors thrown by tree parsers indicate a problem
    	// with the output of the parser or with the tree grammar itself. The job of the parser
    	// is to produce a perfect (in traversal terms) syntactically correct tree, so errors
    	// at that stage should really be semantic errors that your own code determines and handles
    	// in whatever way is appropriate.
    	//
    	switch  (ex->type)
    	{
    	case	ANTLR3_UNWANTED_TOKEN_EXCEPTION:

    		// Indicates that the recognizer was fed a token which seesm to be
    		// spurious input. We can detect this when the token that follows
    		// this unwanted token would normally be part of the syntactically
    		// correct stream. Then we can see that the token we are looking at
    		// is just something that should not be there and throw this exception.
    		//
    		if	(tokenNames == NULL)
    		{
    			ANTLR3_FPRINTF(stderr, " : Extraneous input...");
    		}
    		else
    		{
    			if	(ex->expecting == ANTLR3_TOKEN_EOF)
    			{
    				ANTLR3_FPRINTF(stderr, " : Extraneous input - expected <EOF>\n");
    			}
    			else
    			{
    				ANTLR3_FPRINTF(stderr, " : Extraneous input - expected %s ...\n", tokenNames[ex->expecting]);
    			}
    		}
    		break;

    	case	ANTLR3_MISSING_TOKEN_EXCEPTION:

    		// Indicates that the recognizer detected that the token we just
    		// hit would be valid syntactically if preceeded by a particular
    		// token. Perhaps a missing ';' at line end or a missing ',' in an
    		// expression list, and such like.
    		//
    		if	(tokenNames == NULL)
    		{
    			ANTLR3_FPRINTF(stderr, " : Missing token (%d)...\n", ex->expecting);
    		}
    		else
    		{
    			if	(ex->expecting == ANTLR3_TOKEN_EOF)
    			{
    				ANTLR3_FPRINTF(stderr, " : Missing <EOF>\n");
    			}
    			else
    			{
    				ANTLR3_FPRINTF(stderr, " : Missing %s \n", tokenNames[ex->expecting]);
    			}
    		}
    		break;

    	case	ANTLR3_RECOGNITION_EXCEPTION:

    		// Indicates that the recognizer received a token
    		// in the input that was not predicted. This is the basic exception type
    		// from which all others are derived. So we assume it was a syntax error.
    		// You may get this if there are not more tokens and more are needed
    		// to complete a parse for instance.
    		//
    		ANTLR3_FPRINTF(stderr, " : syntax error...\n");
    		break;

    	case    ANTLR3_MISMATCHED_TOKEN_EXCEPTION:

    		// We were expecting to see one thing and got another. This is the
    		// most common error if we coudl not detect a missing or unwanted token.
    		// Here you can spend your efforts to
    		// derive more useful error messages based on the expected
    		// token set and the last token and so on. The error following
    		// bitmaps do a good job of reducing the set that we were looking
    		// for down to something small. Knowing what you are parsing may be
    		// able to allow you to be even more specific about an error.
    		//
    		if	(tokenNames == NULL)
    		{
    			ANTLR3_FPRINTF(stderr, " : syntax error...\n");
    		}
    		else
    		{
    			if	(ex->expecting == ANTLR3_TOKEN_EOF)
    			{
    				ANTLR3_FPRINTF(stderr, " : expected <EOF>\n");
    			}
    			else
    			{
    				ANTLR3_FPRINTF(stderr, " : expected %s ...\n", tokenNames[ex->expecting]);
    			}
    		}
    		break;

    	case	ANTLR3_NO_VIABLE_ALT_EXCEPTION:

    		// We could not pick any alt decision from the input given
    		// so god knows what happened - however when you examine your grammar,
    		// you should. It means that at the point where the current token occurred
    		// that the DFA indicates nowhere to go from here.
    		//
    		ANTLR3_FPRINTF(stderr, " : cannot match to any predicted input...\n");

    		break;

    	case	ANTLR3_MISMATCHED_SET_EXCEPTION:

    		{
    			ANTLR3_UINT32	  count;
    			ANTLR3_UINT32	  bit;
    			ANTLR3_UINT32	  size;
    			ANTLR3_UINT32	  numbits;
    			pANTLR3_BITSET	  errBits;

    			// This means we were able to deal with one of a set of
    			// possible tokens at this point, but we did not see any
    			// member of that set.
    			//
    			ANTLR3_FPRINTF(stderr, " : unexpected input...\n  expected one of : ");

    			// What tokens could we have accepted at this point in the
    			// parse?
    			//
    			count   = 0;
    			errBits = antlr3BitsetLoad		(ex->expectingSet);
    			numbits = errBits->numBits		(errBits);
    			size    = errBits->size			(errBits);

    			if  (size > 0)
    			{
    				// However many tokens we could have dealt with here, it is usually
    				// not useful to print ALL of the set here. I arbitrarily chose 8
    				// here, but you should do whatever makes sense for you of course.
    				// No token number 0, so look for bit 1 and on.
    				//
    				for	(bit = 1; bit < numbits && count < 8 && count < size; bit++)
    				{
    					// TODO: This doesn;t look right - should be asking if the bit is set!!
    					//
    					if  (tokenNames[bit])
    					{
    						ANTLR3_FPRINTF(stderr, "%s%s", count > 0 ? ", " : "", tokenNames[bit]);
    						count++;
    					}
    				}
    				ANTLR3_FPRINTF(stderr, "\n");
    			}
    			else
    			{
    				ANTLR3_FPRINTF(stderr, "Actually dude, we didn't seem to be expecting anything here, or at least\n");
    				ANTLR3_FPRINTF(stderr, "I could not work out what I was expecting, like so many of us these days!\n");
    			}
    		}
    		break;

    	case	ANTLR3_EARLY_EXIT_EXCEPTION:

    		// We entered a loop requiring a number of token sequences
    		// but found a token that ended that sequence earlier than
    		// we should have done.
    		//
    		ANTLR3_FPRINTF(stderr, " : missing elements...\n");
    		break;

    	default:

    		// We don't handle any other exceptions here, but you can
    		// if you wish. If we get an exception that hits this point
    		// then we are just going to report what we know about the
    		// token.
    		//
    		ANTLR3_FPRINTF(stderr, " : syntax not recognized...\n");
    		break;
    	}

    	// Here you have the token that was in error which if this is
    	// the standard implementation will tell you the line and offset
    	// and also record the address of the start of the line in the
    	// input stream. You could therefore print the source line and so on.
    	// Generally though, I would expect that your lexer/parser will keep
    	// its own map of lines and source pointers or whatever as there
    	// are a lot of specific things you need to know about the input
    	// to do something like that.
    	// Here is where you do it though :-).
    	//
    }




/* Declare the bitsets
 */
/** Bitset defining follow set for error recovery in rule state: FOLLOW_prologue_fml_in_formalML90  */
static	ANTLR3_BITWORD FOLLOW_prologue_fml_in_formalML90_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0404000000010000), ANTLR3_UINT64_LIT(0x0000000200000004), ANTLR3_UINT64_LIT(0x0000000000400240) };
static  ANTLR3_BITSET_LIST FOLLOW_prologue_fml_in_formalML90	= { FOLLOW_prologue_fml_in_formalML90_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_system_in_formalML99  */
static	ANTLR3_BITWORD FOLLOW_def_system_in_formalML99_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_system_in_formalML99	= { FOLLOW_def_system_in_formalML99_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_186_in_prologue_fml131  */
static	ANTLR3_BITWORD FOLLOW_186_in_prologue_fml131_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_186_in_prologue_fml131	= { FOLLOW_186_in_prologue_fml131_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_233_in_prologue_fml141  */
static	ANTLR3_BITWORD FOLLOW_233_in_prologue_fml141_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_233_in_prologue_fml141	= { FOLLOW_233_in_prologue_fml141_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_185_in_prologue_fml155  */
static	ANTLR3_BITWORD FOLLOW_185_in_prologue_fml155_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_185_in_prologue_fml155	= { FOLLOW_185_in_prologue_fml155_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_180_in_prologue_fml170  */
static	ANTLR3_BITWORD FOLLOW_180_in_prologue_fml170_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_180_in_prologue_fml170	= { FOLLOW_180_in_prologue_fml170_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_235_in_prologue_fml179  */
static	ANTLR3_BITWORD FOLLOW_235_in_prologue_fml179_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_235_in_prologue_fml179	= { FOLLOW_235_in_prologue_fml179_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_234_in_prologue_fml193  */
static	ANTLR3_BITWORD FOLLOW_234_in_prologue_fml193_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_234_in_prologue_fml193	= { FOLLOW_234_in_prologue_fml193_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LT__in_prologue_fml217  */
static	ANTLR3_BITWORD FOLLOW_LT__in_prologue_fml217_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000400000), ANTLR3_UINT64_LIT(0x0000000000000040) };
static  ANTLR3_BITSET_LIST FOLLOW_LT__in_prologue_fml217	= { FOLLOW_LT__in_prologue_fml217_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_390_in_prologue_fml226  */
static	ANTLR3_BITWORD FOLLOW_390_in_prologue_fml226_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000800010) };
static  ANTLR3_BITSET_LIST FOLLOW_390_in_prologue_fml226	= { FOLLOW_390_in_prologue_fml226_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_342_in_prologue_fml239  */
static	ANTLR3_BITWORD FOLLOW_342_in_prologue_fml239_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000800010) };
static  ANTLR3_BITSET_LIST FOLLOW_342_in_prologue_fml239	= { FOLLOW_342_in_prologue_fml239_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_prologue_fml253  */
static	ANTLR3_BITWORD FOLLOW_ID_in_prologue_fml253_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000800010) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_prologue_fml253	= { FOLLOW_ID_in_prologue_fml253_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ASSIGN_in_prologue_fml276  */
static	ANTLR3_BITWORD FOLLOW_ASSIGN_in_prologue_fml276_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_ASSIGN_in_prologue_fml276	= { FOLLOW_ASSIGN_in_prologue_fml276_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_prologue_fml280  */
static	ANTLR3_BITWORD FOLLOW_ID_in_prologue_fml280_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000800000) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_prologue_fml280	= { FOLLOW_ID_in_prologue_fml280_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_prologue_fml299  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_prologue_fml299_bits[]	= { ANTLR3_UINT64_LIT(0x0004080000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_prologue_fml299	= { FOLLOW_COMMA_in_prologue_fml299_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_prologue_fml301  */
static	ANTLR3_BITWORD FOLLOW_set_in_prologue_fml301_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000800000) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_prologue_fml301	= { FOLLOW_set_in_prologue_fml301_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_GT_in_prologue_fml321  */
static	ANTLR3_BITWORD FOLLOW_GT_in_prologue_fml321_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000200000) };
static  ANTLR3_BITSET_LIST FOLLOW_GT_in_prologue_fml321	= { FOLLOW_GT_in_prologue_fml321_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COLON_in_prologue_fml326  */
static	ANTLR3_BITWORD FOLLOW_COLON_in_prologue_fml326_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000002000014000) };
static  ANTLR3_BITSET_LIST FOLLOW_COLON_in_prologue_fml326	= { FOLLOW_COLON_in_prologue_fml326_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_prologue_attribute_in_prologue_fml333  */
static	ANTLR3_BITWORD FOLLOW_prologue_attribute_in_prologue_fml333_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000004000) };
static  ANTLR3_BITSET_LIST FOLLOW_prologue_attribute_in_prologue_fml333	= { FOLLOW_prologue_attribute_in_prologue_fml333_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_prologue_options_in_prologue_fml343  */
static	ANTLR3_BITWORD FOLLOW_prologue_options_in_prologue_fml343_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_prologue_options_in_prologue_fml343	= { FOLLOW_prologue_options_in_prologue_fml343_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_208_in_prologue_attribute358  */
static	ANTLR3_BITWORD FOLLOW_208_in_prologue_attribute358_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000010) };
static  ANTLR3_BITSET_LIST FOLLOW_208_in_prologue_attribute358	= { FOLLOW_208_in_prologue_attribute358_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ASSIGN_in_prologue_attribute361  */
static	ANTLR3_BITWORD FOLLOW_ASSIGN_in_prologue_attribute361_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_ASSIGN_in_prologue_attribute361	= { FOLLOW_ASSIGN_in_prologue_attribute361_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_prologue_attribute366  */
static	ANTLR3_BITWORD FOLLOW_ID_in_prologue_attribute366_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_prologue_attribute366	= { FOLLOW_ID_in_prologue_attribute366_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_prologue_attribute369  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_prologue_attribute369_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_prologue_attribute369	= { FOLLOW_SEMI_in_prologue_attribute369_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_229_in_prologue_attribute378  */
static	ANTLR3_BITWORD FOLLOW_229_in_prologue_attribute378_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000010) };
static  ANTLR3_BITSET_LIST FOLLOW_229_in_prologue_attribute378	= { FOLLOW_229_in_prologue_attribute378_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ASSIGN_in_prologue_attribute381  */
static	ANTLR3_BITWORD FOLLOW_ASSIGN_in_prologue_attribute381_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_ASSIGN_in_prologue_attribute381	= { FOLLOW_ASSIGN_in_prologue_attribute381_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_prologue_attribute386  */
static	ANTLR3_BITWORD FOLLOW_ID_in_prologue_attribute386_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_prologue_attribute386	= { FOLLOW_ID_in_prologue_attribute386_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_prologue_attribute389  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_prologue_attribute389_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_prologue_attribute389	= { FOLLOW_SEMI_in_prologue_attribute389_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_206_in_prologue_options404  */
static	ANTLR3_BITWORD FOLLOW_206_in_prologue_options404_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_206_in_prologue_options404	= { FOLLOW_206_in_prologue_options404_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_prologue_options407  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_prologue_options407_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x2000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_prologue_options407	= { FOLLOW_LCURLY_in_prologue_options407_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_prologue_options417  */
static	ANTLR3_BITWORD FOLLOW_ID_in_prologue_options417_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000010) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_prologue_options417	= { FOLLOW_ID_in_prologue_options417_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ASSIGN_in_prologue_options419  */
static	ANTLR3_BITWORD FOLLOW_ASSIGN_in_prologue_options419_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_ASSIGN_in_prologue_options419	= { FOLLOW_ASSIGN_in_prologue_options419_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_prologue_options423  */
static	ANTLR3_BITWORD FOLLOW_expression_in_prologue_options423_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_prologue_options423	= { FOLLOW_expression_in_prologue_options423_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_prologue_options425  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_prologue_options425_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x2000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_prologue_options425	= { FOLLOW_SEMI_in_prologue_options425_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_prologue_options444  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_prologue_options444_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_prologue_options444	= { FOLLOW_RCURLY_in_prologue_options444_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_282_in_modifier_declaration467  */
static	ANTLR3_BITWORD FOLLOW_282_in_modifier_declaration467_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0008000000000000), ANTLR3_UINT64_LIT(0x0002040004000000), ANTLR3_UINT64_LIT(0x1000120820200000), ANTLR3_UINT64_LIT(0x0000000040400800) };
static  ANTLR3_BITSET_LIST FOLLOW_282_in_modifier_declaration467	= { FOLLOW_282_in_modifier_declaration467_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_380_in_modifier_declaration486  */
static	ANTLR3_BITWORD FOLLOW_380_in_modifier_declaration486_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0008000000000000), ANTLR3_UINT64_LIT(0x0002040004000000), ANTLR3_UINT64_LIT(0x1000120820200000), ANTLR3_UINT64_LIT(0x0000000040400800) };
static  ANTLR3_BITSET_LIST FOLLOW_380_in_modifier_declaration486	= { FOLLOW_380_in_modifier_declaration486_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_414_in_modifier_declaration503  */
static	ANTLR3_BITWORD FOLLOW_414_in_modifier_declaration503_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0008000000000000), ANTLR3_UINT64_LIT(0x0002040004000000), ANTLR3_UINT64_LIT(0x1000120820200000), ANTLR3_UINT64_LIT(0x0000000040400800) };
static  ANTLR3_BITSET_LIST FOLLOW_414_in_modifier_declaration503	= { FOLLOW_414_in_modifier_declaration503_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_395_in_modifier_declaration517  */
static	ANTLR3_BITWORD FOLLOW_395_in_modifier_declaration517_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0008000000000000), ANTLR3_UINT64_LIT(0x0002040004000000), ANTLR3_UINT64_LIT(0x1000120820200000), ANTLR3_UINT64_LIT(0x0000000040400800) };
static  ANTLR3_BITSET_LIST FOLLOW_395_in_modifier_declaration517	= { FOLLOW_395_in_modifier_declaration517_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_406_in_modifier_declaration531  */
static	ANTLR3_BITWORD FOLLOW_406_in_modifier_declaration531_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0008000000000000), ANTLR3_UINT64_LIT(0x0002040004000000), ANTLR3_UINT64_LIT(0x1000120820200000), ANTLR3_UINT64_LIT(0x0000000040400800) };
static  ANTLR3_BITSET_LIST FOLLOW_406_in_modifier_declaration531	= { FOLLOW_406_in_modifier_declaration531_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_361_in_modifier_declaration548  */
static	ANTLR3_BITWORD FOLLOW_361_in_modifier_declaration548_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0008000000000000), ANTLR3_UINT64_LIT(0x0002040004000000), ANTLR3_UINT64_LIT(0x1000120820200000), ANTLR3_UINT64_LIT(0x0000000040400800) };
static  ANTLR3_BITSET_LIST FOLLOW_361_in_modifier_declaration548	= { FOLLOW_361_in_modifier_declaration548_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_243_in_modifier_declaration569  */
static	ANTLR3_BITWORD FOLLOW_243_in_modifier_declaration569_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0008000000000000), ANTLR3_UINT64_LIT(0x0002040004000000), ANTLR3_UINT64_LIT(0x1000120820200000), ANTLR3_UINT64_LIT(0x0000000040400800) };
static  ANTLR3_BITSET_LIST FOLLOW_243_in_modifier_declaration569	= { FOLLOW_243_in_modifier_declaration569_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_355_in_modifier_declaration588  */
static	ANTLR3_BITWORD FOLLOW_355_in_modifier_declaration588_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0008000000000000), ANTLR3_UINT64_LIT(0x0002040004000000), ANTLR3_UINT64_LIT(0x1000120820200000), ANTLR3_UINT64_LIT(0x0000000040400800) };
static  ANTLR3_BITSET_LIST FOLLOW_355_in_modifier_declaration588	= { FOLLOW_355_in_modifier_declaration588_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_349_in_modifier_declaration605  */
static	ANTLR3_BITWORD FOLLOW_349_in_modifier_declaration605_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0008000000000000), ANTLR3_UINT64_LIT(0x0002040004000000), ANTLR3_UINT64_LIT(0x1000120820200000), ANTLR3_UINT64_LIT(0x0000000040400800) };
static  ANTLR3_BITSET_LIST FOLLOW_349_in_modifier_declaration605	= { FOLLOW_349_in_modifier_declaration605_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_modifier_set_direction_strict_text_in_modifier_declaration621  */
static	ANTLR3_BITWORD FOLLOW_modifier_set_direction_strict_text_in_modifier_declaration621_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0008000000000000), ANTLR3_UINT64_LIT(0x0002040004000000), ANTLR3_UINT64_LIT(0x1000120820200000), ANTLR3_UINT64_LIT(0x0000000040400800) };
static  ANTLR3_BITSET_LIST FOLLOW_modifier_set_direction_strict_text_in_modifier_declaration621	= { FOLLOW_modifier_set_direction_strict_text_in_modifier_declaration621_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_modifier_direction645  */
static	ANTLR3_BITWORD FOLLOW_set_in_modifier_direction645_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_modifier_direction645	= { FOLLOW_set_in_modifier_direction645_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_modifier_direction668  */
static	ANTLR3_BITWORD FOLLOW_set_in_modifier_direction668_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_modifier_direction668	= { FOLLOW_set_in_modifier_direction668_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_modifier_direction689  */
static	ANTLR3_BITWORD FOLLOW_set_in_modifier_direction689_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_modifier_direction689	= { FOLLOW_set_in_modifier_direction689_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_modifier_direction714  */
static	ANTLR3_BITWORD FOLLOW_set_in_modifier_direction714_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_modifier_direction714	= { FOLLOW_set_in_modifier_direction714_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_modifier_direction_text749  */
static	ANTLR3_BITWORD FOLLOW_set_in_modifier_direction_text749_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_modifier_direction_text749	= { FOLLOW_set_in_modifier_direction_text749_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_modifier_direction_text767  */
static	ANTLR3_BITWORD FOLLOW_set_in_modifier_direction_text767_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_modifier_direction_text767	= { FOLLOW_set_in_modifier_direction_text767_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_298_in_modifier_direction_text785  */
static	ANTLR3_BITWORD FOLLOW_298_in_modifier_direction_text785_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_298_in_modifier_direction_text785	= { FOLLOW_298_in_modifier_direction_text785_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_364_in_modifier_direction_text806  */
static	ANTLR3_BITWORD FOLLOW_364_in_modifier_direction_text806_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_364_in_modifier_direction_text806	= { FOLLOW_364_in_modifier_direction_text806_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_305_in_modifier_set_direction_strict_text833  */
static	ANTLR3_BITWORD FOLLOW_305_in_modifier_set_direction_strict_text833_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_305_in_modifier_set_direction_strict_text833	= { FOLLOW_305_in_modifier_set_direction_strict_text833_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_341_in_modifier_set_direction_strict_text843  */
static	ANTLR3_BITWORD FOLLOW_341_in_modifier_set_direction_strict_text843_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_341_in_modifier_set_direction_strict_text843	= { FOLLOW_341_in_modifier_set_direction_strict_text843_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_298_in_modifier_set_direction_strict_text852  */
static	ANTLR3_BITWORD FOLLOW_298_in_modifier_set_direction_strict_text852_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_298_in_modifier_set_direction_strict_text852	= { FOLLOW_298_in_modifier_set_direction_strict_text852_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_364_in_modifier_set_direction_strict_text862  */
static	ANTLR3_BITWORD FOLLOW_364_in_modifier_set_direction_strict_text862_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_364_in_modifier_set_direction_strict_text862	= { FOLLOW_364_in_modifier_set_direction_strict_text862_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_164_in_modifier_direction_symbol881  */
static	ANTLR3_BITWORD FOLLOW_164_in_modifier_direction_symbol881_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_164_in_modifier_direction_symbol881	= { FOLLOW_164_in_modifier_direction_symbol881_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ASSIGN_REF_in_modifier_direction_symbol891  */
static	ANTLR3_BITWORD FOLLOW_ASSIGN_REF_in_modifier_direction_symbol891_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_ASSIGN_REF_in_modifier_direction_symbol891	= { FOLLOW_ASSIGN_REF_in_modifier_direction_symbol891_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_166_in_modifier_direction_symbol901  */
static	ANTLR3_BITWORD FOLLOW_166_in_modifier_direction_symbol901_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_166_in_modifier_direction_symbol901	= { FOLLOW_166_in_modifier_direction_symbol901_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LTE_in_modifier_direction_symbol910  */
static	ANTLR3_BITWORD FOLLOW_LTE_in_modifier_direction_symbol910_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_LTE_in_modifier_direction_symbol910	= { FOLLOW_LTE_in_modifier_direction_symbol910_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_modifier_direction_in_modifier_param934  */
static	ANTLR3_BITWORD FOLLOW_modifier_direction_in_modifier_param934_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_modifier_direction_in_modifier_param934	= { FOLLOW_modifier_direction_in_modifier_param934_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_282_in_modifier_param943  */
static	ANTLR3_BITWORD FOLLOW_282_in_modifier_param943_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_282_in_modifier_param943	= { FOLLOW_282_in_modifier_param943_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_262_in_modifier_param960  */
static	ANTLR3_BITWORD FOLLOW_262_in_modifier_param960_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_262_in_modifier_param960	= { FOLLOW_262_in_modifier_param960_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_modifier_param978  */
static	ANTLR3_BITWORD FOLLOW_set_in_modifier_param978_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_modifier_param978	= { FOLLOW_set_in_modifier_param978_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_318_in_modifier_param995  */
static	ANTLR3_BITWORD FOLLOW_318_in_modifier_param995_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_318_in_modifier_param995	= { FOLLOW_318_in_modifier_param995_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_243_in_modifier_param1013  */
static	ANTLR3_BITWORD FOLLOW_243_in_modifier_param1013_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_243_in_modifier_param1013	= { FOLLOW_243_in_modifier_param1013_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_393_in_procedure_modifier_specifier1062  */
static	ANTLR3_BITWORD FOLLOW_393_in_procedure_modifier_specifier1062_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000400200) };
static  ANTLR3_BITSET_LIST FOLLOW_393_in_procedure_modifier_specifier1062	= { FOLLOW_393_in_procedure_modifier_specifier1062_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_306_in_procedure_modifier_specifier1079  */
static	ANTLR3_BITWORD FOLLOW_306_in_procedure_modifier_specifier1079_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000400200) };
static  ANTLR3_BITSET_LIST FOLLOW_306_in_procedure_modifier_specifier1079	= { FOLLOW_306_in_procedure_modifier_specifier1079_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_406_in_procedure_modifier_specifier1089  */
static	ANTLR3_BITWORD FOLLOW_406_in_procedure_modifier_specifier1089_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000400200) };
static  ANTLR3_BITSET_LIST FOLLOW_406_in_procedure_modifier_specifier1089	= { FOLLOW_406_in_procedure_modifier_specifier1089_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_322_in_executable_modifier_specifier1127  */
static	ANTLR3_BITWORD FOLLOW_322_in_executable_modifier_specifier1127_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0404000000010000), ANTLR3_UINT64_LIT(0x0000000200000004), ANTLR3_UINT64_LIT(0x0000000000400200) };
static  ANTLR3_BITSET_LIST FOLLOW_322_in_executable_modifier_specifier1127	= { FOLLOW_322_in_executable_modifier_specifier1127_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_353_in_executable_modifier_specifier1144  */
static	ANTLR3_BITWORD FOLLOW_353_in_executable_modifier_specifier1144_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0404000000010000), ANTLR3_UINT64_LIT(0x0000000200000004), ANTLR3_UINT64_LIT(0x0000000000400200) };
static  ANTLR3_BITSET_LIST FOLLOW_353_in_executable_modifier_specifier1144	= { FOLLOW_353_in_executable_modifier_specifier1144_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_272_in_executable_modifier_specifier1158  */
static	ANTLR3_BITWORD FOLLOW_272_in_executable_modifier_specifier1158_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0404000000010000), ANTLR3_UINT64_LIT(0x0000000200000004), ANTLR3_UINT64_LIT(0x0000000000400200) };
static  ANTLR3_BITSET_LIST FOLLOW_272_in_executable_modifier_specifier1158	= { FOLLOW_272_in_executable_modifier_specifier1158_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_406_in_executable_modifier_specifier1181  */
static	ANTLR3_BITWORD FOLLOW_406_in_executable_modifier_specifier1181_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0404000000010000), ANTLR3_UINT64_LIT(0x0000000200000004), ANTLR3_UINT64_LIT(0x0000000000400200) };
static  ANTLR3_BITSET_LIST FOLLOW_406_in_executable_modifier_specifier1181	= { FOLLOW_406_in_executable_modifier_specifier1181_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_393_in_executable_modifier_specifier1198  */
static	ANTLR3_BITWORD FOLLOW_393_in_executable_modifier_specifier1198_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0404000000010000), ANTLR3_UINT64_LIT(0x0000000200000004), ANTLR3_UINT64_LIT(0x0000000000400200) };
static  ANTLR3_BITSET_LIST FOLLOW_393_in_executable_modifier_specifier1198	= { FOLLOW_393_in_executable_modifier_specifier1198_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_306_in_executable_modifier_specifier1215  */
static	ANTLR3_BITWORD FOLLOW_306_in_executable_modifier_specifier1215_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0404000000010000), ANTLR3_UINT64_LIT(0x0000000200000004), ANTLR3_UINT64_LIT(0x0000000000400200) };
static  ANTLR3_BITSET_LIST FOLLOW_306_in_executable_modifier_specifier1215	= { FOLLOW_306_in_executable_modifier_specifier1215_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_314_in_executable_modifier_specifier1224  */
static	ANTLR3_BITWORD FOLLOW_314_in_executable_modifier_specifier1224_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0404000000010000), ANTLR3_UINT64_LIT(0x0000000200000004), ANTLR3_UINT64_LIT(0x0000000000400200) };
static  ANTLR3_BITSET_LIST FOLLOW_314_in_executable_modifier_specifier1224	= { FOLLOW_314_in_executable_modifier_specifier1224_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_282_in_instance_modifier_specifier1254  */
static	ANTLR3_BITWORD FOLLOW_282_in_instance_modifier_specifier1254_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0404000004010000), ANTLR3_UINT64_LIT(0x0000000920000000), ANTLR3_UINT64_LIT(0x0000000000400200) };
static  ANTLR3_BITSET_LIST FOLLOW_282_in_instance_modifier_specifier1254	= { FOLLOW_282_in_instance_modifier_specifier1254_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_272_in_instance_modifier_specifier1278  */
static	ANTLR3_BITWORD FOLLOW_272_in_instance_modifier_specifier1278_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0404000004010000), ANTLR3_UINT64_LIT(0x0000000920000000), ANTLR3_UINT64_LIT(0x0000000000400200) };
static  ANTLR3_BITSET_LIST FOLLOW_272_in_instance_modifier_specifier1278	= { FOLLOW_272_in_instance_modifier_specifier1278_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_355_in_instance_modifier_specifier1297  */
static	ANTLR3_BITWORD FOLLOW_355_in_instance_modifier_specifier1297_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0404000004010000), ANTLR3_UINT64_LIT(0x0000000920000000), ANTLR3_UINT64_LIT(0x0000000000400200) };
static  ANTLR3_BITSET_LIST FOLLOW_355_in_instance_modifier_specifier1297	= { FOLLOW_355_in_instance_modifier_specifier1297_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_352_in_instance_modifier_specifier1313  */
static	ANTLR3_BITWORD FOLLOW_352_in_instance_modifier_specifier1313_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0404000004010000), ANTLR3_UINT64_LIT(0x0000000920000000), ANTLR3_UINT64_LIT(0x0000000000400200) };
static  ANTLR3_BITSET_LIST FOLLOW_352_in_instance_modifier_specifier1313	= { FOLLOW_352_in_instance_modifier_specifier1313_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_349_in_instance_modifier_specifier1326  */
static	ANTLR3_BITWORD FOLLOW_349_in_instance_modifier_specifier1326_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0404000004010000), ANTLR3_UINT64_LIT(0x0000000920000000), ANTLR3_UINT64_LIT(0x0000000000400200) };
static  ANTLR3_BITSET_LIST FOLLOW_349_in_instance_modifier_specifier1326	= { FOLLOW_349_in_instance_modifier_specifier1326_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_406_in_instance_modifier_specifier1342  */
static	ANTLR3_BITWORD FOLLOW_406_in_instance_modifier_specifier1342_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0404000004010000), ANTLR3_UINT64_LIT(0x0000000920000000), ANTLR3_UINT64_LIT(0x0000000000400200) };
static  ANTLR3_BITSET_LIST FOLLOW_406_in_instance_modifier_specifier1342	= { FOLLOW_406_in_instance_modifier_specifier1342_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_393_in_instance_modifier_specifier1359  */
static	ANTLR3_BITWORD FOLLOW_393_in_instance_modifier_specifier1359_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0404000004010000), ANTLR3_UINT64_LIT(0x0000000920000000), ANTLR3_UINT64_LIT(0x0000000000400200) };
static  ANTLR3_BITSET_LIST FOLLOW_393_in_instance_modifier_specifier1359	= { FOLLOW_393_in_instance_modifier_specifier1359_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_306_in_instance_modifier_specifier1376  */
static	ANTLR3_BITWORD FOLLOW_306_in_instance_modifier_specifier1376_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0404000004010000), ANTLR3_UINT64_LIT(0x0000000920000000), ANTLR3_UINT64_LIT(0x0000000000400200) };
static  ANTLR3_BITSET_LIST FOLLOW_306_in_instance_modifier_specifier1376	= { FOLLOW_306_in_instance_modifier_specifier1376_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_314_in_instance_modifier_specifier1385  */
static	ANTLR3_BITWORD FOLLOW_314_in_instance_modifier_specifier1385_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0404000004010000), ANTLR3_UINT64_LIT(0x0000000920000000), ANTLR3_UINT64_LIT(0x0000000000400200) };
static  ANTLR3_BITSET_LIST FOLLOW_314_in_instance_modifier_specifier1385	= { FOLLOW_314_in_instance_modifier_specifier1385_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_395_in_modifier_transition1420  */
static	ANTLR3_BITWORD FOLLOW_395_in_modifier_transition1420_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000A00) };
static  ANTLR3_BITSET_LIST FOLLOW_395_in_modifier_transition1420	= { FOLLOW_395_in_modifier_transition1420_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_393_in_modifier_transition1436  */
static	ANTLR3_BITWORD FOLLOW_393_in_modifier_transition1436_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000A00) };
static  ANTLR3_BITSET_LIST FOLLOW_393_in_modifier_transition1436	= { FOLLOW_393_in_modifier_transition1436_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_306_in_modifier_transition1453  */
static	ANTLR3_BITWORD FOLLOW_306_in_modifier_transition1453_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000A00) };
static  ANTLR3_BITSET_LIST FOLLOW_306_in_modifier_transition1453	= { FOLLOW_306_in_modifier_transition1453_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_342_in_def_package1485  */
static	ANTLR3_BITWORD FOLLOW_342_in_def_package1485_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_342_in_def_package1485	= { FOLLOW_342_in_def_package1485_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_def_package1489  */
static	ANTLR3_BITWORD FOLLOW_ID_in_def_package1489_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_def_package1489	= { FOLLOW_ID_in_def_package1489_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_StringLiteral_in_def_package1506  */
static	ANTLR3_BITWORD FOLLOW_StringLiteral_in_def_package1506_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_StringLiteral_in_def_package1506	= { FOLLOW_StringLiteral_in_def_package1506_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_def_package1527  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_def_package1527_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x1084400000000000), ANTLR3_UINT64_LIT(0x0000000041F80B21) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_def_package1527	= { FOLLOW_LCURLY_in_def_package1527_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_header_in_def_package1532  */
static	ANTLR3_BITWORD FOLLOW_section_header_in_def_package1532_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0084400000000000), ANTLR3_UINT64_LIT(0x0000000041F80B21) };
static  ANTLR3_BITSET_LIST FOLLOW_section_header_in_def_package1532	= { FOLLOW_section_header_in_def_package1532_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_import_in_def_package1540  */
static	ANTLR3_BITWORD FOLLOW_section_import_in_def_package1540_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0084400000000000), ANTLR3_UINT64_LIT(0x0000000041F80B20) };
static  ANTLR3_BITSET_LIST FOLLOW_section_import_in_def_package1540	= { FOLLOW_section_import_in_def_package1540_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_property_in_def_package1551  */
static	ANTLR3_BITWORD FOLLOW_section_property_in_def_package1551_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0084400000000000), ANTLR3_UINT64_LIT(0x0000000041F80B20) };
static  ANTLR3_BITSET_LIST FOLLOW_section_property_in_def_package1551	= { FOLLOW_section_property_in_def_package1551_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_composite_structure_in_def_package1563  */
static	ANTLR3_BITWORD FOLLOW_section_composite_structure_in_def_package1563_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0080400000000000), ANTLR3_UINT64_LIT(0x0000000040900B20) };
static  ANTLR3_BITSET_LIST FOLLOW_section_composite_structure_in_def_package1563	= { FOLLOW_section_composite_structure_in_def_package1563_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_def_package1572  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_def_package1572_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_def_package1572	= { FOLLOW_RCURLY_in_def_package1572_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_executable_modifier_specifier_in_def_system1604  */
static	ANTLR3_BITWORD FOLLOW_executable_modifier_specifier_in_def_system1604_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000040) };
static  ANTLR3_BITSET_LIST FOLLOW_executable_modifier_specifier_in_def_system1604	= { FOLLOW_executable_modifier_specifier_in_def_system1604_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_390_in_def_system1618  */
static	ANTLR3_BITWORD FOLLOW_390_in_def_system1618_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_390_in_def_system1618	= { FOLLOW_390_in_def_system1618_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LT__in_def_system1626  */
static	ANTLR3_BITWORD FOLLOW_LT__in_def_system1626_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000001800000), ANTLR3_UINT64_LIT(0x0000800000000000), ANTLR3_UINT64_LIT(0x0100000054000002), ANTLR3_UINT64_LIT(0x0200100000004002) };
static  ANTLR3_BITSET_LIST FOLLOW_LT__in_def_system1626	= { FOLLOW_LT__in_def_system1626_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_321_in_def_system1630  */
static	ANTLR3_BITWORD FOLLOW_321_in_def_system1630_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000001800000), ANTLR3_UINT64_LIT(0x0000800000000000), ANTLR3_UINT64_LIT(0x0100000054000002), ANTLR3_UINT64_LIT(0x0200100000004000) };
static  ANTLR3_BITSET_LIST FOLLOW_321_in_def_system1630	= { FOLLOW_321_in_def_system1630_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_executable_specifier_in_def_system1636  */
static	ANTLR3_BITWORD FOLLOW_executable_specifier_in_def_system1636_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_executable_specifier_in_def_system1636	= { FOLLOW_executable_specifier_in_def_system1636_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_GT_in_def_system1639  */
static	ANTLR3_BITWORD FOLLOW_GT_in_def_system1639_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_GT_in_def_system1639	= { FOLLOW_GT_in_def_system1639_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_def_system1649  */
static	ANTLR3_BITWORD FOLLOW_ID_in_def_system1649_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_def_system1649	= { FOLLOW_ID_in_def_system1649_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_StringLiteral_in_def_system1662  */
static	ANTLR3_BITWORD FOLLOW_StringLiteral_in_def_system1662_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_StringLiteral_in_def_system1662	= { FOLLOW_StringLiteral_in_def_system1662_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_def_system1679  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_def_system1679_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x1084580000000000), ANTLR3_UINT64_LIT(0x0000000859FE9F79) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_def_system1679	= { FOLLOW_LCURLY_in_def_system1679_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_header_in_def_system1687  */
static	ANTLR3_BITWORD FOLLOW_section_header_in_def_system1687_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0084580000000000), ANTLR3_UINT64_LIT(0x0000000859FE9F79) };
static  ANTLR3_BITSET_LIST FOLLOW_section_header_in_def_system1687	= { FOLLOW_section_header_in_def_system1687_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_import_in_def_system1695  */
static	ANTLR3_BITWORD FOLLOW_section_import_in_def_system1695_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0084580000000000), ANTLR3_UINT64_LIT(0x0000000859FE9F78) };
static  ANTLR3_BITSET_LIST FOLLOW_section_import_in_def_system1695	= { FOLLOW_section_import_in_def_system1695_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_parameter_in_def_system1706  */
static	ANTLR3_BITWORD FOLLOW_section_parameter_in_def_system1706_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0084580000000000), ANTLR3_UINT64_LIT(0x0000000859FE9F78) };
static  ANTLR3_BITSET_LIST FOLLOW_section_parameter_in_def_system1706	= { FOLLOW_section_parameter_in_def_system1706_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_property_in_def_system1728  */
static	ANTLR3_BITWORD FOLLOW_section_property_in_def_system1728_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0084580000000000), ANTLR3_UINT64_LIT(0x0000000841F81F60) };
static  ANTLR3_BITSET_LIST FOLLOW_section_property_in_def_system1728	= { FOLLOW_section_property_in_def_system1728_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_composite_structure_in_def_system1740  */
static	ANTLR3_BITWORD FOLLOW_section_composite_structure_in_def_system1740_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0080580000000000), ANTLR3_UINT64_LIT(0x0000000840901F60) };
static  ANTLR3_BITSET_LIST FOLLOW_section_composite_structure_in_def_system1740	= { FOLLOW_section_composite_structure_in_def_system1740_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_behavior_in_def_system1752  */
static	ANTLR3_BITWORD FOLLOW_section_behavior_in_def_system1752_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0000100000000000), ANTLR3_UINT64_LIT(0x0000000000001440) };
static  ANTLR3_BITSET_LIST FOLLOW_section_behavior_in_def_system1752	= { FOLLOW_section_behavior_in_def_system1752_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_statemachine_in_def_system1760  */
static	ANTLR3_BITWORD FOLLOW_section_statemachine_in_def_system1760_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0000100000000000), ANTLR3_UINT64_LIT(0x0000000000001440) };
static  ANTLR3_BITSET_LIST FOLLOW_section_statemachine_in_def_system1760	= { FOLLOW_section_statemachine_in_def_system1760_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_model_of_computation_in_def_system1788  */
static	ANTLR3_BITWORD FOLLOW_section_model_of_computation_in_def_system1788_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0000100000000000), ANTLR3_UINT64_LIT(0x0000000000001440) };
static  ANTLR3_BITSET_LIST FOLLOW_section_model_of_computation_in_def_system1788	= { FOLLOW_section_model_of_computation_in_def_system1788_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_model_of_interaction_in_def_system1796  */
static	ANTLR3_BITWORD FOLLOW_section_model_of_interaction_in_def_system1796_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0000100000000000), ANTLR3_UINT64_LIT(0x0000000000001440) };
static  ANTLR3_BITSET_LIST FOLLOW_section_model_of_interaction_in_def_system1796	= { FOLLOW_section_model_of_interaction_in_def_system1796_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_model_of_execution_in_def_system1804  */
static	ANTLR3_BITWORD FOLLOW_section_model_of_execution_in_def_system1804_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0000100000000000), ANTLR3_UINT64_LIT(0x0000000000001440) };
static  ANTLR3_BITSET_LIST FOLLOW_section_model_of_execution_in_def_system1804	= { FOLLOW_section_model_of_execution_in_def_system1804_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_def_system1816  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_def_system1816_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_def_system1816	= { FOLLOW_RCURLY_in_def_system1816_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_qualifiedNameID1842  */
static	ANTLR3_BITWORD FOLLOW_ID_in_qualifiedNameID1842_bits[]	= { ANTLR3_UINT64_LIT(0x0000000200400002) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_qualifiedNameID1842	= { FOLLOW_ID_in_qualifiedNameID1842_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_DOT_in_qualifiedNameID1859  */
static	ANTLR3_BITWORD FOLLOW_DOT_in_qualifiedNameID1859_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_DOT_in_qualifiedNameID1859	= { FOLLOW_DOT_in_qualifiedNameID1859_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COLONx2_in_qualifiedNameID1875  */
static	ANTLR3_BITWORD FOLLOW_COLONx2_in_qualifiedNameID1875_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_COLONx2_in_qualifiedNameID1875	= { FOLLOW_COLONx2_in_qualifiedNameID1875_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_qualifiedNameID1893  */
static	ANTLR3_BITWORD FOLLOW_ID_in_qualifiedNameID1893_bits[]	= { ANTLR3_UINT64_LIT(0x0000000200400002) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_qualifiedNameID1893	= { FOLLOW_ID_in_qualifiedNameID1893_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_IntegerLiteral_in_integer_constant1923  */
static	ANTLR3_BITWORD FOLLOW_IntegerLiteral_in_integer_constant1923_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_IntegerLiteral_in_integer_constant1923	= { FOLLOW_IntegerLiteral_in_integer_constant1923_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_qualifiedNameID_in_integer_constant1934  */
static	ANTLR3_BITWORD FOLLOW_qualifiedNameID_in_integer_constant1934_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_qualifiedNameID_in_integer_constant1934	= { FOLLOW_qualifiedNameID_in_integer_constant1934_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_FloatLiteral_in_float_constant1955  */
static	ANTLR3_BITWORD FOLLOW_FloatLiteral_in_float_constant1955_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_FloatLiteral_in_float_constant1955	= { FOLLOW_FloatLiteral_in_float_constant1955_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_qualifiedNameID_in_float_constant1966  */
static	ANTLR3_BITWORD FOLLOW_qualifiedNameID_in_float_constant1966_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_qualifiedNameID_in_float_constant1966	= { FOLLOW_qualifiedNameID_in_float_constant1966_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_188_in_section_header1987  */
static	ANTLR3_BITWORD FOLLOW_188_in_section_header1987_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_188_in_section_header1987	= { FOLLOW_188_in_section_header1987_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_192_in_section_import2005  */
static	ANTLR3_BITWORD FOLLOW_192_in_section_import2005_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_192_in_section_import2005	= { FOLLOW_192_in_section_import2005_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_include_package_in_section_import2009  */
static	ANTLR3_BITWORD FOLLOW_include_package_in_section_import2009_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_include_package_in_section_import2009	= { FOLLOW_include_package_in_section_import2009_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_193_in_include_package2023  */
static	ANTLR3_BITWORD FOLLOW_193_in_include_package2023_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_193_in_include_package2023	= { FOLLOW_193_in_include_package2023_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_StringLiteral_in_include_package2030  */
static	ANTLR3_BITWORD FOLLOW_StringLiteral_in_include_package2030_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_StringLiteral_in_include_package2030	= { FOLLOW_StringLiteral_in_include_package2030_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_include_package2033  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_include_package2033_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_include_package2033	= { FOLLOW_SEMI_in_include_package2033_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_include_package2040  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_include_package2040_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_include_package2040	= { FOLLOW_LCURLY_in_include_package2040_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_StringLiteral_in_include_package2045  */
static	ANTLR3_BITWORD FOLLOW_StringLiteral_in_include_package2045_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_StringLiteral_in_include_package2045	= { FOLLOW_StringLiteral_in_include_package2045_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_include_package2051  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_include_package2051_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_include_package2051	= { FOLLOW_RCURLY_in_include_package2051_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_212_in_section_procedure2081  */
static	ANTLR3_BITWORD FOLLOW_212_in_section_procedure2081_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000080000000), ANTLR3_UINT64_LIT(0x0000000000400200) };
static  ANTLR3_BITSET_LIST FOLLOW_212_in_section_procedure2081	= { FOLLOW_212_in_section_procedure2081_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_procedure_in_section_procedure2090  */
static	ANTLR3_BITWORD FOLLOW_def_procedure_in_section_procedure2090_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000080000000), ANTLR3_UINT64_LIT(0x0000000000400200) };
static  ANTLR3_BITSET_LIST FOLLOW_def_procedure_in_section_procedure2090	= { FOLLOW_def_procedure_in_section_procedure2090_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_procedure_modifier_specifier_in_def_procedure2124  */
static	ANTLR3_BITWORD FOLLOW_procedure_modifier_specifier_in_def_procedure2124_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000080000000) };
static  ANTLR3_BITSET_LIST FOLLOW_procedure_modifier_specifier_in_def_procedure2124	= { FOLLOW_procedure_modifier_specifier_in_def_procedure2124_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_351_in_def_procedure2140  */
static	ANTLR3_BITWORD FOLLOW_351_in_def_procedure2140_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_351_in_def_procedure2140	= { FOLLOW_351_in_def_procedure2140_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LT__in_def_procedure2147  */
static	ANTLR3_BITWORD FOLLOW_LT__in_def_procedure2147_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000001800000), ANTLR3_UINT64_LIT(0x0000800000000000), ANTLR3_UINT64_LIT(0x0100000054000002), ANTLR3_UINT64_LIT(0x0200100000004002) };
static  ANTLR3_BITSET_LIST FOLLOW_LT__in_def_procedure2147	= { FOLLOW_LT__in_def_procedure2147_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_321_in_def_procedure2151  */
static	ANTLR3_BITWORD FOLLOW_321_in_def_procedure2151_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000001800000), ANTLR3_UINT64_LIT(0x0000800000000000), ANTLR3_UINT64_LIT(0x0100000054000002), ANTLR3_UINT64_LIT(0x0200100000004000) };
static  ANTLR3_BITSET_LIST FOLLOW_321_in_def_procedure2151	= { FOLLOW_321_in_def_procedure2151_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_executable_specifier_in_def_procedure2157  */
static	ANTLR3_BITWORD FOLLOW_executable_specifier_in_def_procedure2157_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_executable_specifier_in_def_procedure2157	= { FOLLOW_executable_specifier_in_def_procedure2157_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_GT_in_def_procedure2161  */
static	ANTLR3_BITWORD FOLLOW_GT_in_def_procedure2161_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_GT_in_def_procedure2161	= { FOLLOW_GT_in_def_procedure2161_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_def_procedure2171  */
static	ANTLR3_BITWORD FOLLOW_ID_in_def_procedure2171_bits[]	= { ANTLR3_UINT64_LIT(0x1000000000000000), ANTLR3_UINT64_LIT(0x0000000000000081), ANTLR3_UINT64_LIT(0x0000000800002000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_def_procedure2171	= { FOLLOW_ID_in_def_procedure2171_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_StringLiteral_in_def_procedure2184  */
static	ANTLR3_BITWORD FOLLOW_StringLiteral_in_def_procedure2184_bits[]	= { ANTLR3_UINT64_LIT(0x1000000000000000), ANTLR3_UINT64_LIT(0x0000000000000081), ANTLR3_UINT64_LIT(0x0000000800000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_StringLiteral_in_def_procedure2184	= { FOLLOW_StringLiteral_in_def_procedure2184_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_machine_parameters_in_def_procedure2201  */
static	ANTLR3_BITWORD FOLLOW_def_machine_parameters_in_def_procedure2201_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001), ANTLR3_UINT64_LIT(0x0000000800000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_def_machine_parameters_in_def_procedure2201	= { FOLLOW_def_machine_parameters_in_def_procedure2201_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_machine_returns_in_def_procedure2210  */
static	ANTLR3_BITWORD FOLLOW_def_machine_returns_in_def_procedure2210_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_def_machine_returns_in_def_procedure2210	= { FOLLOW_def_machine_returns_in_def_procedure2210_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_body_procedure_in_def_procedure2219  */
static	ANTLR3_BITWORD FOLLOW_def_body_procedure_in_def_procedure2219_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_body_procedure_in_def_procedure2219	= { FOLLOW_def_body_procedure_in_def_procedure2219_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LBRACKET_in_def_machine_parameters2238  */
static	ANTLR3_BITWORD FOLLOW_LBRACKET_in_def_machine_parameters2238_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000280), ANTLR3_UINT64_LIT(0x0000000000001000), ANTLR3_UINT64_LIT(0x0000005000000000), ANTLR3_UINT64_LIT(0xC27E000000000000), ANTLR3_UINT64_LIT(0x78E204800E00C168), ANTLR3_UINT64_LIT(0x006413600720A261), ANTLR3_UINT64_LIT(0x0000000013A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_LBRACKET_in_def_machine_parameters2238	= { FOLLOW_LBRACKET_in_def_machine_parameters2238_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_machine_variable_parameter_atom_in_def_machine_parameters2241  */
static	ANTLR3_BITWORD FOLLOW_def_machine_variable_parameter_atom_in_def_machine_parameters2241_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x1000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_def_machine_variable_parameter_atom_in_def_machine_parameters2241	= { FOLLOW_def_machine_variable_parameter_atom_in_def_machine_parameters2241_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_def_machine_parameters2249  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_def_machine_parameters2249_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000280), ANTLR3_UINT64_LIT(0x0000000000001000), ANTLR3_UINT64_LIT(0x0000005000000000), ANTLR3_UINT64_LIT(0xC27E000000000000), ANTLR3_UINT64_LIT(0x78E204800E00C168), ANTLR3_UINT64_LIT(0x006413600720A261), ANTLR3_UINT64_LIT(0x0000000013A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_def_machine_parameters2249	= { FOLLOW_COMMA_in_def_machine_parameters2249_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_machine_variable_parameter_atom_in_def_machine_parameters2253  */
static	ANTLR3_BITWORD FOLLOW_def_machine_variable_parameter_atom_in_def_machine_parameters2253_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x1000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_def_machine_variable_parameter_atom_in_def_machine_parameters2253	= { FOLLOW_def_machine_variable_parameter_atom_in_def_machine_parameters2253_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RBRACKET_in_def_machine_parameters2262  */
static	ANTLR3_BITWORD FOLLOW_RBRACKET_in_def_machine_parameters2262_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RBRACKET_in_def_machine_parameters2262	= { FOLLOW_RBRACKET_in_def_machine_parameters2262_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LPAREN_in_def_machine_parameters2268  */
static	ANTLR3_BITWORD FOLLOW_LPAREN_in_def_machine_parameters2268_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000280), ANTLR3_UINT64_LIT(0x0000000000001000), ANTLR3_UINT64_LIT(0x0000005000000000), ANTLR3_UINT64_LIT(0xC27E000000000000), ANTLR3_UINT64_LIT(0x78E204800E00C168), ANTLR3_UINT64_LIT(0x006413600720A261), ANTLR3_UINT64_LIT(0x0000000013A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_LPAREN_in_def_machine_parameters2268	= { FOLLOW_LPAREN_in_def_machine_parameters2268_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_machine_variable_parameter_atom_in_def_machine_parameters2272  */
static	ANTLR3_BITWORD FOLLOW_def_machine_variable_parameter_atom_in_def_machine_parameters2272_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_machine_variable_parameter_atom_in_def_machine_parameters2272	= { FOLLOW_def_machine_variable_parameter_atom_in_def_machine_parameters2272_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_def_machine_parameters2280  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_def_machine_parameters2280_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000280), ANTLR3_UINT64_LIT(0x0000000000001000), ANTLR3_UINT64_LIT(0x0000005000000000), ANTLR3_UINT64_LIT(0xC27E000000000000), ANTLR3_UINT64_LIT(0x78E204800E00C168), ANTLR3_UINT64_LIT(0x006413600720A261), ANTLR3_UINT64_LIT(0x0000000013A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_def_machine_parameters2280	= { FOLLOW_COMMA_in_def_machine_parameters2280_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_machine_variable_parameter_atom_in_def_machine_parameters2283  */
static	ANTLR3_BITWORD FOLLOW_def_machine_variable_parameter_atom_in_def_machine_parameters2283_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_machine_variable_parameter_atom_in_def_machine_parameters2283	= { FOLLOW_def_machine_variable_parameter_atom_in_def_machine_parameters2283_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RPAREN_in_def_machine_parameters2292  */
static	ANTLR3_BITWORD FOLLOW_RPAREN_in_def_machine_parameters2292_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RPAREN_in_def_machine_parameters2292	= { FOLLOW_RPAREN_in_def_machine_parameters2292_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_modifier_param_in_def_machine_variable_parameter_atom2315  */
static	ANTLR3_BITWORD FOLLOW_modifier_param_in_def_machine_variable_parameter_atom2315_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xC266000000000000), ANTLR3_UINT64_LIT(0x38E000000A00C128), ANTLR3_UINT64_LIT(0x0064016007002261), ANTLR3_UINT64_LIT(0x0000000013A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_modifier_param_in_def_machine_variable_parameter_atom2315	= { FOLLOW_modifier_param_in_def_machine_variable_parameter_atom2315_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_type_var_in_def_machine_variable_parameter_atom2327  */
static	ANTLR3_BITWORD FOLLOW_type_var_in_def_machine_variable_parameter_atom2327_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_type_var_in_def_machine_variable_parameter_atom2327	= { FOLLOW_type_var_in_def_machine_variable_parameter_atom2327_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_def_machine_variable_parameter_atom2338  */
static	ANTLR3_BITWORD FOLLOW_ID_in_def_machine_variable_parameter_atom2338_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000012), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_def_machine_variable_parameter_atom2338	= { FOLLOW_ID_in_def_machine_variable_parameter_atom2338_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_initial_value_in_def_machine_variable_parameter_atom2355  */
static	ANTLR3_BITWORD FOLLOW_initial_value_in_def_machine_variable_parameter_atom2355_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_initial_value_in_def_machine_variable_parameter_atom2355	= { FOLLOW_initial_value_in_def_machine_variable_parameter_atom2355_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_244_in_def_machine_variable_parameter_atom2378  */
static	ANTLR3_BITWORD FOLLOW_244_in_def_machine_variable_parameter_atom2378_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xC266000000000000), ANTLR3_UINT64_LIT(0x38E000000A00C128), ANTLR3_UINT64_LIT(0x0064016007002261), ANTLR3_UINT64_LIT(0x0000000013A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_244_in_def_machine_variable_parameter_atom2378	= { FOLLOW_244_in_def_machine_variable_parameter_atom2378_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_type_var_in_def_machine_variable_parameter_atom2399  */
static	ANTLR3_BITWORD FOLLOW_type_var_in_def_machine_variable_parameter_atom2399_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000200000) };
static  ANTLR3_BITSET_LIST FOLLOW_type_var_in_def_machine_variable_parameter_atom2399	= { FOLLOW_type_var_in_def_machine_variable_parameter_atom2399_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COLON_in_def_machine_variable_parameter_atom2401  */
static	ANTLR3_BITWORD FOLLOW_COLON_in_def_machine_variable_parameter_atom2401_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_COLON_in_def_machine_variable_parameter_atom2401	= { FOLLOW_COLON_in_def_machine_variable_parameter_atom2401_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_def_machine_variable_parameter_atom2412  */
static	ANTLR3_BITWORD FOLLOW_expression_in_def_machine_variable_parameter_atom2412_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_def_machine_variable_parameter_atom2412	= { FOLLOW_expression_in_def_machine_variable_parameter_atom2412_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_qualifiedNameID_in_def_machine_variable_parameter_atom2423  */
static	ANTLR3_BITWORD FOLLOW_qualifiedNameID_in_def_machine_variable_parameter_atom2423_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_qualifiedNameID_in_def_machine_variable_parameter_atom2423	= { FOLLOW_qualifiedNameID_in_def_machine_variable_parameter_atom2423_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_def_machine_returns2457  */
static	ANTLR3_BITWORD FOLLOW_set_in_def_machine_returns2457_bits[]	= { ANTLR3_UINT64_LIT(0x1004000000000000), ANTLR3_UINT64_LIT(0x0000000000000080), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xC266000000000000), ANTLR3_UINT64_LIT(0x38E000000A00C128), ANTLR3_UINT64_LIT(0x0064016007002261), ANTLR3_UINT64_LIT(0x0000000013A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_def_machine_returns2457	= { FOLLOW_set_in_def_machine_returns2457_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LBRACKET_in_def_machine_returns2474  */
static	ANTLR3_BITWORD FOLLOW_LBRACKET_in_def_machine_returns2474_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000280), ANTLR3_UINT64_LIT(0x0000000000001000), ANTLR3_UINT64_LIT(0x0000005000000000), ANTLR3_UINT64_LIT(0xC27E000000000000), ANTLR3_UINT64_LIT(0x78E204800E00C168), ANTLR3_UINT64_LIT(0x006413600720A261), ANTLR3_UINT64_LIT(0x0000000013A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_LBRACKET_in_def_machine_returns2474	= { FOLLOW_LBRACKET_in_def_machine_returns2474_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_machine_variable_return_atom_in_def_machine_returns2477  */
static	ANTLR3_BITWORD FOLLOW_def_machine_variable_return_atom_in_def_machine_returns2477_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x1000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_def_machine_variable_return_atom_in_def_machine_returns2477	= { FOLLOW_def_machine_variable_return_atom_in_def_machine_returns2477_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_def_machine_returns2489  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_def_machine_returns2489_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000280), ANTLR3_UINT64_LIT(0x0000000000001000), ANTLR3_UINT64_LIT(0x0000005000000000), ANTLR3_UINT64_LIT(0xC27E000000000000), ANTLR3_UINT64_LIT(0x78E204800E00C168), ANTLR3_UINT64_LIT(0x006413600720A261), ANTLR3_UINT64_LIT(0x0000000013A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_def_machine_returns2489	= { FOLLOW_COMMA_in_def_machine_returns2489_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_machine_variable_return_atom_in_def_machine_returns2493  */
static	ANTLR3_BITWORD FOLLOW_def_machine_variable_return_atom_in_def_machine_returns2493_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x1000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_def_machine_variable_return_atom_in_def_machine_returns2493	= { FOLLOW_def_machine_variable_return_atom_in_def_machine_returns2493_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RBRACKET_in_def_machine_returns2506  */
static	ANTLR3_BITWORD FOLLOW_RBRACKET_in_def_machine_returns2506_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RBRACKET_in_def_machine_returns2506	= { FOLLOW_RBRACKET_in_def_machine_returns2506_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LPAREN_in_def_machine_returns2523  */
static	ANTLR3_BITWORD FOLLOW_LPAREN_in_def_machine_returns2523_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000280), ANTLR3_UINT64_LIT(0x0000000000001000), ANTLR3_UINT64_LIT(0x0000005000000000), ANTLR3_UINT64_LIT(0xC27E000000000000), ANTLR3_UINT64_LIT(0x78E204800E00C168), ANTLR3_UINT64_LIT(0x006413600720A261), ANTLR3_UINT64_LIT(0x0000000013A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_LPAREN_in_def_machine_returns2523	= { FOLLOW_LPAREN_in_def_machine_returns2523_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_machine_variable_return_atom_in_def_machine_returns2527  */
static	ANTLR3_BITWORD FOLLOW_def_machine_variable_return_atom_in_def_machine_returns2527_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_machine_variable_return_atom_in_def_machine_returns2527	= { FOLLOW_def_machine_variable_return_atom_in_def_machine_returns2527_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_def_machine_returns2539  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_def_machine_returns2539_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000280), ANTLR3_UINT64_LIT(0x0000000000001000), ANTLR3_UINT64_LIT(0x0000005000000000), ANTLR3_UINT64_LIT(0xC27E000000000000), ANTLR3_UINT64_LIT(0x78E204800E00C168), ANTLR3_UINT64_LIT(0x006413600720A261), ANTLR3_UINT64_LIT(0x0000000013A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_def_machine_returns2539	= { FOLLOW_COMMA_in_def_machine_returns2539_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_machine_variable_return_atom_in_def_machine_returns2542  */
static	ANTLR3_BITWORD FOLLOW_def_machine_variable_return_atom_in_def_machine_returns2542_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_machine_variable_return_atom_in_def_machine_returns2542	= { FOLLOW_def_machine_variable_return_atom_in_def_machine_returns2542_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RPAREN_in_def_machine_returns2555  */
static	ANTLR3_BITWORD FOLLOW_RPAREN_in_def_machine_returns2555_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RPAREN_in_def_machine_returns2555	= { FOLLOW_RPAREN_in_def_machine_returns2555_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_type_var_in_def_machine_returns2572  */
static	ANTLR3_BITWORD FOLLOW_type_var_in_def_machine_returns2572_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000012), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_type_var_in_def_machine_returns2572	= { FOLLOW_type_var_in_def_machine_returns2572_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_initial_value_in_def_machine_returns2578  */
static	ANTLR3_BITWORD FOLLOW_initial_value_in_def_machine_returns2578_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_initial_value_in_def_machine_returns2578	= { FOLLOW_initial_value_in_def_machine_returns2578_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_modifier_param_in_def_machine_variable_return_atom2617  */
static	ANTLR3_BITWORD FOLLOW_modifier_param_in_def_machine_variable_return_atom2617_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xC266000000000000), ANTLR3_UINT64_LIT(0x38E000000A00C128), ANTLR3_UINT64_LIT(0x0064016007002261), ANTLR3_UINT64_LIT(0x0000000013A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_modifier_param_in_def_machine_variable_return_atom2617	= { FOLLOW_modifier_param_in_def_machine_variable_return_atom2617_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_type_var_in_def_machine_variable_return_atom2629  */
static	ANTLR3_BITWORD FOLLOW_type_var_in_def_machine_variable_return_atom2629_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_type_var_in_def_machine_variable_return_atom2629	= { FOLLOW_type_var_in_def_machine_variable_return_atom2629_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_def_machine_variable_return_atom2640  */
static	ANTLR3_BITWORD FOLLOW_ID_in_def_machine_variable_return_atom2640_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000012), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_def_machine_variable_return_atom2640	= { FOLLOW_ID_in_def_machine_variable_return_atom2640_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_initial_value_in_def_machine_variable_return_atom2657  */
static	ANTLR3_BITWORD FOLLOW_initial_value_in_def_machine_variable_return_atom2657_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_initial_value_in_def_machine_variable_return_atom2657	= { FOLLOW_initial_value_in_def_machine_variable_return_atom2657_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_244_in_def_machine_variable_return_atom2680  */
static	ANTLR3_BITWORD FOLLOW_244_in_def_machine_variable_return_atom2680_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xC266000000000000), ANTLR3_UINT64_LIT(0x38E000000A00C128), ANTLR3_UINT64_LIT(0x0064016007002261), ANTLR3_UINT64_LIT(0x0000000013A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_244_in_def_machine_variable_return_atom2680	= { FOLLOW_244_in_def_machine_variable_return_atom2680_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_type_var_in_def_machine_variable_return_atom2701  */
static	ANTLR3_BITWORD FOLLOW_type_var_in_def_machine_variable_return_atom2701_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000200000) };
static  ANTLR3_BITSET_LIST FOLLOW_type_var_in_def_machine_variable_return_atom2701	= { FOLLOW_type_var_in_def_machine_variable_return_atom2701_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COLON_in_def_machine_variable_return_atom2703  */
static	ANTLR3_BITWORD FOLLOW_COLON_in_def_machine_variable_return_atom2703_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_COLON_in_def_machine_variable_return_atom2703	= { FOLLOW_COLON_in_def_machine_variable_return_atom2703_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_def_machine_variable_return_atom2714  */
static	ANTLR3_BITWORD FOLLOW_expression_in_def_machine_variable_return_atom2714_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_def_machine_variable_return_atom2714	= { FOLLOW_expression_in_def_machine_variable_return_atom2714_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_qualifiedNameID_in_def_machine_variable_return_atom2725  */
static	ANTLR3_BITWORD FOLLOW_qualifiedNameID_in_def_machine_variable_return_atom2725_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_qualifiedNameID_in_def_machine_variable_return_atom2725	= { FOLLOW_qualifiedNameID_in_def_machine_variable_return_atom2725_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_def_body_procedure2755  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_def_body_procedure2755_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0xF1CE5C00027B0000), ANTLR3_UINT64_LIT(0x00080009D9FE9FFD), ANTLR3_UINT64_LIT(0x4406040004010048), ANTLR3_UINT64_LIT(0x1C00120A20200004), ANTLR3_UINT64_LIT(0x000000004C400A00) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_def_body_procedure2755	= { FOLLOW_LCURLY_in_def_body_procedure2755_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_body_procedure_section_in_def_body_procedure2775  */
static	ANTLR3_BITWORD FOLLOW_def_body_procedure_section_in_def_body_procedure2775_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_def_body_procedure_section_in_def_body_procedure2775	= { FOLLOW_def_body_procedure_section_in_def_body_procedure2775_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_body_procedure_simplif_in_def_body_procedure2784  */
static	ANTLR3_BITWORD FOLLOW_def_body_procedure_simplif_in_def_body_procedure2784_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_def_body_procedure_simplif_in_def_body_procedure2784	= { FOLLOW_def_body_procedure_simplif_in_def_body_procedure2784_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_def_body_procedure2795  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_def_body_procedure2795_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_def_body_procedure2795	= { FOLLOW_RCURLY_in_def_body_procedure2795_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_header_in_def_body_procedure_section2808  */
static	ANTLR3_BITWORD FOLLOW_section_header_in_def_body_procedure_section2808_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0084580000000000), ANTLR3_UINT64_LIT(0x0000000859FE9F79) };
static  ANTLR3_BITSET_LIST FOLLOW_section_header_in_def_body_procedure_section2808	= { FOLLOW_section_header_in_def_body_procedure_section2808_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_import_in_def_body_procedure_section2816  */
static	ANTLR3_BITWORD FOLLOW_section_import_in_def_body_procedure_section2816_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0084580000000000), ANTLR3_UINT64_LIT(0x0000000859FE9F78) };
static  ANTLR3_BITSET_LIST FOLLOW_section_import_in_def_body_procedure_section2816	= { FOLLOW_section_import_in_def_body_procedure_section2816_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_parameter_in_def_body_procedure_section2827  */
static	ANTLR3_BITWORD FOLLOW_section_parameter_in_def_body_procedure_section2827_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0084580000000000), ANTLR3_UINT64_LIT(0x0000000859FE9F78) };
static  ANTLR3_BITSET_LIST FOLLOW_section_parameter_in_def_body_procedure_section2827	= { FOLLOW_section_parameter_in_def_body_procedure_section2827_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_property_in_def_body_procedure_section2839  */
static	ANTLR3_BITWORD FOLLOW_section_property_in_def_body_procedure_section2839_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0084580000000000), ANTLR3_UINT64_LIT(0x0000000841F81F60) };
static  ANTLR3_BITSET_LIST FOLLOW_section_property_in_def_body_procedure_section2839	= { FOLLOW_section_property_in_def_body_procedure_section2839_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_composite_structure_in_def_body_procedure_section2852  */
static	ANTLR3_BITWORD FOLLOW_section_composite_structure_in_def_body_procedure_section2852_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0080580000000000), ANTLR3_UINT64_LIT(0x0000000840901F60) };
static  ANTLR3_BITSET_LIST FOLLOW_section_composite_structure_in_def_body_procedure_section2852	= { FOLLOW_section_composite_structure_in_def_body_procedure_section2852_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_behavior_in_def_body_procedure_section2864  */
static	ANTLR3_BITWORD FOLLOW_section_behavior_in_def_body_procedure_section2864_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000100000000000), ANTLR3_UINT64_LIT(0x0000000000001440) };
static  ANTLR3_BITSET_LIST FOLLOW_section_behavior_in_def_body_procedure_section2864	= { FOLLOW_section_behavior_in_def_body_procedure_section2864_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_statemachine_in_def_body_procedure_section2872  */
static	ANTLR3_BITWORD FOLLOW_section_statemachine_in_def_body_procedure_section2872_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000100000000000), ANTLR3_UINT64_LIT(0x0000000000001440) };
static  ANTLR3_BITSET_LIST FOLLOW_section_statemachine_in_def_body_procedure_section2872	= { FOLLOW_section_statemachine_in_def_body_procedure_section2872_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_model_of_computation_in_def_body_procedure_section2887  */
static	ANTLR3_BITWORD FOLLOW_section_model_of_computation_in_def_body_procedure_section2887_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000100000000000), ANTLR3_UINT64_LIT(0x0000000000001440) };
static  ANTLR3_BITSET_LIST FOLLOW_section_model_of_computation_in_def_body_procedure_section2887	= { FOLLOW_section_model_of_computation_in_def_body_procedure_section2887_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_model_of_execution_in_def_body_procedure_section2895  */
static	ANTLR3_BITWORD FOLLOW_section_model_of_execution_in_def_body_procedure_section2895_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000100000000000), ANTLR3_UINT64_LIT(0x0000000000001440) };
static  ANTLR3_BITSET_LIST FOLLOW_section_model_of_execution_in_def_body_procedure_section2895	= { FOLLOW_section_model_of_execution_in_def_body_procedure_section2895_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_model_of_interaction_in_def_body_procedure_section2903  */
static	ANTLR3_BITWORD FOLLOW_section_model_of_interaction_in_def_body_procedure_section2903_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000100000000000), ANTLR3_UINT64_LIT(0x0000000000001440) };
static  ANTLR3_BITSET_LIST FOLLOW_section_model_of_interaction_in_def_body_procedure_section2903	= { FOLLOW_section_model_of_interaction_in_def_body_procedure_section2903_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_modifier_declaration_in_def_body_procedure_simplif2939  */
static	ANTLR3_BITWORD FOLLOW_modifier_declaration_in_def_body_procedure_simplif2939_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xE14A0400027B0000), ANTLR3_UINT64_LIT(0x0000000180000084), ANTLR3_UINT64_LIT(0x4404000000010048), ANTLR3_UINT64_LIT(0x0C00000200000004), ANTLR3_UINT64_LIT(0x000000000C400200) };
static  ANTLR3_BITSET_LIST FOLLOW_modifier_declaration_in_def_body_procedure_simplif2939	= { FOLLOW_modifier_declaration_in_def_body_procedure_simplif2939_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_decl_variable_in_def_body_procedure_simplif2955  */
static	ANTLR3_BITWORD FOLLOW_decl_variable_in_def_body_procedure_simplif2955_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xE14A0400027B0000), ANTLR3_UINT64_LIT(0x0008000180000084), ANTLR3_UINT64_LIT(0x4406040004010048), ANTLR3_UINT64_LIT(0x1C00120A20200004), ANTLR3_UINT64_LIT(0x000000004C400A00) };
static  ANTLR3_BITSET_LIST FOLLOW_decl_variable_in_def_body_procedure_simplif2955	= { FOLLOW_decl_variable_in_def_body_procedure_simplif2955_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_any_def_statemachine_in_def_body_procedure_simplif2968  */
static	ANTLR3_BITWORD FOLLOW_any_def_statemachine_in_def_body_procedure_simplif2968_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xE14A0400027B0000), ANTLR3_UINT64_LIT(0x0008000180000084), ANTLR3_UINT64_LIT(0x4406040004010048), ANTLR3_UINT64_LIT(0x1C00120A20200004), ANTLR3_UINT64_LIT(0x000000004C400A00) };
static  ANTLR3_BITSET_LIST FOLLOW_any_def_statemachine_in_def_body_procedure_simplif2968	= { FOLLOW_any_def_statemachine_in_def_body_procedure_simplif2968_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_state_activity_in_def_body_procedure_simplif2979  */
static	ANTLR3_BITWORD FOLLOW_def_state_activity_in_def_body_procedure_simplif2979_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xE14A0400027B0000), ANTLR3_UINT64_LIT(0x0008000180000084), ANTLR3_UINT64_LIT(0x4406040004010048), ANTLR3_UINT64_LIT(0x1C00120A20200004), ANTLR3_UINT64_LIT(0x000000004C400A00) };
static  ANTLR3_BITSET_LIST FOLLOW_def_state_activity_in_def_body_procedure_simplif2979	= { FOLLOW_def_state_activity_in_def_body_procedure_simplif2979_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_routine_in_section_composite_structure3011  */
static	ANTLR3_BITWORD FOLLOW_section_routine_in_section_composite_structure3011_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_section_routine_in_section_composite_structure3011	= { FOLLOW_section_routine_in_section_composite_structure3011_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_procedure_in_section_composite_structure3017  */
static	ANTLR3_BITWORD FOLLOW_section_procedure_in_section_composite_structure3017_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_section_procedure_in_section_composite_structure3017	= { FOLLOW_section_procedure_in_section_composite_structure3017_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_composite_generic_in_section_composite_structure3024  */
static	ANTLR3_BITWORD FOLLOW_section_composite_generic_in_section_composite_structure3024_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_section_composite_generic_in_section_composite_structure3024	= { FOLLOW_section_composite_generic_in_section_composite_structure3024_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_machine_model_in_section_composite_structure3030  */
static	ANTLR3_BITWORD FOLLOW_section_machine_model_in_section_composite_structure3030_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_section_machine_model_in_section_composite_structure3030	= { FOLLOW_section_machine_model_in_section_composite_structure3030_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_machine_prototype_in_section_composite_structure3036  */
static	ANTLR3_BITWORD FOLLOW_section_machine_prototype_in_section_composite_structure3036_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_section_machine_prototype_in_section_composite_structure3036	= { FOLLOW_section_machine_prototype_in_section_composite_structure3036_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_machine_instance_in_section_composite_structure3042  */
static	ANTLR3_BITWORD FOLLOW_section_machine_instance_in_section_composite_structure3042_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_section_machine_instance_in_section_composite_structure3042	= { FOLLOW_section_machine_instance_in_section_composite_structure3042_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_section_composite_generic3056  */
static	ANTLR3_BITWORD FOLLOW_set_in_section_composite_generic3056_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x00000000027B0000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x240C000000010000), ANTLR3_UINT64_LIT(0x0C00000200000004), ANTLR3_UINT64_LIT(0x0000000000400200) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_section_composite_generic3056	= { FOLLOW_set_in_section_composite_generic3056_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_executable_machine_in_section_composite_generic3081  */
static	ANTLR3_BITWORD FOLLOW_executable_machine_in_section_composite_generic3081_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x00000000027B0000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x240C000000010000), ANTLR3_UINT64_LIT(0x0C00000200000004), ANTLR3_UINT64_LIT(0x0000000000400200) };
static  ANTLR3_BITSET_LIST FOLLOW_executable_machine_in_section_composite_generic3081	= { FOLLOW_executable_machine_in_section_composite_generic3081_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_203_in_section_machine_model3103  */
static	ANTLR3_BITWORD FOLLOW_203_in_section_machine_model3103_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2404000000010000), ANTLR3_UINT64_LIT(0x0800000200000004), ANTLR3_UINT64_LIT(0x0000000000400200) };
static  ANTLR3_BITSET_LIST FOLLOW_203_in_section_machine_model3103	= { FOLLOW_203_in_section_machine_model3103_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_executable_model_definiton_in_section_machine_model3112  */
static	ANTLR3_BITWORD FOLLOW_executable_model_definiton_in_section_machine_model3112_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2404000000010000), ANTLR3_UINT64_LIT(0x0800000200000004), ANTLR3_UINT64_LIT(0x0000000000400200) };
static  ANTLR3_BITSET_LIST FOLLOW_executable_model_definiton_in_section_machine_model3112	= { FOLLOW_executable_model_definiton_in_section_machine_model3112_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_215_in_section_machine_prototype3134  */
static	ANTLR3_BITWORD FOLLOW_215_in_section_machine_prototype3134_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2404000000010000), ANTLR3_UINT64_LIT(0x0800000200000004), ANTLR3_UINT64_LIT(0x0000000000400200) };
static  ANTLR3_BITSET_LIST FOLLOW_215_in_section_machine_prototype3134	= { FOLLOW_215_in_section_machine_prototype3134_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_executable_model_definiton_in_section_machine_prototype3143  */
static	ANTLR3_BITWORD FOLLOW_executable_model_definiton_in_section_machine_prototype3143_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2404000000010000), ANTLR3_UINT64_LIT(0x0800000200000004), ANTLR3_UINT64_LIT(0x0000000000400200) };
static  ANTLR3_BITSET_LIST FOLLOW_executable_model_definiton_in_section_machine_prototype3143	= { FOLLOW_executable_model_definiton_in_section_machine_prototype3143_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_197_in_section_machine_instance3160  */
static	ANTLR3_BITWORD FOLLOW_197_in_section_machine_instance3160_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x040C000004010000), ANTLR3_UINT64_LIT(0x0000000920000000), ANTLR3_UINT64_LIT(0x0000000000400200) };
static  ANTLR3_BITSET_LIST FOLLOW_197_in_section_machine_instance3160	= { FOLLOW_197_in_section_machine_instance3160_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_executable_instance_definiton_in_section_machine_instance3169  */
static	ANTLR3_BITWORD FOLLOW_executable_instance_definiton_in_section_machine_instance3169_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x040C000004010000), ANTLR3_UINT64_LIT(0x0000000920000000), ANTLR3_UINT64_LIT(0x0000000000400200) };
static  ANTLR3_BITSET_LIST FOLLOW_executable_instance_definiton_in_section_machine_instance3169	= { FOLLOW_executable_instance_definiton_in_section_machine_instance3169_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_executable_modifier_specifier_in_executable_machine3199  */
static	ANTLR3_BITWORD FOLLOW_executable_modifier_specifier_in_executable_machine3199_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x00000000027B0000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x240C000000010000), ANTLR3_UINT64_LIT(0x0C00000200000004), ANTLR3_UINT64_LIT(0x0000000000400200) };
static  ANTLR3_BITSET_LIST FOLLOW_executable_modifier_specifier_in_executable_machine3199	= { FOLLOW_executable_modifier_specifier_in_executable_machine3199_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_machine_in_executable_machine3220  */
static	ANTLR3_BITWORD FOLLOW_def_machine_in_executable_machine3220_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_machine_in_executable_machine3220	= { FOLLOW_def_machine_in_executable_machine3220_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_any_def_statemachine_in_executable_machine3236  */
static	ANTLR3_BITWORD FOLLOW_any_def_statemachine_in_executable_machine3236_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_any_def_statemachine_in_executable_machine3236	= { FOLLOW_any_def_statemachine_in_executable_machine3236_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_decl_instance_in_executable_machine3252  */
static	ANTLR3_BITWORD FOLLOW_decl_instance_in_executable_machine3252_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_decl_instance_in_executable_machine3252	= { FOLLOW_decl_instance_in_executable_machine3252_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_executable_modifier_specifier_in_executable_model_definiton3286  */
static	ANTLR3_BITWORD FOLLOW_executable_modifier_specifier_in_executable_model_definiton3286_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0800000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_executable_modifier_specifier_in_executable_model_definiton3286	= { FOLLOW_executable_modifier_specifier_in_executable_model_definiton3286_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_machine_in_executable_model_definiton3307  */
static	ANTLR3_BITWORD FOLLOW_def_machine_in_executable_model_definiton3307_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_machine_in_executable_model_definiton3307	= { FOLLOW_def_machine_in_executable_model_definiton3307_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_statemachine_in_executable_model_definiton3329  */
static	ANTLR3_BITWORD FOLLOW_def_statemachine_in_executable_model_definiton3329_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_statemachine_in_executable_model_definiton3329	= { FOLLOW_def_statemachine_in_executable_model_definiton3329_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_instance_modifier_specifier_in_executable_instance_definiton3365  */
static	ANTLR3_BITWORD FOLLOW_instance_modifier_specifier_in_executable_instance_definiton3365_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0008000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_instance_modifier_specifier_in_executable_instance_definiton3365	= { FOLLOW_instance_modifier_specifier_in_executable_instance_definiton3365_bits, 5	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_decl_instance_in_executable_instance_definiton3384  */
static	ANTLR3_BITWORD FOLLOW_decl_instance_in_executable_instance_definiton3384_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_decl_instance_in_executable_instance_definiton3384	= { FOLLOW_decl_instance_in_executable_instance_definiton3384_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_307_in_decl_instance3421  */
static	ANTLR3_BITWORD FOLLOW_307_in_decl_instance3421_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000002000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0800000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_307_in_decl_instance3421	= { FOLLOW_307_in_decl_instance3421_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LT__in_decl_instance3438  */
static	ANTLR3_BITWORD FOLLOW_LT__in_decl_instance3438_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000008) };
static  ANTLR3_BITSET_LIST FOLLOW_LT__in_decl_instance3438	= { FOLLOW_LT__in_decl_instance3438_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_323_in_decl_instance3446  */
static	ANTLR3_BITWORD FOLLOW_323_in_decl_instance3446_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_323_in_decl_instance3446	= { FOLLOW_323_in_decl_instance3446_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_instance_machine_model_in_decl_instance3453  */
static	ANTLR3_BITWORD FOLLOW_instance_machine_model_in_decl_instance3453_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000800000) };
static  ANTLR3_BITSET_LIST FOLLOW_instance_machine_model_in_decl_instance3453	= { FOLLOW_instance_machine_model_in_decl_instance3453_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_decl_instance3465  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_decl_instance3465_bits[]	= { ANTLR3_UINT64_LIT(0x1000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0010000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_decl_instance3465	= { FOLLOW_COMMA_in_decl_instance3465_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_instance_count_in_decl_instance3468  */
static	ANTLR3_BITWORD FOLLOW_def_instance_count_in_decl_instance3468_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_def_instance_count_in_decl_instance3468	= { FOLLOW_def_instance_count_in_decl_instance3468_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_GT_in_decl_instance3477  */
static	ANTLR3_BITWORD FOLLOW_GT_in_decl_instance3477_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_GT_in_decl_instance3477	= { FOLLOW_GT_in_decl_instance3477_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_decl_instance3482  */
static	ANTLR3_BITWORD FOLLOW_ID_in_decl_instance3482_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000081), ANTLR3_UINT64_LIT(0x0000000000002080) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_decl_instance3482	= { FOLLOW_ID_in_decl_instance3482_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_StringLiteral_in_decl_instance3495  */
static	ANTLR3_BITWORD FOLLOW_StringLiteral_in_decl_instance3495_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000081), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_StringLiteral_in_decl_instance3495	= { FOLLOW_StringLiteral_in_decl_instance3495_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LPAREN_in_decl_instance3515  */
static	ANTLR3_BITWORD FOLLOW_LPAREN_in_decl_instance3515_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002042), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LPAREN_in_decl_instance3515	= { FOLLOW_LPAREN_in_decl_instance3515_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_instance_on_new_activity_in_decl_instance3524  */
static	ANTLR3_BITWORD FOLLOW_def_instance_on_new_activity_in_decl_instance3524_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_instance_on_new_activity_in_decl_instance3524	= { FOLLOW_def_instance_on_new_activity_in_decl_instance3524_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RPAREN_in_decl_instance3536  */
static	ANTLR3_BITWORD FOLLOW_RPAREN_in_decl_instance3536_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_RPAREN_in_decl_instance3536	= { FOLLOW_RPAREN_in_decl_instance3536_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_decl_instance3550  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_decl_instance3550_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_decl_instance3550	= { FOLLOW_SEMI_in_decl_instance3550_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_decl_instance3558  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_decl_instance3558_bits[]	= { ANTLR3_UINT64_LIT(0x000C000104400000), ANTLR3_UINT64_LIT(0x2000000000000101), ANTLR3_UINT64_LIT(0x000200003C001000), ANTLR3_UINT64_LIT(0x0480100400000000), ANTLR3_UINT64_LIT(0x0103F97E24C83881), ANTLR3_UINT64_LIT(0x020B1C00003F0400), ANTLR3_UINT64_LIT(0x00000001800000A6) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_decl_instance3558	= { FOLLOW_LCURLY_in_decl_instance3558_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_statement_in_decl_instance3566  */
static	ANTLR3_BITWORD FOLLOW_statement_in_decl_instance3566_bits[]	= { ANTLR3_UINT64_LIT(0x000C000104400000), ANTLR3_UINT64_LIT(0x2000000000000101), ANTLR3_UINT64_LIT(0x000200003C001000), ANTLR3_UINT64_LIT(0x0480100400000000), ANTLR3_UINT64_LIT(0x0103F97E24C83881), ANTLR3_UINT64_LIT(0x020B1C00003F0400), ANTLR3_UINT64_LIT(0x00000001800000A6) };
static  ANTLR3_BITSET_LIST FOLLOW_statement_in_decl_instance3566	= { FOLLOW_statement_in_decl_instance3566_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_instance_activity_in_decl_instance3578  */
static	ANTLR3_BITWORD FOLLOW_def_instance_activity_in_decl_instance3578_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0002000000000000), ANTLR3_UINT64_LIT(0x0000000400000000) };
static  ANTLR3_BITSET_LIST FOLLOW_def_instance_activity_in_decl_instance3578	= { FOLLOW_def_instance_activity_in_decl_instance3578_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_decl_instance3589  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_decl_instance3589_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_decl_instance3589	= { FOLLOW_RCURLY_in_decl_instance3589_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_instance_on_new_activity_parameter_in_def_instance_on_new_activity3612  */
static	ANTLR3_BITWORD FOLLOW_def_instance_on_new_activity_parameter_in_def_instance_on_new_activity3612_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_instance_on_new_activity_parameter_in_def_instance_on_new_activity3612	= { FOLLOW_def_instance_on_new_activity_parameter_in_def_instance_on_new_activity3612_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_def_instance_on_new_activity3623  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_def_instance_on_new_activity3623_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_def_instance_on_new_activity3623	= { FOLLOW_COMMA_in_def_instance_on_new_activity3623_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_instance_on_new_activity_parameter_in_def_instance_on_new_activity3625  */
static	ANTLR3_BITWORD FOLLOW_def_instance_on_new_activity_parameter_in_def_instance_on_new_activity3625_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_instance_on_new_activity_parameter_in_def_instance_on_new_activity3625	= { FOLLOW_def_instance_on_new_activity_parameter_in_def_instance_on_new_activity3625_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_lvalue_in_def_instance_on_new_activity_parameter3659  */
static	ANTLR3_BITWORD FOLLOW_lvalue_in_def_instance_on_new_activity_parameter3659_bits[]	= { ANTLR3_UINT64_LIT(0x00000000002000D0) };
static  ANTLR3_BITSET_LIST FOLLOW_lvalue_in_def_instance_on_new_activity_parameter3659	= { FOLLOW_lvalue_in_def_instance_on_new_activity_parameter3659_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_op_assign_param_in_def_instance_on_new_activity_parameter3664  */
static	ANTLR3_BITWORD FOLLOW_op_assign_param_in_def_instance_on_new_activity_parameter3664_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_op_assign_param_in_def_instance_on_new_activity_parameter3664	= { FOLLOW_op_assign_param_in_def_instance_on_new_activity_parameter3664_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_def_instance_on_new_activity_parameter3669  */
static	ANTLR3_BITWORD FOLLOW_expression_in_def_instance_on_new_activity_parameter3669_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_def_instance_on_new_activity_parameter3669	= { FOLLOW_expression_in_def_instance_on_new_activity_parameter3669_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_def_instance_on_new_activity_parameter3682  */
static	ANTLR3_BITWORD FOLLOW_expression_in_def_instance_on_new_activity_parameter3682_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_def_instance_on_new_activity_parameter3682	= { FOLLOW_expression_in_def_instance_on_new_activity_parameter3682_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_op_assign_param3702  */
static	ANTLR3_BITWORD FOLLOW_set_in_op_assign_param3702_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_op_assign_param3702	= { FOLLOW_set_in_op_assign_param3702_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ASSIGN_REF_in_op_assign_param3718  */
static	ANTLR3_BITWORD FOLLOW_ASSIGN_REF_in_op_assign_param3718_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_ASSIGN_REF_in_op_assign_param3718	= { FOLLOW_ASSIGN_REF_in_op_assign_param3718_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ASSIGN_MACRO_in_op_assign_param3734  */
static	ANTLR3_BITWORD FOLLOW_ASSIGN_MACRO_in_op_assign_param3734_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_ASSIGN_MACRO_in_op_assign_param3734	= { FOLLOW_ASSIGN_MACRO_in_op_assign_param3734_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_177_in_def_instance_activity3761  */
static	ANTLR3_BITWORD FOLLOW_177_in_def_instance_activity3761_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_177_in_def_instance_activity3761	= { FOLLOW_177_in_def_instance_activity3761_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_block_statement_in_def_instance_activity3767  */
static	ANTLR3_BITWORD FOLLOW_block_statement_in_def_instance_activity3767_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_block_statement_in_def_instance_activity3767	= { FOLLOW_block_statement_in_def_instance_activity3767_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_226_in_def_instance_activity3775  */
static	ANTLR3_BITWORD FOLLOW_226_in_def_instance_activity3775_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_226_in_def_instance_activity3775	= { FOLLOW_226_in_def_instance_activity3775_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_block_statement_in_def_instance_activity3783  */
static	ANTLR3_BITWORD FOLLOW_block_statement_in_def_instance_activity3783_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_block_statement_in_def_instance_activity3783	= { FOLLOW_block_statement_in_def_instance_activity3783_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_171_in_section_behavior3805  */
static	ANTLR3_BITWORD FOLLOW_171_in_section_behavior3805_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x00000000027B0000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x240C000000010000), ANTLR3_UINT64_LIT(0x0C00000200000004), ANTLR3_UINT64_LIT(0x0000000000400200) };
static  ANTLR3_BITSET_LIST FOLLOW_171_in_section_behavior3805	= { FOLLOW_171_in_section_behavior3805_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_executable_machine_in_section_behavior3814  */
static	ANTLR3_BITWORD FOLLOW_executable_machine_in_section_behavior3814_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x00000000027B0000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x240C000000010000), ANTLR3_UINT64_LIT(0x0C00000200000004), ANTLR3_UINT64_LIT(0x0000000000400200) };
static  ANTLR3_BITSET_LIST FOLLOW_executable_machine_in_section_behavior3814	= { FOLLOW_executable_machine_in_section_behavior3814_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LBRACKET_in_def_instance_count3857  */
static	ANTLR3_BITWORD FOLLOW_LBRACKET_in_def_instance_count3857_bits[]	= { ANTLR3_UINT64_LIT(0x0084000000000000), ANTLR3_UINT64_LIT(0x0100000000000000), ANTLR3_UINT64_LIT(0x0000000000000200) };
static  ANTLR3_BITSET_LIST FOLLOW_LBRACKET_in_def_instance_count3857	= { FOLLOW_LBRACKET_in_def_instance_count3857_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_integer_constant_in_def_instance_count3868  */
static	ANTLR3_BITWORD FOLLOW_integer_constant_in_def_instance_count3868_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000) };
static  ANTLR3_BITSET_LIST FOLLOW_integer_constant_in_def_instance_count3868	= { FOLLOW_integer_constant_in_def_instance_count3868_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_def_instance_count3880  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_def_instance_count3880_bits[]	= { ANTLR3_UINT64_LIT(0x0084000000000000), ANTLR3_UINT64_LIT(0x0100000000000000), ANTLR3_UINT64_LIT(0x0000000000000200) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_def_instance_count3880	= { FOLLOW_COMMA_in_def_instance_count3880_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_integer_constant_in_def_instance_count3893  */
static	ANTLR3_BITWORD FOLLOW_integer_constant_in_def_instance_count3893_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x1000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_integer_constant_in_def_instance_count3893	= { FOLLOW_integer_constant_in_def_instance_count3893_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_def_instance_count3907  */
static	ANTLR3_BITWORD FOLLOW_set_in_def_instance_count3907_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x1000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_def_instance_count3907	= { FOLLOW_set_in_def_instance_count3907_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_STAR_in_def_instance_count3939  */
static	ANTLR3_BITWORD FOLLOW_STAR_in_def_instance_count3939_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x1000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_STAR_in_def_instance_count3939	= { FOLLOW_STAR_in_def_instance_count3939_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_PLUS_in_def_instance_count3951  */
static	ANTLR3_BITWORD FOLLOW_PLUS_in_def_instance_count3951_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x1000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_PLUS_in_def_instance_count3951	= { FOLLOW_PLUS_in_def_instance_count3951_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RBRACKET_in_def_instance_count3968  */
static	ANTLR3_BITWORD FOLLOW_RBRACKET_in_def_instance_count3968_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RBRACKET_in_def_instance_count3968	= { FOLLOW_RBRACKET_in_def_instance_count3968_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LPAREN_in_def_instance_count3976  */
static	ANTLR3_BITWORD FOLLOW_LPAREN_in_def_instance_count3976_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x8000020000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_LPAREN_in_def_instance_count3976	= { FOLLOW_LPAREN_in_def_instance_count3976_bits, 5	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_instance_count_atom_in_def_instance_count3983  */
static	ANTLR3_BITWORD FOLLOW_def_instance_count_atom_in_def_instance_count3983_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x8000020000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_def_instance_count_atom_in_def_instance_count3983	= { FOLLOW_def_instance_count_atom_in_def_instance_count3983_bits, 5	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_def_instance_count3993  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_def_instance_count3993_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x8000020000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_def_instance_count3993	= { FOLLOW_COMMA_in_def_instance_count3993_bits, 5	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_instance_count_atom_in_def_instance_count3998  */
static	ANTLR3_BITWORD FOLLOW_def_instance_count_atom_in_def_instance_count3998_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x8000020000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_def_instance_count_atom_in_def_instance_count3998	= { FOLLOW_def_instance_count_atom_in_def_instance_count3998_bits, 5	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RPAREN_in_def_instance_count4009  */
static	ANTLR3_BITWORD FOLLOW_RPAREN_in_def_instance_count4009_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RPAREN_in_def_instance_count4009	= { FOLLOW_RPAREN_in_def_instance_count4009_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_297_in_def_instance_count_atom4028  */
static	ANTLR3_BITWORD FOLLOW_297_in_def_instance_count_atom4028_bits[]	= { ANTLR3_UINT64_LIT(0x0084000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_297_in_def_instance_count_atom4028	= { FOLLOW_297_in_def_instance_count_atom4028_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_integer_constant_in_def_instance_count_atom4032  */
static	ANTLR3_BITWORD FOLLOW_integer_constant_in_def_instance_count_atom4032_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_integer_constant_in_def_instance_count_atom4032	= { FOLLOW_integer_constant_in_def_instance_count_atom4032_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_319_in_def_instance_count_atom4040  */
static	ANTLR3_BITWORD FOLLOW_319_in_def_instance_count_atom4040_bits[]	= { ANTLR3_UINT64_LIT(0x0084000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_319_in_def_instance_count_atom4040	= { FOLLOW_319_in_def_instance_count_atom4040_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_integer_constant_in_def_instance_count_atom4045  */
static	ANTLR3_BITWORD FOLLOW_integer_constant_in_def_instance_count_atom4045_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_integer_constant_in_def_instance_count_atom4045	= { FOLLOW_integer_constant_in_def_instance_count_atom4045_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_317_in_def_machine4075  */
static	ANTLR3_BITWORD FOLLOW_317_in_def_machine4075_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_317_in_def_machine4075	= { FOLLOW_317_in_def_machine4075_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LT__in_def_machine4082  */
static	ANTLR3_BITWORD FOLLOW_LT__in_def_machine4082_bits[]	= { ANTLR3_UINT64_LIT(0x1004200000000000), ANTLR3_UINT64_LIT(0x0000000000000080), ANTLR3_UINT64_LIT(0x0000000001800000), ANTLR3_UINT64_LIT(0x0000800000000000), ANTLR3_UINT64_LIT(0x0110000054000002), ANTLR3_UINT64_LIT(0x0200100000004082) };
static  ANTLR3_BITSET_LIST FOLLOW_LT__in_def_machine4082	= { FOLLOW_LT__in_def_machine4082_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_321_in_def_machine4092  */
static	ANTLR3_BITWORD FOLLOW_321_in_def_machine4092_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000001800000), ANTLR3_UINT64_LIT(0x0000800000000000), ANTLR3_UINT64_LIT(0x0100000054000002), ANTLR3_UINT64_LIT(0x0200100000004000) };
static  ANTLR3_BITSET_LIST FOLLOW_321_in_def_machine4092	= { FOLLOW_321_in_def_machine4092_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_executable_specifier_in_def_machine4098  */
static	ANTLR3_BITWORD FOLLOW_executable_specifier_in_def_machine4098_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000800000) };
static  ANTLR3_BITSET_LIST FOLLOW_executable_specifier_in_def_machine4098	= { FOLLOW_executable_specifier_in_def_machine4098_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_def_machine4108  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_def_machine4108_bits[]	= { ANTLR3_UINT64_LIT(0x1000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0010000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_def_machine4108	= { FOLLOW_COMMA_in_def_machine4108_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_instance_count_in_def_machine4111  */
static	ANTLR3_BITWORD FOLLOW_def_instance_count_in_def_machine4111_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_def_instance_count_in_def_machine4111	= { FOLLOW_def_instance_count_in_def_machine4111_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_instance_count_in_def_machine4124  */
static	ANTLR3_BITWORD FOLLOW_def_instance_count_in_def_machine4124_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_def_instance_count_in_def_machine4124	= { FOLLOW_def_instance_count_in_def_machine4124_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_GT_in_def_machine4137  */
static	ANTLR3_BITWORD FOLLOW_GT_in_def_machine4137_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_GT_in_def_machine4137	= { FOLLOW_GT_in_def_machine4137_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_def_machine4147  */
static	ANTLR3_BITWORD FOLLOW_ID_in_def_machine4147_bits[]	= { ANTLR3_UINT64_LIT(0x1000000000000000), ANTLR3_UINT64_LIT(0x0000000000000081), ANTLR3_UINT64_LIT(0x0000000800002000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_def_machine4147	= { FOLLOW_ID_in_def_machine4147_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_StringLiteral_in_def_machine4160  */
static	ANTLR3_BITWORD FOLLOW_StringLiteral_in_def_machine4160_bits[]	= { ANTLR3_UINT64_LIT(0x1000000000000000), ANTLR3_UINT64_LIT(0x0000000000000081), ANTLR3_UINT64_LIT(0x0000000800000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_StringLiteral_in_def_machine4160	= { FOLLOW_StringLiteral_in_def_machine4160_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_machine_parameters_in_def_machine4177  */
static	ANTLR3_BITWORD FOLLOW_def_machine_parameters_in_def_machine4177_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001), ANTLR3_UINT64_LIT(0x0000000800000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_def_machine_parameters_in_def_machine4177	= { FOLLOW_def_machine_parameters_in_def_machine4177_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_machine_returns_in_def_machine4186  */
static	ANTLR3_BITWORD FOLLOW_def_machine_returns_in_def_machine4186_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_def_machine_returns_in_def_machine4186	= { FOLLOW_def_machine_returns_in_def_machine4186_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_body_machine_in_def_machine4195  */
static	ANTLR3_BITWORD FOLLOW_def_body_machine_in_def_machine4195_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_body_machine_in_def_machine4195	= { FOLLOW_def_body_machine_in_def_machine4195_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_188_in_def_body_machine_using_section_header_predicat4208  */
static	ANTLR3_BITWORD FOLLOW_188_in_def_body_machine_using_section_header_predicat4208_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_188_in_def_body_machine_using_section_header_predicat4208	= { FOLLOW_188_in_def_body_machine_using_section_header_predicat4208_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_192_in_def_body_machine_using_section_import_predicat4219  */
static	ANTLR3_BITWORD FOLLOW_192_in_def_body_machine_using_section_import_predicat4219_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_192_in_def_body_machine_using_section_import_predicat4219	= { FOLLOW_192_in_def_body_machine_using_section_import_predicat4219_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_body_machine_using_section_header_predicat_in_def_body_machine_using_section_predicat4313  */
static	ANTLR3_BITWORD FOLLOW_def_body_machine_using_section_header_predicat_in_def_body_machine_using_section_predicat4313_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_body_machine_using_section_header_predicat_in_def_body_machine_using_section_predicat4313	= { FOLLOW_def_body_machine_using_section_header_predicat_in_def_body_machine_using_section_predicat4313_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_body_machine_using_section_import_predicat_in_def_body_machine_using_section_predicat4318  */
static	ANTLR3_BITWORD FOLLOW_def_body_machine_using_section_import_predicat_in_def_body_machine_using_section_predicat4318_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_body_machine_using_section_import_predicat_in_def_body_machine_using_section_predicat4318	= { FOLLOW_def_body_machine_using_section_import_predicat_in_def_body_machine_using_section_predicat4318_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_body_machine_using_section_parameter_predicat_in_def_body_machine_using_section_predicat4323  */
static	ANTLR3_BITWORD FOLLOW_def_body_machine_using_section_parameter_predicat_in_def_body_machine_using_section_predicat4323_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_body_machine_using_section_parameter_predicat_in_def_body_machine_using_section_predicat4323	= { FOLLOW_def_body_machine_using_section_parameter_predicat_in_def_body_machine_using_section_predicat4323_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_body_machine_using_section_property_predicat_in_def_body_machine_using_section_predicat4328  */
static	ANTLR3_BITWORD FOLLOW_def_body_machine_using_section_property_predicat_in_def_body_machine_using_section_predicat4328_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_body_machine_using_section_property_predicat_in_def_body_machine_using_section_predicat4328	= { FOLLOW_def_body_machine_using_section_property_predicat_in_def_body_machine_using_section_predicat4328_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_201_in_def_body_machine_using_section_predicat4334  */
static	ANTLR3_BITWORD FOLLOW_201_in_def_body_machine_using_section_predicat4334_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_201_in_def_body_machine_using_section_predicat4334	= { FOLLOW_201_in_def_body_machine_using_section_predicat4334_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_221_in_def_body_machine_using_section_predicat4338  */
static	ANTLR3_BITWORD FOLLOW_221_in_def_body_machine_using_section_predicat4338_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_221_in_def_body_machine_using_section_predicat4338	= { FOLLOW_221_in_def_body_machine_using_section_predicat4338_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_212_in_def_body_machine_using_section_predicat4342  */
static	ANTLR3_BITWORD FOLLOW_212_in_def_body_machine_using_section_predicat4342_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_212_in_def_body_machine_using_section_predicat4342	= { FOLLOW_212_in_def_body_machine_using_section_predicat4342_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_173_in_def_body_machine_using_section_predicat4348  */
static	ANTLR3_BITWORD FOLLOW_173_in_def_body_machine_using_section_predicat4348_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_173_in_def_body_machine_using_section_predicat4348	= { FOLLOW_173_in_def_body_machine_using_section_predicat4348_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_200_in_def_body_machine_using_section_predicat4352  */
static	ANTLR3_BITWORD FOLLOW_200_in_def_body_machine_using_section_predicat4352_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_200_in_def_body_machine_using_section_predicat4352	= { FOLLOW_200_in_def_body_machine_using_section_predicat4352_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_217_in_def_body_machine_using_section_predicat4357  */
static	ANTLR3_BITWORD FOLLOW_217_in_def_body_machine_using_section_predicat4357_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_217_in_def_body_machine_using_section_predicat4357	= { FOLLOW_217_in_def_body_machine_using_section_predicat4357_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_227_in_def_body_machine_using_section_predicat4363  */
static	ANTLR3_BITWORD FOLLOW_227_in_def_body_machine_using_section_predicat4363_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_227_in_def_body_machine_using_section_predicat4363	= { FOLLOW_227_in_def_body_machine_using_section_predicat4363_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_171_in_def_body_machine_using_section_predicat4369  */
static	ANTLR3_BITWORD FOLLOW_171_in_def_body_machine_using_section_predicat4369_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_171_in_def_body_machine_using_section_predicat4369	= { FOLLOW_171_in_def_body_machine_using_section_predicat4369_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_231_in_def_body_machine_using_section_predicat4373  */
static	ANTLR3_BITWORD FOLLOW_231_in_def_body_machine_using_section_predicat4373_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_231_in_def_body_machine_using_section_predicat4373	= { FOLLOW_231_in_def_body_machine_using_section_predicat4373_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_202_in_def_body_machine_using_section_predicat4381  */
static	ANTLR3_BITWORD FOLLOW_202_in_def_body_machine_using_section_predicat4381_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_202_in_def_body_machine_using_section_predicat4381	= { FOLLOW_202_in_def_body_machine_using_section_predicat4381_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_204_in_def_body_machine_using_section_predicat4385  */
static	ANTLR3_BITWORD FOLLOW_204_in_def_body_machine_using_section_predicat4385_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_204_in_def_body_machine_using_section_predicat4385	= { FOLLOW_204_in_def_body_machine_using_section_predicat4385_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_172_in_def_body_machine_using_section_predicat4389  */
static	ANTLR3_BITWORD FOLLOW_172_in_def_body_machine_using_section_predicat4389_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_172_in_def_body_machine_using_section_predicat4389	= { FOLLOW_172_in_def_body_machine_using_section_predicat4389_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_198_in_def_body_machine_using_section_predicat4393  */
static	ANTLR3_BITWORD FOLLOW_198_in_def_body_machine_using_section_predicat4393_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_198_in_def_body_machine_using_section_predicat4393	= { FOLLOW_198_in_def_body_machine_using_section_predicat4393_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_def_body_machine4407  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_def_body_machine4407_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x1084580000000000), ANTLR3_UINT64_LIT(0x0000000859FE9F79) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_def_body_machine4407	= { FOLLOW_LCURLY_in_def_body_machine4407_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_body_machine_section_in_def_body_machine4424  */
static	ANTLR3_BITWORD FOLLOW_def_body_machine_section_in_def_body_machine4424_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_def_body_machine_section_in_def_body_machine4424	= { FOLLOW_def_body_machine_section_in_def_body_machine4424_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_def_body_machine4437  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_def_body_machine4437_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_def_body_machine4437	= { FOLLOW_RCURLY_in_def_body_machine4437_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_header_in_def_body_machine_section4450  */
static	ANTLR3_BITWORD FOLLOW_section_header_in_def_body_machine_section4450_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0084580000000000), ANTLR3_UINT64_LIT(0x0000000859FE9F79) };
static  ANTLR3_BITSET_LIST FOLLOW_section_header_in_def_body_machine_section4450	= { FOLLOW_section_header_in_def_body_machine_section4450_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_import_in_def_body_machine_section4458  */
static	ANTLR3_BITWORD FOLLOW_section_import_in_def_body_machine_section4458_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0084580000000000), ANTLR3_UINT64_LIT(0x0000000859FE9F78) };
static  ANTLR3_BITSET_LIST FOLLOW_section_import_in_def_body_machine_section4458	= { FOLLOW_section_import_in_def_body_machine_section4458_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_parameter_in_def_body_machine_section4469  */
static	ANTLR3_BITWORD FOLLOW_section_parameter_in_def_body_machine_section4469_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0084580000000000), ANTLR3_UINT64_LIT(0x0000000859FE9F78) };
static  ANTLR3_BITSET_LIST FOLLOW_section_parameter_in_def_body_machine_section4469	= { FOLLOW_section_parameter_in_def_body_machine_section4469_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_property_in_def_body_machine_section4491  */
static	ANTLR3_BITWORD FOLLOW_section_property_in_def_body_machine_section4491_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0084580000000000), ANTLR3_UINT64_LIT(0x0000000841F81F60) };
static  ANTLR3_BITSET_LIST FOLLOW_section_property_in_def_body_machine_section4491	= { FOLLOW_section_property_in_def_body_machine_section4491_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_composite_structure_in_def_body_machine_section4504  */
static	ANTLR3_BITWORD FOLLOW_section_composite_structure_in_def_body_machine_section4504_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0080580000000000), ANTLR3_UINT64_LIT(0x0000000840901F60) };
static  ANTLR3_BITSET_LIST FOLLOW_section_composite_structure_in_def_body_machine_section4504	= { FOLLOW_section_composite_structure_in_def_body_machine_section4504_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_behavior_in_def_body_machine_section4516  */
static	ANTLR3_BITWORD FOLLOW_section_behavior_in_def_body_machine_section4516_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000100000000000), ANTLR3_UINT64_LIT(0x0000000000001440) };
static  ANTLR3_BITSET_LIST FOLLOW_section_behavior_in_def_body_machine_section4516	= { FOLLOW_section_behavior_in_def_body_machine_section4516_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_statemachine_in_def_body_machine_section4524  */
static	ANTLR3_BITWORD FOLLOW_section_statemachine_in_def_body_machine_section4524_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000100000000000), ANTLR3_UINT64_LIT(0x0000000000001440) };
static  ANTLR3_BITSET_LIST FOLLOW_section_statemachine_in_def_body_machine_section4524	= { FOLLOW_section_statemachine_in_def_body_machine_section4524_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_model_of_computation_in_def_body_machine_section4549  */
static	ANTLR3_BITWORD FOLLOW_section_model_of_computation_in_def_body_machine_section4549_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000100000000000), ANTLR3_UINT64_LIT(0x0000000000001440) };
static  ANTLR3_BITSET_LIST FOLLOW_section_model_of_computation_in_def_body_machine_section4549	= { FOLLOW_section_model_of_computation_in_def_body_machine_section4549_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_model_of_execution_in_def_body_machine_section4557  */
static	ANTLR3_BITWORD FOLLOW_section_model_of_execution_in_def_body_machine_section4557_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000100000000000), ANTLR3_UINT64_LIT(0x0000000000001440) };
static  ANTLR3_BITSET_LIST FOLLOW_section_model_of_execution_in_def_body_machine_section4557	= { FOLLOW_section_model_of_execution_in_def_body_machine_section4557_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_model_of_interaction_in_def_body_machine_section4565  */
static	ANTLR3_BITWORD FOLLOW_section_model_of_interaction_in_def_body_machine_section4565_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000100000000000), ANTLR3_UINT64_LIT(0x0000000000001440) };
static  ANTLR3_BITSET_LIST FOLLOW_section_model_of_interaction_in_def_body_machine_section4565	= { FOLLOW_section_model_of_interaction_in_def_body_machine_section4565_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_property_declaration_in_def_body_machine_simplif4593  */
static	ANTLR3_BITWORD FOLLOW_property_declaration_in_def_body_machine_simplif4593_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2208000000000000), ANTLR3_UINT64_LIT(0x400204000410004E), ANTLR3_UINT64_LIT(0x1040120821200001), ANTLR3_UINT64_LIT(0x000000004C504810) };
static  ANTLR3_BITSET_LIST FOLLOW_property_declaration_in_def_body_machine_simplif4593	= { FOLLOW_property_declaration_in_def_body_machine_simplif4593_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_moe_primitive_in_def_body_machine_simplif4609  */
static	ANTLR3_BITWORD FOLLOW_def_moe_primitive_in_def_body_machine_simplif4609_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xE14A840000000000), ANTLR3_UINT64_LIT(0x0000001784000084), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000800000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_def_moe_primitive_in_def_body_machine_simplif4609	= { FOLLOW_def_moe_primitive_in_def_body_machine_simplif4609_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_executable_modifier_specifier_in_any_def_statemachine4644  */
static	ANTLR3_BITWORD FOLLOW_executable_modifier_specifier_in_any_def_statemachine4644_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x00000000027B0000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0C00000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_executable_modifier_specifier_in_any_def_statemachine4644	= { FOLLOW_executable_modifier_specifier_in_any_def_statemachine4644_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_state_singleton_in_any_def_statemachine4666  */
static	ANTLR3_BITWORD FOLLOW_def_state_singleton_in_any_def_statemachine4666_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_state_singleton_in_any_def_statemachine4666	= { FOLLOW_def_state_singleton_in_any_def_statemachine4666_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_state_in_any_def_statemachine4682  */
static	ANTLR3_BITWORD FOLLOW_def_state_in_any_def_statemachine4682_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_state_in_any_def_statemachine4682	= { FOLLOW_def_state_in_any_def_statemachine4682_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_statemachine_in_any_def_statemachine4698  */
static	ANTLR3_BITWORD FOLLOW_def_statemachine_in_any_def_statemachine4698_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_statemachine_in_any_def_statemachine4698	= { FOLLOW_def_statemachine_in_any_def_statemachine4698_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_379_in_def_statemachine4736  */
static	ANTLR3_BITWORD FOLLOW_379_in_def_statemachine4736_bits[]	= { ANTLR3_UINT64_LIT(0x5004000000000000), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_379_in_def_statemachine4736	= { FOLLOW_379_in_def_statemachine4736_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LT__in_def_statemachine4743  */
static	ANTLR3_BITWORD FOLLOW_LT__in_def_statemachine4743_bits[]	= { ANTLR3_UINT64_LIT(0x1004200000000000), ANTLR3_UINT64_LIT(0x0000000000000080), ANTLR3_UINT64_LIT(0x0000000001800000), ANTLR3_UINT64_LIT(0x0000800000000000), ANTLR3_UINT64_LIT(0x0110000054000002), ANTLR3_UINT64_LIT(0x0200100000004082) };
static  ANTLR3_BITSET_LIST FOLLOW_LT__in_def_statemachine4743	= { FOLLOW_LT__in_def_statemachine4743_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_321_in_def_statemachine4753  */
static	ANTLR3_BITWORD FOLLOW_321_in_def_statemachine4753_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000001800000), ANTLR3_UINT64_LIT(0x0000800000000000), ANTLR3_UINT64_LIT(0x0100000054000002), ANTLR3_UINT64_LIT(0x0200100000004000) };
static  ANTLR3_BITSET_LIST FOLLOW_321_in_def_statemachine4753	= { FOLLOW_321_in_def_statemachine4753_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_executable_specifier_in_def_statemachine4759  */
static	ANTLR3_BITWORD FOLLOW_executable_specifier_in_def_statemachine4759_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000800000) };
static  ANTLR3_BITSET_LIST FOLLOW_executable_specifier_in_def_statemachine4759	= { FOLLOW_executable_specifier_in_def_statemachine4759_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_def_statemachine4769  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_def_statemachine4769_bits[]	= { ANTLR3_UINT64_LIT(0x1000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0010000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_def_statemachine4769	= { FOLLOW_COMMA_in_def_statemachine4769_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_instance_count_in_def_statemachine4772  */
static	ANTLR3_BITWORD FOLLOW_def_instance_count_in_def_statemachine4772_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_def_instance_count_in_def_statemachine4772	= { FOLLOW_def_instance_count_in_def_statemachine4772_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_instance_count_in_def_statemachine4785  */
static	ANTLR3_BITWORD FOLLOW_def_instance_count_in_def_statemachine4785_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_def_instance_count_in_def_statemachine4785	= { FOLLOW_def_instance_count_in_def_statemachine4785_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_GT_in_def_statemachine4798  */
static	ANTLR3_BITWORD FOLLOW_GT_in_def_statemachine4798_bits[]	= { ANTLR3_UINT64_LIT(0x5004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_GT_in_def_statemachine4798	= { FOLLOW_GT_in_def_statemachine4798_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_def_statemachine4814  */
static	ANTLR3_BITWORD FOLLOW_ID_in_def_statemachine4814_bits[]	= { ANTLR3_UINT64_LIT(0x1000000000000000), ANTLR3_UINT64_LIT(0x0000000000000081), ANTLR3_UINT64_LIT(0x0000000800002000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_def_statemachine4814	= { FOLLOW_ID_in_def_statemachine4814_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LBRACKET_in_def_statemachine4828  */
static	ANTLR3_BITWORD FOLLOW_LBRACKET_in_def_statemachine4828_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000200) };
static  ANTLR3_BITSET_LIST FOLLOW_LBRACKET_in_def_statemachine4828	= { FOLLOW_LBRACKET_in_def_statemachine4828_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LBRACKET_EXCEPT_in_def_statemachine4847  */
static	ANTLR3_BITWORD FOLLOW_LBRACKET_EXCEPT_in_def_statemachine4847_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000200) };
static  ANTLR3_BITSET_LIST FOLLOW_LBRACKET_EXCEPT_in_def_statemachine4847	= { FOLLOW_LBRACKET_EXCEPT_in_def_statemachine4847_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_def_statemachine4873  */
static	ANTLR3_BITWORD FOLLOW_ID_in_def_statemachine4873_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x1000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_def_statemachine4873	= { FOLLOW_ID_in_def_statemachine4873_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_def_statemachine4895  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_def_statemachine4895_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_def_statemachine4895	= { FOLLOW_COMMA_in_def_statemachine4895_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_def_statemachine4899  */
static	ANTLR3_BITWORD FOLLOW_ID_in_def_statemachine4899_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x1000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_def_statemachine4899	= { FOLLOW_ID_in_def_statemachine4899_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_STAR_in_def_statemachine4915  */
static	ANTLR3_BITWORD FOLLOW_STAR_in_def_statemachine4915_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x1000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_STAR_in_def_statemachine4915	= { FOLLOW_STAR_in_def_statemachine4915_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RBRACKET_in_def_statemachine4936  */
static	ANTLR3_BITWORD FOLLOW_RBRACKET_in_def_statemachine4936_bits[]	= { ANTLR3_UINT64_LIT(0x1000000000000000), ANTLR3_UINT64_LIT(0x0000000000000081), ANTLR3_UINT64_LIT(0x0000000800002000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_RBRACKET_in_def_statemachine4936	= { FOLLOW_RBRACKET_in_def_statemachine4936_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_StringLiteral_in_def_statemachine4953  */
static	ANTLR3_BITWORD FOLLOW_StringLiteral_in_def_statemachine4953_bits[]	= { ANTLR3_UINT64_LIT(0x1000000000000000), ANTLR3_UINT64_LIT(0x0000000000000081), ANTLR3_UINT64_LIT(0x0000000800000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_StringLiteral_in_def_statemachine4953	= { FOLLOW_StringLiteral_in_def_statemachine4953_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_machine_parameters_in_def_statemachine4970  */
static	ANTLR3_BITWORD FOLLOW_def_machine_parameters_in_def_statemachine4970_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001), ANTLR3_UINT64_LIT(0x0000000800000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_def_machine_parameters_in_def_statemachine4970	= { FOLLOW_def_machine_parameters_in_def_statemachine4970_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_machine_returns_in_def_statemachine4979  */
static	ANTLR3_BITWORD FOLLOW_def_machine_returns_in_def_statemachine4979_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_def_machine_returns_in_def_statemachine4979	= { FOLLOW_def_machine_returns_in_def_statemachine4979_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_body_statemachine_in_def_statemachine4988  */
static	ANTLR3_BITWORD FOLLOW_def_body_statemachine_in_def_statemachine4988_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_body_statemachine_in_def_statemachine4988	= { FOLLOW_def_body_statemachine_in_def_statemachine4988_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_def_body_statemachine5007  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_def_body_statemachine5007_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x1084500000000000), ANTLR3_UINT64_LIT(0x000000805BFE9F79) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_def_body_statemachine5007	= { FOLLOW_LCURLY_in_def_body_statemachine5007_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_header_in_def_body_statemachine5012  */
static	ANTLR3_BITWORD FOLLOW_section_header_in_def_body_statemachine5012_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0084500000000000), ANTLR3_UINT64_LIT(0x000000805BFE9F79) };
static  ANTLR3_BITSET_LIST FOLLOW_section_header_in_def_body_statemachine5012	= { FOLLOW_section_header_in_def_body_statemachine5012_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_import_in_def_body_statemachine5020  */
static	ANTLR3_BITWORD FOLLOW_section_import_in_def_body_statemachine5020_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0084500000000000), ANTLR3_UINT64_LIT(0x000000805BFE9F78) };
static  ANTLR3_BITSET_LIST FOLLOW_section_import_in_def_body_statemachine5020	= { FOLLOW_section_import_in_def_body_statemachine5020_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_parameter_in_def_body_statemachine5031  */
static	ANTLR3_BITWORD FOLLOW_section_parameter_in_def_body_statemachine5031_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0084500000000000), ANTLR3_UINT64_LIT(0x000000805BFE9F78) };
static  ANTLR3_BITSET_LIST FOLLOW_section_parameter_in_def_body_statemachine5031	= { FOLLOW_section_parameter_in_def_body_statemachine5031_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_property_in_def_body_statemachine5053  */
static	ANTLR3_BITWORD FOLLOW_section_property_in_def_body_statemachine5053_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0084500000000000), ANTLR3_UINT64_LIT(0x0000008043F81F60) };
static  ANTLR3_BITSET_LIST FOLLOW_section_property_in_def_body_statemachine5053	= { FOLLOW_section_property_in_def_body_statemachine5053_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_composite_structure_in_def_body_statemachine5066  */
static	ANTLR3_BITWORD FOLLOW_section_composite_structure_in_def_body_statemachine5066_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0080500000000000), ANTLR3_UINT64_LIT(0x0000008042901F60) };
static  ANTLR3_BITSET_LIST FOLLOW_section_composite_structure_in_def_body_statemachine5066	= { FOLLOW_section_composite_structure_in_def_body_statemachine5066_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_region_in_def_body_statemachine5076  */
static	ANTLR3_BITWORD FOLLOW_section_region_in_def_body_statemachine5076_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0000100000000000), ANTLR3_UINT64_LIT(0x0000008000001440) };
static  ANTLR3_BITSET_LIST FOLLOW_section_region_in_def_body_statemachine5076	= { FOLLOW_section_region_in_def_body_statemachine5076_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_transition_in_def_body_statemachine5085  */
static	ANTLR3_BITWORD FOLLOW_section_transition_in_def_body_statemachine5085_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0000100000000000), ANTLR3_UINT64_LIT(0x0000000000001440) };
static  ANTLR3_BITSET_LIST FOLLOW_section_transition_in_def_body_statemachine5085	= { FOLLOW_section_transition_in_def_body_statemachine5085_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_model_of_computation_in_def_body_statemachine5106  */
static	ANTLR3_BITWORD FOLLOW_section_model_of_computation_in_def_body_statemachine5106_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0000100000000000), ANTLR3_UINT64_LIT(0x0000000000001440) };
static  ANTLR3_BITSET_LIST FOLLOW_section_model_of_computation_in_def_body_statemachine5106	= { FOLLOW_section_model_of_computation_in_def_body_statemachine5106_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_model_of_execution_in_def_body_statemachine5114  */
static	ANTLR3_BITWORD FOLLOW_section_model_of_execution_in_def_body_statemachine5114_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0000100000000000), ANTLR3_UINT64_LIT(0x0000000000001440) };
static  ANTLR3_BITSET_LIST FOLLOW_section_model_of_execution_in_def_body_statemachine5114	= { FOLLOW_section_model_of_execution_in_def_body_statemachine5114_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_model_of_interaction_in_def_body_statemachine5122  */
static	ANTLR3_BITWORD FOLLOW_section_model_of_interaction_in_def_body_statemachine5122_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0000100000000000), ANTLR3_UINT64_LIT(0x0000000000001440) };
static  ANTLR3_BITSET_LIST FOLLOW_section_model_of_interaction_in_def_body_statemachine5122	= { FOLLOW_section_model_of_interaction_in_def_body_statemachine5122_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_def_body_statemachine5134  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_def_body_statemachine5134_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_def_body_statemachine5134	= { FOLLOW_RCURLY_in_def_body_statemachine5134_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_217_in_section_region5152  */
static	ANTLR3_BITWORD FOLLOW_217_in_section_region5152_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x00000000027B0000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0404000000010000), ANTLR3_UINT64_LIT(0x0C00000200000004), ANTLR3_UINT64_LIT(0x0000000000400200) };
static  ANTLR3_BITSET_LIST FOLLOW_217_in_section_region5152	= { FOLLOW_217_in_section_region5152_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_any_def_statemachine_in_section_region5167  */
static	ANTLR3_BITWORD FOLLOW_any_def_statemachine_in_section_region5167_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x00000000027B0000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0404000000010000), ANTLR3_UINT64_LIT(0x0C00000200000004), ANTLR3_UINT64_LIT(0x0000000000400200) };
static  ANTLR3_BITSET_LIST FOLLOW_any_def_statemachine_in_section_region5167	= { FOLLOW_any_def_statemachine_in_section_region5167_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_227_in_section_statemachine5188  */
static	ANTLR3_BITWORD FOLLOW_227_in_section_statemachine5188_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x00000000027B0000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0404000000010000), ANTLR3_UINT64_LIT(0x0C00000200000004), ANTLR3_UINT64_LIT(0x0000000000400200) };
static  ANTLR3_BITSET_LIST FOLLOW_227_in_section_statemachine5188	= { FOLLOW_227_in_section_statemachine5188_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_any_def_statemachine_in_section_statemachine5203  */
static	ANTLR3_BITWORD FOLLOW_any_def_statemachine_in_section_statemachine5203_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x00000000027B0000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0404000000010000), ANTLR3_UINT64_LIT(0x0C00000200000004), ANTLR3_UINT64_LIT(0x0000000000400200) };
static  ANTLR3_BITSET_LIST FOLLOW_any_def_statemachine_in_section_statemachine5203	= { FOLLOW_any_def_statemachine_in_section_statemachine5203_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_378_in_def_state5235  */
static	ANTLR3_BITWORD FOLLOW_378_in_def_state5235_bits[]	= { ANTLR3_UINT64_LIT(0x5004000080000000), ANTLR3_UINT64_LIT(0x0000000000002001), ANTLR3_UINT64_LIT(0x00000000027F2080) };
static  ANTLR3_BITSET_LIST FOLLOW_378_in_def_state5235	= { FOLLOW_378_in_def_state5235_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LT__in_def_state5242  */
static	ANTLR3_BITWORD FOLLOW_LT__in_def_state5242_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000001800000), ANTLR3_UINT64_LIT(0x0000800000000000), ANTLR3_UINT64_LIT(0x0100000054000002), ANTLR3_UINT64_LIT(0x0200100000004002) };
static  ANTLR3_BITSET_LIST FOLLOW_LT__in_def_state5242	= { FOLLOW_LT__in_def_state5242_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_321_in_def_state5246  */
static	ANTLR3_BITWORD FOLLOW_321_in_def_state5246_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000001800000), ANTLR3_UINT64_LIT(0x0000800000000000), ANTLR3_UINT64_LIT(0x0100000054000002), ANTLR3_UINT64_LIT(0x0200100000004000) };
static  ANTLR3_BITSET_LIST FOLLOW_321_in_def_state5246	= { FOLLOW_321_in_def_state5246_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_executable_specifier_in_def_state5252  */
static	ANTLR3_BITWORD FOLLOW_executable_specifier_in_def_state5252_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_executable_specifier_in_def_state5252	= { FOLLOW_executable_specifier_in_def_state5252_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_GT_in_def_state5256  */
static	ANTLR3_BITWORD FOLLOW_GT_in_def_state5256_bits[]	= { ANTLR3_UINT64_LIT(0x5004000080000000), ANTLR3_UINT64_LIT(0x0000000000000001), ANTLR3_UINT64_LIT(0x00000000027F2080) };
static  ANTLR3_BITSET_LIST FOLLOW_GT_in_def_state5256	= { FOLLOW_GT_in_def_state5256_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_state_id_in_def_state5278  */
static	ANTLR3_BITWORD FOLLOW_state_id_in_def_state5278_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001), ANTLR3_UINT64_LIT(0x0000000000002080) };
static  ANTLR3_BITSET_LIST FOLLOW_state_id_in_def_state5278	= { FOLLOW_state_id_in_def_state5278_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LBRACKET_in_def_state5295  */
static	ANTLR3_BITWORD FOLLOW_LBRACKET_in_def_state5295_bits[]	= { ANTLR3_UINT64_LIT(0x0004000080000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x00000000027F0200) };
static  ANTLR3_BITSET_LIST FOLLOW_LBRACKET_in_def_state5295	= { FOLLOW_LBRACKET_in_def_state5295_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LBRACKET_EXCEPT_in_def_state5314  */
static	ANTLR3_BITWORD FOLLOW_LBRACKET_EXCEPT_in_def_state5314_bits[]	= { ANTLR3_UINT64_LIT(0x0004000080000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x00000000027F0200) };
static  ANTLR3_BITSET_LIST FOLLOW_LBRACKET_EXCEPT_in_def_state5314	= { FOLLOW_LBRACKET_EXCEPT_in_def_state5314_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_state_id_in_def_state5340  */
static	ANTLR3_BITWORD FOLLOW_state_id_in_def_state5340_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x1000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_state_id_in_def_state5340	= { FOLLOW_state_id_in_def_state5340_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_def_state5362  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_def_state5362_bits[]	= { ANTLR3_UINT64_LIT(0x0004000080000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x00000000027F0000) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_def_state5362	= { FOLLOW_COMMA_in_def_state5362_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_state_id_in_def_state5366  */
static	ANTLR3_BITWORD FOLLOW_state_id_in_def_state5366_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x1000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_state_id_in_def_state5366	= { FOLLOW_state_id_in_def_state5366_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_STAR_in_def_state5382  */
static	ANTLR3_BITWORD FOLLOW_STAR_in_def_state5382_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x1000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_STAR_in_def_state5382	= { FOLLOW_STAR_in_def_state5382_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RBRACKET_in_def_state5403  */
static	ANTLR3_BITWORD FOLLOW_RBRACKET_in_def_state5403_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001), ANTLR3_UINT64_LIT(0x0000000000002080) };
static  ANTLR3_BITSET_LIST FOLLOW_RBRACKET_in_def_state5403	= { FOLLOW_RBRACKET_in_def_state5403_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_StringLiteral_in_def_state5427  */
static	ANTLR3_BITWORD FOLLOW_StringLiteral_in_def_state5427_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_StringLiteral_in_def_state5427	= { FOLLOW_StringLiteral_in_def_state5427_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_body_state_in_def_state5446  */
static	ANTLR3_BITWORD FOLLOW_def_body_state_in_def_state5446_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_body_state_in_def_state5446	= { FOLLOW_def_body_state_in_def_state5446_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_def_state5451  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_def_state5451_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_def_state5451	= { FOLLOW_SEMI_in_def_state5451_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_146_in_state_kw_id5469  */
static	ANTLR3_BITWORD FOLLOW_146_in_state_kw_id5469_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_146_in_state_kw_id5469	= { FOLLOW_146_in_state_kw_id5469_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_147_in_state_kw_id5481  */
static	ANTLR3_BITWORD FOLLOW_147_in_state_kw_id5481_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_147_in_state_kw_id5481	= { FOLLOW_147_in_state_kw_id5481_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_150_in_state_kw_id5490  */
static	ANTLR3_BITWORD FOLLOW_150_in_state_kw_id5490_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_150_in_state_kw_id5490	= { FOLLOW_150_in_state_kw_id5490_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_144_in_state_kw_id5502  */
static	ANTLR3_BITWORD FOLLOW_144_in_state_kw_id5502_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_144_in_state_kw_id5502	= { FOLLOW_144_in_state_kw_id5502_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_149_in_state_kw_id5510  */
static	ANTLR3_BITWORD FOLLOW_149_in_state_kw_id5510_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_149_in_state_kw_id5510	= { FOLLOW_149_in_state_kw_id5510_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_145_in_state_kw_id5519  */
static	ANTLR3_BITWORD FOLLOW_145_in_state_kw_id5519_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_145_in_state_kw_id5519	= { FOLLOW_145_in_state_kw_id5519_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_153_in_state_kw_id5528  */
static	ANTLR3_BITWORD FOLLOW_153_in_state_kw_id5528_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_153_in_state_kw_id5528	= { FOLLOW_153_in_state_kw_id5528_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_148_in_state_kw_id5537  */
static	ANTLR3_BITWORD FOLLOW_148_in_state_kw_id5537_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_148_in_state_kw_id5537	= { FOLLOW_148_in_state_kw_id5537_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_state_kw_id_in_state_id5557  */
static	ANTLR3_BITWORD FOLLOW_state_kw_id_in_state_id5557_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_state_kw_id_in_state_id5557	= { FOLLOW_state_kw_id_in_state_id5557_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_state_id5567  */
static	ANTLR3_BITWORD FOLLOW_ID_in_state_id5567_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_state_id5567	= { FOLLOW_ID_in_state_id5567_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_DOLLAR_in_state_id5584  */
static	ANTLR3_BITWORD FOLLOW_DOLLAR_in_state_id5584_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_DOLLAR_in_state_id5584	= { FOLLOW_DOLLAR_in_state_id5584_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_state_id5588  */
static	ANTLR3_BITWORD FOLLOW_ID_in_state_id5588_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_state_id5588	= { FOLLOW_ID_in_state_id5588_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_147_in_def_state_singleton5624  */
static	ANTLR3_BITWORD FOLLOW_147_in_def_state_singleton5624_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_147_in_def_state_singleton5624	= { FOLLOW_147_in_def_state_singleton5624_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_150_in_def_state_singleton5637  */
static	ANTLR3_BITWORD FOLLOW_150_in_def_state_singleton5637_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_150_in_def_state_singleton5637	= { FOLLOW_150_in_def_state_singleton5637_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_144_in_def_state_singleton5650  */
static	ANTLR3_BITWORD FOLLOW_144_in_def_state_singleton5650_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_144_in_def_state_singleton5650	= { FOLLOW_144_in_def_state_singleton5650_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_149_in_def_state_singleton5663  */
static	ANTLR3_BITWORD FOLLOW_149_in_def_state_singleton5663_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_149_in_def_state_singleton5663	= { FOLLOW_149_in_def_state_singleton5663_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_def_state_singleton5678  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_def_state_singleton5678_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000100), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0xE14A0600027B0000), ANTLR3_UINT64_LIT(0x0008000180000084), ANTLR3_UINT64_LIT(0x4406040004010048), ANTLR3_UINT64_LIT(0x1C00120A20200004), ANTLR3_UINT64_LIT(0x000000004C401A00) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_def_state_singleton5678	= { FOLLOW_LCURLY_in_def_state_singleton5678_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_body_state_simplif_in_def_state_singleton5681  */
static	ANTLR3_BITWORD FOLLOW_def_body_state_simplif_in_def_state_singleton5681_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_def_body_state_simplif_in_def_state_singleton5681	= { FOLLOW_def_body_state_simplif_in_def_state_singleton5681_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_def_state_singleton5685  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_def_state_singleton5685_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_def_state_singleton5685	= { FOLLOW_RCURLY_in_def_state_singleton5685_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_145_in_def_state_singleton5691  */
static	ANTLR3_BITWORD FOLLOW_145_in_def_state_singleton5691_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_145_in_def_state_singleton5691	= { FOLLOW_145_in_def_state_singleton5691_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_block_statement_in_def_state_singleton5695  */
static	ANTLR3_BITWORD FOLLOW_block_statement_in_def_state_singleton5695_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_block_statement_in_def_state_singleton5695	= { FOLLOW_block_statement_in_def_state_singleton5695_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_153_in_def_state_singleton5704  */
static	ANTLR3_BITWORD FOLLOW_153_in_def_state_singleton5704_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_153_in_def_state_singleton5704	= { FOLLOW_153_in_def_state_singleton5704_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_block_statement_in_def_state_singleton5708  */
static	ANTLR3_BITWORD FOLLOW_block_statement_in_def_state_singleton5708_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_block_statement_in_def_state_singleton5708	= { FOLLOW_block_statement_in_def_state_singleton5708_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_148_in_def_state_singleton5717  */
static	ANTLR3_BITWORD FOLLOW_148_in_def_state_singleton5717_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_148_in_def_state_singleton5717	= { FOLLOW_148_in_def_state_singleton5717_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_block_statement_in_def_state_singleton5721  */
static	ANTLR3_BITWORD FOLLOW_block_statement_in_def_state_singleton5721_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_block_statement_in_def_state_singleton5721	= { FOLLOW_block_statement_in_def_state_singleton5721_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_executable_specifier_atom_in_executable_specifier5740  */
static	ANTLR3_BITWORD FOLLOW_executable_specifier_atom_in_executable_specifier5740_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000202) };
static  ANTLR3_BITSET_LIST FOLLOW_executable_specifier_atom_in_executable_specifier5740	= { FOLLOW_executable_specifier_atom_in_executable_specifier5740_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_BAND_in_executable_specifier5748  */
static	ANTLR3_BITWORD FOLLOW_BAND_in_executable_specifier5748_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000001800000), ANTLR3_UINT64_LIT(0x0000800000000000), ANTLR3_UINT64_LIT(0x0100000054000002), ANTLR3_UINT64_LIT(0x0200100000004000) };
static  ANTLR3_BITSET_LIST FOLLOW_BAND_in_executable_specifier5748	= { FOLLOW_BAND_in_executable_specifier5748_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_executable_specifier_atom_in_executable_specifier5752  */
static	ANTLR3_BITWORD FOLLOW_executable_specifier_atom_in_executable_specifier5752_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000202) };
static  ANTLR3_BITSET_LIST FOLLOW_executable_specifier_atom_in_executable_specifier5752	= { FOLLOW_executable_specifier_atom_in_executable_specifier5752_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_executable_specifier_atom5772  */
static	ANTLR3_BITWORD FOLLOW_ID_in_executable_specifier_atom5772_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_executable_specifier_atom5772	= { FOLLOW_ID_in_executable_specifier_atom5772_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_377_in_executable_specifier_atom5782  */
static	ANTLR3_BITWORD FOLLOW_377_in_executable_specifier_atom5782_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_377_in_executable_specifier_atom5782	= { FOLLOW_377_in_executable_specifier_atom5782_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_282_in_executable_specifier_atom5794  */
static	ANTLR3_BITWORD FOLLOW_282_in_executable_specifier_atom5794_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_282_in_executable_specifier_atom5794	= { FOLLOW_282_in_executable_specifier_atom5794_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_364_in_executable_specifier_atom5810  */
static	ANTLR3_BITWORD FOLLOW_364_in_executable_specifier_atom5810_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_364_in_executable_specifier_atom5810	= { FOLLOW_364_in_executable_specifier_atom5810_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_257_in_executable_specifier_atom5823  */
static	ANTLR3_BITWORD FOLLOW_257_in_executable_specifier_atom5823_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_257_in_executable_specifier_atom5823	= { FOLLOW_257_in_executable_specifier_atom5823_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_286_in_executable_specifier_atom5835  */
static	ANTLR3_BITWORD FOLLOW_286_in_executable_specifier_atom5835_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_286_in_executable_specifier_atom5835	= { FOLLOW_286_in_executable_specifier_atom5835_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_312_in_executable_specifier_atom5848  */
static	ANTLR3_BITWORD FOLLOW_312_in_executable_specifier_atom5848_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_312_in_executable_specifier_atom5848	= { FOLLOW_312_in_executable_specifier_atom5848_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_239_in_executable_specifier_atom5865  */
static	ANTLR3_BITWORD FOLLOW_239_in_executable_specifier_atom5865_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_239_in_executable_specifier_atom5865	= { FOLLOW_239_in_executable_specifier_atom5865_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_334_in_executable_specifier_atom5879  */
static	ANTLR3_BITWORD FOLLOW_334_in_executable_specifier_atom5879_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_334_in_executable_specifier_atom5879	= { FOLLOW_334_in_executable_specifier_atom5879_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_152_in_executable_specifier_atom5894  */
static	ANTLR3_BITWORD FOLLOW_152_in_executable_specifier_atom5894_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_152_in_executable_specifier_atom5894	= { FOLLOW_152_in_executable_specifier_atom5894_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_151_in_executable_specifier_atom5907  */
static	ANTLR3_BITWORD FOLLOW_151_in_executable_specifier_atom5907_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_151_in_executable_specifier_atom5907	= { FOLLOW_151_in_executable_specifier_atom5907_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_284_in_executable_specifier_atom5920  */
static	ANTLR3_BITWORD FOLLOW_284_in_executable_specifier_atom5920_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_284_in_executable_specifier_atom5920	= { FOLLOW_284_in_executable_specifier_atom5920_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_qualifiedNameID_in_instance_machine_model5947  */
static	ANTLR3_BITWORD FOLLOW_qualifiedNameID_in_instance_machine_model5947_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_qualifiedNameID_in_instance_machine_model5947	= { FOLLOW_qualifiedNameID_in_instance_machine_model5947_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_def_body_state5964  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_def_body_state5964_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000100), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0xE1CE5600027B0000), ANTLR3_UINT64_LIT(0x00080081C3F81FE4), ANTLR3_UINT64_LIT(0x4406040004010048), ANTLR3_UINT64_LIT(0x1C00120A20200004), ANTLR3_UINT64_LIT(0x000000004C401A00) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_def_body_state5964	= { FOLLOW_LCURLY_in_def_body_state5964_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_body_state_section_in_def_body_state5984  */
static	ANTLR3_BITWORD FOLLOW_def_body_state_section_in_def_body_state5984_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_def_body_state_section_in_def_body_state5984	= { FOLLOW_def_body_state_section_in_def_body_state5984_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_body_state_simplif_in_def_body_state5993  */
static	ANTLR3_BITWORD FOLLOW_def_body_state_simplif_in_def_body_state5993_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_def_body_state_simplif_in_def_body_state5993	= { FOLLOW_def_body_state_simplif_in_def_body_state5993_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_def_body_state6004  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_def_body_state6004_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_def_body_state6004	= { FOLLOW_RCURLY_in_def_body_state6004_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_property_in_def_body_state_section6019  */
static	ANTLR3_BITWORD FOLLOW_section_property_in_def_body_state_section6019_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0084500000000000), ANTLR3_UINT64_LIT(0x0000008043F81F60) };
static  ANTLR3_BITSET_LIST FOLLOW_section_property_in_def_body_state_section6019	= { FOLLOW_section_property_in_def_body_state_section6019_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_composite_structure_in_def_body_state_section6031  */
static	ANTLR3_BITWORD FOLLOW_section_composite_structure_in_def_body_state_section6031_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0080500000000000), ANTLR3_UINT64_LIT(0x0000008042901F60) };
static  ANTLR3_BITSET_LIST FOLLOW_section_composite_structure_in_def_body_state_section6031	= { FOLLOW_section_composite_structure_in_def_body_state_section6031_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_region_in_def_body_state_section6041  */
static	ANTLR3_BITWORD FOLLOW_section_region_in_def_body_state_section6041_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000100000000000), ANTLR3_UINT64_LIT(0x0000008000001440) };
static  ANTLR3_BITSET_LIST FOLLOW_section_region_in_def_body_state_section6041	= { FOLLOW_section_region_in_def_body_state_section6041_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_transition_in_def_body_state_section6050  */
static	ANTLR3_BITWORD FOLLOW_section_transition_in_def_body_state_section6050_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000100000000000), ANTLR3_UINT64_LIT(0x0000000000001440) };
static  ANTLR3_BITSET_LIST FOLLOW_section_transition_in_def_body_state_section6050	= { FOLLOW_section_transition_in_def_body_state_section6050_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_model_of_computation_in_def_body_state_section6061  */
static	ANTLR3_BITWORD FOLLOW_section_model_of_computation_in_def_body_state_section6061_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000100000000000), ANTLR3_UINT64_LIT(0x0000000000001440) };
static  ANTLR3_BITSET_LIST FOLLOW_section_model_of_computation_in_def_body_state_section6061	= { FOLLOW_section_model_of_computation_in_def_body_state_section6061_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_model_of_execution_in_def_body_state_section6069  */
static	ANTLR3_BITWORD FOLLOW_section_model_of_execution_in_def_body_state_section6069_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000100000000000), ANTLR3_UINT64_LIT(0x0000000000001440) };
static  ANTLR3_BITSET_LIST FOLLOW_section_model_of_execution_in_def_body_state_section6069	= { FOLLOW_section_model_of_execution_in_def_body_state_section6069_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_model_of_interaction_in_def_body_state_section6077  */
static	ANTLR3_BITWORD FOLLOW_section_model_of_interaction_in_def_body_state_section6077_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000100000000000), ANTLR3_UINT64_LIT(0x0000000000001440) };
static  ANTLR3_BITSET_LIST FOLLOW_section_model_of_interaction_in_def_body_state_section6077	= { FOLLOW_section_model_of_interaction_in_def_body_state_section6077_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_modifier_declaration_in_def_body_state_simplif6112  */
static	ANTLR3_BITWORD FOLLOW_modifier_declaration_in_def_body_state_simplif6112_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000100), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xE14A0600027B0000), ANTLR3_UINT64_LIT(0x0000000180000084), ANTLR3_UINT64_LIT(0x4404000000010048), ANTLR3_UINT64_LIT(0x0C00000200000004), ANTLR3_UINT64_LIT(0x000000000C401200) };
static  ANTLR3_BITSET_LIST FOLLOW_modifier_declaration_in_def_body_state_simplif6112	= { FOLLOW_modifier_declaration_in_def_body_state_simplif6112_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_decl_variable_in_def_body_state_simplif6128  */
static	ANTLR3_BITWORD FOLLOW_decl_variable_in_def_body_state_simplif6128_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000102), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xE14A0600027B0000), ANTLR3_UINT64_LIT(0x0008000180000084), ANTLR3_UINT64_LIT(0x4406040004010048), ANTLR3_UINT64_LIT(0x1C00120A20200004), ANTLR3_UINT64_LIT(0x000000004C401A00) };
static  ANTLR3_BITSET_LIST FOLLOW_decl_variable_in_def_body_state_simplif6128	= { FOLLOW_decl_variable_in_def_body_state_simplif6128_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_any_def_statemachine_in_def_body_state_simplif6141  */
static	ANTLR3_BITWORD FOLLOW_any_def_statemachine_in_def_body_state_simplif6141_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000102), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xE14A0600027B0000), ANTLR3_UINT64_LIT(0x0008000180000084), ANTLR3_UINT64_LIT(0x4406040004010048), ANTLR3_UINT64_LIT(0x1C00120A20200004), ANTLR3_UINT64_LIT(0x000000004C401A00) };
static  ANTLR3_BITSET_LIST FOLLOW_any_def_statemachine_in_def_body_state_simplif6141	= { FOLLOW_any_def_statemachine_in_def_body_state_simplif6141_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_transition_in_def_body_state_simplif6152  */
static	ANTLR3_BITWORD FOLLOW_def_transition_in_def_body_state_simplif6152_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000102), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xE14A0600027B0000), ANTLR3_UINT64_LIT(0x0008000180000084), ANTLR3_UINT64_LIT(0x4406040004010048), ANTLR3_UINT64_LIT(0x1C00120A20200004), ANTLR3_UINT64_LIT(0x000000004C401A00) };
static  ANTLR3_BITSET_LIST FOLLOW_def_transition_in_def_body_state_simplif6152	= { FOLLOW_def_transition_in_def_body_state_simplif6152_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_state_activity_in_def_body_state_simplif6163  */
static	ANTLR3_BITWORD FOLLOW_def_state_activity_in_def_body_state_simplif6163_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000102), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xE14A0600027B0000), ANTLR3_UINT64_LIT(0x0008000180000084), ANTLR3_UINT64_LIT(0x4406040004010048), ANTLR3_UINT64_LIT(0x1C00120A20200004), ANTLR3_UINT64_LIT(0x000000004C401A00) };
static  ANTLR3_BITSET_LIST FOLLOW_def_state_activity_in_def_body_state_simplif6163	= { FOLLOW_def_state_activity_in_def_body_state_simplif6163_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_231_in_section_transition6194  */
static	ANTLR3_BITWORD FOLLOW_231_in_section_transition6194_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000102), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000020000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000001A00) };
static  ANTLR3_BITSET_LIST FOLLOW_231_in_section_transition6194	= { FOLLOW_231_in_section_transition6194_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_modifier_transition_in_section_transition6205  */
static	ANTLR3_BITWORD FOLLOW_modifier_transition_in_section_transition6205_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000100), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000020000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000001000) };
static  ANTLR3_BITSET_LIST FOLLOW_modifier_transition_in_section_transition6205	= { FOLLOW_modifier_transition_in_section_transition6205_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_transition_in_section_transition6218  */
static	ANTLR3_BITWORD FOLLOW_def_transition_in_section_transition6218_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000102), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000020000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000001A00) };
static  ANTLR3_BITSET_LIST FOLLOW_def_transition_in_section_transition6218	= { FOLLOW_def_transition_in_section_transition6218_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_169_in_def_transition6251  */
static	ANTLR3_BITWORD FOLLOW_169_in_def_transition6251_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000002001), ANTLR3_UINT64_LIT(0x0000000800000000) };
static  ANTLR3_BITSET_LIST FOLLOW_169_in_def_transition6251	= { FOLLOW_169_in_def_transition6251_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_AT_ID_in_def_transition6262  */
static	ANTLR3_BITWORD FOLLOW_AT_ID_in_def_transition6262_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000002001), ANTLR3_UINT64_LIT(0x0000000800000000) };
static  ANTLR3_BITSET_LIST FOLLOW_AT_ID_in_def_transition6262	= { FOLLOW_AT_ID_in_def_transition6262_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LT__in_def_transition6284  */
static	ANTLR3_BITWORD FOLLOW_LT__in_def_transition6284_bits[]	= { ANTLR3_UINT64_LIT(0x0084080000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000100000000000), ANTLR3_UINT64_LIT(0x0000000014020000), ANTLR3_UINT64_LIT(0x0000000050000002) };
static  ANTLR3_BITSET_LIST FOLLOW_LT__in_def_transition6284	= { FOLLOW_LT__in_def_transition6284_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_moc_transition_in_def_transition6287  */
static	ANTLR3_BITWORD FOLLOW_moc_transition_in_def_transition6287_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_moc_transition_in_def_transition6287	= { FOLLOW_moc_transition_in_def_transition6287_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_GT_in_def_transition6291  */
static	ANTLR3_BITWORD FOLLOW_GT_in_def_transition6291_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001), ANTLR3_UINT64_LIT(0x0000000800000000) };
static  ANTLR3_BITSET_LIST FOLLOW_GT_in_def_transition6291	= { FOLLOW_GT_in_def_transition6291_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_moe_transition_in_def_transition6300  */
static	ANTLR3_BITWORD FOLLOW_moe_transition_in_def_transition6300_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_moe_transition_in_def_transition6300	= { FOLLOW_moe_transition_in_def_transition6300_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_396_in_def_transition6307  */
static	ANTLR3_BITWORD FOLLOW_396_in_def_transition6307_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000002001), ANTLR3_UINT64_LIT(0x0000000800002000) };
static  ANTLR3_BITSET_LIST FOLLOW_396_in_def_transition6307	= { FOLLOW_396_in_def_transition6307_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LT__in_def_transition6319  */
static	ANTLR3_BITWORD FOLLOW_LT__in_def_transition6319_bits[]	= { ANTLR3_UINT64_LIT(0x0084080000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000100000000000), ANTLR3_UINT64_LIT(0x0000000014020000), ANTLR3_UINT64_LIT(0x0000000050000002) };
static  ANTLR3_BITSET_LIST FOLLOW_LT__in_def_transition6319	= { FOLLOW_LT__in_def_transition6319_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_moc_transition_in_def_transition6321  */
static	ANTLR3_BITWORD FOLLOW_moc_transition_in_def_transition6321_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_moc_transition_in_def_transition6321	= { FOLLOW_moc_transition_in_def_transition6321_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_GT_in_def_transition6324  */
static	ANTLR3_BITWORD FOLLOW_GT_in_def_transition6324_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000001), ANTLR3_UINT64_LIT(0x0000000800002000) };
static  ANTLR3_BITSET_LIST FOLLOW_GT_in_def_transition6324	= { FOLLOW_GT_in_def_transition6324_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_def_transition6337  */
static	ANTLR3_BITWORD FOLLOW_ID_in_def_transition6337_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001), ANTLR3_UINT64_LIT(0x0000000800002000) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_def_transition6337	= { FOLLOW_ID_in_def_transition6337_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_StringLiteral_in_def_transition6355  */
static	ANTLR3_BITWORD FOLLOW_StringLiteral_in_def_transition6355_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001), ANTLR3_UINT64_LIT(0x0000000800000000) };
static  ANTLR3_BITSET_LIST FOLLOW_StringLiteral_in_def_transition6355	= { FOLLOW_StringLiteral_in_def_transition6355_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_moe_transition_in_def_transition6372  */
static	ANTLR3_BITWORD FOLLOW_moe_transition_in_def_transition6372_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_moe_transition_in_def_transition6372	= { FOLLOW_moe_transition_in_def_transition6372_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_kind_transition6390  */
static	ANTLR3_BITWORD FOLLOW_ID_in_kind_transition6390_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_kind_transition6390	= { FOLLOW_ID_in_kind_transition6390_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_236_in_kind_transition6399  */
static	ANTLR3_BITWORD FOLLOW_236_in_kind_transition6399_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_236_in_kind_transition6399	= { FOLLOW_236_in_kind_transition6399_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_282_in_kind_transition6409  */
static	ANTLR3_BITWORD FOLLOW_282_in_kind_transition6409_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_282_in_kind_transition6409	= { FOLLOW_282_in_kind_transition6409_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_273_in_kind_transition6419  */
static	ANTLR3_BITWORD FOLLOW_273_in_kind_transition6419_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_273_in_kind_transition6419	= { FOLLOW_273_in_kind_transition6419_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_284_in_kind_transition6432  */
static	ANTLR3_BITWORD FOLLOW_284_in_kind_transition6432_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_284_in_kind_transition6432	= { FOLLOW_284_in_kind_transition6432_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_kind_transition_in_moc_transition_attribute6460  */
static	ANTLR3_BITWORD FOLLOW_kind_transition_in_moc_transition_attribute6460_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000202) };
static  ANTLR3_BITSET_LIST FOLLOW_kind_transition_in_moc_transition_attribute6460	= { FOLLOW_kind_transition_in_moc_transition_attribute6460_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_BAND_in_moc_transition_attribute6467  */
static	ANTLR3_BITWORD FOLLOW_BAND_in_moc_transition_attribute6467_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000020000) };
static  ANTLR3_BITSET_LIST FOLLOW_BAND_in_moc_transition_attribute6467	= { FOLLOW_BAND_in_moc_transition_attribute6467_bits, 5	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_273_in_moc_transition_attribute6469  */
static	ANTLR3_BITWORD FOLLOW_273_in_moc_transition_attribute6469_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_273_in_moc_transition_attribute6469	= { FOLLOW_273_in_moc_transition_attribute6469_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_moc_transition_atom_in_moc_transition6494  */
static	ANTLR3_BITWORD FOLLOW_moc_transition_atom_in_moc_transition6494_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800002) };
static  ANTLR3_BITSET_LIST FOLLOW_moc_transition_atom_in_moc_transition6494	= { FOLLOW_moc_transition_atom_in_moc_transition6494_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_moc_transition6499  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_moc_transition6499_bits[]	= { ANTLR3_UINT64_LIT(0x0084080000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000100000000000), ANTLR3_UINT64_LIT(0x0000000014020000), ANTLR3_UINT64_LIT(0x0000000050000002) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_moc_transition6499	= { FOLLOW_COMMA_in_moc_transition6499_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_moc_transition_atom_in_moc_transition6501  */
static	ANTLR3_BITWORD FOLLOW_moc_transition_atom_in_moc_transition6501_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800002) };
static  ANTLR3_BITSET_LIST FOLLOW_moc_transition_atom_in_moc_transition6501	= { FOLLOW_moc_transition_atom_in_moc_transition6501_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_321_in_moc_transition_atom6520  */
static	ANTLR3_BITWORD FOLLOW_321_in_moc_transition_atom6520_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000100000000000), ANTLR3_UINT64_LIT(0x0000000014020000) };
static  ANTLR3_BITSET_LIST FOLLOW_321_in_moc_transition_atom6520	= { FOLLOW_321_in_moc_transition_atom6520_bits, 5	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_moc_transition_attribute_in_moc_transition_atom6527  */
static	ANTLR3_BITWORD FOLLOW_moc_transition_attribute_in_moc_transition_atom6527_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_moc_transition_attribute_in_moc_transition_atom6527	= { FOLLOW_moc_transition_attribute_in_moc_transition_atom6527_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_348_in_moc_transition_atom6538  */
static	ANTLR3_BITWORD FOLLOW_348_in_moc_transition_atom6538_bits[]	= { ANTLR3_UINT64_LIT(0x0084000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_348_in_moc_transition_atom6538	= { FOLLOW_348_in_moc_transition_atom6538_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_integer_constant_in_moc_transition_atom6545  */
static	ANTLR3_BITWORD FOLLOW_integer_constant_in_moc_transition_atom6545_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_integer_constant_in_moc_transition_atom6545	= { FOLLOW_integer_constant_in_moc_transition_atom6545_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_350_in_moc_transition_atom6556  */
static	ANTLR3_BITWORD FOLLOW_350_in_moc_transition_atom6556_bits[]	= { ANTLR3_UINT64_LIT(0x0004080000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_350_in_moc_transition_atom6556	= { FOLLOW_350_in_moc_transition_atom6556_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_float_constant_in_moc_transition_atom6563  */
static	ANTLR3_BITWORD FOLLOW_float_constant_in_moc_transition_atom6563_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_float_constant_in_moc_transition_atom6563	= { FOLLOW_float_constant_in_moc_transition_atom6563_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_transition_statement_in_moe_transition6582  */
static	ANTLR3_BITWORD FOLLOW_transition_statement_in_moe_transition6582_bits[]	= { ANTLR3_UINT64_LIT(0x0004000080000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x00000008027F0000) };
static  ANTLR3_BITSET_LIST FOLLOW_transition_statement_in_moe_transition6582	= { FOLLOW_transition_statement_in_moe_transition6582_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_163_in_moe_transition6600  */
static	ANTLR3_BITWORD FOLLOW_163_in_moe_transition6600_bits[]	= { ANTLR3_UINT64_LIT(0x0004000080000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x00000000027F0000) };
static  ANTLR3_BITSET_LIST FOLLOW_163_in_moe_transition6600	= { FOLLOW_163_in_moe_transition6600_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_target_state_id_in_moe_transition6612  */
static	ANTLR3_BITWORD FOLLOW_target_state_id_in_moe_transition6612_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_target_state_id_in_moe_transition6612	= { FOLLOW_target_state_id_in_moe_transition6612_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_moe_transition6629  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_moe_transition6629_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_moe_transition6629	= { FOLLOW_SEMI_in_moe_transition6629_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_163_in_moe_transition6638  */
static	ANTLR3_BITWORD FOLLOW_163_in_moe_transition6638_bits[]	= { ANTLR3_UINT64_LIT(0x0004000080000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x00000000027F0000) };
static  ANTLR3_BITSET_LIST FOLLOW_163_in_moe_transition6638	= { FOLLOW_163_in_moe_transition6638_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_target_state_id_in_moe_transition6642  */
static	ANTLR3_BITWORD FOLLOW_target_state_id_in_moe_transition6642_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_target_state_id_in_moe_transition6642	= { FOLLOW_target_state_id_in_moe_transition6642_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_transition_statement_in_moe_transition6659  */
static	ANTLR3_BITWORD FOLLOW_transition_statement_in_moe_transition6659_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_transition_statement_in_moe_transition6659	= { FOLLOW_transition_statement_in_moe_transition6659_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_moe_transition6673  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_moe_transition6673_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_moe_transition6673	= { FOLLOW_SEMI_in_moe_transition6673_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_transition_statement6701  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_transition_statement6701_bits[]	= { ANTLR3_UINT64_LIT(0x000C000104400000), ANTLR3_UINT64_LIT(0x2003FCFFFC000101), ANTLR3_UINT64_LIT(0x082000003C001000), ANTLR3_UINT64_LIT(0x0480114000000000), ANTLR3_UINT64_LIT(0x0103F97E24C83881), ANTLR3_UINT64_LIT(0x020B1C00003F0400), ANTLR3_UINT64_LIT(0x00000001800000A6) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_transition_statement6701	= { FOLLOW_LCURLY_in_transition_statement6701_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_op_block_in_transition_statement6708  */
static	ANTLR3_BITWORD FOLLOW_op_block_in_transition_statement6708_bits[]	= { ANTLR3_UINT64_LIT(0x000C000104400000), ANTLR3_UINT64_LIT(0x2000000000000101), ANTLR3_UINT64_LIT(0x082000003C001000), ANTLR3_UINT64_LIT(0x0480114000000000), ANTLR3_UINT64_LIT(0x0103F97E24C83881), ANTLR3_UINT64_LIT(0x020B1C00003F0400), ANTLR3_UINT64_LIT(0x00000001800000A6) };
static  ANTLR3_BITSET_LIST FOLLOW_op_block_in_transition_statement6708	= { FOLLOW_op_block_in_transition_statement6708_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_statement_in_transition_statement6728  */
static	ANTLR3_BITWORD FOLLOW_statement_in_transition_statement6728_bits[]	= { ANTLR3_UINT64_LIT(0x000C000104400000), ANTLR3_UINT64_LIT(0x2000000000000101), ANTLR3_UINT64_LIT(0x082000003C001000), ANTLR3_UINT64_LIT(0x0480114000000000), ANTLR3_UINT64_LIT(0x0103F97E24C83881), ANTLR3_UINT64_LIT(0x020B1C00003F0400), ANTLR3_UINT64_LIT(0x00000001800000A6) };
static  ANTLR3_BITSET_LIST FOLLOW_statement_in_transition_statement6728	= { FOLLOW_statement_in_transition_statement6728_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_transition_trigger_in_transition_statement6741  */
static	ANTLR3_BITWORD FOLLOW_transition_trigger_in_transition_statement6741_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0820000000000000), ANTLR3_UINT64_LIT(0x0000004000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_transition_trigger_in_transition_statement6741	= { FOLLOW_transition_trigger_in_transition_statement6741_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_transition_guard_in_transition_statement6751  */
static	ANTLR3_BITWORD FOLLOW_transition_guard_in_transition_statement6751_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0020000000000000), ANTLR3_UINT64_LIT(0x0000004000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_transition_guard_in_transition_statement6751	= { FOLLOW_transition_guard_in_transition_statement6751_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_transition_timed_guard_in_transition_statement6761  */
static	ANTLR3_BITWORD FOLLOW_transition_timed_guard_in_transition_statement6761_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0020000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_transition_timed_guard_in_transition_statement6761	= { FOLLOW_transition_timed_guard_in_transition_statement6761_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_transition_effect_in_transition_statement6771  */
static	ANTLR3_BITWORD FOLLOW_transition_effect_in_transition_statement6771_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_transition_effect_in_transition_statement6771	= { FOLLOW_transition_effect_in_transition_statement6771_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_transition_statement6780  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_transition_statement6780_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_transition_statement6780	= { FOLLOW_RCURLY_in_transition_statement6780_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_232_in_transition_trigger6793  */
static	ANTLR3_BITWORD FOLLOW_232_in_transition_trigger6793_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0003F80000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_232_in_transition_trigger6793	= { FOLLOW_232_in_transition_trigger6793_bits, 5	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_statement_com_input_in_transition_trigger6799  */
static	ANTLR3_BITWORD FOLLOW_statement_com_input_in_transition_trigger6799_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0003F80000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_statement_com_input_in_transition_trigger6799	= { FOLLOW_statement_com_input_in_transition_trigger6799_bits, 5	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_187_in_transition_guard6819  */
static	ANTLR3_BITWORD FOLLOW_187_in_transition_guard6819_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402002), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004401600201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_187_in_transition_guard6819	= { FOLLOW_187_in_transition_guard6819_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_statement_guard_in_transition_guard6827  */
static	ANTLR3_BITWORD FOLLOW_statement_guard_in_transition_guard6827_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402002), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004401600201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_statement_guard_in_transition_guard6827	= { FOLLOW_statement_guard_in_transition_guard6827_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_transition_guard6840  */
static	ANTLR3_BITWORD FOLLOW_expression_in_transition_guard6840_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402002), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004401600201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_transition_guard6840	= { FOLLOW_expression_in_transition_guard6840_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LBRACKET_in_transition_guard6851  */
static	ANTLR3_BITWORD FOLLOW_LBRACKET_in_transition_guard6851_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LBRACKET_in_transition_guard6851	= { FOLLOW_LBRACKET_in_transition_guard6851_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_transition_guard6855  */
static	ANTLR3_BITWORD FOLLOW_expression_in_transition_guard6855_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x1000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_transition_guard6855	= { FOLLOW_expression_in_transition_guard6855_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RBRACKET_in_transition_guard6857  */
static	ANTLR3_BITWORD FOLLOW_RBRACKET_in_transition_guard6857_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402002), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004401600201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_RBRACKET_in_transition_guard6857	= { FOLLOW_RBRACKET_in_transition_guard6857_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_230_in_transition_timed_guard6879  */
static	ANTLR3_BITWORD FOLLOW_230_in_transition_timed_guard6879_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402002), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002080) };
static  ANTLR3_BITSET_LIST FOLLOW_230_in_transition_timed_guard6879	= { FOLLOW_230_in_transition_timed_guard6879_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_statement_timed_guard_in_transition_timed_guard6887  */
static	ANTLR3_BITWORD FOLLOW_statement_timed_guard_in_transition_timed_guard6887_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402002), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002080) };
static  ANTLR3_BITSET_LIST FOLLOW_statement_timed_guard_in_transition_timed_guard6887	= { FOLLOW_statement_timed_guard_in_transition_timed_guard6887_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_transition_timed_guard6900  */
static	ANTLR3_BITWORD FOLLOW_expression_in_transition_timed_guard6900_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402002), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002080) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_transition_timed_guard6900	= { FOLLOW_expression_in_transition_timed_guard6900_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_transition_timed_guard6911  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_transition_timed_guard6911_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_transition_timed_guard6911	= { FOLLOW_LCURLY_in_transition_timed_guard6911_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_transition_timed_guard6915  */
static	ANTLR3_BITWORD FOLLOW_expression_in_transition_timed_guard6915_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_transition_timed_guard6915	= { FOLLOW_expression_in_transition_timed_guard6915_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_transition_timed_guard6917  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_transition_timed_guard6917_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402002), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002080) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_transition_timed_guard6917	= { FOLLOW_RCURLY_in_transition_timed_guard6917_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_181_in_transition_effect6939  */
static	ANTLR3_BITWORD FOLLOW_181_in_transition_effect6939_bits[]	= { ANTLR3_UINT64_LIT(0x000C000104400002), ANTLR3_UINT64_LIT(0x0000000000000101), ANTLR3_UINT64_LIT(0x000000003C001000), ANTLR3_UINT64_LIT(0x0480100000000000), ANTLR3_UINT64_LIT(0x0103F97E24C83881), ANTLR3_UINT64_LIT(0x020B1C00003F0400), ANTLR3_UINT64_LIT(0x00000001800000A6) };
static  ANTLR3_BITSET_LIST FOLLOW_181_in_transition_effect6939	= { FOLLOW_181_in_transition_effect6939_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_statement_in_transition_effect6945  */
static	ANTLR3_BITWORD FOLLOW_statement_in_transition_effect6945_bits[]	= { ANTLR3_UINT64_LIT(0x000C000104400002), ANTLR3_UINT64_LIT(0x0000000000000101), ANTLR3_UINT64_LIT(0x000000003C001000), ANTLR3_UINT64_LIT(0x0480100000000000), ANTLR3_UINT64_LIT(0x0103F97E24C83881), ANTLR3_UINT64_LIT(0x020B1C00003F0400), ANTLR3_UINT64_LIT(0x00000001800000A6) };
static  ANTLR3_BITSET_LIST FOLLOW_statement_in_transition_effect6945	= { FOLLOW_statement_in_transition_effect6945_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_target_state_kw_id_in_target_state_id6977  */
static	ANTLR3_BITWORD FOLLOW_target_state_kw_id_in_target_state_id6977_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_target_state_kw_id_in_target_state_id6977	= { FOLLOW_target_state_kw_id_in_target_state_id6977_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_qualifiedNameID_in_target_state_id6988  */
static	ANTLR3_BITWORD FOLLOW_qualifiedNameID_in_target_state_id6988_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_qualifiedNameID_in_target_state_id6988	= { FOLLOW_qualifiedNameID_in_target_state_id6988_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_DOLLAR_in_target_state_id7005  */
static	ANTLR3_BITWORD FOLLOW_DOLLAR_in_target_state_id7005_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_DOLLAR_in_target_state_id7005	= { FOLLOW_DOLLAR_in_target_state_id7005_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_target_state_id7009  */
static	ANTLR3_BITWORD FOLLOW_ID_in_target_state_id7009_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_target_state_id7009	= { FOLLOW_ID_in_target_state_id7009_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_146_in_target_state_kw_id7030  */
static	ANTLR3_BITWORD FOLLOW_146_in_target_state_kw_id7030_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_146_in_target_state_kw_id7030	= { FOLLOW_146_in_target_state_kw_id7030_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_147_in_target_state_kw_id7042  */
static	ANTLR3_BITWORD FOLLOW_147_in_target_state_kw_id7042_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_147_in_target_state_kw_id7042	= { FOLLOW_147_in_target_state_kw_id7042_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_150_in_target_state_kw_id7051  */
static	ANTLR3_BITWORD FOLLOW_150_in_target_state_kw_id7051_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_150_in_target_state_kw_id7051	= { FOLLOW_150_in_target_state_kw_id7051_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_144_in_target_state_kw_id7063  */
static	ANTLR3_BITWORD FOLLOW_144_in_target_state_kw_id7063_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_144_in_target_state_kw_id7063	= { FOLLOW_144_in_target_state_kw_id7063_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_149_in_target_state_kw_id7071  */
static	ANTLR3_BITWORD FOLLOW_149_in_target_state_kw_id7071_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_149_in_target_state_kw_id7071	= { FOLLOW_149_in_target_state_kw_id7071_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_145_in_target_state_kw_id7080  */
static	ANTLR3_BITWORD FOLLOW_145_in_target_state_kw_id7080_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_145_in_target_state_kw_id7080	= { FOLLOW_145_in_target_state_kw_id7080_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_153_in_target_state_kw_id7089  */
static	ANTLR3_BITWORD FOLLOW_153_in_target_state_kw_id7089_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_153_in_target_state_kw_id7089	= { FOLLOW_153_in_target_state_kw_id7089_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_148_in_target_state_kw_id7098  */
static	ANTLR3_BITWORD FOLLOW_148_in_target_state_kw_id7098_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_148_in_target_state_kw_id7098	= { FOLLOW_148_in_target_state_kw_id7098_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_177_in_def_state_activity7119  */
static	ANTLR3_BITWORD FOLLOW_177_in_def_state_activity7119_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_177_in_def_state_activity7119	= { FOLLOW_177_in_def_state_activity7119_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_block_statement_in_def_state_activity7125  */
static	ANTLR3_BITWORD FOLLOW_block_statement_in_def_state_activity7125_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_block_statement_in_def_state_activity7125	= { FOLLOW_block_statement_in_def_state_activity7125_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_194_in_def_state_activity7133  */
static	ANTLR3_BITWORD FOLLOW_194_in_def_state_activity7133_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_194_in_def_state_activity7133	= { FOLLOW_194_in_def_state_activity7133_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_block_statement_in_def_state_activity7141  */
static	ANTLR3_BITWORD FOLLOW_block_statement_in_def_state_activity7141_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_block_statement_in_def_state_activity7141	= { FOLLOW_block_statement_in_def_state_activity7141_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_191_in_def_state_activity7150  */
static	ANTLR3_BITWORD FOLLOW_191_in_def_state_activity7150_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_191_in_def_state_activity7150	= { FOLLOW_191_in_def_state_activity7150_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_block_statement_in_def_state_activity7155  */
static	ANTLR3_BITWORD FOLLOW_block_statement_in_def_state_activity7155_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_block_statement_in_def_state_activity7155	= { FOLLOW_block_statement_in_def_state_activity7155_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_182_in_def_state_activity7163  */
static	ANTLR3_BITWORD FOLLOW_182_in_def_state_activity7163_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_182_in_def_state_activity7163	= { FOLLOW_182_in_def_state_activity7163_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_block_statement_in_def_state_activity7169  */
static	ANTLR3_BITWORD FOLLOW_block_statement_in_def_state_activity7169_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_block_statement_in_def_state_activity7169	= { FOLLOW_block_statement_in_def_state_activity7169_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_190_in_def_state_activity7178  */
static	ANTLR3_BITWORD FOLLOW_190_in_def_state_activity7178_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_190_in_def_state_activity7178	= { FOLLOW_190_in_def_state_activity7178_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_block_statement_in_def_state_activity7182  */
static	ANTLR3_BITWORD FOLLOW_block_statement_in_def_state_activity7182_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_block_statement_in_def_state_activity7182	= { FOLLOW_block_statement_in_def_state_activity7182_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_179_in_def_state_activity7190  */
static	ANTLR3_BITWORD FOLLOW_179_in_def_state_activity7190_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_179_in_def_state_activity7190	= { FOLLOW_179_in_def_state_activity7190_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_block_statement_in_def_state_activity7195  */
static	ANTLR3_BITWORD FOLLOW_block_statement_in_def_state_activity7195_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_block_statement_in_def_state_activity7195	= { FOLLOW_block_statement_in_def_state_activity7195_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_189_in_def_state_activity7204  */
static	ANTLR3_BITWORD FOLLOW_189_in_def_state_activity7204_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_189_in_def_state_activity7204	= { FOLLOW_189_in_def_state_activity7204_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_block_statement_in_def_state_activity7210  */
static	ANTLR3_BITWORD FOLLOW_block_statement_in_def_state_activity7210_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_block_statement_in_def_state_activity7210	= { FOLLOW_block_statement_in_def_state_activity7210_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_170_in_def_state_activity7218  */
static	ANTLR3_BITWORD FOLLOW_170_in_def_state_activity7218_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_170_in_def_state_activity7218	= { FOLLOW_170_in_def_state_activity7218_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_block_statement_in_def_state_activity7225  */
static	ANTLR3_BITWORD FOLLOW_block_statement_in_def_state_activity7225_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_block_statement_in_def_state_activity7225	= { FOLLOW_block_statement_in_def_state_activity7225_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_199_in_def_state_activity7234  */
static	ANTLR3_BITWORD FOLLOW_199_in_def_state_activity7234_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_199_in_def_state_activity7234	= { FOLLOW_199_in_def_state_activity7234_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_block_statement_in_def_state_activity7242  */
static	ANTLR3_BITWORD FOLLOW_block_statement_in_def_state_activity7242_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_block_statement_in_def_state_activity7242	= { FOLLOW_block_statement_in_def_state_activity7242_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_224_in_def_state_activity7250  */
static	ANTLR3_BITWORD FOLLOW_224_in_def_state_activity7250_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_224_in_def_state_activity7250	= { FOLLOW_224_in_def_state_activity7250_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_block_statement_in_def_state_activity7259  */
static	ANTLR3_BITWORD FOLLOW_block_statement_in_def_state_activity7259_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_block_statement_in_def_state_activity7259	= { FOLLOW_block_statement_in_def_state_activity7259_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_223_in_def_state_activity7267  */
static	ANTLR3_BITWORD FOLLOW_223_in_def_state_activity7267_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_223_in_def_state_activity7267	= { FOLLOW_223_in_def_state_activity7267_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_block_statement_in_def_state_activity7276  */
static	ANTLR3_BITWORD FOLLOW_block_statement_in_def_state_activity7276_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_block_statement_in_def_state_activity7276	= { FOLLOW_block_statement_in_def_state_activity7276_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_184_in_def_state_activity7285  */
static	ANTLR3_BITWORD FOLLOW_184_in_def_state_activity7285_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_184_in_def_state_activity7285	= { FOLLOW_184_in_def_state_activity7285_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_block_statement_in_def_state_activity7292  */
static	ANTLR3_BITWORD FOLLOW_block_statement_in_def_state_activity7292_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_block_statement_in_def_state_activity7292	= { FOLLOW_block_statement_in_def_state_activity7292_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_header_in_section_header_import_parameter_property7325  */
static	ANTLR3_BITWORD FOLLOW_section_header_in_section_header_import_parameter_property7325_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x00000000196E8019) };
static  ANTLR3_BITSET_LIST FOLLOW_section_header_in_section_header_import_parameter_property7325	= { FOLLOW_section_header_in_section_header_import_parameter_property7325_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_import_in_section_header_import_parameter_property7334  */
static	ANTLR3_BITWORD FOLLOW_section_import_in_section_header_import_parameter_property7334_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x00000000196E8018) };
static  ANTLR3_BITSET_LIST FOLLOW_section_import_in_section_header_import_parameter_property7334	= { FOLLOW_section_import_in_section_header_import_parameter_property7334_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_parameter_in_section_header_import_parameter_property7346  */
static	ANTLR3_BITWORD FOLLOW_section_parameter_in_section_header_import_parameter_property7346_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000001680000) };
static  ANTLR3_BITSET_LIST FOLLOW_section_parameter_in_section_header_import_parameter_property7346	= { FOLLOW_section_parameter_in_section_header_import_parameter_property7346_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_property_in_section_header_import_parameter_property7368  */
static	ANTLR3_BITWORD FOLLOW_section_property_in_section_header_import_parameter_property7368_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000001680000) };
static  ANTLR3_BITSET_LIST FOLLOW_section_property_in_section_header_import_parameter_property7368	= { FOLLOW_section_property_in_section_header_import_parameter_property7368_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_import_in_section_header_import_parameter_property7389  */
static	ANTLR3_BITWORD FOLLOW_section_import_in_section_header_import_parameter_property7389_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x00000000196E8018) };
static  ANTLR3_BITSET_LIST FOLLOW_section_import_in_section_header_import_parameter_property7389	= { FOLLOW_section_import_in_section_header_import_parameter_property7389_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_parameter_in_section_header_import_parameter_property7398  */
static	ANTLR3_BITWORD FOLLOW_section_parameter_in_section_header_import_parameter_property7398_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000001680000) };
static  ANTLR3_BITSET_LIST FOLLOW_section_parameter_in_section_header_import_parameter_property7398	= { FOLLOW_section_parameter_in_section_header_import_parameter_property7398_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_property_in_section_header_import_parameter_property7420  */
static	ANTLR3_BITWORD FOLLOW_section_property_in_section_header_import_parameter_property7420_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000001680000) };
static  ANTLR3_BITSET_LIST FOLLOW_section_property_in_section_header_import_parameter_property7420	= { FOLLOW_section_property_in_section_header_import_parameter_property7420_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_parameter_in_section_header_import_parameter_property7441  */
static	ANTLR3_BITWORD FOLLOW_section_parameter_in_section_header_import_parameter_property7441_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000001680000) };
static  ANTLR3_BITSET_LIST FOLLOW_section_parameter_in_section_header_import_parameter_property7441	= { FOLLOW_section_parameter_in_section_header_import_parameter_property7441_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_property_in_section_header_import_parameter_property7460  */
static	ANTLR3_BITWORD FOLLOW_section_property_in_section_header_import_parameter_property7460_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000001680000) };
static  ANTLR3_BITSET_LIST FOLLOW_section_property_in_section_header_import_parameter_property7460	= { FOLLOW_section_property_in_section_header_import_parameter_property7460_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_property_in_section_header_import_parameter_property7493  */
static	ANTLR3_BITWORD FOLLOW_section_property_in_section_header_import_parameter_property7493_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000001680000) };
static  ANTLR3_BITSET_LIST FOLLOW_section_property_in_section_header_import_parameter_property7493	= { FOLLOW_section_property_in_section_header_import_parameter_property7493_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_section_property_free_declaration_in_section_header_import_parameter_property7508  */
static	ANTLR3_BITWORD FOLLOW_section_property_free_declaration_in_section_header_import_parameter_property7508_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_section_property_free_declaration_in_section_header_import_parameter_property7508	= { FOLLOW_section_property_free_declaration_in_section_header_import_parameter_property7508_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_section_parameter7536  */
static	ANTLR3_BITWORD FOLLOW_set_in_section_parameter7536_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2208000000000000), ANTLR3_UINT64_LIT(0x400204000410004E), ANTLR3_UINT64_LIT(0x1040120821200001), ANTLR3_UINT64_LIT(0x000000004C504810) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_section_parameter7536	= { FOLLOW_set_in_section_parameter7536_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_property_declaration_in_section_parameter7553  */
static	ANTLR3_BITWORD FOLLOW_property_declaration_in_section_parameter7553_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2208000000000000), ANTLR3_UINT64_LIT(0x400204000410004E), ANTLR3_UINT64_LIT(0x1040120821200001), ANTLR3_UINT64_LIT(0x000000004C504810) };
static  ANTLR3_BITSET_LIST FOLLOW_property_declaration_in_section_parameter7553	= { FOLLOW_property_declaration_in_section_parameter7553_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_196_in_section_parameter7566  */
static	ANTLR3_BITWORD FOLLOW_196_in_section_parameter7566_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2208000000000000), ANTLR3_UINT64_LIT(0x400204000410004E), ANTLR3_UINT64_LIT(0x1040120821200001), ANTLR3_UINT64_LIT(0x000000004C504810) };
static  ANTLR3_BITSET_LIST FOLLOW_196_in_section_parameter7566	= { FOLLOW_196_in_section_parameter7566_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_property_declaration_in_section_parameter7571  */
static	ANTLR3_BITWORD FOLLOW_property_declaration_in_section_parameter7571_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2208000000000000), ANTLR3_UINT64_LIT(0x400204000410004E), ANTLR3_UINT64_LIT(0x1040120821200001), ANTLR3_UINT64_LIT(0x000000004C504810) };
static  ANTLR3_BITSET_LIST FOLLOW_property_declaration_in_section_parameter7571	= { FOLLOW_property_declaration_in_section_parameter7571_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_195_in_section_parameter7584  */
static	ANTLR3_BITWORD FOLLOW_195_in_section_parameter7584_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2208000000000000), ANTLR3_UINT64_LIT(0x400204000410004E), ANTLR3_UINT64_LIT(0x1040120821200001), ANTLR3_UINT64_LIT(0x000000004C504810) };
static  ANTLR3_BITSET_LIST FOLLOW_195_in_section_parameter7584	= { FOLLOW_195_in_section_parameter7584_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_property_declaration_in_section_parameter7589  */
static	ANTLR3_BITWORD FOLLOW_property_declaration_in_section_parameter7589_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2208000000000000), ANTLR3_UINT64_LIT(0x400204000410004E), ANTLR3_UINT64_LIT(0x1040120821200001), ANTLR3_UINT64_LIT(0x000000004C504810) };
static  ANTLR3_BITSET_LIST FOLLOW_property_declaration_in_section_parameter7589	= { FOLLOW_property_declaration_in_section_parameter7589_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_207_in_section_parameter7602  */
static	ANTLR3_BITWORD FOLLOW_207_in_section_parameter7602_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2208000000000000), ANTLR3_UINT64_LIT(0x400204000410004E), ANTLR3_UINT64_LIT(0x1040120821200001), ANTLR3_UINT64_LIT(0x000000004C504810) };
static  ANTLR3_BITSET_LIST FOLLOW_207_in_section_parameter7602	= { FOLLOW_207_in_section_parameter7602_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_property_declaration_in_section_parameter7606  */
static	ANTLR3_BITWORD FOLLOW_property_declaration_in_section_parameter7606_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2208000000000000), ANTLR3_UINT64_LIT(0x400204000410004E), ANTLR3_UINT64_LIT(0x1040120821200001), ANTLR3_UINT64_LIT(0x000000004C504810) };
static  ANTLR3_BITSET_LIST FOLLOW_property_declaration_in_section_parameter7606	= { FOLLOW_property_declaration_in_section_parameter7606_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_section_parameter7619  */
static	ANTLR3_BITWORD FOLLOW_set_in_section_parameter7619_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2208000000000000), ANTLR3_UINT64_LIT(0x400204000410004E), ANTLR3_UINT64_LIT(0x1040120821200001), ANTLR3_UINT64_LIT(0x000000004C504810) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_section_parameter7619	= { FOLLOW_set_in_section_parameter7619_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_property_declaration_in_section_parameter7636  */
static	ANTLR3_BITWORD FOLLOW_property_declaration_in_section_parameter7636_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2208000000000000), ANTLR3_UINT64_LIT(0x400204000410004E), ANTLR3_UINT64_LIT(0x1040120821200001), ANTLR3_UINT64_LIT(0x000000004C504810) };
static  ANTLR3_BITSET_LIST FOLLOW_property_declaration_in_section_parameter7636	= { FOLLOW_property_declaration_in_section_parameter7636_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_section_property7669  */
static	ANTLR3_BITWORD FOLLOW_set_in_section_property7669_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2208000000000000), ANTLR3_UINT64_LIT(0x400204000410004E), ANTLR3_UINT64_LIT(0x1040120821200001), ANTLR3_UINT64_LIT(0x000000004C504810) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_section_property7669	= { FOLLOW_set_in_section_property7669_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_property_declaration_in_section_property7686  */
static	ANTLR3_BITWORD FOLLOW_property_declaration_in_section_property7686_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2208000000000000), ANTLR3_UINT64_LIT(0x400204000410004E), ANTLR3_UINT64_LIT(0x1040120821200001), ANTLR3_UINT64_LIT(0x000000004C504810) };
static  ANTLR3_BITSET_LIST FOLLOW_property_declaration_in_section_property7686	= { FOLLOW_property_declaration_in_section_property7686_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_216_in_section_property7699  */
static	ANTLR3_BITWORD FOLLOW_216_in_section_property7699_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2208000000000000), ANTLR3_UINT64_LIT(0x400204000410004E), ANTLR3_UINT64_LIT(0x1040120821200001), ANTLR3_UINT64_LIT(0x000000004C504810) };
static  ANTLR3_BITSET_LIST FOLLOW_216_in_section_property7699	= { FOLLOW_216_in_section_property7699_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_property_declaration_in_section_property7706  */
static	ANTLR3_BITWORD FOLLOW_property_declaration_in_section_property7706_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2208000000000000), ANTLR3_UINT64_LIT(0x400204000410004E), ANTLR3_UINT64_LIT(0x1040120821200001), ANTLR3_UINT64_LIT(0x000000004C504810) };
static  ANTLR3_BITSET_LIST FOLLOW_property_declaration_in_section_property7706	= { FOLLOW_property_declaration_in_section_property7706_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_214_in_section_property7719  */
static	ANTLR3_BITWORD FOLLOW_214_in_section_property7719_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2208000000000000), ANTLR3_UINT64_LIT(0x400204000410004E), ANTLR3_UINT64_LIT(0x1040120821200001), ANTLR3_UINT64_LIT(0x000000004C504810) };
static  ANTLR3_BITSET_LIST FOLLOW_214_in_section_property7719	= { FOLLOW_214_in_section_property7719_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_property_declaration_in_section_property7726  */
static	ANTLR3_BITWORD FOLLOW_property_declaration_in_section_property7726_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2208000000000000), ANTLR3_UINT64_LIT(0x400204000410004E), ANTLR3_UINT64_LIT(0x1040120821200001), ANTLR3_UINT64_LIT(0x000000004C504810) };
static  ANTLR3_BITSET_LIST FOLLOW_property_declaration_in_section_property7726	= { FOLLOW_property_declaration_in_section_property7726_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_211_in_section_property7739  */
static	ANTLR3_BITWORD FOLLOW_211_in_section_property7739_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2208000000000000), ANTLR3_UINT64_LIT(0x400204000410004E), ANTLR3_UINT64_LIT(0x1040120821200001), ANTLR3_UINT64_LIT(0x000000004C504810) };
static  ANTLR3_BITSET_LIST FOLLOW_211_in_section_property7739	= { FOLLOW_211_in_section_property7739_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_property_declaration_in_section_property7746  */
static	ANTLR3_BITWORD FOLLOW_property_declaration_in_section_property7746_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2208000000000000), ANTLR3_UINT64_LIT(0x400204000410004E), ANTLR3_UINT64_LIT(0x1040120821200001), ANTLR3_UINT64_LIT(0x000000004C504810) };
static  ANTLR3_BITSET_LIST FOLLOW_property_declaration_in_section_property7746	= { FOLLOW_property_declaration_in_section_property7746_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_property_declaration_in_section_property_free_declaration7777  */
static	ANTLR3_BITWORD FOLLOW_property_declaration_in_section_property_free_declaration7777_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2208000000000000), ANTLR3_UINT64_LIT(0x400204000410004E), ANTLR3_UINT64_LIT(0x1040120821200001), ANTLR3_UINT64_LIT(0x000000004C504810) };
static  ANTLR3_BITSET_LIST FOLLOW_property_declaration_in_section_property_free_declaration7777	= { FOLLOW_property_declaration_in_section_property_free_declaration7777_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_modifier_declaration_in_property_declaration7806  */
static	ANTLR3_BITWORD FOLLOW_modifier_declaration_in_property_declaration7806_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2200000000000000), ANTLR3_UINT64_LIT(0x400000000010004E), ANTLR3_UINT64_LIT(0x0040000001000001), ANTLR3_UINT64_LIT(0x000000000C104010) };
static  ANTLR3_BITSET_LIST FOLLOW_modifier_declaration_in_property_declaration7806	= { FOLLOW_modifier_declaration_in_property_declaration7806_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_decl_property_element_in_property_declaration7816  */
static	ANTLR3_BITWORD FOLLOW_decl_property_element_in_property_declaration7816_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_decl_property_element_in_property_declaration7816	= { FOLLOW_decl_property_element_in_property_declaration7816_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_decl_variable_in_decl_property_element7831  */
static	ANTLR3_BITWORD FOLLOW_decl_variable_in_decl_property_element7831_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_decl_variable_in_decl_property_element7831	= { FOLLOW_decl_variable_in_decl_property_element7831_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_decl_port_in_decl_property_element7838  */
static	ANTLR3_BITWORD FOLLOW_decl_port_in_decl_property_element7838_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_decl_port_in_decl_property_element7838	= { FOLLOW_decl_port_in_decl_property_element7838_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_decl_signal_in_decl_property_element7847  */
static	ANTLR3_BITWORD FOLLOW_decl_signal_in_decl_property_element7847_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_decl_signal_in_decl_property_element7847	= { FOLLOW_decl_signal_in_decl_property_element7847_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_decl_buffer_in_decl_property_element7854  */
static	ANTLR3_BITWORD FOLLOW_decl_buffer_in_decl_property_element7854_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_decl_buffer_in_decl_property_element7854	= { FOLLOW_decl_buffer_in_decl_property_element7854_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_decl_channel_in_decl_property_element7861  */
static	ANTLR3_BITWORD FOLLOW_decl_channel_in_decl_property_element7861_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_decl_channel_in_decl_property_element7861	= { FOLLOW_decl_channel_in_decl_property_element7861_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_type_in_decl_property_element7868  */
static	ANTLR3_BITWORD FOLLOW_def_type_in_decl_property_element7868_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_type_in_decl_property_element7868	= { FOLLOW_def_type_in_decl_property_element7868_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_enum_in_decl_property_element7876  */
static	ANTLR3_BITWORD FOLLOW_def_enum_in_decl_property_element7876_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_enum_in_decl_property_element7876	= { FOLLOW_def_enum_in_decl_property_element7876_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_union_in_decl_property_element7884  */
static	ANTLR3_BITWORD FOLLOW_def_union_in_decl_property_element7884_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_union_in_decl_property_element7884	= { FOLLOW_def_union_in_decl_property_element7884_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_choice_in_decl_property_element7891  */
static	ANTLR3_BITWORD FOLLOW_def_choice_in_decl_property_element7891_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_choice_in_decl_property_element7891	= { FOLLOW_def_choice_in_decl_property_element7891_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_struct_in_decl_property_element7897  */
static	ANTLR3_BITWORD FOLLOW_def_struct_in_decl_property_element7897_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_struct_in_decl_property_element7897	= { FOLLOW_def_struct_in_decl_property_element7897_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_labelled_argument7933  */
static	ANTLR3_BITWORD FOLLOW_ID_in_labelled_argument7933_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000200000) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_labelled_argument7933	= { FOLLOW_ID_in_labelled_argument7933_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COLON_in_labelled_argument7935  */
static	ANTLR3_BITWORD FOLLOW_COLON_in_labelled_argument7935_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_COLON_in_labelled_argument7935	= { FOLLOW_COLON_in_labelled_argument7935_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_labelled_argument7945  */
static	ANTLR3_BITWORD FOLLOW_expression_in_labelled_argument7945_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_labelled_argument7945	= { FOLLOW_expression_in_labelled_argument7945_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_labelled_argument7955  */
static	ANTLR3_BITWORD FOLLOW_expression_in_labelled_argument7955_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_labelled_argument7955	= { FOLLOW_expression_in_labelled_argument7955_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LPAREN_in_decl_instance_machine_params7979  */
static	ANTLR3_BITWORD FOLLOW_LPAREN_in_decl_instance_machine_params7979_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002042), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LPAREN_in_decl_instance_machine_params7979	= { FOLLOW_LPAREN_in_decl_instance_machine_params7979_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_labelled_argument_in_decl_instance_machine_params7988  */
static	ANTLR3_BITWORD FOLLOW_labelled_argument_in_decl_instance_machine_params7988_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_labelled_argument_in_decl_instance_machine_params7988	= { FOLLOW_labelled_argument_in_decl_instance_machine_params7988_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_decl_instance_machine_params8004  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_decl_instance_machine_params8004_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_decl_instance_machine_params8004	= { FOLLOW_COMMA_in_decl_instance_machine_params8004_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_labelled_argument_in_decl_instance_machine_params8013  */
static	ANTLR3_BITWORD FOLLOW_labelled_argument_in_decl_instance_machine_params8013_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_labelled_argument_in_decl_instance_machine_params8013	= { FOLLOW_labelled_argument_in_decl_instance_machine_params8013_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RPAREN_in_decl_instance_machine_params8039  */
static	ANTLR3_BITWORD FOLLOW_RPAREN_in_decl_instance_machine_params8039_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RPAREN_in_decl_instance_machine_params8039	= { FOLLOW_RPAREN_in_decl_instance_machine_params8039_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_decl_instance_machine_returns8061  */
static	ANTLR3_BITWORD FOLLOW_set_in_decl_instance_machine_returns8061_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_decl_instance_machine_returns8061	= { FOLLOW_set_in_decl_instance_machine_returns8061_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LPAREN_in_decl_instance_machine_returns8076  */
static	ANTLR3_BITWORD FOLLOW_LPAREN_in_decl_instance_machine_returns8076_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LPAREN_in_decl_instance_machine_returns8076	= { FOLLOW_LPAREN_in_decl_instance_machine_returns8076_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_labelled_argument_in_decl_instance_machine_returns8085  */
static	ANTLR3_BITWORD FOLLOW_labelled_argument_in_decl_instance_machine_returns8085_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_labelled_argument_in_decl_instance_machine_returns8085	= { FOLLOW_labelled_argument_in_decl_instance_machine_returns8085_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_decl_instance_machine_returns8101  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_decl_instance_machine_returns8101_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_decl_instance_machine_returns8101	= { FOLLOW_COMMA_in_decl_instance_machine_returns8101_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_labelled_argument_in_decl_instance_machine_returns8112  */
static	ANTLR3_BITWORD FOLLOW_labelled_argument_in_decl_instance_machine_returns8112_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_labelled_argument_in_decl_instance_machine_returns8112	= { FOLLOW_labelled_argument_in_decl_instance_machine_returns8112_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RPAREN_in_decl_instance_machine_returns8136  */
static	ANTLR3_BITWORD FOLLOW_RPAREN_in_decl_instance_machine_returns8136_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RPAREN_in_decl_instance_machine_returns8136	= { FOLLOW_RPAREN_in_decl_instance_machine_returns8136_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_labelled_argument_in_decl_instance_machine_returns8146  */
static	ANTLR3_BITWORD FOLLOW_labelled_argument_in_decl_instance_machine_returns8146_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_labelled_argument_in_decl_instance_machine_returns8146	= { FOLLOW_labelled_argument_in_decl_instance_machine_returns8146_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LPAREN_in_activity_machine_param_return8182  */
static	ANTLR3_BITWORD FOLLOW_LPAREN_in_activity_machine_param_return8182_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002042), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LPAREN_in_activity_machine_param_return8182	= { FOLLOW_LPAREN_in_activity_machine_param_return8182_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_labelled_argument_in_activity_machine_param_return8193  */
static	ANTLR3_BITWORD FOLLOW_labelled_argument_in_activity_machine_param_return8193_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_labelled_argument_in_activity_machine_param_return8193	= { FOLLOW_labelled_argument_in_activity_machine_param_return8193_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_activity_machine_param_return8209  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_activity_machine_param_return8209_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_activity_machine_param_return8209	= { FOLLOW_COMMA_in_activity_machine_param_return8209_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_labelled_argument_in_activity_machine_param_return8218  */
static	ANTLR3_BITWORD FOLLOW_labelled_argument_in_activity_machine_param_return8218_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_labelled_argument_in_activity_machine_param_return8218	= { FOLLOW_labelled_argument_in_activity_machine_param_return8218_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RPAREN_in_activity_machine_param_return8244  */
static	ANTLR3_BITWORD FOLLOW_RPAREN_in_activity_machine_param_return8244_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000800000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_RPAREN_in_activity_machine_param_return8244	= { FOLLOW_RPAREN_in_activity_machine_param_return8244_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_activity_machine_param_return8250  */
static	ANTLR3_BITWORD FOLLOW_set_in_activity_machine_param_return8250_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_activity_machine_param_return8250	= { FOLLOW_set_in_activity_machine_param_return8250_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LPAREN_in_activity_machine_param_return8265  */
static	ANTLR3_BITWORD FOLLOW_LPAREN_in_activity_machine_param_return8265_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LPAREN_in_activity_machine_param_return8265	= { FOLLOW_LPAREN_in_activity_machine_param_return8265_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_labelled_argument_in_activity_machine_param_return8274  */
static	ANTLR3_BITWORD FOLLOW_labelled_argument_in_activity_machine_param_return8274_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_labelled_argument_in_activity_machine_param_return8274	= { FOLLOW_labelled_argument_in_activity_machine_param_return8274_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_activity_machine_param_return8290  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_activity_machine_param_return8290_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_activity_machine_param_return8290	= { FOLLOW_COMMA_in_activity_machine_param_return8290_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_labelled_argument_in_activity_machine_param_return8301  */
static	ANTLR3_BITWORD FOLLOW_labelled_argument_in_activity_machine_param_return8301_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_labelled_argument_in_activity_machine_param_return8301	= { FOLLOW_labelled_argument_in_activity_machine_param_return8301_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RPAREN_in_activity_machine_param_return8325  */
static	ANTLR3_BITWORD FOLLOW_RPAREN_in_activity_machine_param_return8325_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RPAREN_in_activity_machine_param_return8325	= { FOLLOW_RPAREN_in_activity_machine_param_return8325_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_labelled_argument_in_activity_machine_param_return8335  */
static	ANTLR3_BITWORD FOLLOW_labelled_argument_in_activity_machine_param_return8335_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_labelled_argument_in_activity_machine_param_return8335	= { FOLLOW_labelled_argument_in_activity_machine_param_return8335_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_344_in_decl_port8376  */
static	ANTLR3_BITWORD FOLLOW_344_in_decl_port8376_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000001), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0002040000000000), ANTLR3_UINT64_LIT(0x0000100000200000) };
static  ANTLR3_BITSET_LIST FOLLOW_344_in_decl_port8376	= { FOLLOW_344_in_decl_port8376_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_decl_port_impl_in_decl_port8386  */
static	ANTLR3_BITWORD FOLLOW_decl_port_impl_in_decl_port8386_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_decl_port_impl_in_decl_port8386	= { FOLLOW_decl_port_impl_in_decl_port8386_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_decl_port_impl8416  */
static	ANTLR3_BITWORD FOLLOW_ID_in_decl_port_impl8416_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_decl_port_impl8416	= { FOLLOW_ID_in_decl_port_impl8416_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_type_param_com_in_decl_port_impl8428  */
static	ANTLR3_BITWORD FOLLOW_type_param_com_in_decl_port_impl8428_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_type_param_com_in_decl_port_impl8428	= { FOLLOW_type_param_com_in_decl_port_impl8428_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_decl_port_impl8435  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_decl_port_impl8435_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_decl_port_impl8435	= { FOLLOW_SEMI_in_decl_port_impl8435_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_modifier_set_direction_strict_text_in_decl_port_impl8441  */
static	ANTLR3_BITWORD FOLLOW_modifier_set_direction_strict_text_in_decl_port_impl8441_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_modifier_set_direction_strict_text_in_decl_port_impl8441	= { FOLLOW_modifier_set_direction_strict_text_in_decl_port_impl8441_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_decl_port_impl8451  */
static	ANTLR3_BITWORD FOLLOW_ID_in_decl_port_impl8451_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_decl_port_impl8451	= { FOLLOW_ID_in_decl_port_impl8451_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_type_param_com_in_decl_port_impl8461  */
static	ANTLR3_BITWORD FOLLOW_type_param_com_in_decl_port_impl8461_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_type_param_com_in_decl_port_impl8461	= { FOLLOW_type_param_com_in_decl_port_impl8461_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_decl_port_impl8468  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_decl_port_impl8468_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_decl_port_impl8468	= { FOLLOW_SEMI_in_decl_port_impl8468_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_decl_port_impl8476  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_decl_port_impl8476_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_decl_port_impl8476	= { FOLLOW_LCURLY_in_decl_port_impl8476_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_decl_port_impl8486  */
static	ANTLR3_BITWORD FOLLOW_ID_in_decl_port_impl8486_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_decl_port_impl8486	= { FOLLOW_ID_in_decl_port_impl8486_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_type_param_com_in_decl_port_impl8506  */
static	ANTLR3_BITWORD FOLLOW_type_param_com_in_decl_port_impl8506_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_type_param_com_in_decl_port_impl8506	= { FOLLOW_type_param_com_in_decl_port_impl8506_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_decl_port_impl8513  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_decl_port_impl8513_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x2000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_decl_port_impl8513	= { FOLLOW_SEMI_in_decl_port_impl8513_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_decl_port_impl8523  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_decl_port_impl8523_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_decl_port_impl8523	= { FOLLOW_RCURLY_in_decl_port_impl8523_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_decl_port_impl8533  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_decl_port_impl8533_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0002040000000000), ANTLR3_UINT64_LIT(0x0000100000200000) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_decl_port_impl8533	= { FOLLOW_LCURLY_in_decl_port_impl8533_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_decl_port_impl8551  */
static	ANTLR3_BITWORD FOLLOW_ID_in_decl_port_impl8551_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_decl_port_impl8551	= { FOLLOW_ID_in_decl_port_impl8551_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_type_param_com_in_decl_port_impl8567  */
static	ANTLR3_BITWORD FOLLOW_type_param_com_in_decl_port_impl8567_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_type_param_com_in_decl_port_impl8567	= { FOLLOW_type_param_com_in_decl_port_impl8567_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_decl_port_impl8574  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_decl_port_impl8574_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0002040000000000), ANTLR3_UINT64_LIT(0x0000100000200000) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_decl_port_impl8574	= { FOLLOW_SEMI_in_decl_port_impl8574_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_modifier_set_direction_strict_text_in_decl_port_impl8582  */
static	ANTLR3_BITWORD FOLLOW_modifier_set_direction_strict_text_in_decl_port_impl8582_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_modifier_set_direction_strict_text_in_decl_port_impl8582	= { FOLLOW_modifier_set_direction_strict_text_in_decl_port_impl8582_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_decl_port_impl8587  */
static	ANTLR3_BITWORD FOLLOW_ID_in_decl_port_impl8587_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_decl_port_impl8587	= { FOLLOW_ID_in_decl_port_impl8587_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_type_param_com_in_decl_port_impl8603  */
static	ANTLR3_BITWORD FOLLOW_type_param_com_in_decl_port_impl8603_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_type_param_com_in_decl_port_impl8603	= { FOLLOW_type_param_com_in_decl_port_impl8603_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_decl_port_impl8610  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_decl_port_impl8610_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0002040000000000), ANTLR3_UINT64_LIT(0x0000100000200000) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_decl_port_impl8610	= { FOLLOW_SEMI_in_decl_port_impl8610_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_decl_port_impl8621  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_decl_port_impl8621_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_decl_port_impl8621	= { FOLLOW_RCURLY_in_decl_port_impl8621_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_374_in_decl_signal8646  */
static	ANTLR3_BITWORD FOLLOW_374_in_decl_signal8646_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000001), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0002040000000000), ANTLR3_UINT64_LIT(0x0000100000200000) };
static  ANTLR3_BITSET_LIST FOLLOW_374_in_decl_signal8646	= { FOLLOW_374_in_decl_signal8646_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_320_in_decl_signal8656  */
static	ANTLR3_BITWORD FOLLOW_320_in_decl_signal8656_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000001), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0002040000000000), ANTLR3_UINT64_LIT(0x0000100000200000) };
static  ANTLR3_BITSET_LIST FOLLOW_320_in_decl_signal8656	= { FOLLOW_320_in_decl_signal8656_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_decl_signal_impl_in_decl_signal8668  */
static	ANTLR3_BITWORD FOLLOW_decl_signal_impl_in_decl_signal8668_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_decl_signal_impl_in_decl_signal8668	= { FOLLOW_decl_signal_impl_in_decl_signal8668_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_decl_signal_impl8698  */
static	ANTLR3_BITWORD FOLLOW_ID_in_decl_signal_impl8698_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_decl_signal_impl8698	= { FOLLOW_ID_in_decl_signal_impl8698_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_type_param_com_in_decl_signal_impl8710  */
static	ANTLR3_BITWORD FOLLOW_type_param_com_in_decl_signal_impl8710_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_type_param_com_in_decl_signal_impl8710	= { FOLLOW_type_param_com_in_decl_signal_impl8710_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_decl_signal_impl8717  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_decl_signal_impl8717_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_decl_signal_impl8717	= { FOLLOW_SEMI_in_decl_signal_impl8717_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_modifier_set_direction_strict_text_in_decl_signal_impl8723  */
static	ANTLR3_BITWORD FOLLOW_modifier_set_direction_strict_text_in_decl_signal_impl8723_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_modifier_set_direction_strict_text_in_decl_signal_impl8723	= { FOLLOW_modifier_set_direction_strict_text_in_decl_signal_impl8723_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_decl_signal_impl8733  */
static	ANTLR3_BITWORD FOLLOW_ID_in_decl_signal_impl8733_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_decl_signal_impl8733	= { FOLLOW_ID_in_decl_signal_impl8733_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_type_param_com_in_decl_signal_impl8743  */
static	ANTLR3_BITWORD FOLLOW_type_param_com_in_decl_signal_impl8743_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_type_param_com_in_decl_signal_impl8743	= { FOLLOW_type_param_com_in_decl_signal_impl8743_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_decl_signal_impl8750  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_decl_signal_impl8750_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_decl_signal_impl8750	= { FOLLOW_SEMI_in_decl_signal_impl8750_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_decl_signal_impl8758  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_decl_signal_impl8758_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_decl_signal_impl8758	= { FOLLOW_LCURLY_in_decl_signal_impl8758_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_decl_signal_impl8768  */
static	ANTLR3_BITWORD FOLLOW_ID_in_decl_signal_impl8768_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_decl_signal_impl8768	= { FOLLOW_ID_in_decl_signal_impl8768_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_type_param_com_in_decl_signal_impl8788  */
static	ANTLR3_BITWORD FOLLOW_type_param_com_in_decl_signal_impl8788_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_type_param_com_in_decl_signal_impl8788	= { FOLLOW_type_param_com_in_decl_signal_impl8788_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_decl_signal_impl8795  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_decl_signal_impl8795_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x2000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_decl_signal_impl8795	= { FOLLOW_SEMI_in_decl_signal_impl8795_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_decl_signal_impl8805  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_decl_signal_impl8805_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_decl_signal_impl8805	= { FOLLOW_RCURLY_in_decl_signal_impl8805_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_decl_signal_impl8815  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_decl_signal_impl8815_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0002040000000000), ANTLR3_UINT64_LIT(0x0000100000200000) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_decl_signal_impl8815	= { FOLLOW_LCURLY_in_decl_signal_impl8815_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_decl_signal_impl8833  */
static	ANTLR3_BITWORD FOLLOW_ID_in_decl_signal_impl8833_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_decl_signal_impl8833	= { FOLLOW_ID_in_decl_signal_impl8833_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_type_param_com_in_decl_signal_impl8849  */
static	ANTLR3_BITWORD FOLLOW_type_param_com_in_decl_signal_impl8849_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_type_param_com_in_decl_signal_impl8849	= { FOLLOW_type_param_com_in_decl_signal_impl8849_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_decl_signal_impl8856  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_decl_signal_impl8856_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0002040000000000), ANTLR3_UINT64_LIT(0x0000100000200000) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_decl_signal_impl8856	= { FOLLOW_SEMI_in_decl_signal_impl8856_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_modifier_set_direction_strict_text_in_decl_signal_impl8864  */
static	ANTLR3_BITWORD FOLLOW_modifier_set_direction_strict_text_in_decl_signal_impl8864_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_modifier_set_direction_strict_text_in_decl_signal_impl8864	= { FOLLOW_modifier_set_direction_strict_text_in_decl_signal_impl8864_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_decl_signal_impl8869  */
static	ANTLR3_BITWORD FOLLOW_ID_in_decl_signal_impl8869_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_decl_signal_impl8869	= { FOLLOW_ID_in_decl_signal_impl8869_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_type_param_com_in_decl_signal_impl8885  */
static	ANTLR3_BITWORD FOLLOW_type_param_com_in_decl_signal_impl8885_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_type_param_com_in_decl_signal_impl8885	= { FOLLOW_type_param_com_in_decl_signal_impl8885_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_decl_signal_impl8892  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_decl_signal_impl8892_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0002040000000000), ANTLR3_UINT64_LIT(0x0000100000200000) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_decl_signal_impl8892	= { FOLLOW_SEMI_in_decl_signal_impl8892_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_decl_signal_impl8903  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_decl_signal_impl8903_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_decl_signal_impl8903	= { FOLLOW_RCURLY_in_decl_signal_impl8903_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LPAREN_in_type_param_com8925  */
static	ANTLR3_BITWORD FOLLOW_LPAREN_in_type_param_com8925_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xC276000000000000), ANTLR3_UINT64_LIT(0x38E000000A00C128), ANTLR3_UINT64_LIT(0x0064016007002261), ANTLR3_UINT64_LIT(0x0000000013A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_LPAREN_in_type_param_com8925	= { FOLLOW_LPAREN_in_type_param_com8925_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_param_com_atom_in_type_param_com8932  */
static	ANTLR3_BITWORD FOLLOW_param_com_atom_in_type_param_com8932_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_param_com_atom_in_type_param_com8932	= { FOLLOW_param_com_atom_in_type_param_com8932_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_type_param_com8942  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_type_param_com8942_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xC276000000000000), ANTLR3_UINT64_LIT(0x38E000000A00C128), ANTLR3_UINT64_LIT(0x0064016007002261), ANTLR3_UINT64_LIT(0x0000000013A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_type_param_com8942	= { FOLLOW_COMMA_in_type_param_com8942_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_param_com_atom_in_type_param_com8944  */
static	ANTLR3_BITWORD FOLLOW_param_com_atom_in_type_param_com8944_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_param_com_atom_in_type_param_com8944	= { FOLLOW_param_com_atom_in_type_param_com8944_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RPAREN_in_type_param_com8953  */
static	ANTLR3_BITWORD FOLLOW_RPAREN_in_type_param_com8953_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RPAREN_in_type_param_com8953	= { FOLLOW_RPAREN_in_type_param_com8953_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_type_var_in_param_com_atom8973  */
static	ANTLR3_BITWORD FOLLOW_type_var_in_param_com_atom8973_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_type_var_in_param_com_atom8973	= { FOLLOW_type_var_in_param_com_atom8973_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_param_com_atom8984  */
static	ANTLR3_BITWORD FOLLOW_ID_in_param_com_atom8984_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000012), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_param_com_atom8984	= { FOLLOW_ID_in_param_com_atom8984_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_initial_value_in_param_com_atom9001  */
static	ANTLR3_BITWORD FOLLOW_initial_value_in_param_com_atom9001_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_initial_value_in_param_com_atom9001	= { FOLLOW_initial_value_in_param_com_atom9001_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_244_in_param_com_atom9022  */
static	ANTLR3_BITWORD FOLLOW_244_in_param_com_atom9022_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xC266000000000000), ANTLR3_UINT64_LIT(0x38E000000A00C128), ANTLR3_UINT64_LIT(0x0064016007002261), ANTLR3_UINT64_LIT(0x0000000013A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_244_in_param_com_atom9022	= { FOLLOW_244_in_param_com_atom9022_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_type_var_in_param_com_atom9042  */
static	ANTLR3_BITWORD FOLLOW_type_var_in_param_com_atom9042_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000200000) };
static  ANTLR3_BITSET_LIST FOLLOW_type_var_in_param_com_atom9042	= { FOLLOW_type_var_in_param_com_atom9042_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COLON_in_param_com_atom9044  */
static	ANTLR3_BITWORD FOLLOW_COLON_in_param_com_atom9044_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_COLON_in_param_com_atom9044	= { FOLLOW_COLON_in_param_com_atom9044_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_param_com_atom9056  */
static	ANTLR3_BITWORD FOLLOW_expression_in_param_com_atom9056_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_param_com_atom9056	= { FOLLOW_expression_in_param_com_atom9056_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_qualifiedNameID_in_param_com_atom9067  */
static	ANTLR3_BITWORD FOLLOW_qualifiedNameID_in_param_com_atom9067_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_qualifiedNameID_in_param_com_atom9067	= { FOLLOW_qualifiedNameID_in_param_com_atom9067_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_249_in_decl_buffer9098  */
static	ANTLR3_BITWORD FOLLOW_249_in_decl_buffer9098_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0800000002000000), ANTLR3_UINT64_LIT(0x0024001000000260), ANTLR3_UINT64_LIT(0x0000000010000000) };
static  ANTLR3_BITSET_LIST FOLLOW_249_in_decl_buffer9098	= { FOLLOW_249_in_decl_buffer9098_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_decl_buffer_impl_in_decl_buffer9101  */
static	ANTLR3_BITWORD FOLLOW_decl_buffer_impl_in_decl_buffer9101_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_decl_buffer_impl_in_decl_buffer9101	= { FOLLOW_decl_buffer_impl_in_decl_buffer9101_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_buffer_in_decl_buffer_impl9122  */
static	ANTLR3_BITWORD FOLLOW_def_buffer_in_decl_buffer_impl9122_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_def_buffer_in_decl_buffer_impl9122	= { FOLLOW_def_buffer_in_decl_buffer_impl9122_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_decl_buffer_impl9127  */
static	ANTLR3_BITWORD FOLLOW_ID_in_decl_buffer_impl9127_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000010), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_decl_buffer_impl9127	= { FOLLOW_ID_in_decl_buffer_impl9127_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_initial_buffer_contents_in_decl_buffer_impl9137  */
static	ANTLR3_BITWORD FOLLOW_initial_buffer_contents_in_decl_buffer_impl9137_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_initial_buffer_contents_in_decl_buffer_impl9137	= { FOLLOW_initial_buffer_contents_in_decl_buffer_impl9137_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_decl_buffer_impl9144  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_decl_buffer_impl9144_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_decl_buffer_impl9144	= { FOLLOW_SEMI_in_decl_buffer_impl9144_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_decl_buffer_impl9150  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_decl_buffer_impl9150_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0800000002000000), ANTLR3_UINT64_LIT(0x0024001000000260), ANTLR3_UINT64_LIT(0x0000000010000000) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_decl_buffer_impl9150	= { FOLLOW_LCURLY_in_decl_buffer_impl9150_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_buffer_in_decl_buffer_impl9164  */
static	ANTLR3_BITWORD FOLLOW_def_buffer_in_decl_buffer_impl9164_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_def_buffer_in_decl_buffer_impl9164	= { FOLLOW_def_buffer_in_decl_buffer_impl9164_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_decl_buffer_impl9169  */
static	ANTLR3_BITWORD FOLLOW_ID_in_decl_buffer_impl9169_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0800000002000000), ANTLR3_UINT64_LIT(0x0024001000000260), ANTLR3_UINT64_LIT(0x0000000010000000) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_decl_buffer_impl9169	= { FOLLOW_ID_in_decl_buffer_impl9169_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_decl_buffer_impl9187  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_decl_buffer_impl9187_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_decl_buffer_impl9187	= { FOLLOW_RCURLY_in_decl_buffer_impl9187_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_policy_buffer_in_def_buffer9205  */
static	ANTLR3_BITWORD FOLLOW_policy_buffer_in_def_buffer9205_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_policy_buffer_in_def_buffer9205	= { FOLLOW_policy_buffer_in_def_buffer9205_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LT__in_def_buffer9215  */
static	ANTLR3_BITWORD FOLLOW_LT__in_def_buffer9215_bits[]	= { ANTLR3_UINT64_LIT(0x0084000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000200) };
static  ANTLR3_BITSET_LIST FOLLOW_LT__in_def_buffer9215	= { FOLLOW_LT__in_def_buffer9215_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_integer_constant_in_def_buffer9226  */
static	ANTLR3_BITWORD FOLLOW_integer_constant_in_def_buffer9226_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_integer_constant_in_def_buffer9226	= { FOLLOW_integer_constant_in_def_buffer9226_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_STAR_in_def_buffer9238  */
static	ANTLR3_BITWORD FOLLOW_STAR_in_def_buffer9238_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_STAR_in_def_buffer9238	= { FOLLOW_STAR_in_def_buffer9238_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_GT_in_def_buffer9267  */
static	ANTLR3_BITWORD FOLLOW_GT_in_def_buffer9267_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_GT_in_def_buffer9267	= { FOLLOW_GT_in_def_buffer9267_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_356_in_def_buffer9276  */
static	ANTLR3_BITWORD FOLLOW_356_in_def_buffer9276_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_356_in_def_buffer9276	= { FOLLOW_356_in_def_buffer9276_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_281_in_policy_buffer9295  */
static	ANTLR3_BITWORD FOLLOW_281_in_policy_buffer9295_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_281_in_policy_buffer9295	= { FOLLOW_281_in_policy_buffer9295_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_315_in_policy_buffer9307  */
static	ANTLR3_BITWORD FOLLOW_315_in_policy_buffer9307_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_315_in_policy_buffer9307	= { FOLLOW_315_in_policy_buffer9307_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_325_in_policy_buffer9319  */
static	ANTLR3_BITWORD FOLLOW_325_in_policy_buffer9319_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_325_in_policy_buffer9319	= { FOLLOW_325_in_policy_buffer9319_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_326_in_policy_buffer9326  */
static	ANTLR3_BITWORD FOLLOW_326_in_policy_buffer9326_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_326_in_policy_buffer9326	= { FOLLOW_326_in_policy_buffer9326_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_373_in_policy_buffer9333  */
static	ANTLR3_BITWORD FOLLOW_373_in_policy_buffer9333_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_373_in_policy_buffer9333	= { FOLLOW_373_in_policy_buffer9333_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_329_in_policy_buffer9346  */
static	ANTLR3_BITWORD FOLLOW_329_in_policy_buffer9346_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_329_in_policy_buffer9346	= { FOLLOW_329_in_policy_buffer9346_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_412_in_policy_buffer9354  */
static	ANTLR3_BITWORD FOLLOW_412_in_policy_buffer9354_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_412_in_policy_buffer9354	= { FOLLOW_412_in_policy_buffer9354_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_370_in_policy_buffer9364  */
static	ANTLR3_BITWORD FOLLOW_370_in_policy_buffer9364_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_370_in_policy_buffer9364	= { FOLLOW_370_in_policy_buffer9364_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_qualifiedNameID_in_ref_buffer9386  */
static	ANTLR3_BITWORD FOLLOW_qualifiedNameID_in_ref_buffer9386_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_qualifiedNameID_in_ref_buffer9386	= { FOLLOW_qualifiedNameID_in_ref_buffer9386_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ASSIGN_in_initial_buffer_contents9406  */
static	ANTLR3_BITWORD FOLLOW_ASSIGN_in_initial_buffer_contents9406_bits[]	= { ANTLR3_UINT64_LIT(0x1000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_ASSIGN_in_initial_buffer_contents9406	= { FOLLOW_ASSIGN_in_initial_buffer_contents9406_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LBRACKET_in_initial_buffer_contents9408  */
static	ANTLR3_BITWORD FOLLOW_LBRACKET_in_initial_buffer_contents9408_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_LBRACKET_in_initial_buffer_contents9408	= { FOLLOW_LBRACKET_in_initial_buffer_contents9408_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_qualifiedNameID_in_initial_buffer_contents9417  */
static	ANTLR3_BITWORD FOLLOW_qualifiedNameID_in_initial_buffer_contents9417_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x1000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_qualifiedNameID_in_initial_buffer_contents9417	= { FOLLOW_qualifiedNameID_in_initial_buffer_contents9417_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_initial_buffer_contents9431  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_initial_buffer_contents9431_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_initial_buffer_contents9431	= { FOLLOW_COMMA_in_initial_buffer_contents9431_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_qualifiedNameID_in_initial_buffer_contents9435  */
static	ANTLR3_BITWORD FOLLOW_qualifiedNameID_in_initial_buffer_contents9435_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x1000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_qualifiedNameID_in_initial_buffer_contents9435	= { FOLLOW_qualifiedNameID_in_initial_buffer_contents9435_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RBRACKET_in_initial_buffer_contents9446  */
static	ANTLR3_BITWORD FOLLOW_RBRACKET_in_initial_buffer_contents9446_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RBRACKET_in_initial_buffer_contents9446	= { FOLLOW_RBRACKET_in_initial_buffer_contents9446_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_253_in_decl_channel9465  */
static	ANTLR3_BITWORD FOLLOW_253_in_decl_channel9465_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000002000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0002040000000000), ANTLR3_UINT64_LIT(0x0000100000200000) };
static  ANTLR3_BITSET_LIST FOLLOW_253_in_decl_channel9465	= { FOLLOW_253_in_decl_channel9465_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_decl_channel_port_in_decl_channel9468  */
static	ANTLR3_BITWORD FOLLOW_decl_channel_port_in_decl_channel9468_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_decl_channel_port_in_decl_channel9468	= { FOLLOW_decl_channel_port_in_decl_channel9468_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LT__in_decl_channel_port9491  */
static	ANTLR3_BITWORD FOLLOW_LT__in_decl_channel_port9491_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0301000000000000), ANTLR3_UINT64_LIT(0x0800000012200000), ANTLR3_UINT64_LIT(0x0024009000000370), ANTLR3_UINT64_LIT(0x0000000010080000) };
static  ANTLR3_BITSET_LIST FOLLOW_LT__in_decl_channel_port9491	= { FOLLOW_LT__in_decl_channel_port9491_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_com_protocol_in_decl_channel_port9498  */
static	ANTLR3_BITWORD FOLLOW_com_protocol_in_decl_channel_port9498_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000800000) };
static  ANTLR3_BITSET_LIST FOLLOW_com_protocol_in_decl_channel_port9498	= { FOLLOW_com_protocol_in_decl_channel_port9498_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_decl_channel_port9508  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_decl_channel_port9508_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0101000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000010), ANTLR3_UINT64_LIT(0x0000000000080000) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_decl_channel_port9508	= { FOLLOW_COMMA_in_decl_channel_port9508_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_com_cast_in_decl_channel_port9510  */
static	ANTLR3_BITWORD FOLLOW_com_cast_in_decl_channel_port9510_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_com_cast_in_decl_channel_port9510	= { FOLLOW_com_cast_in_decl_channel_port9510_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_GT_in_decl_channel_port9521  */
static	ANTLR3_BITWORD FOLLOW_GT_in_decl_channel_port9521_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0002040000000000), ANTLR3_UINT64_LIT(0x0000100000200000) };
static  ANTLR3_BITSET_LIST FOLLOW_GT_in_decl_channel_port9521	= { FOLLOW_GT_in_decl_channel_port9521_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_modifier_set_direction_strict_text_in_decl_channel_port9535  */
static	ANTLR3_BITWORD FOLLOW_modifier_set_direction_strict_text_in_decl_channel_port9535_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_modifier_set_direction_strict_text_in_decl_channel_port9535	= { FOLLOW_modifier_set_direction_strict_text_in_decl_channel_port9535_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_decl_channel_port9547  */
static	ANTLR3_BITWORD FOLLOW_ID_in_decl_channel_port9547_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_decl_channel_port9547	= { FOLLOW_ID_in_decl_channel_port9547_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_decl_channel_port9556  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_decl_channel_port9556_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000080), ANTLR3_UINT64_LIT(0x0000000000001000), ANTLR3_UINT64_LIT(0x0000005000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0002048000000000), ANTLR3_UINT64_LIT(0x0040100001208001) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_decl_channel_port9556	= { FOLLOW_LCURLY_in_decl_channel_port9556_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_modifier_direction_in_decl_channel_port9570  */
static	ANTLR3_BITWORD FOLLOW_modifier_direction_in_decl_channel_port9570_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_modifier_direction_in_decl_channel_port9570	= { FOLLOW_modifier_direction_in_decl_channel_port9570_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_qualifiedNameID_in_decl_channel_port9575  */
static	ANTLR3_BITWORD FOLLOW_qualifiedNameID_in_decl_channel_port9575_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_qualifiedNameID_in_decl_channel_port9575	= { FOLLOW_qualifiedNameID_in_decl_channel_port9575_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_decl_channel_port9577  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_decl_channel_port9577_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000080), ANTLR3_UINT64_LIT(0x2000000000001000), ANTLR3_UINT64_LIT(0x0000005000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0002048000000000), ANTLR3_UINT64_LIT(0x0040100001208001) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_decl_channel_port9577	= { FOLLOW_SEMI_in_decl_channel_port9577_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_decl_port_in_decl_channel_port9592  */
static	ANTLR3_BITWORD FOLLOW_decl_port_in_decl_channel_port9592_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000080), ANTLR3_UINT64_LIT(0x2000000000001000), ANTLR3_UINT64_LIT(0x0000005000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0002048000000000), ANTLR3_UINT64_LIT(0x0040100001208001) };
static  ANTLR3_BITSET_LIST FOLLOW_decl_port_in_decl_channel_port9592	= { FOLLOW_decl_port_in_decl_channel_port9592_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_decl_signal_in_decl_channel_port9609  */
static	ANTLR3_BITWORD FOLLOW_decl_signal_in_decl_channel_port9609_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000080), ANTLR3_UINT64_LIT(0x2000000000001000), ANTLR3_UINT64_LIT(0x0000005000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0002048000000000), ANTLR3_UINT64_LIT(0x0040100001208001) };
static  ANTLR3_BITSET_LIST FOLLOW_decl_signal_in_decl_channel_port9609	= { FOLLOW_decl_signal_in_decl_channel_port9609_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_decl_channel_port9621  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_decl_channel_port9621_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_decl_channel_port9621	= { FOLLOW_RCURLY_in_decl_channel_port9621_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_type_var_in_decl_channel_var9642  */
static	ANTLR3_BITWORD FOLLOW_type_var_in_decl_channel_var9642_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_type_var_in_decl_channel_var9642	= { FOLLOW_type_var_in_decl_channel_var9642_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_decl_channel_var9647  */
static	ANTLR3_BITWORD FOLLOW_ID_in_decl_channel_var9647_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000010), ANTLR3_UINT64_LIT(0x0000000000000081), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_decl_channel_var9647	= { FOLLOW_ID_in_decl_channel_var9647_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_initial_value_in_decl_channel_var9661  */
static	ANTLR3_BITWORD FOLLOW_initial_value_in_decl_channel_var9661_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_initial_value_in_decl_channel_var9661	= { FOLLOW_initial_value_in_decl_channel_var9661_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_decl_channel_var9674  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_decl_channel_var9674_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_decl_channel_var9674	= { FOLLOW_SEMI_in_decl_channel_var9674_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_on_write_var_routine_def_in_decl_channel_var9680  */
static	ANTLR3_BITWORD FOLLOW_on_write_var_routine_def_in_decl_channel_var9680_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_on_write_var_routine_def_in_decl_channel_var9680	= { FOLLOW_on_write_var_routine_def_in_decl_channel_var9680_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_decl_channel_var9689  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_decl_channel_var9689_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xC266000000000000), ANTLR3_UINT64_LIT(0x38E000000A00C128), ANTLR3_UINT64_LIT(0x0064016007002261), ANTLR3_UINT64_LIT(0x0000000013A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_decl_channel_var9689	= { FOLLOW_LCURLY_in_decl_channel_var9689_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_type_var_in_decl_channel_var9698  */
static	ANTLR3_BITWORD FOLLOW_type_var_in_decl_channel_var9698_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_type_var_in_decl_channel_var9698	= { FOLLOW_type_var_in_decl_channel_var9698_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_decl_channel_var9703  */
static	ANTLR3_BITWORD FOLLOW_ID_in_decl_channel_var9703_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000010), ANTLR3_UINT64_LIT(0x0000000000000081), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_decl_channel_var9703	= { FOLLOW_ID_in_decl_channel_var9703_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_initial_value_in_decl_channel_var9717  */
static	ANTLR3_BITWORD FOLLOW_initial_value_in_decl_channel_var9717_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_initial_value_in_decl_channel_var9717	= { FOLLOW_initial_value_in_decl_channel_var9717_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_decl_channel_var9730  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_decl_channel_var9730_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xC266000000000000), ANTLR3_UINT64_LIT(0x38E000000A00C128), ANTLR3_UINT64_LIT(0x0064016007002261), ANTLR3_UINT64_LIT(0x0000000013A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_decl_channel_var9730	= { FOLLOW_SEMI_in_decl_channel_var9730_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_on_write_var_routine_def_in_decl_channel_var9736  */
static	ANTLR3_BITWORD FOLLOW_on_write_var_routine_def_in_decl_channel_var9736_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xC266000000000000), ANTLR3_UINT64_LIT(0x38E000000A00C128), ANTLR3_UINT64_LIT(0x0064016007002261), ANTLR3_UINT64_LIT(0x0000000013A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_on_write_var_routine_def_in_decl_channel_var9736	= { FOLLOW_on_write_var_routine_def_in_decl_channel_var9736_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_decl_channel_var9748  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_decl_channel_var9748_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_decl_channel_var9748	= { FOLLOW_RCURLY_in_decl_channel_var9748_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_411_in_decl_variable9769  */
static	ANTLR3_BITWORD FOLLOW_411_in_decl_variable9769_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000001), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xC266000000000000), ANTLR3_UINT64_LIT(0x38E000000A00C128), ANTLR3_UINT64_LIT(0x0064016007002261), ANTLR3_UINT64_LIT(0x0000000013A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_411_in_decl_variable9769	= { FOLLOW_411_in_decl_variable9769_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_410_in_decl_variable9783  */
static	ANTLR3_BITWORD FOLLOW_410_in_decl_variable9783_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000001), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xC266000000000000), ANTLR3_UINT64_LIT(0x38E000000A00C128), ANTLR3_UINT64_LIT(0x0064016007002261), ANTLR3_UINT64_LIT(0x0000000013A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_410_in_decl_variable9783	= { FOLLOW_410_in_decl_variable9783_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_262_in_decl_variable9799  */
static	ANTLR3_BITWORD FOLLOW_262_in_decl_variable9799_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000001), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xC266000000000000), ANTLR3_UINT64_LIT(0x78E000000A00C168), ANTLR3_UINT64_LIT(0x0064016007002261), ANTLR3_UINT64_LIT(0x000000001BA78108) };
static  ANTLR3_BITSET_LIST FOLLOW_262_in_decl_variable9799	= { FOLLOW_262_in_decl_variable9799_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_318_in_decl_variable9811  */
static	ANTLR3_BITWORD FOLLOW_318_in_decl_variable9811_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000001), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xC266000000000000), ANTLR3_UINT64_LIT(0x78E000000A00C168), ANTLR3_UINT64_LIT(0x0064016007002261), ANTLR3_UINT64_LIT(0x000000001BA78108) };
static  ANTLR3_BITSET_LIST FOLLOW_318_in_decl_variable9811	= { FOLLOW_318_in_decl_variable9811_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_411_in_decl_variable9831  */
static	ANTLR3_BITWORD FOLLOW_411_in_decl_variable9831_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000001), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xC266000000000000), ANTLR3_UINT64_LIT(0x38E000000A00C128), ANTLR3_UINT64_LIT(0x0064016007002261), ANTLR3_UINT64_LIT(0x0000000013A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_411_in_decl_variable9831	= { FOLLOW_411_in_decl_variable9831_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_decl_variable_impl_in_decl_variable9844  */
static	ANTLR3_BITWORD FOLLOW_decl_variable_impl_in_decl_variable9844_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_decl_variable_impl_in_decl_variable9844	= { FOLLOW_decl_variable_impl_in_decl_variable9844_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_decl_variable_time_clock_impl_in_decl_variable9851  */
static	ANTLR3_BITWORD FOLLOW_decl_variable_time_clock_impl_in_decl_variable9851_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_decl_variable_time_clock_impl_in_decl_variable9851	= { FOLLOW_decl_variable_time_clock_impl_in_decl_variable9851_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_time_clock_type_in_decl_variable_time_clock_impl9873  */
static	ANTLR3_BITWORD FOLLOW_time_clock_type_in_decl_variable_time_clock_impl9873_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_time_clock_type_in_decl_variable_time_clock_impl9873	= { FOLLOW_time_clock_type_in_decl_variable_time_clock_impl9873_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_decl_typed_variable_atom_impl_in_decl_variable_time_clock_impl9878  */
static	ANTLR3_BITWORD FOLLOW_decl_typed_variable_atom_impl_in_decl_variable_time_clock_impl9878_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_decl_typed_variable_atom_impl_in_decl_variable_time_clock_impl9878	= { FOLLOW_decl_typed_variable_atom_impl_in_decl_variable_time_clock_impl9878_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_decl_variable_atom_impl_in_decl_variable_impl9894  */
static	ANTLR3_BITWORD FOLLOW_decl_variable_atom_impl_in_decl_variable_impl9894_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_decl_variable_atom_impl_in_decl_variable_impl9894	= { FOLLOW_decl_variable_atom_impl_in_decl_variable_impl9894_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_decl_variable_impl9901  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_decl_variable_impl9901_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xC266000000000000), ANTLR3_UINT64_LIT(0x38E000000A00C128), ANTLR3_UINT64_LIT(0x0064016007002261), ANTLR3_UINT64_LIT(0x0000000013A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_decl_variable_impl9901	= { FOLLOW_LCURLY_in_decl_variable_impl9901_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_decl_variable_atom_impl_in_decl_variable_impl9908  */
static	ANTLR3_BITWORD FOLLOW_decl_variable_atom_impl_in_decl_variable_impl9908_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xC266000000000000), ANTLR3_UINT64_LIT(0x38E000000A00C128), ANTLR3_UINT64_LIT(0x0064016007002261), ANTLR3_UINT64_LIT(0x0000000013A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_decl_variable_atom_impl_in_decl_variable_impl9908	= { FOLLOW_decl_variable_atom_impl_in_decl_variable_impl9908_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_decl_variable_impl9917  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_decl_variable_impl9917_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_decl_variable_impl9917	= { FOLLOW_RCURLY_in_decl_variable_impl9917_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_type_var_in_decl_variable_atom_impl9933  */
static	ANTLR3_BITWORD FOLLOW_type_var_in_decl_variable_atom_impl9933_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_type_var_in_decl_variable_atom_impl9933	= { FOLLOW_type_var_in_decl_variable_atom_impl9933_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_decl_typed_variable_atom_impl_in_decl_variable_atom_impl9938  */
static	ANTLR3_BITWORD FOLLOW_decl_typed_variable_atom_impl_in_decl_variable_atom_impl9938_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_decl_typed_variable_atom_impl_in_decl_variable_atom_impl9938	= { FOLLOW_decl_typed_variable_atom_impl_in_decl_variable_atom_impl9938_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_decl_typed_variable_atom_impl9959  */
static	ANTLR3_BITWORD FOLLOW_ID_in_decl_typed_variable_atom_impl9959_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000010), ANTLR3_UINT64_LIT(0x0000000000000081), ANTLR3_UINT64_LIT(0x0000000000002080) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_decl_typed_variable_atom_impl9959	= { FOLLOW_ID_in_decl_typed_variable_atom_impl9959_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_StringLiteral_in_decl_typed_variable_atom_impl9972  */
static	ANTLR3_BITWORD FOLLOW_StringLiteral_in_decl_typed_variable_atom_impl9972_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000010), ANTLR3_UINT64_LIT(0x0000000000000081), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_StringLiteral_in_decl_typed_variable_atom_impl9972	= { FOLLOW_StringLiteral_in_decl_typed_variable_atom_impl9972_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_initial_value_in_decl_typed_variable_atom_impl9993  */
static	ANTLR3_BITWORD FOLLOW_initial_value_in_decl_typed_variable_atom_impl9993_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_initial_value_in_decl_typed_variable_atom_impl9993	= { FOLLOW_initial_value_in_decl_typed_variable_atom_impl9993_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_decl_typed_variable_atom_impl10006  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_decl_typed_variable_atom_impl10006_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_decl_typed_variable_atom_impl10006	= { FOLLOW_SEMI_in_decl_typed_variable_atom_impl10006_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_on_write_var_routine_def_in_decl_typed_variable_atom_impl10012  */
static	ANTLR3_BITWORD FOLLOW_on_write_var_routine_def_in_decl_typed_variable_atom_impl10012_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_on_write_var_routine_def_in_decl_typed_variable_atom_impl10012	= { FOLLOW_on_write_var_routine_def_in_decl_typed_variable_atom_impl10012_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ASSIGN_in_initial_value10031  */
static	ANTLR3_BITWORD FOLLOW_ASSIGN_in_initial_value10031_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_ASSIGN_in_initial_value10031	= { FOLLOW_ASSIGN_in_initial_value10031_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_initial_value10036  */
static	ANTLR3_BITWORD FOLLOW_expression_in_initial_value10036_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_initial_value10036	= { FOLLOW_expression_in_initial_value10036_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LPAREN_in_initial_value10052  */
static	ANTLR3_BITWORD FOLLOW_LPAREN_in_initial_value10052_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LPAREN_in_initial_value10052	= { FOLLOW_LPAREN_in_initial_value10052_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_initial_value10057  */
static	ANTLR3_BITWORD FOLLOW_expression_in_initial_value10057_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_initial_value10057	= { FOLLOW_expression_in_initial_value10057_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RPAREN_in_initial_value10060  */
static	ANTLR3_BITWORD FOLLOW_RPAREN_in_initial_value10060_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RPAREN_in_initial_value10060	= { FOLLOW_RPAREN_in_initial_value10060_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_base_type_var_in_type_var10081  */
static	ANTLR3_BITWORD FOLLOW_base_type_var_in_type_var10081_bits[]	= { ANTLR3_UINT64_LIT(0x1000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_base_type_var_in_type_var10081	= { FOLLOW_base_type_var_in_type_var10081_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_type_array_in_type_var10109  */
static	ANTLR3_BITWORD FOLLOW_def_type_array_in_type_var10109_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_type_array_in_type_var10109	= { FOLLOW_def_type_array_in_type_var10109_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_type_container_in_type_var10124  */
static	ANTLR3_BITWORD FOLLOW_def_type_container_in_type_var10124_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_type_container_in_type_var10124	= { FOLLOW_def_type_container_in_type_var10124_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_type_interval_in_type_var10141  */
static	ANTLR3_BITWORD FOLLOW_def_type_interval_in_type_var10141_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_type_interval_in_type_var10141	= { FOLLOW_def_type_interval_in_type_var10141_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_type_array_size_in_def_type_array10178  */
static	ANTLR3_BITWORD FOLLOW_def_type_array_size_in_def_type_array10178_bits[]	= { ANTLR3_UINT64_LIT(0x1000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_type_array_size_in_def_type_array10178	= { FOLLOW_def_type_array_size_in_def_type_array10178_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LBRACKET_in_def_type_array_size10202  */
static	ANTLR3_BITWORD FOLLOW_LBRACKET_in_def_type_array_size10202_bits[]	= { ANTLR3_UINT64_LIT(0x0084000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_LBRACKET_in_def_type_array_size10202	= { FOLLOW_LBRACKET_in_def_type_array_size10202_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_IntegerLiteral_in_def_type_array_size10213  */
static	ANTLR3_BITWORD FOLLOW_IntegerLiteral_in_def_type_array_size10213_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x1000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_IntegerLiteral_in_def_type_array_size10213	= { FOLLOW_IntegerLiteral_in_def_type_array_size10213_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_qualifiedNameID_in_def_type_array_size10228  */
static	ANTLR3_BITWORD FOLLOW_qualifiedNameID_in_def_type_array_size10228_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x1000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_qualifiedNameID_in_def_type_array_size10228	= { FOLLOW_qualifiedNameID_in_def_type_array_size10228_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RBRACKET_in_def_type_array_size10241  */
static	ANTLR3_BITWORD FOLLOW_RBRACKET_in_def_type_array_size10241_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RBRACKET_in_def_type_array_size10241	= { FOLLOW_RBRACKET_in_def_type_array_size10241_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_specifier_buffer_in_def_type_container10266  */
static	ANTLR3_BITWORD FOLLOW_specifier_buffer_in_def_type_container10266_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_specifier_buffer_in_def_type_container10266	= { FOLLOW_specifier_buffer_in_def_type_container10266_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LT__in_def_type_container10274  */
static	ANTLR3_BITWORD FOLLOW_LT__in_def_type_container10274_bits[]	= { ANTLR3_UINT64_LIT(0x0084000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xC264000000000000), ANTLR3_UINT64_LIT(0x206000000800C128), ANTLR3_UINT64_LIT(0x00C0016007002001), ANTLR3_UINT64_LIT(0x0000000003A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_LT__in_def_type_container10274	= { FOLLOW_LT__in_def_type_container10274_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_base_type_var_in_def_type_container10287  */
static	ANTLR3_BITWORD FOLLOW_base_type_var_in_def_type_container10287_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000800000) };
static  ANTLR3_BITSET_LIST FOLLOW_base_type_var_in_def_type_container10287	= { FOLLOW_base_type_var_in_def_type_container10287_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_def_type_container10303  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_def_type_container10303_bits[]	= { ANTLR3_UINT64_LIT(0x0084000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000200), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0080000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_def_type_container10303	= { FOLLOW_COMMA_in_def_type_container10303_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_375_in_def_type_container10308  */
static	ANTLR3_BITWORD FOLLOW_375_in_def_type_container10308_bits[]	= { ANTLR3_UINT64_LIT(0x0084000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000200) };
static  ANTLR3_BITSET_LIST FOLLOW_375_in_def_type_container10308	= { FOLLOW_375_in_def_type_container10308_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_integer_constant_in_def_type_container10328  */
static	ANTLR3_BITWORD FOLLOW_integer_constant_in_def_type_container10328_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_integer_constant_in_def_type_container10328	= { FOLLOW_integer_constant_in_def_type_container10328_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_STAR_in_def_type_container10345  */
static	ANTLR3_BITWORD FOLLOW_STAR_in_def_type_container10345_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_STAR_in_def_type_container10345	= { FOLLOW_STAR_in_def_type_container10345_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_375_in_def_type_container10407  */
static	ANTLR3_BITWORD FOLLOW_375_in_def_type_container10407_bits[]	= { ANTLR3_UINT64_LIT(0x0084000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_375_in_def_type_container10407	= { FOLLOW_375_in_def_type_container10407_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_integer_constant_in_def_type_container10414  */
static	ANTLR3_BITWORD FOLLOW_integer_constant_in_def_type_container10414_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_integer_constant_in_def_type_container10414	= { FOLLOW_integer_constant_in_def_type_container10414_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_GT_in_def_type_container10431  */
static	ANTLR3_BITWORD FOLLOW_GT_in_def_type_container10431_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_GT_in_def_type_container10431	= { FOLLOW_GT_in_def_type_container10431_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_241_in_specifier_buffer10456  */
static	ANTLR3_BITWORD FOLLOW_241_in_specifier_buffer10456_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_241_in_specifier_buffer10456	= { FOLLOW_241_in_specifier_buffer10456_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_412_in_specifier_buffer10467  */
static	ANTLR3_BITWORD FOLLOW_412_in_specifier_buffer10467_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_412_in_specifier_buffer10467	= { FOLLOW_412_in_specifier_buffer10467_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_370_in_specifier_buffer10477  */
static	ANTLR3_BITWORD FOLLOW_370_in_specifier_buffer10477_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_370_in_specifier_buffer10477	= { FOLLOW_370_in_specifier_buffer10477_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_316_in_specifier_buffer10486  */
static	ANTLR3_BITWORD FOLLOW_316_in_specifier_buffer10486_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_316_in_specifier_buffer10486	= { FOLLOW_316_in_specifier_buffer10486_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_281_in_specifier_buffer10498  */
static	ANTLR3_BITWORD FOLLOW_281_in_specifier_buffer10498_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_281_in_specifier_buffer10498	= { FOLLOW_281_in_specifier_buffer10498_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_315_in_specifier_buffer10510  */
static	ANTLR3_BITWORD FOLLOW_315_in_specifier_buffer10510_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_315_in_specifier_buffer10510	= { FOLLOW_315_in_specifier_buffer10510_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_325_in_specifier_buffer10522  */
static	ANTLR3_BITWORD FOLLOW_325_in_specifier_buffer10522_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_325_in_specifier_buffer10522	= { FOLLOW_325_in_specifier_buffer10522_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_326_in_specifier_buffer10529  */
static	ANTLR3_BITWORD FOLLOW_326_in_specifier_buffer10529_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_326_in_specifier_buffer10529	= { FOLLOW_326_in_specifier_buffer10529_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_373_in_specifier_buffer10536  */
static	ANTLR3_BITWORD FOLLOW_373_in_specifier_buffer10536_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_373_in_specifier_buffer10536	= { FOLLOW_373_in_specifier_buffer10536_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_329_in_specifier_buffer10549  */
static	ANTLR3_BITWORD FOLLOW_329_in_specifier_buffer10549_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_329_in_specifier_buffer10549	= { FOLLOW_329_in_specifier_buffer10549_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_311_in_def_type_interval10574  */
static	ANTLR3_BITWORD FOLLOW_311_in_def_type_interval10574_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_311_in_def_type_interval10574	= { FOLLOW_311_in_def_type_interval10574_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LT__in_def_type_interval10582  */
static	ANTLR3_BITWORD FOLLOW_LT__in_def_type_interval10582_bits[]	= { ANTLR3_UINT64_LIT(0x1000000000000000), ANTLR3_UINT64_LIT(0x1000000000000080), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xC264000000000000), ANTLR3_UINT64_LIT(0x206000000800C128), ANTLR3_UINT64_LIT(0x0040016007002001), ANTLR3_UINT64_LIT(0x0000000003A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_LT__in_def_type_interval10582	= { FOLLOW_LT__in_def_type_interval10582_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_primitive_type_in_def_type_interval10593  */
static	ANTLR3_BITWORD FOLLOW_primitive_type_in_def_type_interval10593_bits[]	= { ANTLR3_UINT64_LIT(0x1000000000000000), ANTLR3_UINT64_LIT(0x1000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_primitive_type_in_def_type_interval10593	= { FOLLOW_primitive_type_in_def_type_interval10593_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LBRACKET_in_def_type_interval10608  */
static	ANTLR3_BITWORD FOLLOW_LBRACKET_in_def_type_interval10608_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LBRACKET_in_def_type_interval10608	= { FOLLOW_LBRACKET_in_def_type_interval10608_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RBRACKET_in_def_type_interval10614  */
static	ANTLR3_BITWORD FOLLOW_RBRACKET_in_def_type_interval10614_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_RBRACKET_in_def_type_interval10614	= { FOLLOW_RBRACKET_in_def_type_interval10614_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LPAREN_in_def_type_interval10620  */
static	ANTLR3_BITWORD FOLLOW_LPAREN_in_def_type_interval10620_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LPAREN_in_def_type_interval10620	= { FOLLOW_LPAREN_in_def_type_interval10620_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_def_type_interval10630  */
static	ANTLR3_BITWORD FOLLOW_expression_in_def_type_interval10630_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_def_type_interval10630	= { FOLLOW_expression_in_def_type_interval10630_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_def_type_interval10632  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_def_type_interval10632_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_def_type_interval10632	= { FOLLOW_COMMA_in_def_type_interval10632_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_def_type_interval10637  */
static	ANTLR3_BITWORD FOLLOW_expression_in_def_type_interval10637_bits[]	= { ANTLR3_UINT64_LIT(0x1000000000000000), ANTLR3_UINT64_LIT(0x1000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_def_type_interval10637	= { FOLLOW_expression_in_def_type_interval10637_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LBRACKET_in_def_type_interval10647  */
static	ANTLR3_BITWORD FOLLOW_LBRACKET_in_def_type_interval10647_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_LBRACKET_in_def_type_interval10647	= { FOLLOW_LBRACKET_in_def_type_interval10647_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RBRACKET_in_def_type_interval10653  */
static	ANTLR3_BITWORD FOLLOW_RBRACKET_in_def_type_interval10653_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_RBRACKET_in_def_type_interval10653	= { FOLLOW_RBRACKET_in_def_type_interval10653_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RPAREN_in_def_type_interval10659  */
static	ANTLR3_BITWORD FOLLOW_RPAREN_in_def_type_interval10659_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_RPAREN_in_def_type_interval10659	= { FOLLOW_RPAREN_in_def_type_interval10659_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_GT_in_def_type_interval10665  */
static	ANTLR3_BITWORD FOLLOW_GT_in_def_type_interval10665_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_GT_in_def_type_interval10665	= { FOLLOW_GT_in_def_type_interval10665_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_primitive_type_in_base_type_var10686  */
static	ANTLR3_BITWORD FOLLOW_primitive_type_in_base_type_var10686_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_primitive_type_in_base_type_var10686	= { FOLLOW_primitive_type_in_base_type_var10686_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_qualifiedNameID_in_base_type_var10696  */
static	ANTLR3_BITWORD FOLLOW_qualifiedNameID_in_base_type_var10696_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_qualifiedNameID_in_base_type_var10696	= { FOLLOW_qualifiedNameID_in_base_type_var10696_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_primitive_type10719  */
static	ANTLR3_BITWORD FOLLOW_set_in_primitive_type10719_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_primitive_type10719	= { FOLLOW_set_in_primitive_type10719_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_primitive_type10735  */
static	ANTLR3_BITWORD FOLLOW_set_in_primitive_type10735_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000200002), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_primitive_type10735	= { FOLLOW_set_in_primitive_type10735_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_bit_field_size_in_primitive_type10755  */
static	ANTLR3_BITWORD FOLLOW_bit_field_size_in_primitive_type10755_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_bit_field_size_in_primitive_type10755	= { FOLLOW_bit_field_size_in_primitive_type10755_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_primitive_type10774  */
static	ANTLR3_BITWORD FOLLOW_set_in_primitive_type10774_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000200002), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_primitive_type10774	= { FOLLOW_set_in_primitive_type10774_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_bit_field_size_in_primitive_type10794  */
static	ANTLR3_BITWORD FOLLOW_bit_field_size_in_primitive_type10794_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_bit_field_size_in_primitive_type10794	= { FOLLOW_bit_field_size_in_primitive_type10794_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_primitive_type10811  */
static	ANTLR3_BITWORD FOLLOW_set_in_primitive_type10811_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000200002), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_primitive_type10811	= { FOLLOW_set_in_primitive_type10811_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_bit_field_size_in_primitive_type10831  */
static	ANTLR3_BITWORD FOLLOW_bit_field_size_in_primitive_type10831_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_bit_field_size_in_primitive_type10831	= { FOLLOW_bit_field_size_in_primitive_type10831_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_primitive_type10851  */
static	ANTLR3_BITWORD FOLLOW_set_in_primitive_type10851_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000200002), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_primitive_type10851	= { FOLLOW_set_in_primitive_type10851_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_primitive_type10871  */
static	ANTLR3_BITWORD FOLLOW_set_in_primitive_type10871_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000200002), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_primitive_type10871	= { FOLLOW_set_in_primitive_type10871_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_283_in_primitive_type10890  */
static	ANTLR3_BITWORD FOLLOW_283_in_primitive_type10890_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000200002), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_283_in_primitive_type10890	= { FOLLOW_283_in_primitive_type10890_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_400_in_primitive_type10902  */
static	ANTLR3_BITWORD FOLLOW_400_in_primitive_type10902_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000200002), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_400_in_primitive_type10902	= { FOLLOW_400_in_primitive_type10902_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_270_in_primitive_type10914  */
static	ANTLR3_BITWORD FOLLOW_270_in_primitive_type10914_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000200002), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_270_in_primitive_type10914	= { FOLLOW_270_in_primitive_type10914_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_399_in_primitive_type10925  */
static	ANTLR3_BITWORD FOLLOW_399_in_primitive_type10925_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000200002), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_399_in_primitive_type10925	= { FOLLOW_399_in_primitive_type10925_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_360_in_primitive_type10936  */
static	ANTLR3_BITWORD FOLLOW_360_in_primitive_type10936_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000200002), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_360_in_primitive_type10936	= { FOLLOW_360_in_primitive_type10936_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_409_in_primitive_type10949  */
static	ANTLR3_BITWORD FOLLOW_409_in_primitive_type10949_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000200002), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_409_in_primitive_type10949	= { FOLLOW_409_in_primitive_type10949_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_bit_field_size_in_primitive_type10968  */
static	ANTLR3_BITWORD FOLLOW_bit_field_size_in_primitive_type10968_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_bit_field_size_in_primitive_type10968	= { FOLLOW_bit_field_size_in_primitive_type10968_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_time_clock_type_in_primitive_type10988  */
static	ANTLR3_BITWORD FOLLOW_time_clock_type_in_primitive_type10988_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_time_clock_type_in_primitive_type10988	= { FOLLOW_time_clock_type_in_primitive_type10988_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_time_type_in_primitive_type10998  */
static	ANTLR3_BITWORD FOLLOW_time_type_in_primitive_type10998_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_time_type_in_primitive_type10998	= { FOLLOW_time_type_in_primitive_type10998_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_254_in_primitive_type11006  */
static	ANTLR3_BITWORD FOLLOW_254_in_primitive_type11006_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000200002), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_254_in_primitive_type11006	= { FOLLOW_254_in_primitive_type11006_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_bit_field_size_in_primitive_type11020  */
static	ANTLR3_BITWORD FOLLOW_bit_field_size_in_primitive_type11020_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_bit_field_size_in_primitive_type11020	= { FOLLOW_bit_field_size_in_primitive_type11020_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_255_in_primitive_type11037  */
static	ANTLR3_BITWORD FOLLOW_255_in_primitive_type11037_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000200002), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_255_in_primitive_type11037	= { FOLLOW_255_in_primitive_type11037_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_bit_field_size_in_primitive_type11051  */
static	ANTLR3_BITWORD FOLLOW_bit_field_size_in_primitive_type11051_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_bit_field_size_in_primitive_type11051	= { FOLLOW_bit_field_size_in_primitive_type11051_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_387_in_primitive_type11068  */
static	ANTLR3_BITWORD FOLLOW_387_in_primitive_type11068_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000200002), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_387_in_primitive_type11068	= { FOLLOW_387_in_primitive_type11068_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_string_field_size_in_primitive_type11080  */
static	ANTLR3_BITWORD FOLLOW_string_field_size_in_primitive_type11080_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_string_field_size_in_primitive_type11080	= { FOLLOW_string_field_size_in_primitive_type11080_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_333_in_primitive_type11098  */
static	ANTLR3_BITWORD FOLLOW_333_in_primitive_type11098_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_333_in_primitive_type11098	= { FOLLOW_333_in_primitive_type11098_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_242_in_primitive_type11107  */
static	ANTLR3_BITWORD FOLLOW_242_in_primitive_type11107_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_242_in_primitive_type11107	= { FOLLOW_242_in_primitive_type11107_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_344_in_primitive_type11118  */
static	ANTLR3_BITWORD FOLLOW_344_in_primitive_type11118_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_344_in_primitive_type11118	= { FOLLOW_344_in_primitive_type11118_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_249_in_primitive_type11131  */
static	ANTLR3_BITWORD FOLLOW_249_in_primitive_type11131_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_249_in_primitive_type11131	= { FOLLOW_249_in_primitive_type11131_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_320_in_primitive_type11142  */
static	ANTLR3_BITWORD FOLLOW_320_in_primitive_type11142_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_320_in_primitive_type11142	= { FOLLOW_320_in_primitive_type11142_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_374_in_primitive_type11152  */
static	ANTLR3_BITWORD FOLLOW_374_in_primitive_type11152_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_374_in_primitive_type11152	= { FOLLOW_374_in_primitive_type11152_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_261_in_primitive_type11163  */
static	ANTLR3_BITWORD FOLLOW_261_in_primitive_type11163_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_261_in_primitive_type11163	= { FOLLOW_261_in_primitive_type11163_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_317_in_primitive_type11172  */
static	ANTLR3_BITWORD FOLLOW_317_in_primitive_type11172_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_317_in_primitive_type11172	= { FOLLOW_317_in_primitive_type11172_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LT__in_primitive_type11184  */
static	ANTLR3_BITWORD FOLLOW_LT__in_primitive_type11184_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_LT__in_primitive_type11184	= { FOLLOW_LT__in_primitive_type11184_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_qualifiedNameID_in_primitive_type11189  */
static	ANTLR3_BITWORD FOLLOW_qualifiedNameID_in_primitive_type11189_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_qualifiedNameID_in_primitive_type11189	= { FOLLOW_qualifiedNameID_in_primitive_type11189_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_GT_in_primitive_type11192  */
static	ANTLR3_BITWORD FOLLOW_GT_in_primitive_type11192_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_GT_in_primitive_type11192	= { FOLLOW_GT_in_primitive_type11192_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_405_in_primitive_type11209  */
static	ANTLR3_BITWORD FOLLOW_405_in_primitive_type11209_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_405_in_primitive_type11209	= { FOLLOW_405_in_primitive_type11209_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COLON_in_bit_field_size11228  */
static	ANTLR3_BITWORD FOLLOW_COLON_in_bit_field_size11228_bits[]	= { ANTLR3_UINT64_LIT(0x0084000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_COLON_in_bit_field_size11228	= { FOLLOW_COLON_in_bit_field_size11228_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_integer_constant_in_bit_field_size11233  */
static	ANTLR3_BITWORD FOLLOW_integer_constant_in_bit_field_size11233_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_integer_constant_in_bit_field_size11233	= { FOLLOW_integer_constant_in_bit_field_size11233_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LT__in_bit_field_size11257  */
static	ANTLR3_BITWORD FOLLOW_LT__in_bit_field_size11257_bits[]	= { ANTLR3_UINT64_LIT(0x0084000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0080000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_LT__in_bit_field_size11257	= { FOLLOW_LT__in_bit_field_size11257_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_375_in_bit_field_size11262  */
static	ANTLR3_BITWORD FOLLOW_375_in_bit_field_size11262_bits[]	= { ANTLR3_UINT64_LIT(0x0084000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_375_in_bit_field_size11262	= { FOLLOW_375_in_bit_field_size11262_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_integer_constant_in_bit_field_size11270  */
static	ANTLR3_BITWORD FOLLOW_integer_constant_in_bit_field_size11270_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_integer_constant_in_bit_field_size11270	= { FOLLOW_integer_constant_in_bit_field_size11270_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_GT_in_bit_field_size11273  */
static	ANTLR3_BITWORD FOLLOW_GT_in_bit_field_size11273_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_GT_in_bit_field_size11273	= { FOLLOW_GT_in_bit_field_size11273_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COLON_in_string_field_size11292  */
static	ANTLR3_BITWORD FOLLOW_COLON_in_string_field_size11292_bits[]	= { ANTLR3_UINT64_LIT(0x0084000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_COLON_in_string_field_size11292	= { FOLLOW_COLON_in_string_field_size11292_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_range_constant_in_string_field_size11296  */
static	ANTLR3_BITWORD FOLLOW_range_constant_in_string_field_size11296_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_range_constant_in_string_field_size11296	= { FOLLOW_range_constant_in_string_field_size11296_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LT__in_string_field_size11307  */
static	ANTLR3_BITWORD FOLLOW_LT__in_string_field_size11307_bits[]	= { ANTLR3_UINT64_LIT(0x0084000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0080000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_LT__in_string_field_size11307	= { FOLLOW_LT__in_string_field_size11307_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_375_in_string_field_size11312  */
static	ANTLR3_BITWORD FOLLOW_375_in_string_field_size11312_bits[]	= { ANTLR3_UINT64_LIT(0x0084000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_375_in_string_field_size11312	= { FOLLOW_375_in_string_field_size11312_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_range_constant_in_string_field_size11320  */
static	ANTLR3_BITWORD FOLLOW_range_constant_in_string_field_size11320_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_range_constant_in_string_field_size11320	= { FOLLOW_range_constant_in_string_field_size11320_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_GT_in_string_field_size11323  */
static	ANTLR3_BITWORD FOLLOW_GT_in_string_field_size11323_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_GT_in_string_field_size11323	= { FOLLOW_GT_in_string_field_size11323_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_integer_constant_in_range_constant11345  */
static	ANTLR3_BITWORD FOLLOW_integer_constant_in_range_constant11345_bits[]	= { ANTLR3_UINT64_LIT(0x0000000400800002) };
static  ANTLR3_BITSET_LIST FOLLOW_integer_constant_in_range_constant11345	= { FOLLOW_integer_constant_in_range_constant11345_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_range_constant11357  */
static	ANTLR3_BITWORD FOLLOW_set_in_range_constant11357_bits[]	= { ANTLR3_UINT64_LIT(0x0084000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_range_constant11357	= { FOLLOW_set_in_range_constant11357_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_integer_constant_in_range_constant11374  */
static	ANTLR3_BITWORD FOLLOW_integer_constant_in_range_constant11374_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_integer_constant_in_range_constant11374	= { FOLLOW_integer_constant_in_range_constant11374_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_on_write_var_routine_def11396  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_on_write_var_routine_def11396_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_on_write_var_routine_def11396	= { FOLLOW_LCURLY_in_on_write_var_routine_def11396_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_var_routine_def_in_on_write_var_routine_def11401  */
static	ANTLR3_BITWORD FOLLOW_var_routine_def_in_on_write_var_routine_def11401_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_var_routine_def_in_on_write_var_routine_def11401	= { FOLLOW_var_routine_def_in_on_write_var_routine_def11401_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_on_write_var_routine_def11407  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_on_write_var_routine_def11407_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_on_write_var_routine_def11407	= { FOLLOW_RCURLY_in_on_write_var_routine_def11407_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_205_in_var_routine_def11429  */
static	ANTLR3_BITWORD FOLLOW_205_in_var_routine_def11429_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000081), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000200000000) };
static  ANTLR3_BITSET_LIST FOLLOW_205_in_var_routine_def11429	= { FOLLOW_205_in_var_routine_def11429_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_routine_single_param_in_var_routine_def11441  */
static	ANTLR3_BITWORD FOLLOW_routine_single_param_in_var_routine_def11441_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000200000000) };
static  ANTLR3_BITSET_LIST FOLLOW_routine_single_param_in_var_routine_def11441	= { FOLLOW_routine_single_param_in_var_routine_def11441_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_block_statement_in_var_routine_def11454  */
static	ANTLR3_BITWORD FOLLOW_block_statement_in_var_routine_def11454_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_block_statement_in_var_routine_def11454	= { FOLLOW_block_statement_in_var_routine_def11454_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_417_in_var_routine_def11464  */
static	ANTLR3_BITWORD FOLLOW_417_in_var_routine_def11464_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_417_in_var_routine_def11464	= { FOLLOW_417_in_var_routine_def11464_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_conditionalExpression_in_var_routine_def11468  */
static	ANTLR3_BITWORD FOLLOW_conditionalExpression_in_var_routine_def11468_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_conditionalExpression_in_var_routine_def11468	= { FOLLOW_conditionalExpression_in_var_routine_def11468_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_var_routine_def11470  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_var_routine_def11470_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_var_routine_def11470	= { FOLLOW_SEMI_in_var_routine_def11470_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LPAREN_in_routine_single_param11498  */
static	ANTLR3_BITWORD FOLLOW_LPAREN_in_routine_single_param11498_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xC266000000000000), ANTLR3_UINT64_LIT(0x38E000000A00C128), ANTLR3_UINT64_LIT(0x0064016007002261), ANTLR3_UINT64_LIT(0x0000000013A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_LPAREN_in_routine_single_param11498	= { FOLLOW_LPAREN_in_routine_single_param11498_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_type_var_in_routine_single_param11517  */
static	ANTLR3_BITWORD FOLLOW_type_var_in_routine_single_param11517_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_type_var_in_routine_single_param11517	= { FOLLOW_type_var_in_routine_single_param11517_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_routine_single_param11524  */
static	ANTLR3_BITWORD FOLLOW_ID_in_routine_single_param11524_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000010), ANTLR3_UINT64_LIT(0x0000000000000080), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_routine_single_param11524	= { FOLLOW_ID_in_routine_single_param11524_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_routine_single_param11533  */
static	ANTLR3_BITWORD FOLLOW_ID_in_routine_single_param11533_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000010), ANTLR3_UINT64_LIT(0x0000000000000080), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_routine_single_param11533	= { FOLLOW_ID_in_routine_single_param11533_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_initial_value_in_routine_single_param11547  */
static	ANTLR3_BITWORD FOLLOW_initial_value_in_routine_single_param11547_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_initial_value_in_routine_single_param11547	= { FOLLOW_initial_value_in_routine_single_param11547_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RPAREN_in_routine_single_param11563  */
static	ANTLR3_BITWORD FOLLOW_RPAREN_in_routine_single_param11563_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RPAREN_in_routine_single_param11563	= { FOLLOW_RPAREN_in_routine_single_param11563_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_276_in_def_enum11582  */
static	ANTLR3_BITWORD FOLLOW_276_in_def_enum11582_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_276_in_def_enum11582	= { FOLLOW_276_in_def_enum11582_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_def_enum11587  */
static	ANTLR3_BITWORD FOLLOW_ID_in_def_enum11587_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_def_enum11587	= { FOLLOW_ID_in_def_enum11587_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_enum_impl_in_def_enum11592  */
static	ANTLR3_BITWORD FOLLOW_def_enum_impl_in_def_enum11592_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_enum_impl_in_def_enum11592	= { FOLLOW_def_enum_impl_in_def_enum11592_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_def_enum_impl11611  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_def_enum_impl11611_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_def_enum_impl11611	= { FOLLOW_LCURLY_in_def_enum_impl11611_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_def_enum_impl11620  */
static	ANTLR3_BITWORD FOLLOW_ID_in_def_enum_impl11620_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800010), ANTLR3_UINT64_LIT(0x2000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_def_enum_impl11620	= { FOLLOW_ID_in_def_enum_impl11620_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ASSIGN_in_def_enum_impl11639  */
static	ANTLR3_BITWORD FOLLOW_ASSIGN_in_def_enum_impl11639_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_ASSIGN_in_def_enum_impl11639	= { FOLLOW_ASSIGN_in_def_enum_impl11639_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_def_enum_impl11643  */
static	ANTLR3_BITWORD FOLLOW_expression_in_def_enum_impl11643_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x2000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_def_enum_impl11643	= { FOLLOW_expression_in_def_enum_impl11643_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_def_enum_impl11659  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_def_enum_impl11659_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_def_enum_impl11659	= { FOLLOW_COMMA_in_def_enum_impl11659_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_def_enum_impl11663  */
static	ANTLR3_BITWORD FOLLOW_ID_in_def_enum_impl11663_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800010), ANTLR3_UINT64_LIT(0x2000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_def_enum_impl11663	= { FOLLOW_ID_in_def_enum_impl11663_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ASSIGN_in_def_enum_impl11682  */
static	ANTLR3_BITWORD FOLLOW_ASSIGN_in_def_enum_impl11682_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_ASSIGN_in_def_enum_impl11682	= { FOLLOW_ASSIGN_in_def_enum_impl11682_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_def_enum_impl11686  */
static	ANTLR3_BITWORD FOLLOW_expression_in_def_enum_impl11686_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x2000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_def_enum_impl11686	= { FOLLOW_expression_in_def_enum_impl11686_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_def_enum_impl11707  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_def_enum_impl11707_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_def_enum_impl11707	= { FOLLOW_RCURLY_in_def_enum_impl11707_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_def_struct11722  */
static	ANTLR3_BITWORD FOLLOW_set_in_def_struct11722_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_def_struct11722	= { FOLLOW_set_in_def_struct11722_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_def_struct11735  */
static	ANTLR3_BITWORD FOLLOW_ID_in_def_struct11735_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_def_struct11735	= { FOLLOW_ID_in_def_struct11735_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_class_structure_impl_in_def_struct11740  */
static	ANTLR3_BITWORD FOLLOW_def_class_structure_impl_in_def_struct11740_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_class_structure_impl_in_def_struct11740	= { FOLLOW_def_class_structure_impl_in_def_struct11740_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_def_class_structure_impl11759  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_def_class_structure_impl11759_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0008000000000000), ANTLR3_UINT64_LIT(0x4002040104000048), ANTLR3_UINT64_LIT(0x1000120820200000), ANTLR3_UINT64_LIT(0x000000004C400800) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_def_class_structure_impl11759	= { FOLLOW_LCURLY_in_def_class_structure_impl11759_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_modifier_declaration_in_def_class_structure_impl11775  */
static	ANTLR3_BITWORD FOLLOW_modifier_declaration_in_def_class_structure_impl11775_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x4000000100000048), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x000000000C000000) };
static  ANTLR3_BITSET_LIST FOLLOW_modifier_declaration_in_def_class_structure_impl11775	= { FOLLOW_modifier_declaration_in_def_class_structure_impl11775_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_decl_variable_in_def_class_structure_impl11792  */
static	ANTLR3_BITWORD FOLLOW_decl_variable_in_def_class_structure_impl11792_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0008000000000000), ANTLR3_UINT64_LIT(0x4002040104000048), ANTLR3_UINT64_LIT(0x1000120820200000), ANTLR3_UINT64_LIT(0x000000004C400800) };
static  ANTLR3_BITSET_LIST FOLLOW_decl_variable_in_def_class_structure_impl11792	= { FOLLOW_decl_variable_in_def_class_structure_impl11792_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_method_in_def_class_structure_impl11803  */
static	ANTLR3_BITWORD FOLLOW_def_method_in_def_class_structure_impl11803_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0008000000000000), ANTLR3_UINT64_LIT(0x4002040104000048), ANTLR3_UINT64_LIT(0x1000120820200000), ANTLR3_UINT64_LIT(0x000000004C400800) };
static  ANTLR3_BITSET_LIST FOLLOW_def_method_in_def_class_structure_impl11803	= { FOLLOW_def_method_in_def_class_structure_impl11803_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_def_class_structure_impl11825  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_def_class_structure_impl11825_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_def_class_structure_impl11825	= { FOLLOW_RCURLY_in_def_class_structure_impl11825_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_257_in_def_choice11840  */
static	ANTLR3_BITWORD FOLLOW_257_in_def_choice11840_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_257_in_def_choice11840	= { FOLLOW_257_in_def_choice11840_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_def_choice11845  */
static	ANTLR3_BITWORD FOLLOW_ID_in_def_choice11845_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_def_choice11845	= { FOLLOW_ID_in_def_choice11845_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_choice_impl_in_def_choice11850  */
static	ANTLR3_BITWORD FOLLOW_def_choice_impl_in_def_choice11850_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_choice_impl_in_def_choice11850	= { FOLLOW_def_choice_impl_in_def_choice11850_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_def_choice_impl11869  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_def_choice_impl11869_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0008000000000000), ANTLR3_UINT64_LIT(0x4002040104000048), ANTLR3_UINT64_LIT(0x1000120820200000), ANTLR3_UINT64_LIT(0x000000004C400800) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_def_choice_impl11869	= { FOLLOW_LCURLY_in_def_choice_impl11869_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_modifier_declaration_in_def_choice_impl11885  */
static	ANTLR3_BITWORD FOLLOW_modifier_declaration_in_def_choice_impl11885_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x4000000100000048), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x000000000C000000) };
static  ANTLR3_BITSET_LIST FOLLOW_modifier_declaration_in_def_choice_impl11885	= { FOLLOW_modifier_declaration_in_def_choice_impl11885_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_decl_variable_in_def_choice_impl11902  */
static	ANTLR3_BITWORD FOLLOW_decl_variable_in_def_choice_impl11902_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0008000000000000), ANTLR3_UINT64_LIT(0x4002040104000048), ANTLR3_UINT64_LIT(0x1000120820200000), ANTLR3_UINT64_LIT(0x000000004C400800) };
static  ANTLR3_BITSET_LIST FOLLOW_decl_variable_in_def_choice_impl11902	= { FOLLOW_decl_variable_in_def_choice_impl11902_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_method_in_def_choice_impl11913  */
static	ANTLR3_BITWORD FOLLOW_def_method_in_def_choice_impl11913_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0008000000000000), ANTLR3_UINT64_LIT(0x4002040104000048), ANTLR3_UINT64_LIT(0x1000120820200000), ANTLR3_UINT64_LIT(0x000000004C400800) };
static  ANTLR3_BITSET_LIST FOLLOW_def_method_in_def_choice_impl11913	= { FOLLOW_def_method_in_def_choice_impl11913_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_def_choice_impl11935  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_def_choice_impl11935_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_def_choice_impl11935	= { FOLLOW_RCURLY_in_def_choice_impl11935_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_404_in_def_union11950  */
static	ANTLR3_BITWORD FOLLOW_404_in_def_union11950_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_404_in_def_union11950	= { FOLLOW_404_in_def_union11950_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_def_union11955  */
static	ANTLR3_BITWORD FOLLOW_ID_in_def_union11955_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_def_union11955	= { FOLLOW_ID_in_def_union11955_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_union_impl_in_def_union11960  */
static	ANTLR3_BITWORD FOLLOW_def_union_impl_in_def_union11960_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_union_impl_in_def_union11960	= { FOLLOW_def_union_impl_in_def_union11960_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_def_union_impl11980  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_def_union_impl11980_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0008000000000000), ANTLR3_UINT64_LIT(0x4002040004000048), ANTLR3_UINT64_LIT(0x1000120820200000), ANTLR3_UINT64_LIT(0x000000004C400800) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_def_union_impl11980	= { FOLLOW_LCURLY_in_def_union_impl11980_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_modifier_declaration_in_def_union_impl11996  */
static	ANTLR3_BITWORD FOLLOW_modifier_declaration_in_def_union_impl11996_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x4000000000000048), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x000000000C000000) };
static  ANTLR3_BITSET_LIST FOLLOW_modifier_declaration_in_def_union_impl11996	= { FOLLOW_modifier_declaration_in_def_union_impl11996_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_decl_variable_in_def_union_impl12011  */
static	ANTLR3_BITWORD FOLLOW_decl_variable_in_def_union_impl12011_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0008000000000000), ANTLR3_UINT64_LIT(0x4002040004000048), ANTLR3_UINT64_LIT(0x1000120820200000), ANTLR3_UINT64_LIT(0x000000004C400800) };
static  ANTLR3_BITSET_LIST FOLLOW_decl_variable_in_def_union_impl12011	= { FOLLOW_decl_variable_in_def_union_impl12011_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_def_union_impl12025  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_def_union_impl12025_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_def_union_impl12025	= { FOLLOW_RCURLY_in_def_union_impl12025_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_288_in_def_method12038  */
static	ANTLR3_BITWORD FOLLOW_288_in_def_method12038_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_288_in_def_method12038	= { FOLLOW_288_in_def_method12038_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_def_method12041  */
static	ANTLR3_BITWORD FOLLOW_ID_in_def_method12041_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_def_method12041	= { FOLLOW_ID_in_def_method12041_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LPAREN_in_def_method12044  */
static	ANTLR3_BITWORD FOLLOW_LPAREN_in_def_method12044_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0xC266000000000000), ANTLR3_UINT64_LIT(0x38E000000A00C128), ANTLR3_UINT64_LIT(0x0064016007002261), ANTLR3_UINT64_LIT(0x0000000013A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_LPAREN_in_def_method12044	= { FOLLOW_LPAREN_in_def_method12044_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_decl_parameters_in_def_method12047  */
static	ANTLR3_BITWORD FOLLOW_decl_parameters_in_def_method12047_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_decl_parameters_in_def_method12047	= { FOLLOW_decl_parameters_in_def_method12047_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RPAREN_in_def_method12052  */
static	ANTLR3_BITWORD FOLLOW_RPAREN_in_def_method12052_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xC266000000000000), ANTLR3_UINT64_LIT(0x38E000000A00C128), ANTLR3_UINT64_LIT(0x0064016007002261), ANTLR3_UINT64_LIT(0x0000000013A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_RPAREN_in_def_method12052	= { FOLLOW_RPAREN_in_def_method12052_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_type_var_in_def_method12057  */
static	ANTLR3_BITWORD FOLLOW_type_var_in_def_method12057_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_type_var_in_def_method12057	= { FOLLOW_type_var_in_def_method12057_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_type_var_in_decl_parameters12071  */
static	ANTLR3_BITWORD FOLLOW_type_var_in_decl_parameters12071_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_type_var_in_decl_parameters12071	= { FOLLOW_type_var_in_decl_parameters12071_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_decl_parameters12073  */
static	ANTLR3_BITWORD FOLLOW_ID_in_decl_parameters12073_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800002) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_decl_parameters12073	= { FOLLOW_ID_in_decl_parameters12073_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_decl_parameters12077  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_decl_parameters12077_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xC266000000000000), ANTLR3_UINT64_LIT(0x38E000000A00C128), ANTLR3_UINT64_LIT(0x0064016007002261), ANTLR3_UINT64_LIT(0x0000000013A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_decl_parameters12077	= { FOLLOW_COMMA_in_decl_parameters12077_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_type_var_in_decl_parameters12079  */
static	ANTLR3_BITWORD FOLLOW_type_var_in_decl_parameters12079_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_type_var_in_decl_parameters12079	= { FOLLOW_type_var_in_decl_parameters12079_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_decl_parameters12081  */
static	ANTLR3_BITWORD FOLLOW_ID_in_decl_parameters12081_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800002) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_decl_parameters12081	= { FOLLOW_ID_in_decl_parameters12081_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_398_in_def_type12099  */
static	ANTLR3_BITWORD FOLLOW_398_in_def_type12099_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000001), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000100006), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000100010) };
static  ANTLR3_BITSET_LIST FOLLOW_398_in_def_type12099	= { FOLLOW_398_in_def_type12099_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_type_impl_in_def_type12102  */
static	ANTLR3_BITWORD FOLLOW_def_type_impl_in_def_type12102_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_type_impl_in_def_type12102	= { FOLLOW_def_type_impl_in_def_type12102_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_type_atom_impl_in_def_type_impl12117  */
static	ANTLR3_BITWORD FOLLOW_def_type_atom_impl_in_def_type_impl12117_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_type_atom_impl_in_def_type_impl12117	= { FOLLOW_def_type_atom_impl_in_def_type_impl12117_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_def_type_impl12124  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_def_type_impl12124_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000100006), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000100010) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_def_type_impl12124	= { FOLLOW_LCURLY_in_def_type_impl12124_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_type_atom_impl_in_def_type_impl12131  */
static	ANTLR3_BITWORD FOLLOW_def_type_atom_impl_in_def_type_impl12131_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000100006), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000100010) };
static  ANTLR3_BITSET_LIST FOLLOW_def_type_atom_impl_in_def_type_impl12131	= { FOLLOW_def_type_atom_impl_in_def_type_impl12131_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_def_type_impl12140  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_def_type_impl12140_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_def_type_impl12140	= { FOLLOW_RCURLY_in_def_type_impl12140_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_def_type_atom_impl12161  */
static	ANTLR3_BITWORD FOLLOW_ID_in_def_type_atom_impl12161_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xC266000000000000), ANTLR3_UINT64_LIT(0x38E000000A10C12E), ANTLR3_UINT64_LIT(0x0064016007002261), ANTLR3_UINT64_LIT(0x0000000013B78118) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_def_type_atom_impl12161	= { FOLLOW_ID_in_def_type_atom_impl12161_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_base_type_var_in_def_type_atom_impl12170  */
static	ANTLR3_BITWORD FOLLOW_base_type_var_in_def_type_atom_impl12170_bits[]	= { ANTLR3_UINT64_LIT(0x1000000000000002), ANTLR3_UINT64_LIT(0x0000000000000001), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_base_type_var_in_def_type_atom_impl12170	= { FOLLOW_base_type_var_in_def_type_atom_impl12170_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_type_array_in_def_type_atom_impl12185  */
static	ANTLR3_BITWORD FOLLOW_def_type_array_in_def_type_atom_impl12185_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000001), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_def_type_array_in_def_type_atom_impl12185	= { FOLLOW_def_type_array_in_def_type_atom_impl12185_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_typedef_constraint_in_def_type_atom_impl12222  */
static	ANTLR3_BITWORD FOLLOW_def_typedef_constraint_in_def_type_atom_impl12222_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_typedef_constraint_in_def_type_atom_impl12222	= { FOLLOW_def_typedef_constraint_in_def_type_atom_impl12222_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_def_type_atom_impl12227  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_def_type_atom_impl12227_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_def_type_atom_impl12227	= { FOLLOW_SEMI_in_def_type_atom_impl12227_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_type_container_in_def_type_atom_impl12240  */
static	ANTLR3_BITWORD FOLLOW_def_type_container_in_def_type_atom_impl12240_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000001), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_def_type_container_in_def_type_atom_impl12240	= { FOLLOW_def_type_container_in_def_type_atom_impl12240_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_typedef_constraint_in_def_type_atom_impl12253  */
static	ANTLR3_BITWORD FOLLOW_def_typedef_constraint_in_def_type_atom_impl12253_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_typedef_constraint_in_def_type_atom_impl12253	= { FOLLOW_def_typedef_constraint_in_def_type_atom_impl12253_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_def_type_atom_impl12258  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_def_type_atom_impl12258_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_def_type_atom_impl12258	= { FOLLOW_SEMI_in_def_type_atom_impl12258_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_type_interval_in_def_type_atom_impl12271  */
static	ANTLR3_BITWORD FOLLOW_def_type_interval_in_def_type_atom_impl12271_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_def_type_interval_in_def_type_atom_impl12271	= { FOLLOW_def_type_interval_in_def_type_atom_impl12271_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_def_type_atom_impl12274  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_def_type_atom_impl12274_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_def_type_atom_impl12274	= { FOLLOW_SEMI_in_def_type_atom_impl12274_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_276_in_def_type_atom_impl12287  */
static	ANTLR3_BITWORD FOLLOW_276_in_def_type_atom_impl12287_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_276_in_def_type_atom_impl12287	= { FOLLOW_276_in_def_type_atom_impl12287_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_enum_impl_in_def_type_atom_impl12294  */
static	ANTLR3_BITWORD FOLLOW_def_enum_impl_in_def_type_atom_impl12294_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_enum_impl_in_def_type_atom_impl12294	= { FOLLOW_def_enum_impl_in_def_type_atom_impl12294_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_404_in_def_type_atom_impl12303  */
static	ANTLR3_BITWORD FOLLOW_404_in_def_type_atom_impl12303_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_404_in_def_type_atom_impl12303	= { FOLLOW_404_in_def_type_atom_impl12303_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_union_impl_in_def_type_atom_impl12310  */
static	ANTLR3_BITWORD FOLLOW_def_union_impl_in_def_type_atom_impl12310_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_union_impl_in_def_type_atom_impl12310	= { FOLLOW_def_union_impl_in_def_type_atom_impl12310_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_257_in_def_type_atom_impl12319  */
static	ANTLR3_BITWORD FOLLOW_257_in_def_type_atom_impl12319_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_257_in_def_type_atom_impl12319	= { FOLLOW_257_in_def_type_atom_impl12319_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_choice_impl_in_def_type_atom_impl12326  */
static	ANTLR3_BITWORD FOLLOW_def_choice_impl_in_def_type_atom_impl12326_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_choice_impl_in_def_type_atom_impl12326	= { FOLLOW_def_choice_impl_in_def_type_atom_impl12326_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_def_type_atom_impl12335  */
static	ANTLR3_BITWORD FOLLOW_set_in_def_type_atom_impl12335_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_def_type_atom_impl12335	= { FOLLOW_set_in_def_type_atom_impl12335_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_class_structure_impl_in_def_type_atom_impl12350  */
static	ANTLR3_BITWORD FOLLOW_def_class_structure_impl_in_def_type_atom_impl12350_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_class_structure_impl_in_def_type_atom_impl12350	= { FOLLOW_def_class_structure_impl_in_def_type_atom_impl12350_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_enum_in_def_type_atom_impl12362  */
static	ANTLR3_BITWORD FOLLOW_def_enum_in_def_type_atom_impl12362_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_enum_in_def_type_atom_impl12362	= { FOLLOW_def_enum_in_def_type_atom_impl12362_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_union_in_def_type_atom_impl12370  */
static	ANTLR3_BITWORD FOLLOW_def_union_in_def_type_atom_impl12370_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_union_in_def_type_atom_impl12370	= { FOLLOW_def_union_in_def_type_atom_impl12370_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_choice_in_def_type_atom_impl12377  */
static	ANTLR3_BITWORD FOLLOW_def_choice_in_def_type_atom_impl12377_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_choice_in_def_type_atom_impl12377	= { FOLLOW_def_choice_in_def_type_atom_impl12377_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_struct_in_def_type_atom_impl12383  */
static	ANTLR3_BITWORD FOLLOW_def_struct_in_def_type_atom_impl12383_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_struct_in_def_type_atom_impl12383	= { FOLLOW_def_struct_in_def_type_atom_impl12383_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_def_typedef_constraint12405  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_def_typedef_constraint12405_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0001000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_def_typedef_constraint12405	= { FOLLOW_LCURLY_in_def_typedef_constraint12405_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_176_in_def_typedef_constraint12409  */
static	ANTLR3_BITWORD FOLLOW_176_in_def_typedef_constraint12409_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000081), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000200000000) };
static  ANTLR3_BITSET_LIST FOLLOW_176_in_def_typedef_constraint12409	= { FOLLOW_176_in_def_typedef_constraint12409_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_routine_single_param_in_def_typedef_constraint12425  */
static	ANTLR3_BITWORD FOLLOW_routine_single_param_in_def_typedef_constraint12425_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000200000000) };
static  ANTLR3_BITSET_LIST FOLLOW_routine_single_param_in_def_typedef_constraint12425	= { FOLLOW_routine_single_param_in_def_typedef_constraint12425_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_block_statement_in_def_typedef_constraint12440  */
static	ANTLR3_BITWORD FOLLOW_block_statement_in_def_typedef_constraint12440_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_block_statement_in_def_typedef_constraint12440	= { FOLLOW_block_statement_in_def_typedef_constraint12440_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_417_in_def_typedef_constraint12452  */
static	ANTLR3_BITWORD FOLLOW_417_in_def_typedef_constraint12452_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_417_in_def_typedef_constraint12452	= { FOLLOW_417_in_def_typedef_constraint12452_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_conditionalExpression_in_def_typedef_constraint12456  */
static	ANTLR3_BITWORD FOLLOW_conditionalExpression_in_def_typedef_constraint12456_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_conditionalExpression_in_def_typedef_constraint12456	= { FOLLOW_conditionalExpression_in_def_typedef_constraint12456_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_def_typedef_constraint12458  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_def_typedef_constraint12458_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_def_typedef_constraint12458	= { FOLLOW_SEMI_in_def_typedef_constraint12458_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_def_typedef_constraint12479  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_def_typedef_constraint12479_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_def_typedef_constraint12479	= { FOLLOW_RCURLY_in_def_typedef_constraint12479_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_392_in_time_type12505  */
static	ANTLR3_BITWORD FOLLOW_392_in_time_type12505_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000002000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0060000008004000), ANTLR3_UINT64_LIT(0x0000016000000000), ANTLR3_UINT64_LIT(0x0000000003878000) };
static  ANTLR3_BITSET_LIST FOLLOW_392_in_time_type12505	= { FOLLOW_392_in_time_type12505_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_264_in_time_type12516  */
static	ANTLR3_BITWORD FOLLOW_264_in_time_type12516_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000002000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0060000008004000), ANTLR3_UINT64_LIT(0x0000016000000000), ANTLR3_UINT64_LIT(0x0000000003878000) };
static  ANTLR3_BITSET_LIST FOLLOW_264_in_time_type12516	= { FOLLOW_264_in_time_type12516_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_271_in_time_type12526  */
static	ANTLR3_BITWORD FOLLOW_271_in_time_type12526_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000002000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0060000008004000), ANTLR3_UINT64_LIT(0x0000016000000000), ANTLR3_UINT64_LIT(0x0000000003878000) };
static  ANTLR3_BITSET_LIST FOLLOW_271_in_time_type12526	= { FOLLOW_271_in_time_type12526_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LT__in_time_type12541  */
static	ANTLR3_BITWORD FOLLOW_LT__in_time_type12541_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0060000008004000), ANTLR3_UINT64_LIT(0x0000016000000000), ANTLR3_UINT64_LIT(0x0000000003878000) };
static  ANTLR3_BITSET_LIST FOLLOW_LT__in_time_type12541	= { FOLLOW_LT__in_time_type12541_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_time_type_domain_in_time_type12557  */
static	ANTLR3_BITWORD FOLLOW_time_type_domain_in_time_type12557_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000800000) };
static  ANTLR3_BITSET_LIST FOLLOW_time_type_domain_in_time_type12557	= { FOLLOW_time_type_domain_in_time_type12557_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_time_type12578  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_time_type12578_bits[]	= { ANTLR3_UINT64_LIT(0x0084000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_time_type12578	= { FOLLOW_COMMA_in_time_type12578_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_integer_constant_in_time_type12583  */
static	ANTLR3_BITWORD FOLLOW_integer_constant_in_time_type12583_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_integer_constant_in_time_type12583	= { FOLLOW_integer_constant_in_time_type12583_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_GT_in_time_type12595  */
static	ANTLR3_BITWORD FOLLOW_GT_in_time_type12595_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_GT_in_time_type12595	= { FOLLOW_GT_in_time_type12595_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_time_type_domain_in_time_type12611  */
static	ANTLR3_BITWORD FOLLOW_time_type_domain_in_time_type12611_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_time_type_domain_in_time_type12611	= { FOLLOW_time_type_domain_in_time_type12611_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_259_in_time_clock_type12642  */
static	ANTLR3_BITWORD FOLLOW_259_in_time_clock_type12642_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000002000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x006000000800C100), ANTLR3_UINT64_LIT(0x0000016000000000), ANTLR3_UINT64_LIT(0x0000000003878100) };
static  ANTLR3_BITSET_LIST FOLLOW_259_in_time_clock_type12642	= { FOLLOW_259_in_time_clock_type12642_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LT__in_time_clock_type12652  */
static	ANTLR3_BITWORD FOLLOW_LT__in_time_clock_type12652_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x006000000800C100), ANTLR3_UINT64_LIT(0x0000016000000000), ANTLR3_UINT64_LIT(0x0000000003878100) };
static  ANTLR3_BITSET_LIST FOLLOW_LT__in_time_clock_type12652	= { FOLLOW_LT__in_time_clock_type12652_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_392_in_time_clock_type12658  */
static	ANTLR3_BITWORD FOLLOW_392_in_time_clock_type12658_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000800000) };
static  ANTLR3_BITSET_LIST FOLLOW_392_in_time_clock_type12658	= { FOLLOW_392_in_time_clock_type12658_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_264_in_time_clock_type12668  */
static	ANTLR3_BITWORD FOLLOW_264_in_time_clock_type12668_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000800000) };
static  ANTLR3_BITSET_LIST FOLLOW_264_in_time_clock_type12668	= { FOLLOW_264_in_time_clock_type12668_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_271_in_time_clock_type12677  */
static	ANTLR3_BITWORD FOLLOW_271_in_time_clock_type12677_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000800000) };
static  ANTLR3_BITSET_LIST FOLLOW_271_in_time_clock_type12677	= { FOLLOW_271_in_time_clock_type12677_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_time_type_domain_in_time_clock_type12688  */
static	ANTLR3_BITWORD FOLLOW_time_type_domain_in_time_clock_type12688_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000800000) };
static  ANTLR3_BITSET_LIST FOLLOW_time_type_domain_in_time_clock_type12688	= { FOLLOW_time_type_domain_in_time_clock_type12688_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_time_clock_type12700  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_time_clock_type12700_bits[]	= { ANTLR3_UINT64_LIT(0x0084000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_time_clock_type12700	= { FOLLOW_COMMA_in_time_clock_type12700_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_integer_constant_in_time_clock_type12705  */
static	ANTLR3_BITWORD FOLLOW_integer_constant_in_time_clock_type12705_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_integer_constant_in_time_clock_type12705	= { FOLLOW_integer_constant_in_time_clock_type12705_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_GT_in_time_clock_type12717  */
static	ANTLR3_BITWORD FOLLOW_GT_in_time_clock_type12717_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_GT_in_time_clock_type12717	= { FOLLOW_GT_in_time_clock_type12717_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_392_in_time_clock_type12733  */
static	ANTLR3_BITWORD FOLLOW_392_in_time_clock_type12733_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800002) };
static  ANTLR3_BITSET_LIST FOLLOW_392_in_time_clock_type12733	= { FOLLOW_392_in_time_clock_type12733_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_264_in_time_clock_type12743  */
static	ANTLR3_BITWORD FOLLOW_264_in_time_clock_type12743_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800002) };
static  ANTLR3_BITSET_LIST FOLLOW_264_in_time_clock_type12743	= { FOLLOW_264_in_time_clock_type12743_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_271_in_time_clock_type12752  */
static	ANTLR3_BITWORD FOLLOW_271_in_time_clock_type12752_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800002) };
static  ANTLR3_BITSET_LIST FOLLOW_271_in_time_clock_type12752	= { FOLLOW_271_in_time_clock_type12752_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_time_type_domain_in_time_clock_type12763  */
static	ANTLR3_BITWORD FOLLOW_time_type_domain_in_time_clock_type12763_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800002) };
static  ANTLR3_BITSET_LIST FOLLOW_time_type_domain_in_time_clock_type12763	= { FOLLOW_time_type_domain_in_time_clock_type12763_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_time_clock_type12775  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_time_clock_type12775_bits[]	= { ANTLR3_UINT64_LIT(0x0084000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_time_clock_type12775	= { FOLLOW_COMMA_in_time_clock_type12775_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_integer_constant_in_time_clock_type12780  */
static	ANTLR3_BITWORD FOLLOW_integer_constant_in_time_clock_type12780_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_integer_constant_in_time_clock_type12780	= { FOLLOW_integer_constant_in_time_clock_type12780_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_time_type_domain12814  */
static	ANTLR3_BITWORD FOLLOW_set_in_time_type_domain12814_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_time_type_domain12814	= { FOLLOW_set_in_time_type_domain12814_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LT__in_time_type_domain12834  */
static	ANTLR3_BITWORD FOLLOW_LT__in_time_type_domain12834_bits[]	= { ANTLR3_UINT64_LIT(0x0084000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_LT__in_time_type_domain12834	= { FOLLOW_LT__in_time_type_domain12834_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_integer_constant_in_time_type_domain12843  */
static	ANTLR3_BITWORD FOLLOW_integer_constant_in_time_type_domain12843_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_integer_constant_in_time_type_domain12843	= { FOLLOW_integer_constant_in_time_type_domain12843_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_GT_in_time_type_domain12856  */
static	ANTLR3_BITWORD FOLLOW_GT_in_time_type_domain12856_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_GT_in_time_type_domain12856	= { FOLLOW_GT_in_time_type_domain12856_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_time_type_domain12865  */
static	ANTLR3_BITWORD FOLLOW_set_in_time_type_domain12865_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_time_type_domain12865	= { FOLLOW_set_in_time_type_domain12865_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LT__in_time_type_domain12885  */
static	ANTLR3_BITWORD FOLLOW_LT__in_time_type_domain12885_bits[]	= { ANTLR3_UINT64_LIT(0x0084000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_LT__in_time_type_domain12885	= { FOLLOW_LT__in_time_type_domain12885_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_integer_constant_in_time_type_domain12894  */
static	ANTLR3_BITWORD FOLLOW_integer_constant_in_time_type_domain12894_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_integer_constant_in_time_type_domain12894	= { FOLLOW_integer_constant_in_time_type_domain12894_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_GT_in_time_type_domain12907  */
static	ANTLR3_BITWORD FOLLOW_GT_in_time_type_domain12907_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_GT_in_time_type_domain12907	= { FOLLOW_GT_in_time_type_domain12907_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_time_type_domain12916  */
static	ANTLR3_BITWORD FOLLOW_set_in_time_type_domain12916_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_time_type_domain12916	= { FOLLOW_set_in_time_type_domain12916_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_time_type_domain12934  */
static	ANTLR3_BITWORD FOLLOW_set_in_time_type_domain12934_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_time_type_domain12934	= { FOLLOW_set_in_time_type_domain12934_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_283_in_time_type_domain12951  */
static	ANTLR3_BITWORD FOLLOW_283_in_time_type_domain12951_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_283_in_time_type_domain12951	= { FOLLOW_283_in_time_type_domain12951_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_400_in_time_type_domain12963  */
static	ANTLR3_BITWORD FOLLOW_400_in_time_type_domain12963_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_400_in_time_type_domain12963	= { FOLLOW_400_in_time_type_domain12963_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_270_in_time_type_domain12975  */
static	ANTLR3_BITWORD FOLLOW_270_in_time_type_domain12975_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_270_in_time_type_domain12975	= { FOLLOW_270_in_time_type_domain12975_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_399_in_time_type_domain12986  */
static	ANTLR3_BITWORD FOLLOW_399_in_time_type_domain12986_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_399_in_time_type_domain12986	= { FOLLOW_399_in_time_type_domain12986_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_360_in_time_type_domain12997  */
static	ANTLR3_BITWORD FOLLOW_360_in_time_type_domain12997_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_360_in_time_type_domain12997	= { FOLLOW_360_in_time_type_domain12997_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_409_in_time_type_domain13010  */
static	ANTLR3_BITWORD FOLLOW_409_in_time_type_domain13010_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_409_in_time_type_domain13010	= { FOLLOW_409_in_time_type_domain13010_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_202_in_section_model_of_computation13042  */
static	ANTLR3_BITWORD FOLLOW_202_in_section_model_of_computation13042_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_202_in_section_model_of_computation13042	= { FOLLOW_202_in_section_model_of_computation13042_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_222_in_section_routine13066  */
static	ANTLR3_BITWORD FOLLOW_222_in_section_routine13066_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x4000000000000000), ANTLR3_UINT64_LIT(0x0000800000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_222_in_section_routine13066	= { FOLLOW_222_in_section_routine13066_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_201_in_section_routine13073  */
static	ANTLR3_BITWORD FOLLOW_201_in_section_routine13073_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x4000000000000000), ANTLR3_UINT64_LIT(0x0000800000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_201_in_section_routine13073	= { FOLLOW_201_in_section_routine13073_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_routine_model_in_section_routine13088  */
static	ANTLR3_BITWORD FOLLOW_def_routine_model_in_section_routine13088_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x4000000000000000), ANTLR3_UINT64_LIT(0x0000800000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_def_routine_model_in_section_routine13088	= { FOLLOW_def_routine_model_in_section_routine13088_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_367_in_def_routine_model13107  */
static	ANTLR3_BITWORD FOLLOW_367_in_def_routine_model13107_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_367_in_def_routine_model13107	= { FOLLOW_367_in_def_routine_model13107_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_318_in_def_routine_model13114  */
static	ANTLR3_BITWORD FOLLOW_318_in_def_routine_model13114_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000800000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_318_in_def_routine_model13114	= { FOLLOW_318_in_def_routine_model13114_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_367_in_def_routine_model13127  */
static	ANTLR3_BITWORD FOLLOW_367_in_def_routine_model13127_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_367_in_def_routine_model13127	= { FOLLOW_367_in_def_routine_model13127_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_routine_model_impl_in_def_routine_model13141  */
static	ANTLR3_BITWORD FOLLOW_def_routine_model_impl_in_def_routine_model13141_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_routine_model_impl_in_def_routine_model13141	= { FOLLOW_def_routine_model_impl_in_def_routine_model13141_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_def_routine_model_impl13165  */
static	ANTLR3_BITWORD FOLLOW_ID_in_def_routine_model_impl13165_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000081), ANTLR3_UINT64_LIT(0x0000000800000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_def_routine_model_impl13165	= { FOLLOW_ID_in_def_routine_model_impl13165_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_routine_parameters_in_def_routine_model_impl13178  */
static	ANTLR3_BITWORD FOLLOW_def_routine_parameters_in_def_routine_model_impl13178_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001), ANTLR3_UINT64_LIT(0x0000000800000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_def_routine_parameters_in_def_routine_model_impl13178	= { FOLLOW_def_routine_parameters_in_def_routine_model_impl13178_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_def_routine_model_impl13189  */
static	ANTLR3_BITWORD FOLLOW_set_in_def_routine_model_impl13189_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000080), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xC266000000000000), ANTLR3_UINT64_LIT(0x38E000000A00C128), ANTLR3_UINT64_LIT(0x0064016007002261), ANTLR3_UINT64_LIT(0x0000000013A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_def_routine_model_impl13189	= { FOLLOW_set_in_def_routine_model_impl13189_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_routine_returns_in_def_routine_model_impl13200  */
static	ANTLR3_BITWORD FOLLOW_def_routine_returns_in_def_routine_model_impl13200_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_def_routine_returns_in_def_routine_model_impl13200	= { FOLLOW_def_routine_returns_in_def_routine_model_impl13200_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_block_statement_in_def_routine_model_impl13212  */
static	ANTLR3_BITWORD FOLLOW_block_statement_in_def_routine_model_impl13212_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_block_statement_in_def_routine_model_impl13212	= { FOLLOW_block_statement_in_def_routine_model_impl13212_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LPAREN_in_def_routine_parameters13233  */
static	ANTLR3_BITWORD FOLLOW_LPAREN_in_def_routine_parameters13233_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000280), ANTLR3_UINT64_LIT(0x0000000000001000), ANTLR3_UINT64_LIT(0x0000005000000002), ANTLR3_UINT64_LIT(0xC26E000000000000), ANTLR3_UINT64_LIT(0x78E204800E00C168), ANTLR3_UINT64_LIT(0x006413600720A261), ANTLR3_UINT64_LIT(0x0000000013A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_LPAREN_in_def_routine_parameters13233	= { FOLLOW_LPAREN_in_def_routine_parameters13233_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_routine_param_atom_in_def_routine_parameters13243  */
static	ANTLR3_BITWORD FOLLOW_def_routine_param_atom_in_def_routine_parameters13243_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_routine_param_atom_in_def_routine_parameters13243	= { FOLLOW_def_routine_param_atom_in_def_routine_parameters13243_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_def_routine_parameters13255  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_def_routine_parameters13255_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000280), ANTLR3_UINT64_LIT(0x0000000000001000), ANTLR3_UINT64_LIT(0x0000005000000000), ANTLR3_UINT64_LIT(0xC26E000000000000), ANTLR3_UINT64_LIT(0x78E204800E00C168), ANTLR3_UINT64_LIT(0x006413600720A261), ANTLR3_UINT64_LIT(0x0000000013A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_def_routine_parameters13255	= { FOLLOW_COMMA_in_def_routine_parameters13255_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_routine_param_atom_in_def_routine_parameters13257  */
static	ANTLR3_BITWORD FOLLOW_def_routine_param_atom_in_def_routine_parameters13257_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_routine_param_atom_in_def_routine_parameters13257	= { FOLLOW_def_routine_param_atom_in_def_routine_parameters13257_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RPAREN_in_def_routine_parameters13269  */
static	ANTLR3_BITWORD FOLLOW_RPAREN_in_def_routine_parameters13269_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RPAREN_in_def_routine_parameters13269	= { FOLLOW_RPAREN_in_def_routine_parameters13269_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_modifier_param_in_def_routine_param_atom13312  */
static	ANTLR3_BITWORD FOLLOW_modifier_param_in_def_routine_param_atom13312_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xC266000000000000), ANTLR3_UINT64_LIT(0x38E000000A00C128), ANTLR3_UINT64_LIT(0x0064016007002261), ANTLR3_UINT64_LIT(0x0000000013A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_modifier_param_in_def_routine_param_atom13312	= { FOLLOW_modifier_param_in_def_routine_param_atom13312_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_type_var_in_def_routine_param_atom13326  */
static	ANTLR3_BITWORD FOLLOW_type_var_in_def_routine_param_atom13326_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_type_var_in_def_routine_param_atom13326	= { FOLLOW_type_var_in_def_routine_param_atom13326_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_def_routine_param_atom13333  */
static	ANTLR3_BITWORD FOLLOW_ID_in_def_routine_param_atom13333_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000012), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_def_routine_param_atom13333	= { FOLLOW_ID_in_def_routine_param_atom13333_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_def_routine_param_atom13343  */
static	ANTLR3_BITWORD FOLLOW_ID_in_def_routine_param_atom13343_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000012), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_def_routine_param_atom13343	= { FOLLOW_ID_in_def_routine_param_atom13343_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_initial_value_in_def_routine_param_atom13369  */
static	ANTLR3_BITWORD FOLLOW_initial_value_in_def_routine_param_atom13369_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_initial_value_in_def_routine_param_atom13369	= { FOLLOW_initial_value_in_def_routine_param_atom13369_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LPAREN_in_def_routine_returns13393  */
static	ANTLR3_BITWORD FOLLOW_LPAREN_in_def_routine_returns13393_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000280), ANTLR3_UINT64_LIT(0x0000000000001000), ANTLR3_UINT64_LIT(0x0000005000000000), ANTLR3_UINT64_LIT(0xC26E000000000000), ANTLR3_UINT64_LIT(0x78E204800E00C168), ANTLR3_UINT64_LIT(0x006413600720A261), ANTLR3_UINT64_LIT(0x0000000013A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_LPAREN_in_def_routine_returns13393	= { FOLLOW_LPAREN_in_def_routine_returns13393_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_routine_returns_atom_in_def_routine_returns13401  */
static	ANTLR3_BITWORD FOLLOW_def_routine_returns_atom_in_def_routine_returns13401_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_routine_returns_atom_in_def_routine_returns13401	= { FOLLOW_def_routine_returns_atom_in_def_routine_returns13401_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_def_routine_returns13413  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_def_routine_returns13413_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000280), ANTLR3_UINT64_LIT(0x0000000000001000), ANTLR3_UINT64_LIT(0x0000005000000000), ANTLR3_UINT64_LIT(0xC26E000000000000), ANTLR3_UINT64_LIT(0x78E204800E00C168), ANTLR3_UINT64_LIT(0x006413600720A261), ANTLR3_UINT64_LIT(0x0000000013A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_def_routine_returns13413	= { FOLLOW_COMMA_in_def_routine_returns13413_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_routine_returns_atom_in_def_routine_returns13415  */
static	ANTLR3_BITWORD FOLLOW_def_routine_returns_atom_in_def_routine_returns13415_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_routine_returns_atom_in_def_routine_returns13415	= { FOLLOW_def_routine_returns_atom_in_def_routine_returns13415_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RPAREN_in_def_routine_returns13424  */
static	ANTLR3_BITWORD FOLLOW_RPAREN_in_def_routine_returns13424_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RPAREN_in_def_routine_returns13424	= { FOLLOW_RPAREN_in_def_routine_returns13424_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_type_var_in_def_routine_returns13432  */
static	ANTLR3_BITWORD FOLLOW_type_var_in_def_routine_returns13432_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000012), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_type_var_in_def_routine_returns13432	= { FOLLOW_type_var_in_def_routine_returns13432_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_initial_value_in_def_routine_returns13438  */
static	ANTLR3_BITWORD FOLLOW_initial_value_in_def_routine_returns13438_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_initial_value_in_def_routine_returns13438	= { FOLLOW_initial_value_in_def_routine_returns13438_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_modifier_param_in_def_routine_returns_atom13491  */
static	ANTLR3_BITWORD FOLLOW_modifier_param_in_def_routine_returns_atom13491_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xC266000000000000), ANTLR3_UINT64_LIT(0x38E000000A00C128), ANTLR3_UINT64_LIT(0x0064016007002261), ANTLR3_UINT64_LIT(0x0000000013A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_modifier_param_in_def_routine_returns_atom13491	= { FOLLOW_modifier_param_in_def_routine_returns_atom13491_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_type_var_in_def_routine_returns_atom13505  */
static	ANTLR3_BITWORD FOLLOW_type_var_in_def_routine_returns_atom13505_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_type_var_in_def_routine_returns_atom13505	= { FOLLOW_type_var_in_def_routine_returns_atom13505_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_def_routine_returns_atom13512  */
static	ANTLR3_BITWORD FOLLOW_ID_in_def_routine_returns_atom13512_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000012), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_def_routine_returns_atom13512	= { FOLLOW_ID_in_def_routine_returns_atom13512_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_def_routine_returns_atom13522  */
static	ANTLR3_BITWORD FOLLOW_ID_in_def_routine_returns_atom13522_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000012), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_def_routine_returns_atom13522	= { FOLLOW_ID_in_def_routine_returns_atom13522_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_initial_value_in_def_routine_returns_atom13550  */
static	ANTLR3_BITWORD FOLLOW_initial_value_in_def_routine_returns_atom13550_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_initial_value_in_def_routine_returns_atom13550	= { FOLLOW_initial_value_in_def_routine_returns_atom13550_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_204_in_section_model_of_execution13574  */
static	ANTLR3_BITWORD FOLLOW_204_in_section_model_of_execution13574_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xE14A840000000000), ANTLR3_UINT64_LIT(0x0000001784000084), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000800000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_204_in_section_model_of_execution13574	= { FOLLOW_204_in_section_model_of_execution13574_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_moe_primitive_in_section_model_of_execution13579  */
static	ANTLR3_BITWORD FOLLOW_def_moe_primitive_in_section_model_of_execution13579_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xE14A840000000000), ANTLR3_UINT64_LIT(0x0000001784000084), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000800000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_def_moe_primitive_in_section_model_of_execution13579	= { FOLLOW_def_moe_primitive_in_section_model_of_execution13579_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_177_in_def_moe_primitive13600  */
static	ANTLR3_BITWORD FOLLOW_177_in_def_moe_primitive13600_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000081), ANTLR3_UINT64_LIT(0x0000000800000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_177_in_def_moe_primitive13600	= { FOLLOW_177_in_def_moe_primitive13600_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_routine_seq_in_def_moe_primitive13608  */
static	ANTLR3_BITWORD FOLLOW_def_routine_seq_in_def_moe_primitive13608_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_routine_seq_in_def_moe_primitive13608	= { FOLLOW_def_routine_seq_in_def_moe_primitive13608_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_194_in_def_moe_primitive13614  */
static	ANTLR3_BITWORD FOLLOW_194_in_def_moe_primitive13614_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000081), ANTLR3_UINT64_LIT(0x0000000800000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_194_in_def_moe_primitive13614	= { FOLLOW_194_in_def_moe_primitive13614_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_routine_seq_in_def_moe_primitive13624  */
static	ANTLR3_BITWORD FOLLOW_def_routine_seq_in_def_moe_primitive13624_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_routine_seq_in_def_moe_primitive13624	= { FOLLOW_def_routine_seq_in_def_moe_primitive13624_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_184_in_def_moe_primitive13630  */
static	ANTLR3_BITWORD FOLLOW_184_in_def_moe_primitive13630_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000081), ANTLR3_UINT64_LIT(0x0000000800000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_184_in_def_moe_primitive13630	= { FOLLOW_184_in_def_moe_primitive13630_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_routine_seq_in_def_moe_primitive13639  */
static	ANTLR3_BITWORD FOLLOW_def_routine_seq_in_def_moe_primitive13639_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_routine_seq_in_def_moe_primitive13639	= { FOLLOW_def_routine_seq_in_def_moe_primitive13639_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_226_in_def_moe_primitive13646  */
static	ANTLR3_BITWORD FOLLOW_226_in_def_moe_primitive13646_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000081), ANTLR3_UINT64_LIT(0x0000000800000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_226_in_def_moe_primitive13646	= { FOLLOW_226_in_def_moe_primitive13646_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_routine_seq_in_def_moe_primitive13655  */
static	ANTLR3_BITWORD FOLLOW_def_routine_seq_in_def_moe_primitive13655_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_routine_seq_in_def_moe_primitive13655	= { FOLLOW_def_routine_seq_in_def_moe_primitive13655_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_228_in_def_moe_primitive13661  */
static	ANTLR3_BITWORD FOLLOW_228_in_def_moe_primitive13661_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000081), ANTLR3_UINT64_LIT(0x0000000800000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_228_in_def_moe_primitive13661	= { FOLLOW_228_in_def_moe_primitive13661_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_routine_seq_in_def_moe_primitive13671  */
static	ANTLR3_BITWORD FOLLOW_def_routine_seq_in_def_moe_primitive13671_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_routine_seq_in_def_moe_primitive13671	= { FOLLOW_def_routine_seq_in_def_moe_primitive13671_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_191_in_def_moe_primitive13678  */
static	ANTLR3_BITWORD FOLLOW_191_in_def_moe_primitive13678_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000081), ANTLR3_UINT64_LIT(0x0000000800000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_191_in_def_moe_primitive13678	= { FOLLOW_191_in_def_moe_primitive13678_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_routine_seq_in_def_moe_primitive13685  */
static	ANTLR3_BITWORD FOLLOW_def_routine_seq_in_def_moe_primitive13685_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_routine_seq_in_def_moe_primitive13685	= { FOLLOW_def_routine_seq_in_def_moe_primitive13685_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_182_in_def_moe_primitive13691  */
static	ANTLR3_BITWORD FOLLOW_182_in_def_moe_primitive13691_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000081), ANTLR3_UINT64_LIT(0x0000000800000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_182_in_def_moe_primitive13691	= { FOLLOW_182_in_def_moe_primitive13691_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_routine_seq_in_def_moe_primitive13699  */
static	ANTLR3_BITWORD FOLLOW_def_routine_seq_in_def_moe_primitive13699_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_routine_seq_in_def_moe_primitive13699	= { FOLLOW_def_routine_seq_in_def_moe_primitive13699_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_190_in_def_moe_primitive13706  */
static	ANTLR3_BITWORD FOLLOW_190_in_def_moe_primitive13706_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000081), ANTLR3_UINT64_LIT(0x0000000800000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_190_in_def_moe_primitive13706	= { FOLLOW_190_in_def_moe_primitive13706_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_routine_seq_in_def_moe_primitive13712  */
static	ANTLR3_BITWORD FOLLOW_def_routine_seq_in_def_moe_primitive13712_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_routine_seq_in_def_moe_primitive13712	= { FOLLOW_def_routine_seq_in_def_moe_primitive13712_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_179_in_def_moe_primitive13718  */
static	ANTLR3_BITWORD FOLLOW_179_in_def_moe_primitive13718_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000081), ANTLR3_UINT64_LIT(0x0000000800000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_179_in_def_moe_primitive13718	= { FOLLOW_179_in_def_moe_primitive13718_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_routine_seq_in_def_moe_primitive13725  */
static	ANTLR3_BITWORD FOLLOW_def_routine_seq_in_def_moe_primitive13725_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_routine_seq_in_def_moe_primitive13725	= { FOLLOW_def_routine_seq_in_def_moe_primitive13725_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_189_in_def_moe_primitive13732  */
static	ANTLR3_BITWORD FOLLOW_189_in_def_moe_primitive13732_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000081), ANTLR3_UINT64_LIT(0x0000000800000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_189_in_def_moe_primitive13732	= { FOLLOW_189_in_def_moe_primitive13732_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_routine_seq_in_def_moe_primitive13740  */
static	ANTLR3_BITWORD FOLLOW_def_routine_seq_in_def_moe_primitive13740_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_routine_seq_in_def_moe_primitive13740	= { FOLLOW_def_routine_seq_in_def_moe_primitive13740_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_170_in_def_moe_primitive13746  */
static	ANTLR3_BITWORD FOLLOW_170_in_def_moe_primitive13746_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000081), ANTLR3_UINT64_LIT(0x0000000800000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_170_in_def_moe_primitive13746	= { FOLLOW_170_in_def_moe_primitive13746_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_routine_seq_in_def_moe_primitive13755  */
static	ANTLR3_BITWORD FOLLOW_def_routine_seq_in_def_moe_primitive13755_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_routine_seq_in_def_moe_primitive13755	= { FOLLOW_def_routine_seq_in_def_moe_primitive13755_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_199_in_def_moe_primitive13762  */
static	ANTLR3_BITWORD FOLLOW_199_in_def_moe_primitive13762_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000081), ANTLR3_UINT64_LIT(0x0000000800000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_199_in_def_moe_primitive13762	= { FOLLOW_199_in_def_moe_primitive13762_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_routine_seq_in_def_moe_primitive13772  */
static	ANTLR3_BITWORD FOLLOW_def_routine_seq_in_def_moe_primitive13772_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_routine_seq_in_def_moe_primitive13772	= { FOLLOW_def_routine_seq_in_def_moe_primitive13772_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_224_in_def_moe_primitive13778  */
static	ANTLR3_BITWORD FOLLOW_224_in_def_moe_primitive13778_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000081), ANTLR3_UINT64_LIT(0x0000000800000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_224_in_def_moe_primitive13778	= { FOLLOW_224_in_def_moe_primitive13778_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_routine_seq_in_def_moe_primitive13789  */
static	ANTLR3_BITWORD FOLLOW_def_routine_seq_in_def_moe_primitive13789_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_routine_seq_in_def_moe_primitive13789	= { FOLLOW_def_routine_seq_in_def_moe_primitive13789_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_223_in_def_moe_primitive13795  */
static	ANTLR3_BITWORD FOLLOW_223_in_def_moe_primitive13795_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000081), ANTLR3_UINT64_LIT(0x0000000800000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_223_in_def_moe_primitive13795	= { FOLLOW_223_in_def_moe_primitive13795_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_routine_seq_in_def_moe_primitive13806  */
static	ANTLR3_BITWORD FOLLOW_def_routine_seq_in_def_moe_primitive13806_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_routine_seq_in_def_moe_primitive13806	= { FOLLOW_def_routine_seq_in_def_moe_primitive13806_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_218_in_def_moe_primitive13813  */
static	ANTLR3_BITWORD FOLLOW_218_in_def_moe_primitive13813_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000081), ANTLR3_UINT64_LIT(0x0000000800000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_218_in_def_moe_primitive13813	= { FOLLOW_218_in_def_moe_primitive13813_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_routine_seq_in_def_moe_primitive13821  */
static	ANTLR3_BITWORD FOLLOW_def_routine_seq_in_def_moe_primitive13821_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_routine_seq_in_def_moe_primitive13821	= { FOLLOW_def_routine_seq_in_def_moe_primitive13821_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_175_in_def_moe_primitive13828  */
static	ANTLR3_BITWORD FOLLOW_175_in_def_moe_primitive13828_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000081), ANTLR3_UINT64_LIT(0x0000000800000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_175_in_def_moe_primitive13828	= { FOLLOW_175_in_def_moe_primitive13828_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_routine_seq_in_def_moe_primitive13831  */
static	ANTLR3_BITWORD FOLLOW_def_routine_seq_in_def_moe_primitive13831_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_routine_seq_in_def_moe_primitive13831	= { FOLLOW_def_routine_seq_in_def_moe_primitive13831_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_225_in_def_moe_primitive13837  */
static	ANTLR3_BITWORD FOLLOW_225_in_def_moe_primitive13837_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000081), ANTLR3_UINT64_LIT(0x0000000800000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_225_in_def_moe_primitive13837	= { FOLLOW_225_in_def_moe_primitive13837_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_routine_seq_in_def_moe_primitive13843  */
static	ANTLR3_BITWORD FOLLOW_def_routine_seq_in_def_moe_primitive13843_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_routine_seq_in_def_moe_primitive13843	= { FOLLOW_def_routine_seq_in_def_moe_primitive13843_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_367_in_def_moe_primitive13851  */
static	ANTLR3_BITWORD FOLLOW_367_in_def_moe_primitive13851_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_367_in_def_moe_primitive13851	= { FOLLOW_367_in_def_moe_primitive13851_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_routine_model_impl_in_def_moe_primitive13856  */
static	ANTLR3_BITWORD FOLLOW_def_routine_model_impl_in_def_moe_primitive13856_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_routine_model_impl_in_def_moe_primitive13856	= { FOLLOW_def_routine_model_impl_in_def_moe_primitive13856_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_routine_parameters_in_def_routine_seq13881  */
static	ANTLR3_BITWORD FOLLOW_def_routine_parameters_in_def_routine_seq13881_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001), ANTLR3_UINT64_LIT(0x0000000800000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_def_routine_parameters_in_def_routine_seq13881	= { FOLLOW_def_routine_parameters_in_def_routine_seq13881_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_def_routine_seq13892  */
static	ANTLR3_BITWORD FOLLOW_set_in_def_routine_seq13892_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000080), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xC266000000000000), ANTLR3_UINT64_LIT(0x38E000000A00C128), ANTLR3_UINT64_LIT(0x0064016007002261), ANTLR3_UINT64_LIT(0x0000000013A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_def_routine_seq13892	= { FOLLOW_set_in_def_routine_seq13892_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_routine_returns_in_def_routine_seq13903  */
static	ANTLR3_BITWORD FOLLOW_def_routine_returns_in_def_routine_seq13903_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_def_routine_returns_in_def_routine_seq13903	= { FOLLOW_def_routine_returns_in_def_routine_seq13903_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_block_statement_in_def_routine_seq13915  */
static	ANTLR3_BITWORD FOLLOW_block_statement_in_def_routine_seq13915_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_block_statement_in_def_routine_seq13915	= { FOLLOW_block_statement_in_def_routine_seq13915_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_section_model_of_interaction13945  */
static	ANTLR3_BITWORD FOLLOW_set_in_section_model_of_interaction13945_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000030), ANTLR3_UINT64_LIT(0x0000400000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_section_model_of_interaction13945	= { FOLLOW_set_in_section_model_of_interaction13945_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_com_connect_in_section_model_of_interaction13960  */
static	ANTLR3_BITWORD FOLLOW_com_connect_in_section_model_of_interaction13960_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000030), ANTLR3_UINT64_LIT(0x0000400000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_com_connect_in_section_model_of_interaction13960	= { FOLLOW_com_connect_in_section_model_of_interaction13960_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_277_in_com_protocol13978  */
static	ANTLR3_BITWORD FOLLOW_277_in_com_protocol13978_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_277_in_com_protocol13978	= { FOLLOW_277_in_com_protocol13978_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_359_in_com_protocol13992  */
static	ANTLR3_BITWORD FOLLOW_359_in_com_protocol13992_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_359_in_com_protocol13992	= { FOLLOW_359_in_com_protocol13992_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_328_in_com_protocol14005  */
static	ANTLR3_BITWORD FOLLOW_328_in_com_protocol14005_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_328_in_com_protocol14005	= { FOLLOW_328_in_com_protocol14005_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_284_in_com_protocol14014  */
static	ANTLR3_BITWORD FOLLOW_284_in_com_protocol14014_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_284_in_com_protocol14014	= { FOLLOW_284_in_com_protocol14014_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_240_in_com_protocol14028  */
static	ANTLR3_BITWORD FOLLOW_240_in_com_protocol14028_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_240_in_com_protocol14028	= { FOLLOW_240_in_com_protocol14028_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_403_in_com_protocol14038  */
static	ANTLR3_BITWORD FOLLOW_403_in_com_protocol14038_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_403_in_com_protocol14038	= { FOLLOW_403_in_com_protocol14038_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_324_in_com_protocol14048  */
static	ANTLR3_BITWORD FOLLOW_324_in_com_protocol14048_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_324_in_com_protocol14048	= { FOLLOW_324_in_com_protocol14048_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_248_in_com_protocol14056  */
static	ANTLR3_BITWORD FOLLOW_248_in_com_protocol14056_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_248_in_com_protocol14056	= { FOLLOW_248_in_com_protocol14056_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_buffer_com_in_com_protocol14066  */
static	ANTLR3_BITWORD FOLLOW_buffer_com_in_com_protocol14066_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_buffer_com_in_com_protocol14066	= { FOLLOW_buffer_com_in_com_protocol14066_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_240_in_com_cast14083  */
static	ANTLR3_BITWORD FOLLOW_240_in_com_cast14083_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_240_in_com_cast14083	= { FOLLOW_240_in_com_cast14083_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_403_in_com_cast14093  */
static	ANTLR3_BITWORD FOLLOW_403_in_com_cast14093_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_403_in_com_cast14093	= { FOLLOW_403_in_com_cast14093_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_324_in_com_cast14103  */
static	ANTLR3_BITWORD FOLLOW_324_in_com_cast14103_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_324_in_com_cast14103	= { FOLLOW_324_in_com_cast14103_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_248_in_com_cast14111  */
static	ANTLR3_BITWORD FOLLOW_248_in_com_cast14111_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_248_in_com_cast14111	= { FOLLOW_248_in_com_cast14111_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_249_in_buffer_com14132  */
static	ANTLR3_BITWORD FOLLOW_249_in_buffer_com14132_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000200000), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_249_in_buffer_com14132	= { FOLLOW_249_in_buffer_com14132_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COLON_in_buffer_com14139  */
static	ANTLR3_BITWORD FOLLOW_COLON_in_buffer_com14139_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0800000002000000), ANTLR3_UINT64_LIT(0x0024001000000260), ANTLR3_UINT64_LIT(0x0000000010000000) };
static  ANTLR3_BITSET_LIST FOLLOW_COLON_in_buffer_com14139	= { FOLLOW_COLON_in_buffer_com14139_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ref_buffer_in_buffer_com14150  */
static	ANTLR3_BITWORD FOLLOW_ref_buffer_in_buffer_com14150_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_ref_buffer_in_buffer_com14150	= { FOLLOW_ref_buffer_in_buffer_com14150_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_buffer_in_buffer_com14165  */
static	ANTLR3_BITWORD FOLLOW_def_buffer_in_buffer_com14165_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_buffer_in_buffer_com14165	= { FOLLOW_def_buffer_in_buffer_com14165_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LT__in_buffer_com14187  */
static	ANTLR3_BITWORD FOLLOW_LT__in_buffer_com14187_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0800000002000000), ANTLR3_UINT64_LIT(0x0024001000000260), ANTLR3_UINT64_LIT(0x0000000010000000) };
static  ANTLR3_BITSET_LIST FOLLOW_LT__in_buffer_com14187	= { FOLLOW_LT__in_buffer_com14187_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ref_buffer_in_buffer_com14200  */
static	ANTLR3_BITWORD FOLLOW_ref_buffer_in_buffer_com14200_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_ref_buffer_in_buffer_com14200	= { FOLLOW_ref_buffer_in_buffer_com14200_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_buffer_in_buffer_com14217  */
static	ANTLR3_BITWORD FOLLOW_def_buffer_in_buffer_com14217_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_def_buffer_in_buffer_com14217	= { FOLLOW_def_buffer_in_buffer_com14217_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_GT_in_buffer_com14238  */
static	ANTLR3_BITWORD FOLLOW_GT_in_buffer_com14238_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_GT_in_buffer_com14238	= { FOLLOW_GT_in_buffer_com14238_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_buffer_in_buffer_com14250  */
static	ANTLR3_BITWORD FOLLOW_def_buffer_in_buffer_com14250_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_buffer_in_buffer_com14250	= { FOLLOW_def_buffer_in_buffer_com14250_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_com_connect14276  */
static	ANTLR3_BITWORD FOLLOW_set_in_com_connect14276_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000002001) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_com_connect14276	= { FOLLOW_set_in_com_connect14276_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LT__in_com_connect14291  */
static	ANTLR3_BITWORD FOLLOW_LT__in_com_connect14291_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0301000000000000), ANTLR3_UINT64_LIT(0x0800000012200000), ANTLR3_UINT64_LIT(0x0024009000000370), ANTLR3_UINT64_LIT(0x0000000010080000) };
static  ANTLR3_BITSET_LIST FOLLOW_LT__in_com_connect14291	= { FOLLOW_LT__in_com_connect14291_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_com_protocol_in_com_connect14298  */
static	ANTLR3_BITWORD FOLLOW_com_protocol_in_com_connect14298_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000800000) };
static  ANTLR3_BITSET_LIST FOLLOW_com_protocol_in_com_connect14298	= { FOLLOW_com_protocol_in_com_connect14298_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_com_connect14308  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_com_connect14308_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0101000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000010), ANTLR3_UINT64_LIT(0x0000000000080000) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_com_connect14308	= { FOLLOW_COMMA_in_com_connect14308_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_com_cast_in_com_connect14310  */
static	ANTLR3_BITWORD FOLLOW_com_cast_in_com_connect14310_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_com_cast_in_com_connect14310	= { FOLLOW_com_cast_in_com_connect14310_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_GT_in_com_connect14321  */
static	ANTLR3_BITWORD FOLLOW_GT_in_com_connect14321_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_GT_in_com_connect14321	= { FOLLOW_GT_in_com_connect14321_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_com_connect14334  */
static	ANTLR3_BITWORD FOLLOW_ID_in_com_connect14334_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_com_connect14334	= { FOLLOW_ID_in_com_connect14334_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_com_connect14349  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_com_connect14349_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0002040000000000), ANTLR3_UINT64_LIT(0x0000100000200000) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_com_connect14349	= { FOLLOW_LCURLY_in_com_connect14349_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_com_route_in_com_connect14356  */
static	ANTLR3_BITWORD FOLLOW_com_route_in_com_connect14356_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0002040000000000), ANTLR3_UINT64_LIT(0x0000100000200000) };
static  ANTLR3_BITSET_LIST FOLLOW_com_route_in_com_connect14356	= { FOLLOW_com_route_in_com_connect14356_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_com_connect14365  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_com_connect14365_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_com_connect14365	= { FOLLOW_RCURLY_in_com_connect14365_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_366_in_com_connect14374  */
static	ANTLR3_BITWORD FOLLOW_366_in_com_connect14374_bits[]	= { ANTLR3_UINT64_LIT(0x1004000000000000), ANTLR3_UINT64_LIT(0x0000000000002001), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0002040000000000), ANTLR3_UINT64_LIT(0x0000100000200000) };
static  ANTLR3_BITSET_LIST FOLLOW_366_in_com_connect14374	= { FOLLOW_366_in_com_connect14374_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LT__in_com_connect14388  */
static	ANTLR3_BITWORD FOLLOW_LT__in_com_connect14388_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0301000000000000), ANTLR3_UINT64_LIT(0x0800000012200000), ANTLR3_UINT64_LIT(0x0024009000000370), ANTLR3_UINT64_LIT(0x0000000010080000) };
static  ANTLR3_BITSET_LIST FOLLOW_LT__in_com_connect14388	= { FOLLOW_LT__in_com_connect14388_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_com_protocol_in_com_connect14395  */
static	ANTLR3_BITWORD FOLLOW_com_protocol_in_com_connect14395_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000800000) };
static  ANTLR3_BITSET_LIST FOLLOW_com_protocol_in_com_connect14395	= { FOLLOW_com_protocol_in_com_connect14395_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_com_connect14405  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_com_connect14405_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0101000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000010), ANTLR3_UINT64_LIT(0x0000000000080000) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_com_connect14405	= { FOLLOW_COMMA_in_com_connect14405_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_com_cast_in_com_connect14407  */
static	ANTLR3_BITWORD FOLLOW_com_cast_in_com_connect14407_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_com_cast_in_com_connect14407	= { FOLLOW_com_cast_in_com_connect14407_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_GT_in_com_connect14418  */
static	ANTLR3_BITWORD FOLLOW_GT_in_com_connect14418_bits[]	= { ANTLR3_UINT64_LIT(0x1004000000000000), ANTLR3_UINT64_LIT(0x0000000000000001), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0002040000000000), ANTLR3_UINT64_LIT(0x0000100000200000) };
static  ANTLR3_BITSET_LIST FOLLOW_GT_in_com_connect14418	= { FOLLOW_GT_in_com_connect14418_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_com_route_in_com_connect14432  */
static	ANTLR3_BITWORD FOLLOW_com_route_in_com_connect14432_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_com_route_in_com_connect14432	= { FOLLOW_com_route_in_com_connect14432_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_com_connect14441  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_com_connect14441_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0002040000000000), ANTLR3_UINT64_LIT(0x0000100000200000) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_com_connect14441	= { FOLLOW_LCURLY_in_com_connect14441_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_com_route_in_com_connect14450  */
static	ANTLR3_BITWORD FOLLOW_com_route_in_com_connect14450_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0002040000000000), ANTLR3_UINT64_LIT(0x0000100000200000) };
static  ANTLR3_BITSET_LIST FOLLOW_com_route_in_com_connect14450	= { FOLLOW_com_route_in_com_connect14450_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_com_connect14461  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_com_connect14461_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_com_connect14461	= { FOLLOW_RCURLY_in_com_connect14461_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LBRACKET_in_com_connect14469  */
static	ANTLR3_BITWORD FOLLOW_LBRACKET_in_com_connect14469_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000200) };
static  ANTLR3_BITSET_LIST FOLLOW_LBRACKET_in_com_connect14469	= { FOLLOW_LBRACKET_in_com_connect14469_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_com_port_in_com_connect14485  */
static	ANTLR3_BITWORD FOLLOW_com_port_in_com_connect14485_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x1000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_com_port_in_com_connect14485	= { FOLLOW_com_port_in_com_connect14485_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_com_connect14497  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_com_connect14497_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_com_connect14497	= { FOLLOW_COMMA_in_com_connect14497_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_com_port_in_com_connect14500  */
static	ANTLR3_BITWORD FOLLOW_com_port_in_com_connect14500_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x1000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_com_port_in_com_connect14500	= { FOLLOW_com_port_in_com_connect14500_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_STAR_in_com_connect14514  */
static	ANTLR3_BITWORD FOLLOW_STAR_in_com_connect14514_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x1000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_STAR_in_com_connect14514	= { FOLLOW_STAR_in_com_connect14514_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RBRACKET_in_com_connect14535  */
static	ANTLR3_BITWORD FOLLOW_RBRACKET_in_com_connect14535_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_RBRACKET_in_com_connect14535	= { FOLLOW_RBRACKET_in_com_connect14535_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_com_connect14542  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_com_connect14542_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_com_connect14542	= { FOLLOW_SEMI_in_com_connect14542_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_modifier_set_direction_strict_text_in_com_route14570  */
static	ANTLR3_BITWORD FOLLOW_modifier_set_direction_strict_text_in_com_route14570_bits[]	= { ANTLR3_UINT64_LIT(0x1004000000000000), ANTLR3_UINT64_LIT(0x0000000000002001) };
static  ANTLR3_BITSET_LIST FOLLOW_modifier_set_direction_strict_text_in_com_route14570	= { FOLLOW_modifier_set_direction_strict_text_in_com_route14570_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LT__in_com_route14578  */
static	ANTLR3_BITWORD FOLLOW_LT__in_com_route14578_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0301000000000000), ANTLR3_UINT64_LIT(0x0800000002000000), ANTLR3_UINT64_LIT(0x0024001000000270), ANTLR3_UINT64_LIT(0x0000000010080000) };
static  ANTLR3_BITSET_LIST FOLLOW_LT__in_com_route14578	= { FOLLOW_LT__in_com_route14578_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_buffer_com_in_com_route14589  */
static	ANTLR3_BITWORD FOLLOW_buffer_com_in_com_route14589_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_buffer_com_in_com_route14589	= { FOLLOW_buffer_com_in_com_route14589_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_com_cast_in_com_route14606  */
static	ANTLR3_BITWORD FOLLOW_com_cast_in_com_route14606_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_com_cast_in_com_route14606	= { FOLLOW_com_cast_in_com_route14606_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_GT_in_com_route14614  */
static	ANTLR3_BITWORD FOLLOW_GT_in_com_route14614_bits[]	= { ANTLR3_UINT64_LIT(0x1004000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_GT_in_com_route14614	= { FOLLOW_GT_in_com_route14614_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_com_port_in_com_route14625  */
static	ANTLR3_BITWORD FOLLOW_com_port_in_com_route14625_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_com_port_in_com_route14625	= { FOLLOW_com_port_in_com_route14625_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_com_route14629  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_com_route14629_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_com_route14629	= { FOLLOW_SEMI_in_com_route14629_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_com_route14637  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_com_route14637_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_com_route14637	= { FOLLOW_LCURLY_in_com_route14637_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_com_port_in_com_route14646  */
static	ANTLR3_BITWORD FOLLOW_com_port_in_com_route14646_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_com_port_in_com_route14646	= { FOLLOW_com_port_in_com_route14646_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_com_route14650  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_com_route14650_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x2000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_com_route14650	= { FOLLOW_SEMI_in_com_route14650_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_com_route14660  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_com_route14660_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_com_route14660	= { FOLLOW_RCURLY_in_com_route14660_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LBRACKET_in_com_route14668  */
static	ANTLR3_BITWORD FOLLOW_LBRACKET_in_com_route14668_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000200) };
static  ANTLR3_BITSET_LIST FOLLOW_LBRACKET_in_com_route14668	= { FOLLOW_LBRACKET_in_com_route14668_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_com_port_in_com_route14677  */
static	ANTLR3_BITWORD FOLLOW_com_port_in_com_route14677_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x1000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_com_port_in_com_route14677	= { FOLLOW_com_port_in_com_route14677_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_com_route14689  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_com_route14689_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_com_route14689	= { FOLLOW_COMMA_in_com_route14689_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_com_port_in_com_route14692  */
static	ANTLR3_BITWORD FOLLOW_com_port_in_com_route14692_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x1000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_com_port_in_com_route14692	= { FOLLOW_com_port_in_com_route14692_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_STAR_in_com_route14706  */
static	ANTLR3_BITWORD FOLLOW_STAR_in_com_route14706_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x1000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_STAR_in_com_route14706	= { FOLLOW_STAR_in_com_route14706_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RBRACKET_in_com_route14727  */
static	ANTLR3_BITWORD FOLLOW_RBRACKET_in_com_route14727_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_RBRACKET_in_com_route14727	= { FOLLOW_RBRACKET_in_com_route14727_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_com_route14734  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_com_route14734_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_com_route14734	= { FOLLOW_SEMI_in_com_route14734_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_com_port_in_com_route14748  */
static	ANTLR3_BITWORD FOLLOW_com_port_in_com_route14748_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_com_port_in_com_route14748	= { FOLLOW_com_port_in_com_route14748_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_com_route14752  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_com_route14752_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_com_route14752	= { FOLLOW_SEMI_in_com_route14752_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_qualifiedNameID_in_com_port14786  */
static	ANTLR3_BITWORD FOLLOW_qualifiedNameID_in_com_port14786_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000001000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_qualifiedNameID_in_com_port14786	= { FOLLOW_qualifiedNameID_in_com_port14786_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_164_in_com_port14800  */
static	ANTLR3_BITWORD FOLLOW_164_in_com_port14800_bits[]	= { ANTLR3_UINT64_LIT(0x1004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_164_in_com_port14800	= { FOLLOW_164_in_com_port14800_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_com_port_id_in_com_port14810  */
static	ANTLR3_BITWORD FOLLOW_com_port_id_in_com_port14810_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_com_port_id_in_com_port14810	= { FOLLOW_com_port_id_in_com_port14810_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LBRACKET_in_com_port14826  */
static	ANTLR3_BITWORD FOLLOW_LBRACKET_in_com_port14826_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000200) };
static  ANTLR3_BITSET_LIST FOLLOW_LBRACKET_in_com_port14826	= { FOLLOW_LBRACKET_in_com_port14826_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_com_port_id_in_com_port14837  */
static	ANTLR3_BITWORD FOLLOW_com_port_id_in_com_port14837_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x1000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_com_port_id_in_com_port14837	= { FOLLOW_com_port_id_in_com_port14837_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_com_port14859  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_com_port14859_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_com_port14859	= { FOLLOW_COMMA_in_com_port14859_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_com_port_id_in_com_port14864  */
static	ANTLR3_BITWORD FOLLOW_com_port_id_in_com_port14864_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x1000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_com_port_id_in_com_port14864	= { FOLLOW_com_port_id_in_com_port14864_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_STAR_in_com_port14887  */
static	ANTLR3_BITWORD FOLLOW_STAR_in_com_port14887_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x1000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_STAR_in_com_port14887	= { FOLLOW_STAR_in_com_port14887_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RBRACKET_in_com_port14908  */
static	ANTLR3_BITWORD FOLLOW_RBRACKET_in_com_port14908_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RBRACKET_in_com_port14908	= { FOLLOW_RBRACKET_in_com_port14908_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_com_port_id_in_com_port14922  */
static	ANTLR3_BITWORD FOLLOW_com_port_id_in_com_port14922_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_com_port_id_in_com_port14922	= { FOLLOW_com_port_id_in_com_port14922_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_qualifiedNameID_in_com_port_id14951  */
static	ANTLR3_BITWORD FOLLOW_qualifiedNameID_in_com_port_id14951_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_qualifiedNameID_in_com_port_id14951	= { FOLLOW_qualifiedNameID_in_com_port_id14951_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_statement_assign_in_statement14981  */
static	ANTLR3_BITWORD FOLLOW_statement_assign_in_statement14981_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_statement_assign_in_statement14981	= { FOLLOW_statement_assign_in_statement14981_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_statement_com_in_statement15002  */
static	ANTLR3_BITWORD FOLLOW_statement_com_in_statement15002_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_statement_com_in_statement15002	= { FOLLOW_statement_com_in_statement15002_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_statement_constraint_in_statement15025  */
static	ANTLR3_BITWORD FOLLOW_statement_constraint_in_statement15025_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_statement_constraint_in_statement15025	= { FOLLOW_statement_constraint_in_statement15025_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_statement_jump_in_statement15041  */
static	ANTLR3_BITWORD FOLLOW_statement_jump_in_statement15041_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_statement_jump_in_statement15041	= { FOLLOW_statement_jump_in_statement15041_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_statement_activity_in_statement15065  */
static	ANTLR3_BITWORD FOLLOW_statement_activity_in_statement15065_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_statement_activity_in_statement15065	= { FOLLOW_statement_activity_in_statement15065_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_statement_invoke_routine_in_statement15083  */
static	ANTLR3_BITWORD FOLLOW_statement_invoke_routine_in_statement15083_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_statement_invoke_routine_in_statement15083	= { FOLLOW_statement_invoke_routine_in_statement15083_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_statement_moc_in_statement15096  */
static	ANTLR3_BITWORD FOLLOW_statement_moc_in_statement15096_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_statement_moc_in_statement15096	= { FOLLOW_statement_moc_in_statement15096_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_statement_invoke_in_statement15120  */
static	ANTLR3_BITWORD FOLLOW_statement_invoke_in_statement15120_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_statement_invoke_in_statement15120	= { FOLLOW_statement_invoke_in_statement15120_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_statement_invoke_method_in_statement15140  */
static	ANTLR3_BITWORD FOLLOW_statement_invoke_method_in_statement15140_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_statement_invoke_method_in_statement15140	= { FOLLOW_statement_invoke_method_in_statement15140_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_statement_activity_new_in_statement15154  */
static	ANTLR3_BITWORD FOLLOW_statement_activity_new_in_statement15154_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_statement_activity_new_in_statement15154	= { FOLLOW_statement_activity_new_in_statement15154_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_statement_ite_in_statement15169  */
static	ANTLR3_BITWORD FOLLOW_statement_ite_in_statement15169_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_statement_ite_in_statement15169	= { FOLLOW_statement_ite_in_statement15169_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_statement_iteration_in_statement15192  */
static	ANTLR3_BITWORD FOLLOW_statement_iteration_in_statement15192_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_statement_iteration_in_statement15192	= { FOLLOW_statement_iteration_in_statement15192_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_block_statement_in_statement15212  */
static	ANTLR3_BITWORD FOLLOW_block_statement_in_statement15212_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_block_statement_in_statement15212	= { FOLLOW_block_statement_in_statement15212_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_prefix_statement_in_statement15234  */
static	ANTLR3_BITWORD FOLLOW_prefix_statement_in_statement15234_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_prefix_statement_in_statement15234	= { FOLLOW_prefix_statement_in_statement15234_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_statement_prompt_in_statement15255  */
static	ANTLR3_BITWORD FOLLOW_statement_prompt_in_statement15255_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_statement_prompt_in_statement15255	= { FOLLOW_statement_prompt_in_statement15255_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_meta_statement_in_statement15276  */
static	ANTLR3_BITWORD FOLLOW_meta_statement_in_statement15276_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_meta_statement_in_statement15276	= { FOLLOW_meta_statement_in_statement15276_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_block_statement15317  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_block_statement15317_bits[]	= { ANTLR3_UINT64_LIT(0x000C000104400000), ANTLR3_UINT64_LIT(0x2003FCFFFC000101), ANTLR3_UINT64_LIT(0x000000003C001000), ANTLR3_UINT64_LIT(0x0480100000000000), ANTLR3_UINT64_LIT(0x0103F97E24C83881), ANTLR3_UINT64_LIT(0x020B1C00003F0400), ANTLR3_UINT64_LIT(0x00000001800000A6) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_block_statement15317	= { FOLLOW_LCURLY_in_block_statement15317_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_op_block_in_block_statement15324  */
static	ANTLR3_BITWORD FOLLOW_op_block_in_block_statement15324_bits[]	= { ANTLR3_UINT64_LIT(0x000C000104400000), ANTLR3_UINT64_LIT(0x2000000000000101), ANTLR3_UINT64_LIT(0x000000003C001000), ANTLR3_UINT64_LIT(0x0480100000000000), ANTLR3_UINT64_LIT(0x0103F97E24C83881), ANTLR3_UINT64_LIT(0x020B1C00003F0400), ANTLR3_UINT64_LIT(0x00000001800000A6) };
static  ANTLR3_BITSET_LIST FOLLOW_op_block_in_block_statement15324	= { FOLLOW_op_block_in_block_statement15324_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_statement_in_block_statement15348  */
static	ANTLR3_BITWORD FOLLOW_statement_in_block_statement15348_bits[]	= { ANTLR3_UINT64_LIT(0x000C000104400000), ANTLR3_UINT64_LIT(0x2000000000000101), ANTLR3_UINT64_LIT(0x000000003C001000), ANTLR3_UINT64_LIT(0x0480100000000000), ANTLR3_UINT64_LIT(0x0103F97E24C83881), ANTLR3_UINT64_LIT(0x020B1C00003F0400), ANTLR3_UINT64_LIT(0x00000001800000A6) };
static  ANTLR3_BITSET_LIST FOLLOW_statement_in_block_statement15348	= { FOLLOW_statement_in_block_statement15348_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_block_statement15360  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_block_statement15360_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_block_statement15360	= { FOLLOW_RCURLY_in_block_statement15360_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_op_sequence_in_op_block15377  */
static	ANTLR3_BITWORD FOLLOW_op_sequence_in_op_block15377_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_op_sequence_in_op_block15377	= { FOLLOW_op_sequence_in_op_block15377_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_op_scheduling_in_op_block15389  */
static	ANTLR3_BITWORD FOLLOW_op_scheduling_in_op_block15389_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_op_scheduling_in_op_block15389	= { FOLLOW_op_scheduling_in_op_block15389_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_op_concurrency_in_op_block15399  */
static	ANTLR3_BITWORD FOLLOW_op_concurrency_in_op_block15399_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_op_concurrency_in_op_block15399	= { FOLLOW_op_concurrency_in_op_block15399_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_OP_FORK_in_op_block15407  */
static	ANTLR3_BITWORD FOLLOW_OP_FORK_in_op_block15407_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_OP_FORK_in_op_block15407	= { FOLLOW_OP_FORK_in_op_block15407_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_OP_JOIN_in_op_block15423  */
static	ANTLR3_BITWORD FOLLOW_OP_JOIN_in_op_block15423_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_OP_JOIN_in_op_block15423	= { FOLLOW_OP_JOIN_in_op_block15423_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_OP_SEQUENCE_in_op_sequence15449  */
static	ANTLR3_BITWORD FOLLOW_OP_SEQUENCE_in_op_sequence15449_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_OP_SEQUENCE_in_op_sequence15449	= { FOLLOW_OP_SEQUENCE_in_op_sequence15449_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_OP_SEQUENCE_SIDE_in_op_sequence15464  */
static	ANTLR3_BITWORD FOLLOW_OP_SEQUENCE_SIDE_in_op_sequence15464_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_OP_SEQUENCE_SIDE_in_op_sequence15464	= { FOLLOW_OP_SEQUENCE_SIDE_in_op_sequence15464_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_OP_SEQUENCE_WEAK_in_op_sequence15474  */
static	ANTLR3_BITWORD FOLLOW_OP_SEQUENCE_WEAK_in_op_sequence15474_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_OP_SEQUENCE_WEAK_in_op_sequence15474	= { FOLLOW_OP_SEQUENCE_WEAK_in_op_sequence15474_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_OP_ATOMIC_SEQUENCE_in_op_sequence15485  */
static	ANTLR3_BITWORD FOLLOW_OP_ATOMIC_SEQUENCE_in_op_sequence15485_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_OP_ATOMIC_SEQUENCE_in_op_sequence15485	= { FOLLOW_OP_ATOMIC_SEQUENCE_in_op_sequence15485_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_OP_SCHEDULE_GT_in_op_scheduling15503  */
static	ANTLR3_BITWORD FOLLOW_OP_SCHEDULE_GT_in_op_scheduling15503_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_OP_SCHEDULE_GT_in_op_scheduling15503	= { FOLLOW_OP_SCHEDULE_GT_in_op_scheduling15503_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_OP_SCHEDULE_LT_in_op_scheduling15517  */
static	ANTLR3_BITWORD FOLLOW_OP_SCHEDULE_LT_in_op_scheduling15517_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_OP_SCHEDULE_LT_in_op_scheduling15517	= { FOLLOW_OP_SCHEDULE_LT_in_op_scheduling15517_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_OP_SCHEDULE_XOR_in_op_scheduling15531  */
static	ANTLR3_BITWORD FOLLOW_OP_SCHEDULE_XOR_in_op_scheduling15531_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_OP_SCHEDULE_XOR_in_op_scheduling15531	= { FOLLOW_OP_SCHEDULE_XOR_in_op_scheduling15531_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_OP_SCHEDULE_AND_THEN_in_op_scheduling15545  */
static	ANTLR3_BITWORD FOLLOW_OP_SCHEDULE_AND_THEN_in_op_scheduling15545_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_OP_SCHEDULE_AND_THEN_in_op_scheduling15545	= { FOLLOW_OP_SCHEDULE_AND_THEN_in_op_scheduling15545_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_OP_SCHEDULE_OR_ELSE_in_op_scheduling15553  */
static	ANTLR3_BITWORD FOLLOW_OP_SCHEDULE_OR_ELSE_in_op_scheduling15553_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_OP_SCHEDULE_OR_ELSE_in_op_scheduling15553	= { FOLLOW_OP_SCHEDULE_OR_ELSE_in_op_scheduling15553_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_OP_NON_DETERMINISM_in_op_scheduling15563  */
static	ANTLR3_BITWORD FOLLOW_OP_NON_DETERMINISM_in_op_scheduling15563_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_OP_NON_DETERMINISM_in_op_scheduling15563	= { FOLLOW_OP_NON_DETERMINISM_in_op_scheduling15563_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_OP_CONCURRENCY_ASYNC_in_op_concurrency15583  */
static	ANTLR3_BITWORD FOLLOW_OP_CONCURRENCY_ASYNC_in_op_concurrency15583_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_OP_CONCURRENCY_ASYNC_in_op_concurrency15583	= { FOLLOW_OP_CONCURRENCY_ASYNC_in_op_concurrency15583_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_OP_CONCURRENCY_AND_in_op_concurrency15601  */
static	ANTLR3_BITWORD FOLLOW_OP_CONCURRENCY_AND_in_op_concurrency15601_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_OP_CONCURRENCY_AND_in_op_concurrency15601	= { FOLLOW_OP_CONCURRENCY_AND_in_op_concurrency15601_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_OP_CONCURRENCY_OR_in_op_concurrency15621  */
static	ANTLR3_BITWORD FOLLOW_OP_CONCURRENCY_OR_in_op_concurrency15621_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_OP_CONCURRENCY_OR_in_op_concurrency15621	= { FOLLOW_OP_CONCURRENCY_OR_in_op_concurrency15621_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_OP_CONCURRENCY_INTERLEAVING_in_op_concurrency15642  */
static	ANTLR3_BITWORD FOLLOW_OP_CONCURRENCY_INTERLEAVING_in_op_concurrency15642_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_OP_CONCURRENCY_INTERLEAVING_in_op_concurrency15642	= { FOLLOW_OP_CONCURRENCY_INTERLEAVING_in_op_concurrency15642_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_OP_CONCURRENCY_PARALLEL_in_op_concurrency15653  */
static	ANTLR3_BITWORD FOLLOW_OP_CONCURRENCY_PARALLEL_in_op_concurrency15653_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_OP_CONCURRENCY_PARALLEL_in_op_concurrency15653	= { FOLLOW_OP_CONCURRENCY_PARALLEL_in_op_concurrency15653_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_OP_CONCURRENCY_RDV_ASYNC_in_op_concurrency15669  */
static	ANTLR3_BITWORD FOLLOW_OP_CONCURRENCY_RDV_ASYNC_in_op_concurrency15669_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_OP_CONCURRENCY_RDV_ASYNC_in_op_concurrency15669	= { FOLLOW_OP_CONCURRENCY_RDV_ASYNC_in_op_concurrency15669_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_OP_CONCURRENCY_RDV_AND_in_op_concurrency15683  */
static	ANTLR3_BITWORD FOLLOW_OP_CONCURRENCY_RDV_AND_in_op_concurrency15683_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_OP_CONCURRENCY_RDV_AND_in_op_concurrency15683	= { FOLLOW_OP_CONCURRENCY_RDV_AND_in_op_concurrency15683_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_OP_CONCURRENCY_RDV_OR_in_op_concurrency15699  */
static	ANTLR3_BITWORD FOLLOW_OP_CONCURRENCY_RDV_OR_in_op_concurrency15699_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_OP_CONCURRENCY_RDV_OR_in_op_concurrency15699	= { FOLLOW_OP_CONCURRENCY_RDV_OR_in_op_concurrency15699_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_OP_CONCURRENCY_RDV_INTERLEAVING_in_op_concurrency15716  */
static	ANTLR3_BITWORD FOLLOW_OP_CONCURRENCY_RDV_INTERLEAVING_in_op_concurrency15716_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_OP_CONCURRENCY_RDV_INTERLEAVING_in_op_concurrency15716	= { FOLLOW_OP_CONCURRENCY_RDV_INTERLEAVING_in_op_concurrency15716_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_OP_CONCURRENCY_RDV_PARALLEL_in_op_concurrency15723  */
static	ANTLR3_BITWORD FOLLOW_OP_CONCURRENCY_RDV_PARALLEL_in_op_concurrency15723_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_OP_CONCURRENCY_RDV_PARALLEL_in_op_concurrency15723	= { FOLLOW_OP_CONCURRENCY_RDV_PARALLEL_in_op_concurrency15723_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_PLUS_in_op_invokable15746  */
static	ANTLR3_BITWORD FOLLOW_PLUS_in_op_invokable15746_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_PLUS_in_op_invokable15746	= { FOLLOW_PLUS_in_op_invokable15746_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_MINUS_in_op_invokable15766  */
static	ANTLR3_BITWORD FOLLOW_MINUS_in_op_invokable15766_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_MINUS_in_op_invokable15766	= { FOLLOW_MINUS_in_op_invokable15766_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_STAR_in_op_invokable15785  */
static	ANTLR3_BITWORD FOLLOW_STAR_in_op_invokable15785_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_STAR_in_op_invokable15785	= { FOLLOW_STAR_in_op_invokable15785_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_DIV_in_op_invokable15804  */
static	ANTLR3_BITWORD FOLLOW_DIV_in_op_invokable15804_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_DIV_in_op_invokable15804	= { FOLLOW_DIV_in_op_invokable15804_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_MOD_in_op_invokable15824  */
static	ANTLR3_BITWORD FOLLOW_MOD_in_op_invokable15824_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_MOD_in_op_invokable15824	= { FOLLOW_MOD_in_op_invokable15824_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_EQUAL_in_op_invokable15847  */
static	ANTLR3_BITWORD FOLLOW_EQUAL_in_op_invokable15847_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_EQUAL_in_op_invokable15847	= { FOLLOW_EQUAL_in_op_invokable15847_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_NEQUAL_in_op_invokable15865  */
static	ANTLR3_BITWORD FOLLOW_NEQUAL_in_op_invokable15865_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_NEQUAL_in_op_invokable15865	= { FOLLOW_NEQUAL_in_op_invokable15865_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEQUAL_in_op_invokable15883  */
static	ANTLR3_BITWORD FOLLOW_SEQUAL_in_op_invokable15883_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEQUAL_in_op_invokable15883	= { FOLLOW_SEQUAL_in_op_invokable15883_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_NSEQUAL_in_op_invokable15900  */
static	ANTLR3_BITWORD FOLLOW_NSEQUAL_in_op_invokable15900_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_NSEQUAL_in_op_invokable15900	= { FOLLOW_NSEQUAL_in_op_invokable15900_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_GT_in_op_invokable15917  */
static	ANTLR3_BITWORD FOLLOW_GT_in_op_invokable15917_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_GT_in_op_invokable15917	= { FOLLOW_GT_in_op_invokable15917_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_GTE_in_op_invokable15938  */
static	ANTLR3_BITWORD FOLLOW_GTE_in_op_invokable15938_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_GTE_in_op_invokable15938	= { FOLLOW_GTE_in_op_invokable15938_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LT__in_op_invokable15958  */
static	ANTLR3_BITWORD FOLLOW_LT__in_op_invokable15958_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_LT__in_op_invokable15958	= { FOLLOW_LT__in_op_invokable15958_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LTE_in_op_invokable15978  */
static	ANTLR3_BITWORD FOLLOW_LTE_in_op_invokable15978_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_LTE_in_op_invokable15978	= { FOLLOW_LTE_in_op_invokable15978_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LNOT_in_op_invokable15999  */
static	ANTLR3_BITWORD FOLLOW_LNOT_in_op_invokable15999_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_LNOT_in_op_invokable15999	= { FOLLOW_LNOT_in_op_invokable15999_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LAND_in_op_invokable16018  */
static	ANTLR3_BITWORD FOLLOW_LAND_in_op_invokable16018_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_LAND_in_op_invokable16018	= { FOLLOW_LAND_in_op_invokable16018_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LAND_THEN_in_op_invokable16037  */
static	ANTLR3_BITWORD FOLLOW_LAND_THEN_in_op_invokable16037_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_LAND_THEN_in_op_invokable16037	= { FOLLOW_LAND_THEN_in_op_invokable16037_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LOR_in_op_invokable16051  */
static	ANTLR3_BITWORD FOLLOW_LOR_in_op_invokable16051_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_LOR_in_op_invokable16051	= { FOLLOW_LOR_in_op_invokable16051_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LOR_ELSE_in_op_invokable16071  */
static	ANTLR3_BITWORD FOLLOW_LOR_ELSE_in_op_invokable16071_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_LOR_ELSE_in_op_invokable16071	= { FOLLOW_LOR_ELSE_in_op_invokable16071_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_BNOT_in_op_invokable16087  */
static	ANTLR3_BITWORD FOLLOW_BNOT_in_op_invokable16087_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_BNOT_in_op_invokable16087	= { FOLLOW_BNOT_in_op_invokable16087_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_BAND_in_op_invokable16106  */
static	ANTLR3_BITWORD FOLLOW_BAND_in_op_invokable16106_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_BAND_in_op_invokable16106	= { FOLLOW_BAND_in_op_invokable16106_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_BOR_in_op_invokable16125  */
static	ANTLR3_BITWORD FOLLOW_BOR_in_op_invokable16125_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_BOR_in_op_invokable16125	= { FOLLOW_BOR_in_op_invokable16125_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_BXOR_in_op_invokable16145  */
static	ANTLR3_BITWORD FOLLOW_BXOR_in_op_invokable16145_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_BXOR_in_op_invokable16145	= { FOLLOW_BXOR_in_op_invokable16145_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LSHIFT_in_op_invokable16165  */
static	ANTLR3_BITWORD FOLLOW_LSHIFT_in_op_invokable16165_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_LSHIFT_in_op_invokable16165	= { FOLLOW_LSHIFT_in_op_invokable16165_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RSHIFT_in_op_invokable16182  */
static	ANTLR3_BITWORD FOLLOW_RSHIFT_in_op_invokable16182_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RSHIFT_in_op_invokable16182	= { FOLLOW_RSHIFT_in_op_invokable16182_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ASSIGN_in_op_invokable16200  */
static	ANTLR3_BITWORD FOLLOW_ASSIGN_in_op_invokable16200_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_ASSIGN_in_op_invokable16200	= { FOLLOW_ASSIGN_in_op_invokable16200_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ASSIGN_AFTER_in_op_invokable16217  */
static	ANTLR3_BITWORD FOLLOW_ASSIGN_AFTER_in_op_invokable16217_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_ASSIGN_AFTER_in_op_invokable16217	= { FOLLOW_ASSIGN_AFTER_in_op_invokable16217_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ASSIGN_REF_in_op_invokable16228  */
static	ANTLR3_BITWORD FOLLOW_ASSIGN_REF_in_op_invokable16228_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_ASSIGN_REF_in_op_invokable16228	= { FOLLOW_ASSIGN_REF_in_op_invokable16228_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ASSIGN_MACRO_in_op_invokable16241  */
static	ANTLR3_BITWORD FOLLOW_ASSIGN_MACRO_in_op_invokable16241_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_ASSIGN_MACRO_in_op_invokable16241	= { FOLLOW_ASSIGN_MACRO_in_op_invokable16241_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_OP_PUSH_in_op_invokable16253  */
static	ANTLR3_BITWORD FOLLOW_OP_PUSH_in_op_invokable16253_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_OP_PUSH_in_op_invokable16253	= { FOLLOW_OP_PUSH_in_op_invokable16253_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_OP_ASSIGN_TOP_in_op_invokable16269  */
static	ANTLR3_BITWORD FOLLOW_OP_ASSIGN_TOP_in_op_invokable16269_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_OP_ASSIGN_TOP_in_op_invokable16269	= { FOLLOW_OP_ASSIGN_TOP_in_op_invokable16269_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_OP_TOP_in_op_invokable16279  */
static	ANTLR3_BITWORD FOLLOW_OP_TOP_in_op_invokable16279_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_OP_TOP_in_op_invokable16279	= { FOLLOW_OP_TOP_in_op_invokable16279_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_OP_POP_in_op_invokable16296  */
static	ANTLR3_BITWORD FOLLOW_OP_POP_in_op_invokable16296_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_OP_POP_in_op_invokable16296	= { FOLLOW_OP_POP_in_op_invokable16296_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_DOLLAR_LCURLY_in_prefix_statement16327  */
static	ANTLR3_BITWORD FOLLOW_DOLLAR_LCURLY_in_prefix_statement16327_bits[]	= { ANTLR3_UINT64_LIT(0x09046080100262F0), ANTLR3_UINT64_LIT(0x010403000264B24C), ANTLR3_UINT64_LIT(0x0000000000000308), ANTLR3_UINT64_LIT(0x0000100000000000), ANTLR3_UINT64_LIT(0x0000013804081800), ANTLR3_UINT64_LIT(0x020B0C0000000000), ANTLR3_UINT64_LIT(0x0000000080000024) };
static  ANTLR3_BITSET_LIST FOLLOW_DOLLAR_LCURLY_in_prefix_statement16327	= { FOLLOW_DOLLAR_LCURLY_in_prefix_statement16327_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_avm_operator_in_prefix_statement16332  */
static	ANTLR3_BITWORD FOLLOW_avm_operator_in_prefix_statement16332_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x2124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_avm_operator_in_prefix_statement16332	= { FOLLOW_avm_operator_in_prefix_statement16332_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_prefix_statement_in_prefix_statement16346  */
static	ANTLR3_BITWORD FOLLOW_prefix_statement_in_prefix_statement16346_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x2124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_prefix_statement_in_prefix_statement16346	= { FOLLOW_prefix_statement_in_prefix_statement16346_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_unaryExpression_in_prefix_statement16367  */
static	ANTLR3_BITWORD FOLLOW_unaryExpression_in_prefix_statement16367_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x2124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_unaryExpression_in_prefix_statement16367	= { FOLLOW_unaryExpression_in_prefix_statement16367_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_prefix_statement16392  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_prefix_statement16392_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_prefix_statement16392	= { FOLLOW_RCURLY_in_prefix_statement16392_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_DOLLAR_LCURLY_in_prefix_expression16407  */
static	ANTLR3_BITWORD FOLLOW_DOLLAR_LCURLY_in_prefix_expression16407_bits[]	= { ANTLR3_UINT64_LIT(0x09046080100262F0), ANTLR3_UINT64_LIT(0x010403000264B24C), ANTLR3_UINT64_LIT(0x0000000000000308), ANTLR3_UINT64_LIT(0x0000100000000000), ANTLR3_UINT64_LIT(0x0000013804081800), ANTLR3_UINT64_LIT(0x020B0C0000000000), ANTLR3_UINT64_LIT(0x0000000080000024) };
static  ANTLR3_BITSET_LIST FOLLOW_DOLLAR_LCURLY_in_prefix_expression16407	= { FOLLOW_DOLLAR_LCURLY_in_prefix_expression16407_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_avm_operator_in_prefix_expression16412  */
static	ANTLR3_BITWORD FOLLOW_avm_operator_in_prefix_expression16412_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x2124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_avm_operator_in_prefix_expression16412	= { FOLLOW_avm_operator_in_prefix_expression16412_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_prefix_expression_in_prefix_expression16426  */
static	ANTLR3_BITWORD FOLLOW_prefix_expression_in_prefix_expression16426_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x2124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_prefix_expression_in_prefix_expression16426	= { FOLLOW_prefix_expression_in_prefix_expression16426_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_unaryExpression_in_prefix_expression16446  */
static	ANTLR3_BITWORD FOLLOW_unaryExpression_in_prefix_expression16446_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x2124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_unaryExpression_in_prefix_expression16446	= { FOLLOW_unaryExpression_in_prefix_expression16446_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_prefix_expression16471  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_prefix_expression16471_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_prefix_expression16471	= { FOLLOW_RCURLY_in_prefix_expression16471_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_op_invokable_in_avm_operator16488  */
static	ANTLR3_BITWORD FOLLOW_op_invokable_in_avm_operator16488_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_op_invokable_in_avm_operator16488	= { FOLLOW_op_invokable_in_avm_operator16488_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_op_activity_in_avm_operator16500  */
static	ANTLR3_BITWORD FOLLOW_op_activity_in_avm_operator16500_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_op_activity_in_avm_operator16500	= { FOLLOW_op_activity_in_avm_operator16500_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_avm_operator16512  */
static	ANTLR3_BITWORD FOLLOW_ID_in_avm_operator16512_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_avm_operator16512	= { FOLLOW_ID_in_avm_operator16512_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_250_in_statement_invoke_method16541  */
static	ANTLR3_BITWORD FOLLOW_250_in_statement_invoke_method16541_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_250_in_statement_invoke_method16541	= { FOLLOW_250_in_statement_invoke_method16541_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_statement_invoke_method16545  */
static	ANTLR3_BITWORD FOLLOW_ID_in_statement_invoke_method16545_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080), ANTLR3_UINT64_LIT(0x0000000800000080), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_statement_invoke_method16545	= { FOLLOW_ID_in_statement_invoke_method16545_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_decl_instance_machine_params_in_statement_invoke_method16556  */
static	ANTLR3_BITWORD FOLLOW_decl_instance_machine_params_in_statement_invoke_method16556_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000800000080), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_decl_instance_machine_params_in_statement_invoke_method16556	= { FOLLOW_decl_instance_machine_params_in_statement_invoke_method16556_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_decl_instance_machine_returns_in_statement_invoke_method16565  */
static	ANTLR3_BITWORD FOLLOW_decl_instance_machine_returns_in_statement_invoke_method16565_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_decl_instance_machine_returns_in_statement_invoke_method16565	= { FOLLOW_decl_instance_machine_returns_in_statement_invoke_method16565_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_invoke_method16574  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_invoke_method16574_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_invoke_method16574	= { FOLLOW_SEMI_in_statement_invoke_method16574_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LPAREN_INVOKE_in_statement_invoke16590  */
static	ANTLR3_BITWORD FOLLOW_LPAREN_INVOKE_in_statement_invoke16590_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LPAREN_INVOKE_in_statement_invoke16590	= { FOLLOW_LPAREN_INVOKE_in_statement_invoke16590_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_unaryExpression_in_statement_invoke16599  */
static	ANTLR3_BITWORD FOLLOW_unaryExpression_in_statement_invoke16599_bits[]	= { ANTLR3_UINT64_LIT(0x09046080100262F0), ANTLR3_UINT64_LIT(0x010403000264B24C), ANTLR3_UINT64_LIT(0x0000000000000308), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000008000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_unaryExpression_in_statement_invoke16599	= { FOLLOW_unaryExpression_in_statement_invoke16599_bits, 5	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_statement_invoke16612  */
static	ANTLR3_BITWORD FOLLOW_ID_in_statement_invoke16612_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002042), ANTLR3_UINT64_LIT(0x0000600000000000), ANTLR3_UINT64_LIT(0x0200004081200201), ANTLR3_UINT64_LIT(0x0010000408801C00), ANTLR3_UINT64_LIT(0x0000000000002400) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_statement_invoke16612	= { FOLLOW_ID_in_statement_invoke16612_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_295_in_statement_invoke16634  */
static	ANTLR3_BITWORD FOLLOW_295_in_statement_invoke16634_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002042), ANTLR3_UINT64_LIT(0x0000600000000000), ANTLR3_UINT64_LIT(0x0200004081200201), ANTLR3_UINT64_LIT(0x0010000408801C00), ANTLR3_UINT64_LIT(0x0000000000002400) };
static  ANTLR3_BITSET_LIST FOLLOW_295_in_statement_invoke16634	= { FOLLOW_295_in_statement_invoke16634_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_op_invokable_in_statement_invoke16659  */
static	ANTLR3_BITWORD FOLLOW_op_invokable_in_statement_invoke16659_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002042), ANTLR3_UINT64_LIT(0x0000600000000000), ANTLR3_UINT64_LIT(0x0200004081200201), ANTLR3_UINT64_LIT(0x0010000408801C00), ANTLR3_UINT64_LIT(0x0000000000002400) };
static  ANTLR3_BITSET_LIST FOLLOW_op_invokable_in_statement_invoke16659	= { FOLLOW_op_invokable_in_statement_invoke16659_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_invoke16680  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_invoke16680_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002042), ANTLR3_UINT64_LIT(0x0000600000000000), ANTLR3_UINT64_LIT(0x0200004081200201), ANTLR3_UINT64_LIT(0x0010000408801C00), ANTLR3_UINT64_LIT(0x0000000000002400) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_invoke16680	= { FOLLOW_expression_in_statement_invoke16680_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_354_in_statement_invoke16698  */
static	ANTLR3_BITWORD FOLLOW_354_in_statement_invoke16698_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_354_in_statement_invoke16698	= { FOLLOW_354_in_statement_invoke16698_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_invoke16704  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_invoke16704_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_invoke16704	= { FOLLOW_expression_in_statement_invoke16704_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_287_in_statement_invoke16713  */
static	ANTLR3_BITWORD FOLLOW_287_in_statement_invoke16713_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_287_in_statement_invoke16713	= { FOLLOW_287_in_statement_invoke16713_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_unaryExpression_in_statement_invoke16723  */
static	ANTLR3_BITWORD FOLLOW_unaryExpression_in_statement_invoke16723_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_unaryExpression_in_statement_invoke16723	= { FOLLOW_unaryExpression_in_statement_invoke16723_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_394_in_statement_invoke16732  */
static	ANTLR3_BITWORD FOLLOW_394_in_statement_invoke16732_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_394_in_statement_invoke16732	= { FOLLOW_394_in_statement_invoke16732_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_unaryExpression_in_statement_invoke16744  */
static	ANTLR3_BITWORD FOLLOW_unaryExpression_in_statement_invoke16744_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_unaryExpression_in_statement_invoke16744	= { FOLLOW_unaryExpression_in_statement_invoke16744_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_238_in_statement_invoke16753  */
static	ANTLR3_BITWORD FOLLOW_238_in_statement_invoke16753_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000100000000000), ANTLR3_UINT64_LIT(0x0000013804081800), ANTLR3_UINT64_LIT(0x020B0C0000000000), ANTLR3_UINT64_LIT(0x0000000080000024) };
static  ANTLR3_BITSET_LIST FOLLOW_238_in_statement_invoke16753	= { FOLLOW_238_in_statement_invoke16753_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_op_activity_in_statement_invoke16759  */
static	ANTLR3_BITWORD FOLLOW_op_activity_in_statement_invoke16759_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_op_activity_in_statement_invoke16759	= { FOLLOW_op_activity_in_statement_invoke16759_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RPAREN_in_statement_invoke16772  */
static	ANTLR3_BITWORD FOLLOW_RPAREN_in_statement_invoke16772_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_RPAREN_in_statement_invoke16772	= { FOLLOW_RPAREN_in_statement_invoke16772_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_invoke16777  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_invoke16777_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_invoke16777	= { FOLLOW_SEMI_in_statement_invoke16777_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LPAREN_INVOKE_in_expression_invoke16792  */
static	ANTLR3_BITWORD FOLLOW_LPAREN_INVOKE_in_expression_invoke16792_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LPAREN_INVOKE_in_expression_invoke16792	= { FOLLOW_LPAREN_INVOKE_in_expression_invoke16792_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_unaryExpression_in_expression_invoke16801  */
static	ANTLR3_BITWORD FOLLOW_unaryExpression_in_expression_invoke16801_bits[]	= { ANTLR3_UINT64_LIT(0x09046080100262F0), ANTLR3_UINT64_LIT(0x010403000264B24C), ANTLR3_UINT64_LIT(0x0000000000000308), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000008000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_unaryExpression_in_expression_invoke16801	= { FOLLOW_unaryExpression_in_expression_invoke16801_bits, 5	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_expression_invoke16815  */
static	ANTLR3_BITWORD FOLLOW_ID_in_expression_invoke16815_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002042), ANTLR3_UINT64_LIT(0x0000600000000000), ANTLR3_UINT64_LIT(0x0200004081200201), ANTLR3_UINT64_LIT(0x0010000408801C00), ANTLR3_UINT64_LIT(0x0000000000002400) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_expression_invoke16815	= { FOLLOW_ID_in_expression_invoke16815_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_295_in_expression_invoke16837  */
static	ANTLR3_BITWORD FOLLOW_295_in_expression_invoke16837_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002042), ANTLR3_UINT64_LIT(0x0000600000000000), ANTLR3_UINT64_LIT(0x0200004081200201), ANTLR3_UINT64_LIT(0x0010000408801C00), ANTLR3_UINT64_LIT(0x0000000000002400) };
static  ANTLR3_BITSET_LIST FOLLOW_295_in_expression_invoke16837	= { FOLLOW_295_in_expression_invoke16837_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_op_invokable_in_expression_invoke16862  */
static	ANTLR3_BITWORD FOLLOW_op_invokable_in_expression_invoke16862_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002042), ANTLR3_UINT64_LIT(0x0000600000000000), ANTLR3_UINT64_LIT(0x0200004081200201), ANTLR3_UINT64_LIT(0x0010000408801C00), ANTLR3_UINT64_LIT(0x0000000000002400) };
static  ANTLR3_BITSET_LIST FOLLOW_op_invokable_in_expression_invoke16862	= { FOLLOW_op_invokable_in_expression_invoke16862_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression_invoke16883  */
static	ANTLR3_BITWORD FOLLOW_expression_in_expression_invoke16883_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002042), ANTLR3_UINT64_LIT(0x0000600000000000), ANTLR3_UINT64_LIT(0x0200004081200201), ANTLR3_UINT64_LIT(0x0010000408801C00), ANTLR3_UINT64_LIT(0x0000000000002400) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_expression_invoke16883	= { FOLLOW_expression_in_expression_invoke16883_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_354_in_expression_invoke16901  */
static	ANTLR3_BITWORD FOLLOW_354_in_expression_invoke16901_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_354_in_expression_invoke16901	= { FOLLOW_354_in_expression_invoke16901_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression_invoke16907  */
static	ANTLR3_BITWORD FOLLOW_expression_in_expression_invoke16907_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_expression_invoke16907	= { FOLLOW_expression_in_expression_invoke16907_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_287_in_expression_invoke16916  */
static	ANTLR3_BITWORD FOLLOW_287_in_expression_invoke16916_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_287_in_expression_invoke16916	= { FOLLOW_287_in_expression_invoke16916_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_unaryExpression_in_expression_invoke16925  */
static	ANTLR3_BITWORD FOLLOW_unaryExpression_in_expression_invoke16925_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_unaryExpression_in_expression_invoke16925	= { FOLLOW_unaryExpression_in_expression_invoke16925_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_394_in_expression_invoke16934  */
static	ANTLR3_BITWORD FOLLOW_394_in_expression_invoke16934_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_394_in_expression_invoke16934	= { FOLLOW_394_in_expression_invoke16934_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_unaryExpression_in_expression_invoke16945  */
static	ANTLR3_BITWORD FOLLOW_unaryExpression_in_expression_invoke16945_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_unaryExpression_in_expression_invoke16945	= { FOLLOW_unaryExpression_in_expression_invoke16945_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_238_in_expression_invoke16954  */
static	ANTLR3_BITWORD FOLLOW_238_in_expression_invoke16954_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000100000000000), ANTLR3_UINT64_LIT(0x0000013804081800), ANTLR3_UINT64_LIT(0x020B0C0000000000), ANTLR3_UINT64_LIT(0x0000000080000024) };
static  ANTLR3_BITSET_LIST FOLLOW_238_in_expression_invoke16954	= { FOLLOW_238_in_expression_invoke16954_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_op_activity_in_expression_invoke16960  */
static	ANTLR3_BITWORD FOLLOW_op_activity_in_expression_invoke16960_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_op_activity_in_expression_invoke16960	= { FOLLOW_op_activity_in_expression_invoke16960_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RPAREN_in_expression_invoke16973  */
static	ANTLR3_BITWORD FOLLOW_RPAREN_in_expression_invoke16973_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RPAREN_in_expression_invoke16973	= { FOLLOW_RPAREN_in_expression_invoke16973_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_330_in_statement_activity_new17001  */
static	ANTLR3_BITWORD FOLLOW_330_in_statement_activity_new17001_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_330_in_statement_activity_new17001	= { FOLLOW_330_in_statement_activity_new17001_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_qualifiedNameID_in_statement_activity_new17012  */
static	ANTLR3_BITWORD FOLLOW_qualifiedNameID_in_statement_activity_new17012_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000081), ANTLR3_UINT64_LIT(0x0000000800000080), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_qualifiedNameID_in_statement_activity_new17012	= { FOLLOW_qualifiedNameID_in_statement_activity_new17012_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_decl_instance_dynamic_impl_in_statement_activity_new17027  */
static	ANTLR3_BITWORD FOLLOW_decl_instance_dynamic_impl_in_statement_activity_new17027_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000800000080), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_decl_instance_dynamic_impl_in_statement_activity_new17027	= { FOLLOW_decl_instance_dynamic_impl_in_statement_activity_new17027_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_statement_activity_new17036  */
static	ANTLR3_BITWORD FOLLOW_set_in_statement_activity_new17036_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_statement_activity_new17036	= { FOLLOW_set_in_statement_activity_new17036_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_activity_new17048  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_activity_new17048_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_activity_new17048	= { FOLLOW_expression_in_statement_activity_new17048_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_activity_new17060  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_activity_new17060_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_activity_new17060	= { FOLLOW_SEMI_in_statement_activity_new17060_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LPAREN_in_decl_instance_dynamic_impl17093  */
static	ANTLR3_BITWORD FOLLOW_LPAREN_in_decl_instance_dynamic_impl17093_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002042), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LPAREN_in_decl_instance_dynamic_impl17093	= { FOLLOW_LPAREN_in_decl_instance_dynamic_impl17093_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_instance_on_new_activity_in_decl_instance_dynamic_impl17102  */
static	ANTLR3_BITWORD FOLLOW_def_instance_on_new_activity_in_decl_instance_dynamic_impl17102_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_instance_on_new_activity_in_decl_instance_dynamic_impl17102	= { FOLLOW_def_instance_on_new_activity_in_decl_instance_dynamic_impl17102_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RPAREN_in_decl_instance_dynamic_impl17114  */
static	ANTLR3_BITWORD FOLLOW_RPAREN_in_decl_instance_dynamic_impl17114_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_RPAREN_in_decl_instance_dynamic_impl17114	= { FOLLOW_RPAREN_in_decl_instance_dynamic_impl17114_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_decl_instance_dynamic_impl17136  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_decl_instance_dynamic_impl17136_bits[]	= { ANTLR3_UINT64_LIT(0x000C000104400000), ANTLR3_UINT64_LIT(0x2000000000000101), ANTLR3_UINT64_LIT(0x000200003C001000), ANTLR3_UINT64_LIT(0x0480100400000000), ANTLR3_UINT64_LIT(0x0103F97E24C83881), ANTLR3_UINT64_LIT(0x020B1C00003F0400), ANTLR3_UINT64_LIT(0x00000001800000A6) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_decl_instance_dynamic_impl17136	= { FOLLOW_LCURLY_in_decl_instance_dynamic_impl17136_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_statement_in_decl_instance_dynamic_impl17147  */
static	ANTLR3_BITWORD FOLLOW_statement_in_decl_instance_dynamic_impl17147_bits[]	= { ANTLR3_UINT64_LIT(0x000C000104400000), ANTLR3_UINT64_LIT(0x2000000000000101), ANTLR3_UINT64_LIT(0x000200003C001000), ANTLR3_UINT64_LIT(0x0480100400000000), ANTLR3_UINT64_LIT(0x0103F97E24C83881), ANTLR3_UINT64_LIT(0x020B1C00003F0400), ANTLR3_UINT64_LIT(0x00000001800000A6) };
static  ANTLR3_BITSET_LIST FOLLOW_statement_in_decl_instance_dynamic_impl17147	= { FOLLOW_statement_in_decl_instance_dynamic_impl17147_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_instance_activity_in_decl_instance_dynamic_impl17162  */
static	ANTLR3_BITWORD FOLLOW_def_instance_activity_in_decl_instance_dynamic_impl17162_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0002000000000000), ANTLR3_UINT64_LIT(0x0000000400000000) };
static  ANTLR3_BITSET_LIST FOLLOW_def_instance_activity_in_decl_instance_dynamic_impl17162	= { FOLLOW_def_instance_activity_in_decl_instance_dynamic_impl17162_bits, 4	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_decl_instance_dynamic_impl17173  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_decl_instance_dynamic_impl17173_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_decl_instance_dynamic_impl17173	= { FOLLOW_RCURLY_in_decl_instance_dynamic_impl17173_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_330_in_expression_activity_new17204  */
static	ANTLR3_BITWORD FOLLOW_330_in_expression_activity_new17204_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_330_in_expression_activity_new17204	= { FOLLOW_330_in_expression_activity_new17204_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_qualifiedNameID_in_expression_activity_new17216  */
static	ANTLR3_BITWORD FOLLOW_qualifiedNameID_in_expression_activity_new17216_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_qualifiedNameID_in_expression_activity_new17216	= { FOLLOW_qualifiedNameID_in_expression_activity_new17216_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_activity_machine_param_return_in_expression_activity_new17227  */
static	ANTLR3_BITWORD FOLLOW_activity_machine_param_return_in_expression_activity_new17227_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_activity_machine_param_return_in_expression_activity_new17227	= { FOLLOW_activity_machine_param_return_in_expression_activity_new17227_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_STATEMENT_PROMPT_in_statement_prompt17251  */
static	ANTLR3_BITWORD FOLLOW_STATEMENT_PROMPT_in_statement_prompt17251_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_STATEMENT_PROMPT_in_statement_prompt17251	= { FOLLOW_STATEMENT_PROMPT_in_statement_prompt17251_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_statement_prompt_impl_in_statement_prompt17256  */
static	ANTLR3_BITWORD FOLLOW_statement_prompt_impl_in_statement_prompt17256_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_statement_prompt_impl_in_statement_prompt17256	= { FOLLOW_statement_prompt_impl_in_statement_prompt17256_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_statement_prompt_obs_in_statement_prompt_impl17275  */
static	ANTLR3_BITWORD FOLLOW_statement_prompt_obs_in_statement_prompt_impl17275_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_statement_prompt_obs_in_statement_prompt_impl17275	= { FOLLOW_statement_prompt_obs_in_statement_prompt_impl17275_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_statement_prompt_obs17300  */
static	ANTLR3_BITWORD FOLLOW_ID_in_statement_prompt_obs17300_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000400) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_statement_prompt_obs17300	= { FOLLOW_ID_in_statement_prompt_obs17300_bits, 5	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_266_in_statement_prompt_obs17308  */
static	ANTLR3_BITWORD FOLLOW_266_in_statement_prompt_obs17308_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_266_in_statement_prompt_obs17308	= { FOLLOW_266_in_statement_prompt_obs17308_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_qualifiedNameID_in_statement_prompt_obs17312  */
static	ANTLR3_BITWORD FOLLOW_qualifiedNameID_in_statement_prompt_obs17312_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_qualifiedNameID_in_statement_prompt_obs17312	= { FOLLOW_qualifiedNameID_in_statement_prompt_obs17312_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_statement_prompt_obs17329  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_statement_prompt_obs17329_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0003F80000000000), ANTLR3_UINT64_LIT(0x00000000003F0000) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_statement_prompt_obs17329	= { FOLLOW_LCURLY_in_statement_prompt_obs17329_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_statement_prompt_obs_com_in_statement_prompt_obs17338  */
static	ANTLR3_BITWORD FOLLOW_statement_prompt_obs_com_in_statement_prompt_obs17338_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_statement_prompt_obs_com_in_statement_prompt_obs17338	= { FOLLOW_statement_prompt_obs_com_in_statement_prompt_obs17338_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_statement_prompt_obs17344  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_statement_prompt_obs17344_bits[]	= { ANTLR3_UINT64_LIT(0x1000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000400000000) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_statement_prompt_obs17344	= { FOLLOW_RCURLY_in_statement_prompt_obs17344_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_354_in_statement_prompt_obs17352  */
static	ANTLR3_BITWORD FOLLOW_354_in_statement_prompt_obs17352_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_354_in_statement_prompt_obs17352	= { FOLLOW_354_in_statement_prompt_obs17352_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_prompt_obs17356  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_prompt_obs17356_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_prompt_obs17356	= { FOLLOW_expression_in_statement_prompt_obs17356_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LBRACKET_in_statement_prompt_obs17363  */
static	ANTLR3_BITWORD FOLLOW_LBRACKET_in_statement_prompt_obs17363_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LBRACKET_in_statement_prompt_obs17363	= { FOLLOW_LBRACKET_in_statement_prompt_obs17363_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_prompt_obs17367  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_prompt_obs17367_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x1000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_prompt_obs17367	= { FOLLOW_expression_in_statement_prompt_obs17367_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RBRACKET_in_statement_prompt_obs17369  */
static	ANTLR3_BITWORD FOLLOW_RBRACKET_in_statement_prompt_obs17369_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_RBRACKET_in_statement_prompt_obs17369	= { FOLLOW_RBRACKET_in_statement_prompt_obs17369_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_prompt_obs17379  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_prompt_obs17379_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_prompt_obs17379	= { FOLLOW_SEMI_in_statement_prompt_obs17379_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_statement_com_in_statement_prompt_obs_com17404  */
static	ANTLR3_BITWORD FOLLOW_statement_com_in_statement_prompt_obs_com17404_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_statement_com_in_statement_prompt_obs_com17404	= { FOLLOW_statement_com_in_statement_prompt_obs_com17404_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_156_in_meta_statement17427  */
static	ANTLR3_BITWORD FOLLOW_156_in_meta_statement17427_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_156_in_meta_statement17427	= { FOLLOW_156_in_meta_statement17427_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_block_statement_in_meta_statement17432  */
static	ANTLR3_BITWORD FOLLOW_block_statement_in_meta_statement17432_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_block_statement_in_meta_statement17432	= { FOLLOW_block_statement_in_meta_statement17432_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_157_in_meta_statement17440  */
static	ANTLR3_BITWORD FOLLOW_157_in_meta_statement17440_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_157_in_meta_statement17440	= { FOLLOW_157_in_meta_statement17440_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_block_statement_in_meta_statement17448  */
static	ANTLR3_BITWORD FOLLOW_block_statement_in_meta_statement17448_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_block_statement_in_meta_statement17448	= { FOLLOW_block_statement_in_meta_statement17448_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_155_in_meta_statement17456  */
static	ANTLR3_BITWORD FOLLOW_155_in_meta_statement17456_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_155_in_meta_statement17456	= { FOLLOW_155_in_meta_statement17456_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_block_statement_in_meta_statement17464  */
static	ANTLR3_BITWORD FOLLOW_block_statement_in_meta_statement17464_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_block_statement_in_meta_statement17464	= { FOLLOW_block_statement_in_meta_statement17464_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_154_in_meta_statement17472  */
static	ANTLR3_BITWORD FOLLOW_154_in_meta_statement17472_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_154_in_meta_statement17472	= { FOLLOW_154_in_meta_statement17472_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_block_statement_in_meta_statement17478  */
static	ANTLR3_BITWORD FOLLOW_block_statement_in_meta_statement17478_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_block_statement_in_meta_statement17478	= { FOLLOW_block_statement_in_meta_statement17478_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_lvalue_in_statement_assign17510  */
static	ANTLR3_BITWORD FOLLOW_lvalue_in_statement_assign17510_bits[]	= { ANTLR3_UINT64_LIT(0x06080000640D8CF0), ANTLR3_UINT64_LIT(0x06040300021B0C30), ANTLR3_UINT64_LIT(0x0000000000000C30) };
static  ANTLR3_BITSET_LIST FOLLOW_lvalue_in_statement_assign17510	= { FOLLOW_lvalue_in_statement_assign17510_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_statement_assign17515  */
static	ANTLR3_BITWORD FOLLOW_set_in_statement_assign17515_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_statement_assign17515	= { FOLLOW_set_in_statement_assign17515_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_assign17528  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_assign17528_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_assign17528	= { FOLLOW_expression_in_statement_assign17528_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_assign17531  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_assign17531_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_assign17531	= { FOLLOW_SEMI_in_statement_assign17531_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ASSIGN_REF_in_statement_assign17542  */
static	ANTLR3_BITWORD FOLLOW_ASSIGN_REF_in_statement_assign17542_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000400000) };
static  ANTLR3_BITSET_LIST FOLLOW_ASSIGN_REF_in_statement_assign17542	= { FOLLOW_ASSIGN_REF_in_statement_assign17542_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_lvalue_in_statement_assign17547  */
static	ANTLR3_BITWORD FOLLOW_lvalue_in_statement_assign17547_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_lvalue_in_statement_assign17547	= { FOLLOW_lvalue_in_statement_assign17547_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_assign17550  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_assign17550_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_assign17550	= { FOLLOW_SEMI_in_statement_assign17550_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ASSIGN_MACRO_in_statement_assign17559  */
static	ANTLR3_BITWORD FOLLOW_ASSIGN_MACRO_in_statement_assign17559_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_ASSIGN_MACRO_in_statement_assign17559	= { FOLLOW_ASSIGN_MACRO_in_statement_assign17559_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_assign17564  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_assign17564_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_assign17564	= { FOLLOW_expression_in_statement_assign17564_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_assign17567  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_assign17567_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_assign17567	= { FOLLOW_SEMI_in_statement_assign17567_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_statement_assign17577  */
static	ANTLR3_BITWORD FOLLOW_set_in_statement_assign17577_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_statement_assign17577	= { FOLLOW_set_in_statement_assign17577_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_assign17590  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_assign17590_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_assign17590	= { FOLLOW_expression_in_statement_assign17590_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_assign17593  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_assign17593_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_assign17593	= { FOLLOW_SEMI_in_statement_assign17593_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_statement_assign17602  */
static	ANTLR3_BITWORD FOLLOW_set_in_statement_assign17602_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_statement_assign17602	= { FOLLOW_set_in_statement_assign17602_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_assign17615  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_assign17615_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_assign17615	= { FOLLOW_expression_in_statement_assign17615_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_assign17618  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_assign17618_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_assign17618	= { FOLLOW_SEMI_in_statement_assign17618_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_statement_assign17627  */
static	ANTLR3_BITWORD FOLLOW_set_in_statement_assign17627_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_statement_assign17627	= { FOLLOW_set_in_statement_assign17627_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_assign17640  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_assign17640_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_assign17640	= { FOLLOW_expression_in_statement_assign17640_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_assign17643  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_assign17643_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_assign17643	= { FOLLOW_SEMI_in_statement_assign17643_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_statement_assign17652  */
static	ANTLR3_BITWORD FOLLOW_set_in_statement_assign17652_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_statement_assign17652	= { FOLLOW_set_in_statement_assign17652_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_assign17665  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_assign17665_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_assign17665	= { FOLLOW_expression_in_statement_assign17665_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_assign17668  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_assign17668_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_assign17668	= { FOLLOW_SEMI_in_statement_assign17668_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_statement_assign17677  */
static	ANTLR3_BITWORD FOLLOW_set_in_statement_assign17677_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_statement_assign17677	= { FOLLOW_set_in_statement_assign17677_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_assign17690  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_assign17690_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_assign17690	= { FOLLOW_expression_in_statement_assign17690_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_assign17693  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_assign17693_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_assign17693	= { FOLLOW_SEMI_in_statement_assign17693_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_statement_assign17703  */
static	ANTLR3_BITWORD FOLLOW_set_in_statement_assign17703_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_statement_assign17703	= { FOLLOW_set_in_statement_assign17703_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_assign17716  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_assign17716_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_assign17716	= { FOLLOW_expression_in_statement_assign17716_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_assign17719  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_assign17719_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_assign17719	= { FOLLOW_SEMI_in_statement_assign17719_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_statement_assign17728  */
static	ANTLR3_BITWORD FOLLOW_set_in_statement_assign17728_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_statement_assign17728	= { FOLLOW_set_in_statement_assign17728_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_assign17741  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_assign17741_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_assign17741	= { FOLLOW_expression_in_statement_assign17741_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_assign17744  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_assign17744_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_assign17744	= { FOLLOW_SEMI_in_statement_assign17744_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_statement_assign17754  */
static	ANTLR3_BITWORD FOLLOW_set_in_statement_assign17754_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_statement_assign17754	= { FOLLOW_set_in_statement_assign17754_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_assign17767  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_assign17767_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_assign17767	= { FOLLOW_expression_in_statement_assign17767_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_assign17770  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_assign17770_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_assign17770	= { FOLLOW_SEMI_in_statement_assign17770_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_statement_assign17779  */
static	ANTLR3_BITWORD FOLLOW_set_in_statement_assign17779_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_statement_assign17779	= { FOLLOW_set_in_statement_assign17779_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_assign17792  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_assign17792_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_assign17792	= { FOLLOW_expression_in_statement_assign17792_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_assign17795  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_assign17795_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_assign17795	= { FOLLOW_SEMI_in_statement_assign17795_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_statement_assign17804  */
static	ANTLR3_BITWORD FOLLOW_set_in_statement_assign17804_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_statement_assign17804	= { FOLLOW_set_in_statement_assign17804_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_assign17817  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_assign17817_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_assign17817	= { FOLLOW_expression_in_statement_assign17817_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_assign17820  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_assign17820_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_assign17820	= { FOLLOW_SEMI_in_statement_assign17820_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_statement_assign17830  */
static	ANTLR3_BITWORD FOLLOW_set_in_statement_assign17830_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_statement_assign17830	= { FOLLOW_set_in_statement_assign17830_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_assign17843  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_assign17843_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_assign17843	= { FOLLOW_expression_in_statement_assign17843_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_assign17846  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_assign17846_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_assign17846	= { FOLLOW_SEMI_in_statement_assign17846_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_statement_assign17855  */
static	ANTLR3_BITWORD FOLLOW_set_in_statement_assign17855_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_statement_assign17855	= { FOLLOW_set_in_statement_assign17855_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_assign17868  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_assign17868_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_assign17868	= { FOLLOW_expression_in_statement_assign17868_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_assign17871  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_assign17871_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_assign17871	= { FOLLOW_SEMI_in_statement_assign17871_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_OP_PUSH_in_statement_assign17887  */
static	ANTLR3_BITWORD FOLLOW_OP_PUSH_in_statement_assign17887_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_OP_PUSH_in_statement_assign17887	= { FOLLOW_OP_PUSH_in_statement_assign17887_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_assign17892  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_assign17892_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000020000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_assign17892	= { FOLLOW_expression_in_statement_assign17892_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_OP_PUSH_in_statement_assign17902  */
static	ANTLR3_BITWORD FOLLOW_OP_PUSH_in_statement_assign17902_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_OP_PUSH_in_statement_assign17902	= { FOLLOW_OP_PUSH_in_statement_assign17902_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_assign17907  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_assign17907_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000020000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_assign17907	= { FOLLOW_expression_in_statement_assign17907_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_assign17918  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_assign17918_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_assign17918	= { FOLLOW_SEMI_in_statement_assign17918_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_OP_ASSIGN_TOP_in_statement_assign17930  */
static	ANTLR3_BITWORD FOLLOW_OP_ASSIGN_TOP_in_statement_assign17930_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_OP_ASSIGN_TOP_in_statement_assign17930	= { FOLLOW_OP_ASSIGN_TOP_in_statement_assign17930_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_assign17935  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_assign17935_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_assign17935	= { FOLLOW_expression_in_statement_assign17935_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_assign17938  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_assign17938_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_assign17938	= { FOLLOW_SEMI_in_statement_assign17938_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_OP_TOP_in_statement_assign17953  */
static	ANTLR3_BITWORD FOLLOW_OP_TOP_in_statement_assign17953_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000400000) };
static  ANTLR3_BITSET_LIST FOLLOW_OP_TOP_in_statement_assign17953	= { FOLLOW_OP_TOP_in_statement_assign17953_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_lvalue_in_statement_assign17958  */
static	ANTLR3_BITWORD FOLLOW_lvalue_in_statement_assign17958_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_lvalue_in_statement_assign17958	= { FOLLOW_lvalue_in_statement_assign17958_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_assign17961  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_assign17961_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_assign17961	= { FOLLOW_SEMI_in_statement_assign17961_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_OP_POP_in_statement_assign17976  */
static	ANTLR3_BITWORD FOLLOW_OP_POP_in_statement_assign17976_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000400000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_OP_POP_in_statement_assign17976	= { FOLLOW_OP_POP_in_statement_assign17976_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_lvalue_in_statement_assign17992  */
static	ANTLR3_BITWORD FOLLOW_lvalue_in_statement_assign17992_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000400000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_lvalue_in_statement_assign17992	= { FOLLOW_lvalue_in_statement_assign17992_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_assign18003  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_assign18003_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_assign18003	= { FOLLOW_SEMI_in_statement_assign18003_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_INCR_in_statement_assign18011  */
static	ANTLR3_BITWORD FOLLOW_INCR_in_statement_assign18011_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_INCR_in_statement_assign18011	= { FOLLOW_INCR_in_statement_assign18011_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_assign18014  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_assign18014_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_assign18014	= { FOLLOW_SEMI_in_statement_assign18014_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_DECR_in_statement_assign18025  */
static	ANTLR3_BITWORD FOLLOW_DECR_in_statement_assign18025_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_DECR_in_statement_assign18025	= { FOLLOW_DECR_in_statement_assign18025_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_assign18028  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_assign18028_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_assign18028	= { FOLLOW_SEMI_in_statement_assign18028_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_INCR_in_statement_assign18048  */
static	ANTLR3_BITWORD FOLLOW_INCR_in_statement_assign18048_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000400000) };
static  ANTLR3_BITSET_LIST FOLLOW_INCR_in_statement_assign18048	= { FOLLOW_INCR_in_statement_assign18048_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_lvalue_in_statement_assign18053  */
static	ANTLR3_BITWORD FOLLOW_lvalue_in_statement_assign18053_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_lvalue_in_statement_assign18053	= { FOLLOW_lvalue_in_statement_assign18053_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_assign18056  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_assign18056_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_assign18056	= { FOLLOW_SEMI_in_statement_assign18056_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_DECR_in_statement_assign18067  */
static	ANTLR3_BITWORD FOLLOW_DECR_in_statement_assign18067_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000400000) };
static  ANTLR3_BITSET_LIST FOLLOW_DECR_in_statement_assign18067	= { FOLLOW_DECR_in_statement_assign18067_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_lvalue_in_statement_assign18072  */
static	ANTLR3_BITWORD FOLLOW_lvalue_in_statement_assign18072_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_lvalue_in_statement_assign18072	= { FOLLOW_lvalue_in_statement_assign18072_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_assign18075  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_assign18075_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_assign18075	= { FOLLOW_SEMI_in_statement_assign18075_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COLONx2_in_lvalue18100  */
static	ANTLR3_BITWORD FOLLOW_COLONx2_in_lvalue18100_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_COLONx2_in_lvalue18100	= { FOLLOW_COLONx2_in_lvalue18100_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_lvalue18112  */
static	ANTLR3_BITWORD FOLLOW_ID_in_lvalue18112_bits[]	= { ANTLR3_UINT64_LIT(0x1000000200000002) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_lvalue18112	= { FOLLOW_ID_in_lvalue18112_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_DOT_in_lvalue18127  */
static	ANTLR3_BITWORD FOLLOW_DOT_in_lvalue18127_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_DOT_in_lvalue18127	= { FOLLOW_DOT_in_lvalue18127_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_lvalue18131  */
static	ANTLR3_BITWORD FOLLOW_ID_in_lvalue18131_bits[]	= { ANTLR3_UINT64_LIT(0x1000000200000002) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_lvalue18131	= { FOLLOW_ID_in_lvalue18131_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LBRACKET_in_lvalue18150  */
static	ANTLR3_BITWORD FOLLOW_LBRACKET_in_lvalue18150_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LBRACKET_in_lvalue18150	= { FOLLOW_LBRACKET_in_lvalue18150_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_lvalue18155  */
static	ANTLR3_BITWORD FOLLOW_expression_in_lvalue18155_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x1000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_lvalue18155	= { FOLLOW_expression_in_lvalue18155_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RBRACKET_in_lvalue18158  */
static	ANTLR3_BITWORD FOLLOW_RBRACKET_in_lvalue18158_bits[]	= { ANTLR3_UINT64_LIT(0x1000000200000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RBRACKET_in_lvalue18158	= { FOLLOW_RBRACKET_in_lvalue18158_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LPAREN_in_parameters18239  */
static	ANTLR3_BITWORD FOLLOW_LPAREN_in_parameters18239_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LPAREN_in_parameters18239	= { FOLLOW_LPAREN_in_parameters18239_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_parameters18244  */
static	ANTLR3_BITWORD FOLLOW_expression_in_parameters18244_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_parameters18244	= { FOLLOW_expression_in_parameters18244_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_parameters18254  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_parameters18254_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_parameters18254	= { FOLLOW_COMMA_in_parameters18254_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_parameters18258  */
static	ANTLR3_BITWORD FOLLOW_expression_in_parameters18258_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_parameters18258	= { FOLLOW_expression_in_parameters18258_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RPAREN_in_parameters18270  */
static	ANTLR3_BITWORD FOLLOW_RPAREN_in_parameters18270_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RPAREN_in_parameters18270	= { FOLLOW_RPAREN_in_parameters18270_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_statement_com_input_in_statement_com18292  */
static	ANTLR3_BITWORD FOLLOW_statement_com_input_in_statement_com18292_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_statement_com_input_in_statement_com18292	= { FOLLOW_statement_com_input_in_statement_com18292_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_statement_com_output_in_statement_com18303  */
static	ANTLR3_BITWORD FOLLOW_statement_com_output_in_statement_com18303_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_statement_com_output_in_statement_com18303	= { FOLLOW_statement_com_output_in_statement_com18303_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_305_in_statement_com_input18329  */
static	ANTLR3_BITWORD FOLLOW_305_in_statement_com_input18329_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_305_in_statement_com_input18329	= { FOLLOW_305_in_statement_com_input18329_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_303_in_statement_com_input18347  */
static	ANTLR3_BITWORD FOLLOW_303_in_statement_com_input18347_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_303_in_statement_com_input18347	= { FOLLOW_303_in_statement_com_input18347_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_304_in_statement_com_input18360  */
static	ANTLR3_BITWORD FOLLOW_304_in_statement_com_input18360_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_304_in_statement_com_input18360	= { FOLLOW_304_in_statement_com_input18360_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_301_in_statement_com_input18374  */
static	ANTLR3_BITWORD FOLLOW_301_in_statement_com_input18374_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_301_in_statement_com_input18374	= { FOLLOW_301_in_statement_com_input18374_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_300_in_statement_com_input18387  */
static	ANTLR3_BITWORD FOLLOW_300_in_statement_com_input18387_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_300_in_statement_com_input18387	= { FOLLOW_300_in_statement_com_input18387_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_299_in_statement_com_input18401  */
static	ANTLR3_BITWORD FOLLOW_299_in_statement_com_input18401_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_299_in_statement_com_input18401	= { FOLLOW_299_in_statement_com_input18401_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_302_in_statement_com_input18412  */
static	ANTLR3_BITWORD FOLLOW_302_in_statement_com_input18412_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_302_in_statement_com_input18412	= { FOLLOW_302_in_statement_com_input18412_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_qualifiedNameID_in_statement_com_input18426  */
static	ANTLR3_BITWORD FOLLOW_qualifiedNameID_in_statement_com_input18426_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080), ANTLR3_UINT64_LIT(0x000000A000000080), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000020000000) };
static  ANTLR3_BITSET_LIST FOLLOW_qualifiedNameID_in_statement_com_input18426	= { FOLLOW_qualifiedNameID_in_statement_com_input18426_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_parameters_port_in_statement_com_input18436  */
static	ANTLR3_BITWORD FOLLOW_parameters_port_in_statement_com_input18436_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x000000A000000080), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000020000000) };
static  ANTLR3_BITSET_LIST FOLLOW_parameters_port_in_statement_com_input18436	= { FOLLOW_parameters_port_in_statement_com_input18436_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_165_in_statement_com_input18446  */
static	ANTLR3_BITWORD FOLLOW_165_in_statement_com_input18446_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_165_in_statement_com_input18446	= { FOLLOW_165_in_statement_com_input18446_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_277_in_statement_com_input18455  */
static	ANTLR3_BITWORD FOLLOW_277_in_statement_com_input18455_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000080), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000008000000080), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000020000000) };
static  ANTLR3_BITSET_LIST FOLLOW_277_in_statement_com_input18455	= { FOLLOW_277_in_statement_com_input18455_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_com_input18469  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_com_input18469_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000080), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000008000000080), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000020000000) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_com_input18469	= { FOLLOW_expression_in_statement_com_input18469_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ASSIGN_REF_in_statement_com_input18489  */
static	ANTLR3_BITWORD FOLLOW_ASSIGN_REF_in_statement_com_input18489_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_ASSIGN_REF_in_statement_com_input18489	= { FOLLOW_ASSIGN_REF_in_statement_com_input18489_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_qualifiedNameID_in_statement_com_input18493  */
static	ANTLR3_BITWORD FOLLOW_qualifiedNameID_in_statement_com_input18493_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000008000000080), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000020000000) };
static  ANTLR3_BITSET_LIST FOLLOW_qualifiedNameID_in_statement_com_input18493	= { FOLLOW_qualifiedNameID_in_statement_com_input18493_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_statement_com_input18521  */
static	ANTLR3_BITWORD FOLLOW_set_in_statement_com_input18521_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_statement_com_input18521	= { FOLLOW_set_in_statement_com_input18521_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_qualifiedNameID_in_statement_com_input18533  */
static	ANTLR3_BITWORD FOLLOW_qualifiedNameID_in_statement_com_input18533_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_qualifiedNameID_in_statement_com_input18533	= { FOLLOW_qualifiedNameID_in_statement_com_input18533_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_com_input18549  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_com_input18549_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_com_input18549	= { FOLLOW_SEMI_in_statement_com_input18549_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_341_in_statement_com_output18572  */
static	ANTLR3_BITWORD FOLLOW_341_in_statement_com_output18572_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_341_in_statement_com_output18572	= { FOLLOW_341_in_statement_com_output18572_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_340_in_statement_com_output18590  */
static	ANTLR3_BITWORD FOLLOW_340_in_statement_com_output18590_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_340_in_statement_com_output18590	= { FOLLOW_340_in_statement_com_output18590_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_338_in_statement_com_output18604  */
static	ANTLR3_BITWORD FOLLOW_338_in_statement_com_output18604_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_338_in_statement_com_output18604	= { FOLLOW_338_in_statement_com_output18604_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_337_in_statement_com_output18617  */
static	ANTLR3_BITWORD FOLLOW_337_in_statement_com_output18617_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_337_in_statement_com_output18617	= { FOLLOW_337_in_statement_com_output18617_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_336_in_statement_com_output18631  */
static	ANTLR3_BITWORD FOLLOW_336_in_statement_com_output18631_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_336_in_statement_com_output18631	= { FOLLOW_336_in_statement_com_output18631_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_339_in_statement_com_output18642  */
static	ANTLR3_BITWORD FOLLOW_339_in_statement_com_output18642_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_339_in_statement_com_output18642	= { FOLLOW_339_in_statement_com_output18642_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_qualifiedNameID_in_statement_com_output18656  */
static	ANTLR3_BITWORD FOLLOW_qualifiedNameID_in_statement_com_output18656_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080), ANTLR3_UINT64_LIT(0x0000010800000080), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000020000000) };
static  ANTLR3_BITSET_LIST FOLLOW_qualifiedNameID_in_statement_com_output18656	= { FOLLOW_qualifiedNameID_in_statement_com_output18656_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_parameters_port_in_statement_com_output18666  */
static	ANTLR3_BITWORD FOLLOW_parameters_port_in_statement_com_output18666_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000010800000080), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000020000000) };
static  ANTLR3_BITSET_LIST FOLLOW_parameters_port_in_statement_com_output18666	= { FOLLOW_parameters_port_in_statement_com_output18666_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_163_in_statement_com_output18676  */
static	ANTLR3_BITWORD FOLLOW_163_in_statement_com_output18676_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_163_in_statement_com_output18676	= { FOLLOW_163_in_statement_com_output18676_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_277_in_statement_com_output18685  */
static	ANTLR3_BITWORD FOLLOW_277_in_statement_com_output18685_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000011000000080), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000020000000) };
static  ANTLR3_BITSET_LIST FOLLOW_277_in_statement_com_output18685	= { FOLLOW_277_in_statement_com_output18685_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_com_output18699  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_com_output18699_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000011000000080), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000020000000) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_com_output18699	= { FOLLOW_expression_in_statement_com_output18699_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_164_in_statement_com_output18721  */
static	ANTLR3_BITWORD FOLLOW_164_in_statement_com_output18721_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_164_in_statement_com_output18721	= { FOLLOW_164_in_statement_com_output18721_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_qualifiedNameID_in_statement_com_output18725  */
static	ANTLR3_BITWORD FOLLOW_qualifiedNameID_in_statement_com_output18725_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000010000000080), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000020000000) };
static  ANTLR3_BITSET_LIST FOLLOW_qualifiedNameID_in_statement_com_output18725	= { FOLLOW_qualifiedNameID_in_statement_com_output18725_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_statement_com_output18753  */
static	ANTLR3_BITWORD FOLLOW_set_in_statement_com_output18753_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_statement_com_output18753	= { FOLLOW_set_in_statement_com_output18753_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_qualifiedNameID_in_statement_com_output18765  */
static	ANTLR3_BITWORD FOLLOW_qualifiedNameID_in_statement_com_output18765_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_qualifiedNameID_in_statement_com_output18765	= { FOLLOW_qualifiedNameID_in_statement_com_output18765_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_com_output18781  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_com_output18781_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_com_output18781	= { FOLLOW_SEMI_in_statement_com_output18781_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LPAREN_in_parameters_port18804  */
static	ANTLR3_BITWORD FOLLOW_LPAREN_in_parameters_port18804_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LPAREN_in_parameters_port18804	= { FOLLOW_LPAREN_in_parameters_port18804_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_labelled_argument_in_parameters_port18813  */
static	ANTLR3_BITWORD FOLLOW_labelled_argument_in_parameters_port18813_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_labelled_argument_in_parameters_port18813	= { FOLLOW_labelled_argument_in_parameters_port18813_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_parameters_port18827  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_parameters_port18827_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_parameters_port18827	= { FOLLOW_COMMA_in_parameters_port18827_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_labelled_argument_in_parameters_port18832  */
static	ANTLR3_BITWORD FOLLOW_labelled_argument_in_parameters_port18832_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_labelled_argument_in_parameters_port18832	= { FOLLOW_labelled_argument_in_parameters_port18832_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RPAREN_in_parameters_port18852  */
static	ANTLR3_BITWORD FOLLOW_RPAREN_in_parameters_port18852_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RPAREN_in_parameters_port18852	= { FOLLOW_RPAREN_in_parameters_port18852_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_347_in_expression_com18869  */
static	ANTLR3_BITWORD FOLLOW_347_in_expression_com18869_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_347_in_expression_com18869	= { FOLLOW_347_in_expression_com18869_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_qualifiedNameID_in_expression_com18874  */
static	ANTLR3_BITWORD FOLLOW_qualifiedNameID_in_expression_com18874_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_qualifiedNameID_in_expression_com18874	= { FOLLOW_qualifiedNameID_in_expression_com18874_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_237_in_expression_com18883  */
static	ANTLR3_BITWORD FOLLOW_237_in_expression_com18883_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_237_in_expression_com18883	= { FOLLOW_237_in_expression_com18883_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_qualifiedNameID_in_expression_com18888  */
static	ANTLR3_BITWORD FOLLOW_qualifiedNameID_in_expression_com18888_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_qualifiedNameID_in_expression_com18888	= { FOLLOW_qualifiedNameID_in_expression_com18888_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_statement_guard_in_statement_constraint18912  */
static	ANTLR3_BITWORD FOLLOW_statement_guard_in_statement_constraint18912_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_statement_guard_in_statement_constraint18912	= { FOLLOW_statement_guard_in_statement_constraint18912_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_statement_timed_guard_in_statement_constraint18928  */
static	ANTLR3_BITWORD FOLLOW_statement_timed_guard_in_statement_constraint18928_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_statement_timed_guard_in_statement_constraint18928	= { FOLLOW_statement_timed_guard_in_statement_constraint18928_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_statement_checksat_in_statement_constraint18938  */
static	ANTLR3_BITWORD FOLLOW_statement_checksat_in_statement_constraint18938_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_statement_checksat_in_statement_constraint18938	= { FOLLOW_statement_checksat_in_statement_constraint18938_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_290_in_statement_guard18960  */
static	ANTLR3_BITWORD FOLLOW_290_in_statement_guard18960_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_290_in_statement_guard18960	= { FOLLOW_290_in_statement_guard18960_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_guard18965  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_guard18965_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_guard18965	= { FOLLOW_expression_in_statement_guard18965_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_guard18968  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_guard18968_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_guard18968	= { FOLLOW_SEMI_in_statement_guard18968_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_278_in_statement_guard18977  */
static	ANTLR3_BITWORD FOLLOW_278_in_statement_guard18977_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_278_in_statement_guard18977	= { FOLLOW_278_in_statement_guard18977_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_guard18982  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_guard18982_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_guard18982	= { FOLLOW_expression_in_statement_guard18982_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_guard18985  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_guard18985_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_guard18985	= { FOLLOW_SEMI_in_statement_guard18985_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_391_in_statement_timed_guard19003  */
static	ANTLR3_BITWORD FOLLOW_391_in_statement_timed_guard19003_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_391_in_statement_timed_guard19003	= { FOLLOW_391_in_statement_timed_guard19003_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_timed_guard19008  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_timed_guard19008_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_timed_guard19008	= { FOLLOW_expression_in_statement_timed_guard19008_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_timed_guard19011  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_timed_guard19011_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_timed_guard19011	= { FOLLOW_SEMI_in_statement_timed_guard19011_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_256_in_statement_checksat19033  */
static	ANTLR3_BITWORD FOLLOW_256_in_statement_checksat19033_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x012401000000A185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0110000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_256_in_statement_checksat19033	= { FOLLOW_256_in_statement_checksat19033_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LT__in_statement_checksat19040  */
static	ANTLR3_BITWORD FOLLOW_LT__in_statement_checksat19040_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LT__in_statement_checksat19040	= { FOLLOW_LT__in_statement_checksat19040_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_StringLiteral_in_statement_checksat19047  */
static	ANTLR3_BITWORD FOLLOW_StringLiteral_in_statement_checksat19047_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_StringLiteral_in_statement_checksat19047	= { FOLLOW_StringLiteral_in_statement_checksat19047_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_statement_checksat19053  */
static	ANTLR3_BITWORD FOLLOW_ID_in_statement_checksat19053_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_statement_checksat19053	= { FOLLOW_ID_in_statement_checksat19053_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_GT_in_statement_checksat19058  */
static	ANTLR3_BITWORD FOLLOW_GT_in_statement_checksat19058_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_GT_in_statement_checksat19058	= { FOLLOW_GT_in_statement_checksat19058_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_376_in_statement_checksat19070  */
static	ANTLR3_BITWORD FOLLOW_376_in_statement_checksat19070_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_376_in_statement_checksat19070	= { FOLLOW_376_in_statement_checksat19070_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_StringLiteral_in_statement_checksat19077  */
static	ANTLR3_BITWORD FOLLOW_StringLiteral_in_statement_checksat19077_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_StringLiteral_in_statement_checksat19077	= { FOLLOW_StringLiteral_in_statement_checksat19077_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_statement_checksat19083  */
static	ANTLR3_BITWORD FOLLOW_ID_in_statement_checksat19083_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_statement_checksat19083	= { FOLLOW_ID_in_statement_checksat19083_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_checksat19101  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_checksat19101_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_checksat19101	= { FOLLOW_expression_in_statement_checksat19101_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_checksat19104  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_checksat19104_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_checksat19104	= { FOLLOW_SEMI_in_statement_checksat19104_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_256_in_expression_guard19127  */
static	ANTLR3_BITWORD FOLLOW_256_in_expression_guard19127_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x012401000000A185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0110000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_256_in_expression_guard19127	= { FOLLOW_256_in_expression_guard19127_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LT__in_expression_guard19134  */
static	ANTLR3_BITWORD FOLLOW_LT__in_expression_guard19134_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LT__in_expression_guard19134	= { FOLLOW_LT__in_expression_guard19134_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_StringLiteral_in_expression_guard19141  */
static	ANTLR3_BITWORD FOLLOW_StringLiteral_in_expression_guard19141_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_StringLiteral_in_expression_guard19141	= { FOLLOW_StringLiteral_in_expression_guard19141_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_expression_guard19147  */
static	ANTLR3_BITWORD FOLLOW_ID_in_expression_guard19147_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_expression_guard19147	= { FOLLOW_ID_in_expression_guard19147_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_GT_in_expression_guard19152  */
static	ANTLR3_BITWORD FOLLOW_GT_in_expression_guard19152_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_GT_in_expression_guard19152	= { FOLLOW_GT_in_expression_guard19152_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_376_in_expression_guard19164  */
static	ANTLR3_BITWORD FOLLOW_376_in_expression_guard19164_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_376_in_expression_guard19164	= { FOLLOW_376_in_expression_guard19164_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_StringLiteral_in_expression_guard19171  */
static	ANTLR3_BITWORD FOLLOW_StringLiteral_in_expression_guard19171_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_StringLiteral_in_expression_guard19171	= { FOLLOW_StringLiteral_in_expression_guard19171_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_expression_guard19177  */
static	ANTLR3_BITWORD FOLLOW_ID_in_expression_guard19177_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_expression_guard19177	= { FOLLOW_ID_in_expression_guard19177_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression_guard19195  */
static	ANTLR3_BITWORD FOLLOW_expression_in_expression_guard19195_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_expression_guard19195	= { FOLLOW_expression_in_expression_guard19195_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_294_in_statement_ite19221  */
static	ANTLR3_BITWORD FOLLOW_294_in_statement_ite19221_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_294_in_statement_ite19221	= { FOLLOW_294_in_statement_ite19221_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_ite19226  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_ite19226_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_ite19226	= { FOLLOW_expression_in_statement_ite19226_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_block_statement_in_statement_ite19231  */
static	ANTLR3_BITWORD FOLLOW_block_statement_in_statement_ite19231_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000060000) };
static  ANTLR3_BITSET_LIST FOLLOW_block_statement_in_statement_ite19231	= { FOLLOW_block_statement_in_statement_ite19231_bits, 5	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_274_in_statement_ite19245  */
static	ANTLR3_BITWORD FOLLOW_274_in_statement_ite19245_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_274_in_statement_ite19245	= { FOLLOW_274_in_statement_ite19245_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_273_in_statement_ite19249  */
static	ANTLR3_BITWORD FOLLOW_273_in_statement_ite19249_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000004000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_273_in_statement_ite19249	= { FOLLOW_273_in_statement_ite19249_bits, 5	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_294_in_statement_ite19251  */
static	ANTLR3_BITWORD FOLLOW_294_in_statement_ite19251_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_294_in_statement_ite19251	= { FOLLOW_294_in_statement_ite19251_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_ite19258  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_ite19258_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_ite19258	= { FOLLOW_expression_in_statement_ite19258_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_block_statement_in_statement_ite19263  */
static	ANTLR3_BITWORD FOLLOW_block_statement_in_statement_ite19263_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000060000) };
static  ANTLR3_BITSET_LIST FOLLOW_block_statement_in_statement_ite19263	= { FOLLOW_block_statement_in_statement_ite19263_bits, 5	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_273_in_statement_ite19283  */
static	ANTLR3_BITWORD FOLLOW_273_in_statement_ite19283_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_273_in_statement_ite19283	= { FOLLOW_273_in_statement_ite19283_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_block_statement_in_statement_ite19288  */
static	ANTLR3_BITWORD FOLLOW_block_statement_in_statement_ite19288_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_block_statement_in_statement_ite19288	= { FOLLOW_block_statement_in_statement_ite19288_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_294_in_expression_ite19320  */
static	ANTLR3_BITWORD FOLLOW_294_in_expression_ite19320_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_294_in_expression_ite19320	= { FOLLOW_294_in_expression_ite19320_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression_ite19325  */
static	ANTLR3_BITWORD FOLLOW_expression_in_expression_ite19325_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_expression_ite19325	= { FOLLOW_expression_in_expression_ite19325_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_expression_ite19328  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_expression_ite19328_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_expression_ite19328	= { FOLLOW_LCURLY_in_expression_ite19328_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression_ite19333  */
static	ANTLR3_BITWORD FOLLOW_expression_in_expression_ite19333_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_expression_ite19333	= { FOLLOW_expression_in_expression_ite19333_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_expression_ite19336  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_expression_ite19336_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000060000) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_expression_ite19336	= { FOLLOW_RCURLY_in_expression_ite19336_bits, 5	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_274_in_expression_ite19350  */
static	ANTLR3_BITWORD FOLLOW_274_in_expression_ite19350_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_274_in_expression_ite19350	= { FOLLOW_274_in_expression_ite19350_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_273_in_expression_ite19354  */
static	ANTLR3_BITWORD FOLLOW_273_in_expression_ite19354_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000004000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_273_in_expression_ite19354	= { FOLLOW_273_in_expression_ite19354_bits, 5	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_294_in_expression_ite19356  */
static	ANTLR3_BITWORD FOLLOW_294_in_expression_ite19356_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_294_in_expression_ite19356	= { FOLLOW_294_in_expression_ite19356_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression_ite19362  */
static	ANTLR3_BITWORD FOLLOW_expression_in_expression_ite19362_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_expression_ite19362	= { FOLLOW_expression_in_expression_ite19362_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_expression_ite19365  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_expression_ite19365_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_expression_ite19365	= { FOLLOW_LCURLY_in_expression_ite19365_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression_ite19370  */
static	ANTLR3_BITWORD FOLLOW_expression_in_expression_ite19370_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_expression_ite19370	= { FOLLOW_expression_in_expression_ite19370_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_expression_ite19373  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_expression_ite19373_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000060000) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_expression_ite19373	= { FOLLOW_RCURLY_in_expression_ite19373_bits, 5	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_273_in_expression_ite19393  */
static	ANTLR3_BITWORD FOLLOW_273_in_expression_ite19393_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_273_in_expression_ite19393	= { FOLLOW_273_in_expression_ite19393_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_expression_ite19396  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_expression_ite19396_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_expression_ite19396	= { FOLLOW_LCURLY_in_expression_ite19396_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression_ite19401  */
static	ANTLR3_BITWORD FOLLOW_expression_in_expression_ite19401_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_expression_ite19401	= { FOLLOW_expression_in_expression_ite19401_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_expression_ite19404  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_expression_ite19404_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_expression_ite19404	= { FOLLOW_RCURLY_in_expression_ite19404_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_285_in_statement_iteration19451  */
static	ANTLR3_BITWORD FOLLOW_285_in_statement_iteration19451_bits[]	= { ANTLR3_UINT64_LIT(0x000C000004400000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_285_in_statement_iteration19451	= { FOLLOW_285_in_statement_iteration19451_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_for_assign_header_in_statement_iteration19460  */
static	ANTLR3_BITWORD FOLLOW_for_assign_header_in_statement_iteration19460_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_for_assign_header_in_statement_iteration19460	= { FOLLOW_for_assign_header_in_statement_iteration19460_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_iteration19463  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_iteration19463_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_iteration19463	= { FOLLOW_SEMI_in_statement_iteration19463_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_iteration19468  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_iteration19468_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_iteration19468	= { FOLLOW_expression_in_statement_iteration19468_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_iteration19471  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_iteration19471_bits[]	= { ANTLR3_UINT64_LIT(0x000C000004400000) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_iteration19471	= { FOLLOW_SEMI_in_statement_iteration19471_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_for_assign_header_in_statement_iteration19476  */
static	ANTLR3_BITWORD FOLLOW_for_assign_header_in_statement_iteration19476_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_for_assign_header_in_statement_iteration19476	= { FOLLOW_for_assign_header_in_statement_iteration19476_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LPAREN_in_statement_iteration19495  */
static	ANTLR3_BITWORD FOLLOW_LPAREN_in_statement_iteration19495_bits[]	= { ANTLR3_UINT64_LIT(0x000C000004400000) };
static  ANTLR3_BITSET_LIST FOLLOW_LPAREN_in_statement_iteration19495	= { FOLLOW_LPAREN_in_statement_iteration19495_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_for_assign_header_in_statement_iteration19506  */
static	ANTLR3_BITWORD FOLLOW_for_assign_header_in_statement_iteration19506_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_for_assign_header_in_statement_iteration19506	= { FOLLOW_for_assign_header_in_statement_iteration19506_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_iteration19509  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_iteration19509_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_iteration19509	= { FOLLOW_SEMI_in_statement_iteration19509_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_iteration19514  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_iteration19514_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_iteration19514	= { FOLLOW_expression_in_statement_iteration19514_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_iteration19517  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_iteration19517_bits[]	= { ANTLR3_UINT64_LIT(0x000C000004400000) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_iteration19517	= { FOLLOW_SEMI_in_statement_iteration19517_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_for_assign_header_in_statement_iteration19522  */
static	ANTLR3_BITWORD FOLLOW_for_assign_header_in_statement_iteration19522_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_for_assign_header_in_statement_iteration19522	= { FOLLOW_for_assign_header_in_statement_iteration19522_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RPAREN_in_statement_iteration19529  */
static	ANTLR3_BITWORD FOLLOW_RPAREN_in_statement_iteration19529_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_RPAREN_in_statement_iteration19529	= { FOLLOW_RPAREN_in_statement_iteration19529_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_lvalue_in_statement_iteration19550  */
static	ANTLR3_BITWORD FOLLOW_lvalue_in_statement_iteration19550_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000200000) };
static  ANTLR3_BITSET_LIST FOLLOW_lvalue_in_statement_iteration19550	= { FOLLOW_lvalue_in_statement_iteration19550_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COLON_in_statement_iteration19553  */
static	ANTLR3_BITWORD FOLLOW_COLON_in_statement_iteration19553_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_COLON_in_statement_iteration19553	= { FOLLOW_COLON_in_statement_iteration19553_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_iteration19558  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_iteration19558_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_iteration19558	= { FOLLOW_expression_in_statement_iteration19558_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LPAREN_in_statement_iteration19577  */
static	ANTLR3_BITWORD FOLLOW_LPAREN_in_statement_iteration19577_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000400000) };
static  ANTLR3_BITSET_LIST FOLLOW_LPAREN_in_statement_iteration19577	= { FOLLOW_LPAREN_in_statement_iteration19577_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_lvalue_in_statement_iteration19582  */
static	ANTLR3_BITWORD FOLLOW_lvalue_in_statement_iteration19582_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000200000) };
static  ANTLR3_BITSET_LIST FOLLOW_lvalue_in_statement_iteration19582	= { FOLLOW_lvalue_in_statement_iteration19582_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COLON_in_statement_iteration19585  */
static	ANTLR3_BITWORD FOLLOW_COLON_in_statement_iteration19585_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_COLON_in_statement_iteration19585	= { FOLLOW_COLON_in_statement_iteration19585_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_iteration19590  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_iteration19590_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_iteration19590	= { FOLLOW_expression_in_statement_iteration19590_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RPAREN_in_statement_iteration19593  */
static	ANTLR3_BITWORD FOLLOW_RPAREN_in_statement_iteration19593_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_RPAREN_in_statement_iteration19593	= { FOLLOW_RPAREN_in_statement_iteration19593_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_block_statement_in_statement_iteration19612  */
static	ANTLR3_BITWORD FOLLOW_block_statement_in_statement_iteration19612_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_block_statement_in_statement_iteration19612	= { FOLLOW_block_statement_in_statement_iteration19612_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_416_in_statement_iteration19621  */
static	ANTLR3_BITWORD FOLLOW_416_in_statement_iteration19621_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_416_in_statement_iteration19621	= { FOLLOW_416_in_statement_iteration19621_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_iteration19626  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_iteration19626_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_iteration19626	= { FOLLOW_expression_in_statement_iteration19626_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_block_statement_in_statement_iteration19631  */
static	ANTLR3_BITWORD FOLLOW_block_statement_in_statement_iteration19631_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_block_statement_in_statement_iteration19631	= { FOLLOW_block_statement_in_statement_iteration19631_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_269_in_statement_iteration19640  */
static	ANTLR3_BITWORD FOLLOW_269_in_statement_iteration19640_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_269_in_statement_iteration19640	= { FOLLOW_269_in_statement_iteration19640_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_block_statement_in_statement_iteration19645  */
static	ANTLR3_BITWORD FOLLOW_block_statement_in_statement_iteration19645_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000100000000) };
static  ANTLR3_BITSET_LIST FOLLOW_block_statement_in_statement_iteration19645	= { FOLLOW_block_statement_in_statement_iteration19645_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_416_in_statement_iteration19648  */
static	ANTLR3_BITWORD FOLLOW_416_in_statement_iteration19648_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_416_in_statement_iteration19648	= { FOLLOW_416_in_statement_iteration19648_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_iteration19653  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_iteration19653_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_iteration19653	= { FOLLOW_expression_in_statement_iteration19653_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_iteration19656  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_iteration19656_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_iteration19656	= { FOLLOW_SEMI_in_statement_iteration19656_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_lvalue_in_for_assign_header19679  */
static	ANTLR3_BITWORD FOLLOW_lvalue_in_for_assign_header19679_bits[]	= { ANTLR3_UINT64_LIT(0x0008000004000010) };
static  ANTLR3_BITSET_LIST FOLLOW_lvalue_in_for_assign_header19679	= { FOLLOW_lvalue_in_for_assign_header19679_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ASSIGN_in_for_assign_header19684  */
static	ANTLR3_BITWORD FOLLOW_ASSIGN_in_for_assign_header19684_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_ASSIGN_in_for_assign_header19684	= { FOLLOW_ASSIGN_in_for_assign_header19684_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_for_assign_header19689  */
static	ANTLR3_BITWORD FOLLOW_expression_in_for_assign_header19689_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_for_assign_header19689	= { FOLLOW_expression_in_for_assign_header19689_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_INCR_in_for_assign_header19702  */
static	ANTLR3_BITWORD FOLLOW_INCR_in_for_assign_header19702_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_INCR_in_for_assign_header19702	= { FOLLOW_INCR_in_for_assign_header19702_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_DECR_in_for_assign_header19713  */
static	ANTLR3_BITWORD FOLLOW_DECR_in_for_assign_header19713_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_DECR_in_for_assign_header19713	= { FOLLOW_DECR_in_for_assign_header19713_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_INCR_in_for_assign_header19725  */
static	ANTLR3_BITWORD FOLLOW_INCR_in_for_assign_header19725_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000400000) };
static  ANTLR3_BITSET_LIST FOLLOW_INCR_in_for_assign_header19725	= { FOLLOW_INCR_in_for_assign_header19725_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_lvalue_in_for_assign_header19730  */
static	ANTLR3_BITWORD FOLLOW_lvalue_in_for_assign_header19730_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_lvalue_in_for_assign_header19730	= { FOLLOW_lvalue_in_for_assign_header19730_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_DECR_in_for_assign_header19741  */
static	ANTLR3_BITWORD FOLLOW_DECR_in_for_assign_header19741_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000400000) };
static  ANTLR3_BITSET_LIST FOLLOW_DECR_in_for_assign_header19741	= { FOLLOW_DECR_in_for_assign_header19741_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_lvalue_in_for_assign_header19746  */
static	ANTLR3_BITWORD FOLLOW_lvalue_in_for_assign_header19746_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_lvalue_in_for_assign_header19746	= { FOLLOW_lvalue_in_for_assign_header19746_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_247_in_statement_jump19769  */
static	ANTLR3_BITWORD FOLLOW_247_in_statement_jump19769_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C00020C0), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_247_in_statement_jump19769	= { FOLLOW_247_in_statement_jump19769_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_jump19788  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_jump19788_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_jump19788	= { FOLLOW_expression_in_statement_jump19788_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_jump19799  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_jump19799_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_jump19799	= { FOLLOW_SEMI_in_statement_jump19799_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_263_in_statement_jump19805  */
static	ANTLR3_BITWORD FOLLOW_263_in_statement_jump19805_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C00020C0), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_263_in_statement_jump19805	= { FOLLOW_263_in_statement_jump19805_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_jump19821  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_jump19821_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_jump19821	= { FOLLOW_expression_in_statement_jump19821_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_jump19832  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_jump19832_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_jump19832	= { FOLLOW_SEMI_in_statement_jump19832_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_364_in_statement_jump19838  */
static	ANTLR3_BITWORD FOLLOW_364_in_statement_jump19838_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C00020C0), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_364_in_statement_jump19838	= { FOLLOW_364_in_statement_jump19838_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_jump19856  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_jump19856_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_jump19856	= { FOLLOW_expression_in_statement_jump19856_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_statement_jump19868  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_statement_jump19868_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_statement_jump19868	= { FOLLOW_COMMA_in_statement_jump19868_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_jump19872  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_jump19872_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_jump19872	= { FOLLOW_expression_in_statement_jump19872_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_jump19889  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_jump19889_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_jump19889	= { FOLLOW_SEMI_in_statement_jump19889_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_279_in_statement_jump19895  */
static	ANTLR3_BITWORD FOLLOW_279_in_statement_jump19895_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C00020C0), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_279_in_statement_jump19895	= { FOLLOW_279_in_statement_jump19895_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_jump19915  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_jump19915_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_jump19915	= { FOLLOW_expression_in_statement_jump19915_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_jump19926  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_jump19926_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_jump19926	= { FOLLOW_SEMI_in_statement_jump19926_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_313_in_expression_lambda19945  */
static	ANTLR3_BITWORD FOLLOW_313_in_expression_lambda19945_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000001000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_313_in_expression_lambda19945	= { FOLLOW_313_in_expression_lambda19945_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_expression_lambda19957  */
static	ANTLR3_BITWORD FOLLOW_ID_in_expression_lambda19957_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000001000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_expression_lambda19957	= { FOLLOW_ID_in_expression_lambda19957_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_164_in_expression_lambda19969  */
static	ANTLR3_BITWORD FOLLOW_164_in_expression_lambda19969_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_164_in_expression_lambda19969	= { FOLLOW_164_in_expression_lambda19969_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression_lambda19973  */
static	ANTLR3_BITWORD FOLLOW_expression_in_expression_lambda19973_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_expression_lambda19973	= { FOLLOW_expression_in_expression_lambda19973_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_383_in_expression_status19996  */
static	ANTLR3_BITWORD FOLLOW_383_in_expression_status19996_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000100000000000), ANTLR3_UINT64_LIT(0x0000013804081800), ANTLR3_UINT64_LIT(0x020B0C0000000000), ANTLR3_UINT64_LIT(0x0000000080000024) };
static  ANTLR3_BITSET_LIST FOLLOW_383_in_expression_status19996	= { FOLLOW_383_in_expression_status19996_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_op_activity_in_expression_status20003  */
static	ANTLR3_BITWORD FOLLOW_op_activity_in_expression_status20003_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_op_activity_in_expression_status20003	= { FOLLOW_op_activity_in_expression_status20003_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_qualifiedNameID_in_expression_status20008  */
static	ANTLR3_BITWORD FOLLOW_qualifiedNameID_in_expression_status20008_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_qualifiedNameID_in_expression_status20008	= { FOLLOW_qualifiedNameID_in_expression_status20008_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_382_in_expression_status20017  */
static	ANTLR3_BITWORD FOLLOW_382_in_expression_status20017_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000100000000000), ANTLR3_UINT64_LIT(0x0000013804081800), ANTLR3_UINT64_LIT(0x020B0C0000000000), ANTLR3_UINT64_LIT(0x0000000080000024) };
static  ANTLR3_BITSET_LIST FOLLOW_382_in_expression_status20017	= { FOLLOW_382_in_expression_status20017_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_op_activity_in_expression_status20025  */
static	ANTLR3_BITWORD FOLLOW_op_activity_in_expression_status20025_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_op_activity_in_expression_status20025	= { FOLLOW_op_activity_in_expression_status20025_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_qualifiedNameID_in_expression_status20030  */
static	ANTLR3_BITWORD FOLLOW_qualifiedNameID_in_expression_status20030_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_qualifiedNameID_in_expression_status20030	= { FOLLOW_qualifiedNameID_in_expression_status20030_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_381_in_expression_status20039  */
static	ANTLR3_BITWORD FOLLOW_381_in_expression_status20039_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000100000000000), ANTLR3_UINT64_LIT(0x0000013804081800), ANTLR3_UINT64_LIT(0x020B0C0000000000), ANTLR3_UINT64_LIT(0x0000000080000024) };
static  ANTLR3_BITSET_LIST FOLLOW_381_in_expression_status20039	= { FOLLOW_381_in_expression_status20039_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_op_activity_in_expression_status20044  */
static	ANTLR3_BITWORD FOLLOW_op_activity_in_expression_status20044_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_op_activity_in_expression_status20044	= { FOLLOW_op_activity_in_expression_status20044_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_qualifiedNameID_in_expression_status20049  */
static	ANTLR3_BITWORD FOLLOW_qualifiedNameID_in_expression_status20049_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_qualifiedNameID_in_expression_status20049	= { FOLLOW_qualifiedNameID_in_expression_status20049_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_384_in_expression_status20058  */
static	ANTLR3_BITWORD FOLLOW_384_in_expression_status20058_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000100000000000), ANTLR3_UINT64_LIT(0x0000013804081800), ANTLR3_UINT64_LIT(0x020B0C0000000000), ANTLR3_UINT64_LIT(0x0000000080000024) };
static  ANTLR3_BITSET_LIST FOLLOW_384_in_expression_status20058	= { FOLLOW_384_in_expression_status20058_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_op_activity_in_expression_status20064  */
static	ANTLR3_BITWORD FOLLOW_op_activity_in_expression_status20064_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_op_activity_in_expression_status20064	= { FOLLOW_op_activity_in_expression_status20064_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_qualifiedNameID_in_expression_status20069  */
static	ANTLR3_BITWORD FOLLOW_qualifiedNameID_in_expression_status20069_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_qualifiedNameID_in_expression_status20069	= { FOLLOW_qualifiedNameID_in_expression_status20069_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_252_in_expression_status20078  */
static	ANTLR3_BITWORD FOLLOW_252_in_expression_status20078_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000400000) };
static  ANTLR3_BITSET_LIST FOLLOW_252_in_expression_status20078	= { FOLLOW_252_in_expression_status20078_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_lvalue_in_expression_status20086  */
static	ANTLR3_BITWORD FOLLOW_lvalue_in_expression_status20086_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_lvalue_in_expression_status20086	= { FOLLOW_lvalue_in_expression_status20086_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_251_in_expression_status20095  */
static	ANTLR3_BITWORD FOLLOW_251_in_expression_status20095_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000400000) };
static  ANTLR3_BITSET_LIST FOLLOW_251_in_expression_status20095	= { FOLLOW_251_in_expression_status20095_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_lvalue_in_expression_status20100  */
static	ANTLR3_BITWORD FOLLOW_lvalue_in_expression_status20100_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_lvalue_in_expression_status20100	= { FOLLOW_lvalue_in_expression_status20100_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_296_in_op_activity20118  */
static	ANTLR3_BITWORD FOLLOW_296_in_op_activity20118_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_296_in_op_activity20118	= { FOLLOW_296_in_op_activity20118_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_282_in_op_activity20129  */
static	ANTLR3_BITWORD FOLLOW_282_in_op_activity20129_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_282_in_op_activity20129	= { FOLLOW_282_in_op_activity20129_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_267_in_op_activity20139  */
static	ANTLR3_BITWORD FOLLOW_267_in_op_activity20139_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_267_in_op_activity20139	= { FOLLOW_267_in_op_activity20139_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_377_in_op_activity20147  */
static	ANTLR3_BITWORD FOLLOW_377_in_op_activity20147_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_377_in_op_activity20147	= { FOLLOW_377_in_op_activity20147_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_362_in_op_activity20157  */
static	ANTLR3_BITWORD FOLLOW_362_in_op_activity20157_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_362_in_op_activity20157	= { FOLLOW_362_in_op_activity20157_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_386_in_op_activity20165  */
static	ANTLR3_BITWORD FOLLOW_386_in_op_activity20165_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_386_in_op_activity20165	= { FOLLOW_386_in_op_activity20165_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_293_in_op_activity20176  */
static	ANTLR3_BITWORD FOLLOW_293_in_op_activity20176_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_293_in_op_activity20176	= { FOLLOW_293_in_op_activity20176_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_275_in_op_activity20184  */
static	ANTLR3_BITWORD FOLLOW_275_in_op_activity20184_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_275_in_op_activity20184	= { FOLLOW_275_in_op_activity20184_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_292_in_op_activity20193  */
static	ANTLR3_BITWORD FOLLOW_292_in_op_activity20193_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_292_in_op_activity20193	= { FOLLOW_292_in_op_activity20193_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_268_in_op_activity20200  */
static	ANTLR3_BITWORD FOLLOW_268_in_op_activity20200_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_268_in_op_activity20200	= { FOLLOW_268_in_op_activity20200_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_291_in_op_activity20208  */
static	ANTLR3_BITWORD FOLLOW_291_in_op_activity20208_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_291_in_op_activity20208	= { FOLLOW_291_in_op_activity20208_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_236_in_op_activity20217  */
static	ANTLR3_BITWORD FOLLOW_236_in_op_activity20217_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_236_in_op_activity20217	= { FOLLOW_236_in_op_activity20217_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_369_in_op_activity20227  */
static	ANTLR3_BITWORD FOLLOW_369_in_op_activity20227_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_369_in_op_activity20227	= { FOLLOW_369_in_op_activity20227_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_368_in_op_activity20239  */
static	ANTLR3_BITWORD FOLLOW_368_in_op_activity20239_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_368_in_op_activity20239	= { FOLLOW_368_in_op_activity20239_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_371_in_op_activity20251  */
static	ANTLR3_BITWORD FOLLOW_371_in_op_activity20251_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_371_in_op_activity20251	= { FOLLOW_371_in_op_activity20251_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_389_in_op_activity20258  */
static	ANTLR3_BITWORD FOLLOW_389_in_op_activity20258_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_389_in_op_activity20258	= { FOLLOW_389_in_op_activity20258_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_363_in_op_activity20266  */
static	ANTLR3_BITWORD FOLLOW_363_in_op_activity20266_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_363_in_op_activity20266	= { FOLLOW_363_in_op_activity20266_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_415_in_op_activity20275  */
static	ANTLR3_BITWORD FOLLOW_415_in_op_activity20275_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_415_in_op_activity20275	= { FOLLOW_415_in_op_activity20275_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_op_activity_in_statement_activity20307  */
static	ANTLR3_BITWORD FOLLOW_op_activity_in_statement_activity20307_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000080), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_op_activity_in_statement_activity20307	= { FOLLOW_op_activity_in_statement_activity20307_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_qualifiedNameID_in_statement_activity20319  */
static	ANTLR3_BITWORD FOLLOW_qualifiedNameID_in_statement_activity20319_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_qualifiedNameID_in_statement_activity20319	= { FOLLOW_qualifiedNameID_in_statement_activity20319_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_activity_machine_param_return_in_statement_activity20338  */
static	ANTLR3_BITWORD FOLLOW_activity_machine_param_return_in_statement_activity20338_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_activity_machine_param_return_in_statement_activity20338	= { FOLLOW_activity_machine_param_return_in_statement_activity20338_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_activity20346  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_activity20346_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_activity20346	= { FOLLOW_SEMI_in_statement_activity20346_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_289_in_statement_activity20355  */
static	ANTLR3_BITWORD FOLLOW_289_in_statement_activity20355_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_289_in_statement_activity20355	= { FOLLOW_289_in_statement_activity20355_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_qualifiedNameID_in_statement_activity20360  */
static	ANTLR3_BITWORD FOLLOW_qualifiedNameID_in_statement_activity20360_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000010000000) };
static  ANTLR3_BITSET_LIST FOLLOW_qualifiedNameID_in_statement_activity20360	= { FOLLOW_qualifiedNameID_in_statement_activity20360_bits, 5	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_statement_init_flow_in_statement_activity20374  */
static	ANTLR3_BITWORD FOLLOW_statement_init_flow_in_statement_activity20374_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_statement_init_flow_in_statement_activity20374	= { FOLLOW_statement_init_flow_in_statement_activity20374_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_activity20385  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_activity20385_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_activity20385	= { FOLLOW_SEMI_in_statement_activity20385_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_312_in_statement_activity20396  */
static	ANTLR3_BITWORD FOLLOW_312_in_statement_activity20396_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_312_in_statement_activity20396	= { FOLLOW_312_in_statement_activity20396_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_statement_activity20401  */
static	ANTLR3_BITWORD FOLLOW_expression_in_statement_activity20401_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_statement_activity20401	= { FOLLOW_expression_in_statement_activity20401_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_activity20404  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_activity20404_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_activity20404	= { FOLLOW_SEMI_in_statement_activity20404_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_284_in_statement_init_flow20434  */
static	ANTLR3_BITWORD FOLLOW_284_in_statement_init_flow20434_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_284_in_statement_init_flow20434	= { FOLLOW_284_in_statement_init_flow20434_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_block_statement_in_statement_init_flow20438  */
static	ANTLR3_BITWORD FOLLOW_block_statement_in_statement_init_flow20438_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_block_statement_in_statement_init_flow20438	= { FOLLOW_block_statement_in_statement_init_flow20438_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_statement_invoke_routine20468  */
static	ANTLR3_BITWORD FOLLOW_ID_in_statement_invoke_routine20468_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_statement_invoke_routine20468	= { FOLLOW_ID_in_statement_invoke_routine20468_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_invoke_routine_params_in_statement_invoke_routine20479  */
static	ANTLR3_BITWORD FOLLOW_invoke_routine_params_in_statement_invoke_routine20479_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000800000080), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_invoke_routine_params_in_statement_invoke_routine20479	= { FOLLOW_invoke_routine_params_in_statement_invoke_routine20479_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_invoke_routine_returns_in_statement_invoke_routine20490  */
static	ANTLR3_BITWORD FOLLOW_invoke_routine_returns_in_statement_invoke_routine20490_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_invoke_routine_returns_in_statement_invoke_routine20490	= { FOLLOW_invoke_routine_returns_in_statement_invoke_routine20490_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_invoke_routine20502  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_invoke_routine20502_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_invoke_routine20502	= { FOLLOW_SEMI_in_statement_invoke_routine20502_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LPAREN_in_invoke_routine_params20525  */
static	ANTLR3_BITWORD FOLLOW_LPAREN_in_invoke_routine_params20525_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002042), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LPAREN_in_invoke_routine_params20525	= { FOLLOW_LPAREN_in_invoke_routine_params20525_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_labelled_argument_in_invoke_routine_params20534  */
static	ANTLR3_BITWORD FOLLOW_labelled_argument_in_invoke_routine_params20534_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_labelled_argument_in_invoke_routine_params20534	= { FOLLOW_labelled_argument_in_invoke_routine_params20534_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_invoke_routine_params20550  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_invoke_routine_params20550_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_invoke_routine_params20550	= { FOLLOW_COMMA_in_invoke_routine_params20550_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_labelled_argument_in_invoke_routine_params20559  */
static	ANTLR3_BITWORD FOLLOW_labelled_argument_in_invoke_routine_params20559_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_labelled_argument_in_invoke_routine_params20559	= { FOLLOW_labelled_argument_in_invoke_routine_params20559_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RPAREN_in_invoke_routine_params20585  */
static	ANTLR3_BITWORD FOLLOW_RPAREN_in_invoke_routine_params20585_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RPAREN_in_invoke_routine_params20585	= { FOLLOW_RPAREN_in_invoke_routine_params20585_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_invoke_routine_returns20599  */
static	ANTLR3_BITWORD FOLLOW_set_in_invoke_routine_returns20599_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_invoke_routine_returns20599	= { FOLLOW_set_in_invoke_routine_returns20599_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LPAREN_in_invoke_routine_returns20614  */
static	ANTLR3_BITWORD FOLLOW_LPAREN_in_invoke_routine_returns20614_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LPAREN_in_invoke_routine_returns20614	= { FOLLOW_LPAREN_in_invoke_routine_returns20614_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_labelled_argument_in_invoke_routine_returns20623  */
static	ANTLR3_BITWORD FOLLOW_labelled_argument_in_invoke_routine_returns20623_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_labelled_argument_in_invoke_routine_returns20623	= { FOLLOW_labelled_argument_in_invoke_routine_returns20623_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_invoke_routine_returns20639  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_invoke_routine_returns20639_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_invoke_routine_returns20639	= { FOLLOW_COMMA_in_invoke_routine_returns20639_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_labelled_argument_in_invoke_routine_returns20650  */
static	ANTLR3_BITWORD FOLLOW_labelled_argument_in_invoke_routine_returns20650_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_labelled_argument_in_invoke_routine_returns20650	= { FOLLOW_labelled_argument_in_invoke_routine_returns20650_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RPAREN_in_invoke_routine_returns20674  */
static	ANTLR3_BITWORD FOLLOW_RPAREN_in_invoke_routine_returns20674_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RPAREN_in_invoke_routine_returns20674	= { FOLLOW_RPAREN_in_invoke_routine_returns20674_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_labelled_argument_in_invoke_routine_returns20684  */
static	ANTLR3_BITWORD FOLLOW_labelled_argument_in_invoke_routine_returns20684_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_labelled_argument_in_invoke_routine_returns20684	= { FOLLOW_labelled_argument_in_invoke_routine_returns20684_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_385_in_statement_moc20722  */
static	ANTLR3_BITWORD FOLLOW_385_in_statement_moc20722_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_385_in_statement_moc20722	= { FOLLOW_385_in_statement_moc20722_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_StringLiteral_in_statement_moc20725  */
static	ANTLR3_BITWORD FOLLOW_StringLiteral_in_statement_moc20725_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_StringLiteral_in_statement_moc20725	= { FOLLOW_StringLiteral_in_statement_moc20725_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_statement_moc20728  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_statement_moc20728_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_statement_moc20728	= { FOLLOW_SEMI_in_statement_moc20728_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_conditionalExpression_in_expression20757  */
static	ANTLR3_BITWORD FOLLOW_conditionalExpression_in_expression20757_bits[]	= { ANTLR3_UINT64_LIT(0x06000000600D8C72), ANTLR3_UINT64_LIT(0x06000300021B0C30), ANTLR3_UINT64_LIT(0x0000000000000C30) };
static  ANTLR3_BITSET_LIST FOLLOW_conditionalExpression_in_expression20757	= { FOLLOW_conditionalExpression_in_expression20757_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ASSIGN_in_expression20766  */
static	ANTLR3_BITWORD FOLLOW_ASSIGN_in_expression20766_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_ASSIGN_in_expression20766	= { FOLLOW_ASSIGN_in_expression20766_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression20771  */
static	ANTLR3_BITWORD FOLLOW_expression_in_expression20771_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_expression20771	= { FOLLOW_expression_in_expression20771_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ASSIGN_MACRO_in_expression20780  */
static	ANTLR3_BITWORD FOLLOW_ASSIGN_MACRO_in_expression20780_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_ASSIGN_MACRO_in_expression20780	= { FOLLOW_ASSIGN_MACRO_in_expression20780_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression20785  */
static	ANTLR3_BITWORD FOLLOW_expression_in_expression20785_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_expression20785	= { FOLLOW_expression_in_expression20785_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ASSIGN_AFTER_in_expression20794  */
static	ANTLR3_BITWORD FOLLOW_ASSIGN_AFTER_in_expression20794_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_ASSIGN_AFTER_in_expression20794	= { FOLLOW_ASSIGN_AFTER_in_expression20794_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression20799  */
static	ANTLR3_BITWORD FOLLOW_expression_in_expression20799_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_expression20799	= { FOLLOW_expression_in_expression20799_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_PLUS_ASSIGN_in_expression20808  */
static	ANTLR3_BITWORD FOLLOW_PLUS_ASSIGN_in_expression20808_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_PLUS_ASSIGN_in_expression20808	= { FOLLOW_PLUS_ASSIGN_in_expression20808_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression20813  */
static	ANTLR3_BITWORD FOLLOW_expression_in_expression20813_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_expression20813	= { FOLLOW_expression_in_expression20813_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_PLUS_ASSIGN_AFTER_in_expression20822  */
static	ANTLR3_BITWORD FOLLOW_PLUS_ASSIGN_AFTER_in_expression20822_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_PLUS_ASSIGN_AFTER_in_expression20822	= { FOLLOW_PLUS_ASSIGN_AFTER_in_expression20822_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression20827  */
static	ANTLR3_BITWORD FOLLOW_expression_in_expression20827_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_expression20827	= { FOLLOW_expression_in_expression20827_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_MINUS_ASSIGN_in_expression20836  */
static	ANTLR3_BITWORD FOLLOW_MINUS_ASSIGN_in_expression20836_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_MINUS_ASSIGN_in_expression20836	= { FOLLOW_MINUS_ASSIGN_in_expression20836_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression20841  */
static	ANTLR3_BITWORD FOLLOW_expression_in_expression20841_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_expression20841	= { FOLLOW_expression_in_expression20841_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_MINUS_ASSIGN_AFTER_in_expression20850  */
static	ANTLR3_BITWORD FOLLOW_MINUS_ASSIGN_AFTER_in_expression20850_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_MINUS_ASSIGN_AFTER_in_expression20850	= { FOLLOW_MINUS_ASSIGN_AFTER_in_expression20850_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression20855  */
static	ANTLR3_BITWORD FOLLOW_expression_in_expression20855_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_expression20855	= { FOLLOW_expression_in_expression20855_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_STAR_ASSIGN_in_expression20864  */
static	ANTLR3_BITWORD FOLLOW_STAR_ASSIGN_in_expression20864_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_STAR_ASSIGN_in_expression20864	= { FOLLOW_STAR_ASSIGN_in_expression20864_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression20869  */
static	ANTLR3_BITWORD FOLLOW_expression_in_expression20869_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_expression20869	= { FOLLOW_expression_in_expression20869_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_STAR_ASSIGN_AFTER_in_expression20878  */
static	ANTLR3_BITWORD FOLLOW_STAR_ASSIGN_AFTER_in_expression20878_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_STAR_ASSIGN_AFTER_in_expression20878	= { FOLLOW_STAR_ASSIGN_AFTER_in_expression20878_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression20883  */
static	ANTLR3_BITWORD FOLLOW_expression_in_expression20883_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_expression20883	= { FOLLOW_expression_in_expression20883_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_DIV_ASSIGN_in_expression20892  */
static	ANTLR3_BITWORD FOLLOW_DIV_ASSIGN_in_expression20892_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_DIV_ASSIGN_in_expression20892	= { FOLLOW_DIV_ASSIGN_in_expression20892_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression20897  */
static	ANTLR3_BITWORD FOLLOW_expression_in_expression20897_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_expression20897	= { FOLLOW_expression_in_expression20897_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_DIV_ASSIGN_AFTER_in_expression20906  */
static	ANTLR3_BITWORD FOLLOW_DIV_ASSIGN_AFTER_in_expression20906_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_DIV_ASSIGN_AFTER_in_expression20906	= { FOLLOW_DIV_ASSIGN_AFTER_in_expression20906_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression20911  */
static	ANTLR3_BITWORD FOLLOW_expression_in_expression20911_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_expression20911	= { FOLLOW_expression_in_expression20911_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_MOD_ASSIGN_in_expression20920  */
static	ANTLR3_BITWORD FOLLOW_MOD_ASSIGN_in_expression20920_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_MOD_ASSIGN_in_expression20920	= { FOLLOW_MOD_ASSIGN_in_expression20920_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression20925  */
static	ANTLR3_BITWORD FOLLOW_expression_in_expression20925_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_expression20925	= { FOLLOW_expression_in_expression20925_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_MOD_ASSIGN_AFTER_in_expression20934  */
static	ANTLR3_BITWORD FOLLOW_MOD_ASSIGN_AFTER_in_expression20934_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_MOD_ASSIGN_AFTER_in_expression20934	= { FOLLOW_MOD_ASSIGN_AFTER_in_expression20934_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression20939  */
static	ANTLR3_BITWORD FOLLOW_expression_in_expression20939_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_expression20939	= { FOLLOW_expression_in_expression20939_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LAND_ASSIGN_in_expression20948  */
static	ANTLR3_BITWORD FOLLOW_LAND_ASSIGN_in_expression20948_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LAND_ASSIGN_in_expression20948	= { FOLLOW_LAND_ASSIGN_in_expression20948_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression20953  */
static	ANTLR3_BITWORD FOLLOW_expression_in_expression20953_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_expression20953	= { FOLLOW_expression_in_expression20953_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LAND_ASSIGN_AFTER_in_expression20962  */
static	ANTLR3_BITWORD FOLLOW_LAND_ASSIGN_AFTER_in_expression20962_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LAND_ASSIGN_AFTER_in_expression20962	= { FOLLOW_LAND_ASSIGN_AFTER_in_expression20962_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression20967  */
static	ANTLR3_BITWORD FOLLOW_expression_in_expression20967_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_expression20967	= { FOLLOW_expression_in_expression20967_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LOR_ASSIGN_in_expression20976  */
static	ANTLR3_BITWORD FOLLOW_LOR_ASSIGN_in_expression20976_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LOR_ASSIGN_in_expression20976	= { FOLLOW_LOR_ASSIGN_in_expression20976_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression20981  */
static	ANTLR3_BITWORD FOLLOW_expression_in_expression20981_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_expression20981	= { FOLLOW_expression_in_expression20981_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LOR_ASSIGN_AFTER_in_expression20990  */
static	ANTLR3_BITWORD FOLLOW_LOR_ASSIGN_AFTER_in_expression20990_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LOR_ASSIGN_AFTER_in_expression20990	= { FOLLOW_LOR_ASSIGN_AFTER_in_expression20990_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression20995  */
static	ANTLR3_BITWORD FOLLOW_expression_in_expression20995_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_expression20995	= { FOLLOW_expression_in_expression20995_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_BAND_ASSIGN_in_expression21004  */
static	ANTLR3_BITWORD FOLLOW_BAND_ASSIGN_in_expression21004_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_BAND_ASSIGN_in_expression21004	= { FOLLOW_BAND_ASSIGN_in_expression21004_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression21009  */
static	ANTLR3_BITWORD FOLLOW_expression_in_expression21009_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_expression21009	= { FOLLOW_expression_in_expression21009_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_BAND_ASSIGN_AFTER_in_expression21018  */
static	ANTLR3_BITWORD FOLLOW_BAND_ASSIGN_AFTER_in_expression21018_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_BAND_ASSIGN_AFTER_in_expression21018	= { FOLLOW_BAND_ASSIGN_AFTER_in_expression21018_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression21023  */
static	ANTLR3_BITWORD FOLLOW_expression_in_expression21023_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_expression21023	= { FOLLOW_expression_in_expression21023_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_BOR_ASSIGN_in_expression21032  */
static	ANTLR3_BITWORD FOLLOW_BOR_ASSIGN_in_expression21032_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_BOR_ASSIGN_in_expression21032	= { FOLLOW_BOR_ASSIGN_in_expression21032_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression21037  */
static	ANTLR3_BITWORD FOLLOW_expression_in_expression21037_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_expression21037	= { FOLLOW_expression_in_expression21037_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_BOR_ASSIGN_AFTER_in_expression21046  */
static	ANTLR3_BITWORD FOLLOW_BOR_ASSIGN_AFTER_in_expression21046_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_BOR_ASSIGN_AFTER_in_expression21046	= { FOLLOW_BOR_ASSIGN_AFTER_in_expression21046_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression21051  */
static	ANTLR3_BITWORD FOLLOW_expression_in_expression21051_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_expression21051	= { FOLLOW_expression_in_expression21051_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_BXOR_ASSIGN_in_expression21060  */
static	ANTLR3_BITWORD FOLLOW_BXOR_ASSIGN_in_expression21060_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_BXOR_ASSIGN_in_expression21060	= { FOLLOW_BXOR_ASSIGN_in_expression21060_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression21065  */
static	ANTLR3_BITWORD FOLLOW_expression_in_expression21065_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_expression21065	= { FOLLOW_expression_in_expression21065_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_BXOR_ASSIGN_AFTER_in_expression21074  */
static	ANTLR3_BITWORD FOLLOW_BXOR_ASSIGN_AFTER_in_expression21074_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_BXOR_ASSIGN_AFTER_in_expression21074	= { FOLLOW_BXOR_ASSIGN_AFTER_in_expression21074_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression21079  */
static	ANTLR3_BITWORD FOLLOW_expression_in_expression21079_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_expression21079	= { FOLLOW_expression_in_expression21079_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LSHIFT_ASSIGN_in_expression21088  */
static	ANTLR3_BITWORD FOLLOW_LSHIFT_ASSIGN_in_expression21088_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LSHIFT_ASSIGN_in_expression21088	= { FOLLOW_LSHIFT_ASSIGN_in_expression21088_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression21093  */
static	ANTLR3_BITWORD FOLLOW_expression_in_expression21093_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_expression21093	= { FOLLOW_expression_in_expression21093_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LSHIFT_ASSIGN_AFTER_in_expression21102  */
static	ANTLR3_BITWORD FOLLOW_LSHIFT_ASSIGN_AFTER_in_expression21102_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LSHIFT_ASSIGN_AFTER_in_expression21102	= { FOLLOW_LSHIFT_ASSIGN_AFTER_in_expression21102_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression21107  */
static	ANTLR3_BITWORD FOLLOW_expression_in_expression21107_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_expression21107	= { FOLLOW_expression_in_expression21107_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RSHIFT_ASSIGN_in_expression21116  */
static	ANTLR3_BITWORD FOLLOW_RSHIFT_ASSIGN_in_expression21116_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_RSHIFT_ASSIGN_in_expression21116	= { FOLLOW_RSHIFT_ASSIGN_in_expression21116_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression21121  */
static	ANTLR3_BITWORD FOLLOW_expression_in_expression21121_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_expression21121	= { FOLLOW_expression_in_expression21121_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RSHIFT_ASSIGN_AFTER_in_expression21130  */
static	ANTLR3_BITWORD FOLLOW_RSHIFT_ASSIGN_AFTER_in_expression21130_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_RSHIFT_ASSIGN_AFTER_in_expression21130	= { FOLLOW_RSHIFT_ASSIGN_AFTER_in_expression21130_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression21135  */
static	ANTLR3_BITWORD FOLLOW_expression_in_expression21135_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_expression21135	= { FOLLOW_expression_in_expression21135_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_OP_PUSH_in_expression21144  */
static	ANTLR3_BITWORD FOLLOW_OP_PUSH_in_expression21144_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_OP_PUSH_in_expression21144	= { FOLLOW_OP_PUSH_in_expression21144_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression21149  */
static	ANTLR3_BITWORD FOLLOW_expression_in_expression21149_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_expression21149	= { FOLLOW_expression_in_expression21149_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_OP_ASSIGN_TOP_in_expression21158  */
static	ANTLR3_BITWORD FOLLOW_OP_ASSIGN_TOP_in_expression21158_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_OP_ASSIGN_TOP_in_expression21158	= { FOLLOW_OP_ASSIGN_TOP_in_expression21158_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression21163  */
static	ANTLR3_BITWORD FOLLOW_expression_in_expression21163_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_expression21163	= { FOLLOW_expression_in_expression21163_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_OP_POP_in_expression21172  */
static	ANTLR3_BITWORD FOLLOW_OP_POP_in_expression21172_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_OP_POP_in_expression21172	= { FOLLOW_OP_POP_in_expression21172_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_expression21177  */
static	ANTLR3_BITWORD FOLLOW_expression_in_expression21177_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_expression21177	= { FOLLOW_expression_in_expression21177_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_scheduleExpression_in_conditionalExpression21205  */
static	ANTLR3_BITWORD FOLLOW_scheduleExpression_in_conditionalExpression21205_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0800000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_scheduleExpression_in_conditionalExpression21205	= { FOLLOW_scheduleExpression_in_conditionalExpression21205_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_QUESTION_in_conditionalExpression21215  */
static	ANTLR3_BITWORD FOLLOW_QUESTION_in_conditionalExpression21215_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_QUESTION_in_conditionalExpression21215	= { FOLLOW_QUESTION_in_conditionalExpression21215_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_conditionalExpression21220  */
static	ANTLR3_BITWORD FOLLOW_expression_in_conditionalExpression21220_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000200000) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_conditionalExpression21220	= { FOLLOW_expression_in_conditionalExpression21220_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COLON_in_conditionalExpression21223  */
static	ANTLR3_BITWORD FOLLOW_COLON_in_conditionalExpression21223_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_COLON_in_conditionalExpression21223	= { FOLLOW_COLON_in_conditionalExpression21223_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_conditionalExpression21228  */
static	ANTLR3_BITWORD FOLLOW_expression_in_conditionalExpression21228_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_conditionalExpression21228	= { FOLLOW_expression_in_conditionalExpression21228_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_conditionalOrExpression_in_scheduleExpression21256  */
static	ANTLR3_BITWORD FOLLOW_conditionalOrExpression_in_scheduleExpression21256_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0003FC9FFC000000) };
static  ANTLR3_BITSET_LIST FOLLOW_conditionalOrExpression_in_scheduleExpression21256	= { FOLLOW_conditionalOrExpression_in_scheduleExpression21256_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_op_sequence_in_scheduleExpression21270  */
static	ANTLR3_BITWORD FOLLOW_op_sequence_in_scheduleExpression21270_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_op_sequence_in_scheduleExpression21270	= { FOLLOW_op_sequence_in_scheduleExpression21270_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_op_scheduling_in_scheduleExpression21278  */
static	ANTLR3_BITWORD FOLLOW_op_scheduling_in_scheduleExpression21278_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_op_scheduling_in_scheduleExpression21278	= { FOLLOW_op_scheduling_in_scheduleExpression21278_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_op_concurrency_in_scheduleExpression21286  */
static	ANTLR3_BITWORD FOLLOW_op_concurrency_in_scheduleExpression21286_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_op_concurrency_in_scheduleExpression21286	= { FOLLOW_op_concurrency_in_scheduleExpression21286_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_conditionalOrExpression_in_scheduleExpression21297  */
static	ANTLR3_BITWORD FOLLOW_conditionalOrExpression_in_scheduleExpression21297_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0003FC9FFC000000) };
static  ANTLR3_BITSET_LIST FOLLOW_conditionalOrExpression_in_scheduleExpression21297	= { FOLLOW_conditionalOrExpression_in_scheduleExpression21297_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_conditionalAndExpression_in_conditionalOrExpression21323  */
static	ANTLR3_BITWORD FOLLOW_conditionalAndExpression_in_conditionalOrExpression21323_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000008) };
static  ANTLR3_BITSET_LIST FOLLOW_conditionalAndExpression_in_conditionalOrExpression21323	= { FOLLOW_conditionalAndExpression_in_conditionalOrExpression21323_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LOR_in_conditionalOrExpression21333  */
static	ANTLR3_BITWORD FOLLOW_LOR_in_conditionalOrExpression21333_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LOR_in_conditionalOrExpression21333	= { FOLLOW_LOR_in_conditionalOrExpression21333_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_conditionalAndExpression_in_conditionalOrExpression21337  */
static	ANTLR3_BITWORD FOLLOW_conditionalAndExpression_in_conditionalOrExpression21337_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000008) };
static  ANTLR3_BITSET_LIST FOLLOW_conditionalAndExpression_in_conditionalOrExpression21337	= { FOLLOW_conditionalAndExpression_in_conditionalOrExpression21337_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_bitwiseOrExpression_in_conditionalAndExpression21365  */
static	ANTLR3_BITWORD FOLLOW_bitwiseOrExpression_in_conditionalAndExpression21365_bits[]	= { ANTLR3_UINT64_LIT(0x0100000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_bitwiseOrExpression_in_conditionalAndExpression21365	= { FOLLOW_bitwiseOrExpression_in_conditionalAndExpression21365_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LAND_in_conditionalAndExpression21375  */
static	ANTLR3_BITWORD FOLLOW_LAND_in_conditionalAndExpression21375_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LAND_in_conditionalAndExpression21375	= { FOLLOW_LAND_in_conditionalAndExpression21375_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_bitwiseOrExpression_in_conditionalAndExpression21379  */
static	ANTLR3_BITWORD FOLLOW_bitwiseOrExpression_in_conditionalAndExpression21379_bits[]	= { ANTLR3_UINT64_LIT(0x0100000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_bitwiseOrExpression_in_conditionalAndExpression21379	= { FOLLOW_bitwiseOrExpression_in_conditionalAndExpression21379_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_bitwiseXorExpression_in_bitwiseOrExpression21407  */
static	ANTLR3_BITWORD FOLLOW_bitwiseXorExpression_in_bitwiseOrExpression21407_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000004002) };
static  ANTLR3_BITSET_LIST FOLLOW_bitwiseXorExpression_in_bitwiseOrExpression21407	= { FOLLOW_bitwiseXorExpression_in_bitwiseOrExpression21407_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_BOR_in_bitwiseOrExpression21417  */
static	ANTLR3_BITWORD FOLLOW_BOR_in_bitwiseOrExpression21417_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_BOR_in_bitwiseOrExpression21417	= { FOLLOW_BOR_in_bitwiseOrExpression21417_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_bitwiseXorExpression_in_bitwiseOrExpression21421  */
static	ANTLR3_BITWORD FOLLOW_bitwiseXorExpression_in_bitwiseOrExpression21421_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000004002) };
static  ANTLR3_BITSET_LIST FOLLOW_bitwiseXorExpression_in_bitwiseOrExpression21421	= { FOLLOW_bitwiseXorExpression_in_bitwiseOrExpression21421_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_bitwiseAndExpression_in_bitwiseXorExpression21449  */
static	ANTLR3_BITWORD FOLLOW_bitwiseAndExpression_in_bitwiseXorExpression21449_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000020002) };
static  ANTLR3_BITSET_LIST FOLLOW_bitwiseAndExpression_in_bitwiseXorExpression21449	= { FOLLOW_bitwiseAndExpression_in_bitwiseXorExpression21449_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_BXOR_in_bitwiseXorExpression21459  */
static	ANTLR3_BITWORD FOLLOW_BXOR_in_bitwiseXorExpression21459_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_BXOR_in_bitwiseXorExpression21459	= { FOLLOW_BXOR_in_bitwiseXorExpression21459_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_bitwiseAndExpression_in_bitwiseXorExpression21463  */
static	ANTLR3_BITWORD FOLLOW_bitwiseAndExpression_in_bitwiseXorExpression21463_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000020002) };
static  ANTLR3_BITSET_LIST FOLLOW_bitwiseAndExpression_in_bitwiseXorExpression21463	= { FOLLOW_bitwiseAndExpression_in_bitwiseXorExpression21463_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_equalityExpression_in_bitwiseAndExpression21491  */
static	ANTLR3_BITWORD FOLLOW_equalityExpression_in_bitwiseAndExpression21491_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000202) };
static  ANTLR3_BITSET_LIST FOLLOW_equalityExpression_in_bitwiseAndExpression21491	= { FOLLOW_equalityExpression_in_bitwiseAndExpression21491_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_BAND_in_bitwiseAndExpression21501  */
static	ANTLR3_BITWORD FOLLOW_BAND_in_bitwiseAndExpression21501_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_BAND_in_bitwiseAndExpression21501	= { FOLLOW_BAND_in_bitwiseAndExpression21501_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_equalityExpression_in_bitwiseAndExpression21505  */
static	ANTLR3_BITWORD FOLLOW_equalityExpression_in_bitwiseAndExpression21505_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000202) };
static  ANTLR3_BITSET_LIST FOLLOW_equalityExpression_in_bitwiseAndExpression21505	= { FOLLOW_equalityExpression_in_bitwiseAndExpression21505_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_relationalExpression_in_equalityExpression21537  */
static	ANTLR3_BITWORD FOLLOW_relationalExpression_in_equalityExpression21537_bits[]	= { ANTLR3_UINT64_LIT(0x0000008000000002), ANTLR3_UINT64_LIT(0x0000000000600000), ANTLR3_UINT64_LIT(0x0000000000000100) };
static  ANTLR3_BITSET_LIST FOLLOW_relationalExpression_in_equalityExpression21537	= { FOLLOW_relationalExpression_in_equalityExpression21537_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_equalOp_in_equalityExpression21549  */
static	ANTLR3_BITWORD FOLLOW_equalOp_in_equalityExpression21549_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_equalOp_in_equalityExpression21549	= { FOLLOW_equalOp_in_equalityExpression21549_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_relationalExpression_in_equalityExpression21553  */
static	ANTLR3_BITWORD FOLLOW_relationalExpression_in_equalityExpression21553_bits[]	= { ANTLR3_UINT64_LIT(0x0000008000000002), ANTLR3_UINT64_LIT(0x0000000000600000), ANTLR3_UINT64_LIT(0x0000000000000100) };
static  ANTLR3_BITSET_LIST FOLLOW_relationalExpression_in_equalityExpression21553	= { FOLLOW_relationalExpression_in_equalityExpression21553_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_equalOp_in_equalityExpression21569  */
static	ANTLR3_BITWORD FOLLOW_equalOp_in_equalityExpression21569_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_equalOp_in_equalityExpression21569	= { FOLLOW_equalOp_in_equalityExpression21569_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_relationalExpression_in_equalityExpression21573  */
static	ANTLR3_BITWORD FOLLOW_relationalExpression_in_equalityExpression21573_bits[]	= { ANTLR3_UINT64_LIT(0x0000008000000002), ANTLR3_UINT64_LIT(0x0000000000600000), ANTLR3_UINT64_LIT(0x0000000000000100) };
static  ANTLR3_BITSET_LIST FOLLOW_relationalExpression_in_equalityExpression21573	= { FOLLOW_relationalExpression_in_equalityExpression21573_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_EQUAL_in_equalOp21614  */
static	ANTLR3_BITWORD FOLLOW_EQUAL_in_equalOp21614_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_EQUAL_in_equalOp21614	= { FOLLOW_EQUAL_in_equalOp21614_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_NEQUAL_in_equalOp21623  */
static	ANTLR3_BITWORD FOLLOW_NEQUAL_in_equalOp21623_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_NEQUAL_in_equalOp21623	= { FOLLOW_NEQUAL_in_equalOp21623_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEQUAL_in_equalOp21631  */
static	ANTLR3_BITWORD FOLLOW_SEQUAL_in_equalOp21631_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEQUAL_in_equalOp21631	= { FOLLOW_SEQUAL_in_equalOp21631_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_NSEQUAL_in_equalOp21639  */
static	ANTLR3_BITWORD FOLLOW_NSEQUAL_in_equalOp21639_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_NSEQUAL_in_equalOp21639	= { FOLLOW_NSEQUAL_in_equalOp21639_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_shiftExpression_in_relationalExpression21663  */
static	ANTLR3_BITWORD FOLLOW_shiftExpression_in_relationalExpression21663_bits[]	= { ANTLR3_UINT64_LIT(0x0000600000000002), ANTLR3_UINT64_LIT(0x0000000000003000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000008000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_shiftExpression_in_relationalExpression21663	= { FOLLOW_shiftExpression_in_relationalExpression21663_bits, 5	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_relationalOp_in_relationalExpression21675  */
static	ANTLR3_BITWORD FOLLOW_relationalOp_in_relationalExpression21675_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_relationalOp_in_relationalExpression21675	= { FOLLOW_relationalOp_in_relationalExpression21675_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_shiftExpression_in_relationalExpression21679  */
static	ANTLR3_BITWORD FOLLOW_shiftExpression_in_relationalExpression21679_bits[]	= { ANTLR3_UINT64_LIT(0x0000600000000002), ANTLR3_UINT64_LIT(0x0000000000003000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000008000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_shiftExpression_in_relationalExpression21679	= { FOLLOW_shiftExpression_in_relationalExpression21679_bits, 5	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_relationalOp_in_relationalExpression21695  */
static	ANTLR3_BITWORD FOLLOW_relationalOp_in_relationalExpression21695_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_relationalOp_in_relationalExpression21695	= { FOLLOW_relationalOp_in_relationalExpression21695_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_shiftExpression_in_relationalExpression21699  */
static	ANTLR3_BITWORD FOLLOW_shiftExpression_in_relationalExpression21699_bits[]	= { ANTLR3_UINT64_LIT(0x0000600000000002), ANTLR3_UINT64_LIT(0x0000000000003000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000008000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_shiftExpression_in_relationalExpression21699	= { FOLLOW_shiftExpression_in_relationalExpression21699_bits, 5	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LTE_in_relationalOp21740  */
static	ANTLR3_BITWORD FOLLOW_LTE_in_relationalOp21740_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_LTE_in_relationalOp21740	= { FOLLOW_LTE_in_relationalOp21740_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_GTE_in_relationalOp21748  */
static	ANTLR3_BITWORD FOLLOW_GTE_in_relationalOp21748_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_GTE_in_relationalOp21748	= { FOLLOW_GTE_in_relationalOp21748_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LT__in_relationalOp21756  */
static	ANTLR3_BITWORD FOLLOW_LT__in_relationalOp21756_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_LT__in_relationalOp21756	= { FOLLOW_LT__in_relationalOp21756_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_GT_in_relationalOp21764  */
static	ANTLR3_BITWORD FOLLOW_GT_in_relationalOp21764_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_GT_in_relationalOp21764	= { FOLLOW_GT_in_relationalOp21764_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_295_in_relationalOp21774  */
static	ANTLR3_BITWORD FOLLOW_295_in_relationalOp21774_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_295_in_relationalOp21774	= { FOLLOW_295_in_relationalOp21774_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_additiveExpression_in_shiftExpression21806  */
static	ANTLR3_BITWORD FOLLOW_additiveExpression_in_shiftExpression21806_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000200), ANTLR3_UINT64_LIT(0x0000000000000008) };
static  ANTLR3_BITSET_LIST FOLLOW_additiveExpression_in_shiftExpression21806	= { FOLLOW_additiveExpression_in_shiftExpression21806_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_shiftOp_in_shiftExpression21818  */
static	ANTLR3_BITWORD FOLLOW_shiftOp_in_shiftExpression21818_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_shiftOp_in_shiftExpression21818	= { FOLLOW_shiftOp_in_shiftExpression21818_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_additiveExpression_in_shiftExpression21822  */
static	ANTLR3_BITWORD FOLLOW_additiveExpression_in_shiftExpression21822_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0000000000000200), ANTLR3_UINT64_LIT(0x0000000000000008) };
static  ANTLR3_BITSET_LIST FOLLOW_additiveExpression_in_shiftExpression21822	= { FOLLOW_additiveExpression_in_shiftExpression21822_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LSHIFT_in_shiftOp21849  */
static	ANTLR3_BITWORD FOLLOW_LSHIFT_in_shiftOp21849_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_LSHIFT_in_shiftOp21849	= { FOLLOW_LSHIFT_in_shiftOp21849_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RSHIFT_in_shiftOp21857  */
static	ANTLR3_BITWORD FOLLOW_RSHIFT_in_shiftOp21857_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RSHIFT_in_shiftOp21857	= { FOLLOW_RSHIFT_in_shiftOp21857_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_multiplicativeExpression_in_additiveExpression21882  */
static	ANTLR3_BITWORD FOLLOW_multiplicativeExpression_in_additiveExpression21882_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0100000000008000) };
static  ANTLR3_BITSET_LIST FOLLOW_multiplicativeExpression_in_additiveExpression21882	= { FOLLOW_multiplicativeExpression_in_additiveExpression21882_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_PLUS_in_additiveExpression21894  */
static	ANTLR3_BITWORD FOLLOW_PLUS_in_additiveExpression21894_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_PLUS_in_additiveExpression21894	= { FOLLOW_PLUS_in_additiveExpression21894_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_MINUS_in_additiveExpression21906  */
static	ANTLR3_BITWORD FOLLOW_MINUS_in_additiveExpression21906_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_MINUS_in_additiveExpression21906	= { FOLLOW_MINUS_in_additiveExpression21906_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_multiplicativeExpression_in_additiveExpression21924  */
static	ANTLR3_BITWORD FOLLOW_multiplicativeExpression_in_additiveExpression21924_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002), ANTLR3_UINT64_LIT(0x0100000000008000) };
static  ANTLR3_BITSET_LIST FOLLOW_multiplicativeExpression_in_additiveExpression21924	= { FOLLOW_multiplicativeExpression_in_additiveExpression21924_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_unaryExpression_in_multiplicativeExpression21958  */
static	ANTLR3_BITWORD FOLLOW_unaryExpression_in_multiplicativeExpression21958_bits[]	= { ANTLR3_UINT64_LIT(0x0000000010000002), ANTLR3_UINT64_LIT(0x0000000000040000), ANTLR3_UINT64_LIT(0x0000000000000200) };
static  ANTLR3_BITSET_LIST FOLLOW_unaryExpression_in_multiplicativeExpression21958	= { FOLLOW_unaryExpression_in_multiplicativeExpression21958_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_STAR_in_multiplicativeExpression21970  */
static	ANTLR3_BITWORD FOLLOW_STAR_in_multiplicativeExpression21970_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_STAR_in_multiplicativeExpression21970	= { FOLLOW_STAR_in_multiplicativeExpression21970_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_DIV_in_multiplicativeExpression21981  */
static	ANTLR3_BITWORD FOLLOW_DIV_in_multiplicativeExpression21981_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_DIV_in_multiplicativeExpression21981	= { FOLLOW_DIV_in_multiplicativeExpression21981_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_MOD_in_multiplicativeExpression21993  */
static	ANTLR3_BITWORD FOLLOW_MOD_in_multiplicativeExpression21993_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_MOD_in_multiplicativeExpression21993	= { FOLLOW_MOD_in_multiplicativeExpression21993_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_unaryExpression_in_multiplicativeExpression22012  */
static	ANTLR3_BITWORD FOLLOW_unaryExpression_in_multiplicativeExpression22012_bits[]	= { ANTLR3_UINT64_LIT(0x0000000010000002), ANTLR3_UINT64_LIT(0x0000000000040000), ANTLR3_UINT64_LIT(0x0000000000000200) };
static  ANTLR3_BITSET_LIST FOLLOW_unaryExpression_in_multiplicativeExpression22012	= { FOLLOW_unaryExpression_in_multiplicativeExpression22012_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_PLUS_in_unaryExpression22042  */
static	ANTLR3_BITWORD FOLLOW_PLUS_in_unaryExpression22042_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_PLUS_in_unaryExpression22042	= { FOLLOW_PLUS_in_unaryExpression22042_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_unaryExpression_in_unaryExpression22047  */
static	ANTLR3_BITWORD FOLLOW_unaryExpression_in_unaryExpression22047_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_unaryExpression_in_unaryExpression22047	= { FOLLOW_unaryExpression_in_unaryExpression22047_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_MINUS_in_unaryExpression22056  */
static	ANTLR3_BITWORD FOLLOW_MINUS_in_unaryExpression22056_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_MINUS_in_unaryExpression22056	= { FOLLOW_MINUS_in_unaryExpression22056_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_unaryExpression_in_unaryExpression22060  */
static	ANTLR3_BITWORD FOLLOW_unaryExpression_in_unaryExpression22060_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_unaryExpression_in_unaryExpression22060	= { FOLLOW_unaryExpression_in_unaryExpression22060_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_INCR_in_unaryExpression22069  */
static	ANTLR3_BITWORD FOLLOW_INCR_in_unaryExpression22069_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_INCR_in_unaryExpression22069	= { FOLLOW_INCR_in_unaryExpression22069_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_unaryExpression_in_unaryExpression22074  */
static	ANTLR3_BITWORD FOLLOW_unaryExpression_in_unaryExpression22074_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_unaryExpression_in_unaryExpression22074	= { FOLLOW_unaryExpression_in_unaryExpression22074_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_DECR_in_unaryExpression22082  */
static	ANTLR3_BITWORD FOLLOW_DECR_in_unaryExpression22082_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_DECR_in_unaryExpression22082	= { FOLLOW_DECR_in_unaryExpression22082_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_unaryExpression_in_unaryExpression22087  */
static	ANTLR3_BITWORD FOLLOW_unaryExpression_in_unaryExpression22087_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_unaryExpression_in_unaryExpression22087	= { FOLLOW_unaryExpression_in_unaryExpression22087_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LNOT_in_unaryExpression22096  */
static	ANTLR3_BITWORD FOLLOW_LNOT_in_unaryExpression22096_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LNOT_in_unaryExpression22096	= { FOLLOW_LNOT_in_unaryExpression22096_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_unaryExpression_in_unaryExpression22100  */
static	ANTLR3_BITWORD FOLLOW_unaryExpression_in_unaryExpression22100_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_unaryExpression_in_unaryExpression22100	= { FOLLOW_unaryExpression_in_unaryExpression22100_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_BNOT_in_unaryExpression22109  */
static	ANTLR3_BITWORD FOLLOW_BNOT_in_unaryExpression22109_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_BNOT_in_unaryExpression22109	= { FOLLOW_BNOT_in_unaryExpression22109_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_unaryExpression_in_unaryExpression22113  */
static	ANTLR3_BITWORD FOLLOW_unaryExpression_in_unaryExpression22113_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_unaryExpression_in_unaryExpression22113	= { FOLLOW_unaryExpression_in_unaryExpression22113_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_OP_POP_in_unaryExpression22122  */
static	ANTLR3_BITWORD FOLLOW_OP_POP_in_unaryExpression22122_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_OP_POP_in_unaryExpression22122	= { FOLLOW_OP_POP_in_unaryExpression22122_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_unaryExpression_in_unaryExpression22128  */
static	ANTLR3_BITWORD FOLLOW_unaryExpression_in_unaryExpression22128_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_unaryExpression_in_unaryExpression22128	= { FOLLOW_unaryExpression_in_unaryExpression22128_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_OP_TOP_in_unaryExpression22137  */
static	ANTLR3_BITWORD FOLLOW_OP_TOP_in_unaryExpression22137_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_OP_TOP_in_unaryExpression22137	= { FOLLOW_OP_TOP_in_unaryExpression22137_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_unaryExpression_in_unaryExpression22143  */
static	ANTLR3_BITWORD FOLLOW_unaryExpression_in_unaryExpression22143_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_unaryExpression_in_unaryExpression22143	= { FOLLOW_unaryExpression_in_unaryExpression22143_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_prefix_expression_in_unaryExpression22158  */
static	ANTLR3_BITWORD FOLLOW_prefix_expression_in_unaryExpression22158_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_prefix_expression_in_unaryExpression22158	= { FOLLOW_prefix_expression_in_unaryExpression22158_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_invoke_in_unaryExpression22178  */
static	ANTLR3_BITWORD FOLLOW_expression_invoke_in_unaryExpression22178_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_invoke_in_unaryExpression22178	= { FOLLOW_expression_invoke_in_unaryExpression22178_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_activity_new_in_unaryExpression22198  */
static	ANTLR3_BITWORD FOLLOW_expression_activity_new_in_unaryExpression22198_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_activity_new_in_unaryExpression22198	= { FOLLOW_expression_activity_new_in_unaryExpression22198_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_com_in_unaryExpression22213  */
static	ANTLR3_BITWORD FOLLOW_expression_com_in_unaryExpression22213_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_com_in_unaryExpression22213	= { FOLLOW_expression_com_in_unaryExpression22213_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_guard_in_unaryExpression22235  */
static	ANTLR3_BITWORD FOLLOW_expression_guard_in_unaryExpression22235_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_guard_in_unaryExpression22235	= { FOLLOW_expression_guard_in_unaryExpression22235_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_ite_in_unaryExpression22255  */
static	ANTLR3_BITWORD FOLLOW_expression_ite_in_unaryExpression22255_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_ite_in_unaryExpression22255	= { FOLLOW_expression_ite_in_unaryExpression22255_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_lambda_in_unaryExpression22277  */
static	ANTLR3_BITWORD FOLLOW_expression_lambda_in_unaryExpression22277_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_lambda_in_unaryExpression22277	= { FOLLOW_expression_lambda_in_unaryExpression22277_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ctorExpression_in_unaryExpression22301  */
static	ANTLR3_BITWORD FOLLOW_ctorExpression_in_unaryExpression22301_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_ctorExpression_in_unaryExpression22301	= { FOLLOW_ctorExpression_in_unaryExpression22301_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_primary_in_unaryExpression22324  */
static	ANTLR3_BITWORD FOLLOW_primary_in_unaryExpression22324_bits[]	= { ANTLR3_UINT64_LIT(0x0008000004000002) };
static  ANTLR3_BITSET_LIST FOLLOW_primary_in_unaryExpression22324	= { FOLLOW_primary_in_unaryExpression22324_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_INCR_in_unaryExpression22353  */
static	ANTLR3_BITWORD FOLLOW_INCR_in_unaryExpression22353_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_INCR_in_unaryExpression22353	= { FOLLOW_INCR_in_unaryExpression22353_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_DECR_in_unaryExpression22364  */
static	ANTLR3_BITWORD FOLLOW_DECR_in_unaryExpression22364_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_DECR_in_unaryExpression22364	= { FOLLOW_DECR_in_unaryExpression22364_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_literal_in_unaryExpression22382  */
static	ANTLR3_BITWORD FOLLOW_literal_in_unaryExpression22382_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_literal_in_unaryExpression22382	= { FOLLOW_literal_in_unaryExpression22382_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_quote_expression_in_unaryExpression22412  */
static	ANTLR3_BITWORD FOLLOW_quote_expression_in_unaryExpression22412_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_quote_expression_in_unaryExpression22412	= { FOLLOW_quote_expression_in_unaryExpression22412_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_meta_eval_expression_in_unaryExpression22433  */
static	ANTLR3_BITWORD FOLLOW_meta_eval_expression_in_unaryExpression22433_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_meta_eval_expression_in_unaryExpression22433	= { FOLLOW_meta_eval_expression_in_unaryExpression22433_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LPAREN_in_unaryExpression22448  */
static	ANTLR3_BITWORD FOLLOW_LPAREN_in_unaryExpression22448_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LPAREN_in_unaryExpression22448	= { FOLLOW_LPAREN_in_unaryExpression22448_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_unaryExpression22453  */
static	ANTLR3_BITWORD FOLLOW_expression_in_unaryExpression22453_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_unaryExpression22453	= { FOLLOW_expression_in_unaryExpression22453_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RPAREN_in_unaryExpression22456  */
static	ANTLR3_BITWORD FOLLOW_RPAREN_in_unaryExpression22456_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RPAREN_in_unaryExpression22456	= { FOLLOW_RPAREN_in_unaryExpression22456_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_collection_of_expression_in_unaryExpression22467  */
static	ANTLR3_BITWORD FOLLOW_collection_of_expression_in_unaryExpression22467_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_collection_of_expression_in_unaryExpression22467	= { FOLLOW_collection_of_expression_in_unaryExpression22467_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_265_in_ctorExpression22488  */
static	ANTLR3_BITWORD FOLLOW_265_in_ctorExpression22488_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_265_in_ctorExpression22488	= { FOLLOW_265_in_ctorExpression22488_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LT__in_ctorExpression22490  */
static	ANTLR3_BITWORD FOLLOW_LT__in_ctorExpression22490_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xC266000000000000), ANTLR3_UINT64_LIT(0x38E000000A00C128), ANTLR3_UINT64_LIT(0x0064016007002261), ANTLR3_UINT64_LIT(0x0000000013A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_LT__in_ctorExpression22490	= { FOLLOW_LT__in_ctorExpression22490_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_type_var_in_ctorExpression22495  */
static	ANTLR3_BITWORD FOLLOW_type_var_in_ctorExpression22495_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_type_var_in_ctorExpression22495	= { FOLLOW_type_var_in_ctorExpression22495_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_GT_in_ctorExpression22498  */
static	ANTLR3_BITWORD FOLLOW_GT_in_ctorExpression22498_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_GT_in_ctorExpression22498	= { FOLLOW_GT_in_ctorExpression22498_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LPAREN_in_ctorExpression22501  */
static	ANTLR3_BITWORD FOLLOW_LPAREN_in_ctorExpression22501_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LPAREN_in_ctorExpression22501	= { FOLLOW_LPAREN_in_ctorExpression22501_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_ctorExpression22506  */
static	ANTLR3_BITWORD FOLLOW_expression_in_ctorExpression22506_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_ctorExpression22506	= { FOLLOW_expression_in_ctorExpression22506_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RPAREN_in_ctorExpression22509  */
static	ANTLR3_BITWORD FOLLOW_RPAREN_in_ctorExpression22509_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RPAREN_in_ctorExpression22509	= { FOLLOW_RPAREN_in_ctorExpression22509_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_PERCENT_LCURLY_in_quote_expression22532  */
static	ANTLR3_BITWORD FOLLOW_PERCENT_LCURLY_in_quote_expression22532_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_PERCENT_LCURLY_in_quote_expression22532	= { FOLLOW_PERCENT_LCURLY_in_quote_expression22532_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_quote_expression22537  */
static	ANTLR3_BITWORD FOLLOW_expression_in_quote_expression22537_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x8000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_quote_expression22537	= { FOLLOW_expression_in_quote_expression22537_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_PERCENT_in_quote_expression22540  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_PERCENT_in_quote_expression22540_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_PERCENT_in_quote_expression22540	= { FOLLOW_RCURLY_PERCENT_in_quote_expression22540_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LBRACKET_BAR_in_meta_eval_expression22559  */
static	ANTLR3_BITWORD FOLLOW_LBRACKET_BAR_in_meta_eval_expression22559_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LBRACKET_BAR_in_meta_eval_expression22559	= { FOLLOW_LBRACKET_BAR_in_meta_eval_expression22559_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_meta_eval_expression22564  */
static	ANTLR3_BITWORD FOLLOW_expression_in_meta_eval_expression22564_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000001000) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_meta_eval_expression22564	= { FOLLOW_expression_in_meta_eval_expression22564_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_BAR_RBRACKET_in_meta_eval_expression22567  */
static	ANTLR3_BITWORD FOLLOW_BAR_RBRACKET_in_meta_eval_expression22567_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_BAR_RBRACKET_in_meta_eval_expression22567	= { FOLLOW_BAR_RBRACKET_in_meta_eval_expression22567_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_primary22594  */
static	ANTLR3_BITWORD FOLLOW_ID_in_primary22594_bits[]	= { ANTLR3_UINT64_LIT(0x1000000200400002), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_primary22594	= { FOLLOW_ID_in_primary22594_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_primary_invoke_in_primary22619  */
static	ANTLR3_BITWORD FOLLOW_primary_invoke_in_primary22619_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_primary_invoke_in_primary22619	= { FOLLOW_primary_invoke_in_primary22619_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_primary_ufid_in_primary22649  */
static	ANTLR3_BITWORD FOLLOW_primary_ufid_in_primary22649_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_primary_ufid_in_primary22649	= { FOLLOW_primary_ufid_in_primary22649_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_primary_ufi_in_primary22681  */
static	ANTLR3_BITWORD FOLLOW_primary_ufi_in_primary22681_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_primary_ufi_in_primary22681	= { FOLLOW_primary_ufi_in_primary22681_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_primary_ufi_in_primary22708  */
static	ANTLR3_BITWORD FOLLOW_primary_ufi_in_primary22708_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_primary_ufi_in_primary22708	= { FOLLOW_primary_ufi_in_primary22708_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_DOT_in_primary_ufid22738  */
static	ANTLR3_BITWORD FOLLOW_DOT_in_primary_ufid22738_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_DOT_in_primary_ufid22738	= { FOLLOW_DOT_in_primary_ufid22738_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_primary_ufid22742  */
static	ANTLR3_BITWORD FOLLOW_ID_in_primary_ufid22742_bits[]	= { ANTLR3_UINT64_LIT(0x1000000200000002) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_primary_ufid22742	= { FOLLOW_ID_in_primary_ufid22742_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LBRACKET_in_primary_ufid22761  */
static	ANTLR3_BITWORD FOLLOW_LBRACKET_in_primary_ufid22761_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LBRACKET_in_primary_ufid22761	= { FOLLOW_LBRACKET_in_primary_ufid22761_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_primary_ufid22766  */
static	ANTLR3_BITWORD FOLLOW_expression_in_primary_ufid22766_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x1000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_primary_ufid22766	= { FOLLOW_expression_in_primary_ufid22766_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RBRACKET_in_primary_ufid22769  */
static	ANTLR3_BITWORD FOLLOW_RBRACKET_in_primary_ufid22769_bits[]	= { ANTLR3_UINT64_LIT(0x1000000200000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RBRACKET_in_primary_ufid22769	= { FOLLOW_RBRACKET_in_primary_ufid22769_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COLONx2_in_primary_ufi22815  */
static	ANTLR3_BITWORD FOLLOW_COLONx2_in_primary_ufi22815_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_COLONx2_in_primary_ufi22815	= { FOLLOW_COLONx2_in_primary_ufi22815_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_primary_ufi22819  */
static	ANTLR3_BITWORD FOLLOW_ID_in_primary_ufi22819_bits[]	= { ANTLR3_UINT64_LIT(0x1000000200000000) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_primary_ufi22819	= { FOLLOW_ID_in_primary_ufi22819_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_DOT_in_primary_ufi22834  */
static	ANTLR3_BITWORD FOLLOW_DOT_in_primary_ufi22834_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_DOT_in_primary_ufi22834	= { FOLLOW_DOT_in_primary_ufi22834_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_primary_ufi22838  */
static	ANTLR3_BITWORD FOLLOW_ID_in_primary_ufi22838_bits[]	= { ANTLR3_UINT64_LIT(0x1000000200000002) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_primary_ufi22838	= { FOLLOW_ID_in_primary_ufi22838_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LBRACKET_in_primary_ufi22857  */
static	ANTLR3_BITWORD FOLLOW_LBRACKET_in_primary_ufi22857_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LBRACKET_in_primary_ufi22857	= { FOLLOW_LBRACKET_in_primary_ufi22857_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_primary_ufi22862  */
static	ANTLR3_BITWORD FOLLOW_expression_in_primary_ufi22862_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x1000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_primary_ufi22862	= { FOLLOW_expression_in_primary_ufi22862_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RBRACKET_in_primary_ufi22865  */
static	ANTLR3_BITWORD FOLLOW_RBRACKET_in_primary_ufi22865_bits[]	= { ANTLR3_UINT64_LIT(0x1000000200000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RBRACKET_in_primary_ufi22865	= { FOLLOW_RBRACKET_in_primary_ufi22865_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LPAREN_in_primary_invoke22915  */
static	ANTLR3_BITWORD FOLLOW_LPAREN_in_primary_invoke22915_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002042), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LPAREN_in_primary_invoke22915	= { FOLLOW_LPAREN_in_primary_invoke22915_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_labelled_argument_in_primary_invoke22924  */
static	ANTLR3_BITWORD FOLLOW_labelled_argument_in_primary_invoke22924_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_labelled_argument_in_primary_invoke22924	= { FOLLOW_labelled_argument_in_primary_invoke22924_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_primary_invoke22940  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_primary_invoke22940_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_primary_invoke22940	= { FOLLOW_COMMA_in_primary_invoke22940_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_labelled_argument_in_primary_invoke22949  */
static	ANTLR3_BITWORD FOLLOW_labelled_argument_in_primary_invoke22949_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_labelled_argument_in_primary_invoke22949	= { FOLLOW_labelled_argument_in_primary_invoke22949_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RPAREN_in_primary_invoke22975  */
static	ANTLR3_BITWORD FOLLOW_RPAREN_in_primary_invoke22975_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RPAREN_in_primary_invoke22975	= { FOLLOW_RPAREN_in_primary_invoke22975_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_IntegerLiteral_in_literal22997  */
static	ANTLR3_BITWORD FOLLOW_IntegerLiteral_in_literal22997_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_IntegerLiteral_in_literal22997	= { FOLLOW_IntegerLiteral_in_literal22997_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RationalLiteral_in_literal23005  */
static	ANTLR3_BITWORD FOLLOW_RationalLiteral_in_literal23005_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RationalLiteral_in_literal23005	= { FOLLOW_RationalLiteral_in_literal23005_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_FloatLiteral_in_literal23012  */
static	ANTLR3_BITWORD FOLLOW_FloatLiteral_in_literal23012_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_FloatLiteral_in_literal23012	= { FOLLOW_FloatLiteral_in_literal23012_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_CharLiteral_in_literal23023  */
static	ANTLR3_BITWORD FOLLOW_CharLiteral_in_literal23023_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_CharLiteral_in_literal23023	= { FOLLOW_CharLiteral_in_literal23023_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_StringLiteral_in_literal23034  */
static	ANTLR3_BITWORD FOLLOW_StringLiteral_in_literal23034_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_StringLiteral_in_literal23034	= { FOLLOW_StringLiteral_in_literal23034_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_397_in_literal23044  */
static	ANTLR3_BITWORD FOLLOW_397_in_literal23044_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_397_in_literal23044	= { FOLLOW_397_in_literal23044_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_280_in_literal23053  */
static	ANTLR3_BITWORD FOLLOW_280_in_literal23053_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_280_in_literal23053	= { FOLLOW_280_in_literal23053_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_372_in_literal23062  */
static	ANTLR3_BITWORD FOLLOW_372_in_literal23062_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_372_in_literal23062	= { FOLLOW_372_in_literal23062_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_343_in_literal23071  */
static	ANTLR3_BITWORD FOLLOW_343_in_literal23071_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_343_in_literal23071	= { FOLLOW_343_in_literal23071_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_277_in_literal23078  */
static	ANTLR3_BITWORD FOLLOW_277_in_literal23078_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_277_in_literal23078	= { FOLLOW_277_in_literal23078_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_162_in_literal23089  */
static	ANTLR3_BITWORD FOLLOW_162_in_literal23089_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_162_in_literal23089	= { FOLLOW_162_in_literal23089_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_160_in_literal23098  */
static	ANTLR3_BITWORD FOLLOW_160_in_literal23098_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_160_in_literal23098	= { FOLLOW_160_in_literal23098_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_159_in_literal23107  */
static	ANTLR3_BITWORD FOLLOW_159_in_literal23107_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_159_in_literal23107	= { FOLLOW_159_in_literal23107_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_161_in_literal23114  */
static	ANTLR3_BITWORD FOLLOW_161_in_literal23114_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_161_in_literal23114	= { FOLLOW_161_in_literal23114_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_158_in_literal23122  */
static	ANTLR3_BITWORD FOLLOW_158_in_literal23122_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_158_in_literal23122	= { FOLLOW_158_in_literal23122_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_332_in_literal23133  */
static	ANTLR3_BITWORD FOLLOW_332_in_literal23133_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2200000000000000), ANTLR3_UINT64_LIT(0x2000000000000000), ANTLR3_UINT64_LIT(0x0040000001000001) };
static  ANTLR3_BITSET_LIST FOLLOW_332_in_literal23133	= { FOLLOW_332_in_literal23133_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_317_in_literal23141  */
static	ANTLR3_BITWORD FOLLOW_317_in_literal23141_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_317_in_literal23141	= { FOLLOW_317_in_literal23141_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_253_in_literal23152  */
static	ANTLR3_BITWORD FOLLOW_253_in_literal23152_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_253_in_literal23152	= { FOLLOW_253_in_literal23152_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_344_in_literal23163  */
static	ANTLR3_BITWORD FOLLOW_344_in_literal23163_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_344_in_literal23163	= { FOLLOW_344_in_literal23163_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_374_in_literal23177  */
static	ANTLR3_BITWORD FOLLOW_374_in_literal23177_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_374_in_literal23177	= { FOLLOW_374_in_literal23177_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_320_in_literal23189  */
static	ANTLR3_BITWORD FOLLOW_320_in_literal23189_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_320_in_literal23189	= { FOLLOW_320_in_literal23189_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_249_in_literal23200  */
static	ANTLR3_BITWORD FOLLOW_249_in_literal23200_bits[]	= { ANTLR3_UINT64_LIT(0x0000200000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_249_in_literal23200	= { FOLLOW_249_in_literal23200_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_GT_in_literal23212  */
static	ANTLR3_BITWORD FOLLOW_GT_in_literal23212_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_GT_in_literal23212	= { FOLLOW_GT_in_literal23212_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_331_in_literal23217  */
static	ANTLR3_BITWORD FOLLOW_331_in_literal23217_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_331_in_literal23217	= { FOLLOW_331_in_literal23217_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_collection_of_expression23246  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_collection_of_expression23246_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_collection_of_expression23246	= { FOLLOW_LCURLY_in_collection_of_expression23246_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_collection_of_expression23255  */
static	ANTLR3_BITWORD FOLLOW_expression_in_collection_of_expression23255_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x2000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_collection_of_expression23255	= { FOLLOW_expression_in_collection_of_expression23255_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_collection_of_expression23275  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_collection_of_expression23275_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_collection_of_expression23275	= { FOLLOW_COMMA_in_collection_of_expression23275_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_collection_of_expression23279  */
static	ANTLR3_BITWORD FOLLOW_expression_in_collection_of_expression23279_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x2000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_collection_of_expression23279	= { FOLLOW_expression_in_collection_of_expression23279_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_collection_of_expression23290  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_collection_of_expression23290_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_collection_of_expression23290	= { FOLLOW_RCURLY_in_collection_of_expression23290_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LBRACKET_in_collection_of_expression23301  */
static	ANTLR3_BITWORD FOLLOW_LBRACKET_in_collection_of_expression23301_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LBRACKET_in_collection_of_expression23301	= { FOLLOW_LBRACKET_in_collection_of_expression23301_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_collection_of_expression23310  */
static	ANTLR3_BITWORD FOLLOW_expression_in_collection_of_expression23310_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x1000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_collection_of_expression23310	= { FOLLOW_expression_in_collection_of_expression23310_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_collection_of_expression23330  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_collection_of_expression23330_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_collection_of_expression23330	= { FOLLOW_COMMA_in_collection_of_expression23330_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_collection_of_expression23334  */
static	ANTLR3_BITWORD FOLLOW_expression_in_collection_of_expression23334_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x1000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_collection_of_expression23334	= { FOLLOW_expression_in_collection_of_expression23334_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RBRACKET_in_collection_of_expression23345  */
static	ANTLR3_BITWORD FOLLOW_RBRACKET_in_collection_of_expression23345_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RBRACKET_in_collection_of_expression23345	= { FOLLOW_RBRACKET_in_collection_of_expression23345_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_406_in_synpred21_fml531  */
static	ANTLR3_BITWORD FOLLOW_406_in_synpred21_fml531_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_406_in_synpred21_fml531	= { FOLLOW_406_in_synpred21_fml531_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_322_in_synpred56_fml1127  */
static	ANTLR3_BITWORD FOLLOW_322_in_synpred56_fml1127_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_322_in_synpred56_fml1127	= { FOLLOW_322_in_synpred56_fml1127_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_353_in_synpred57_fml1144  */
static	ANTLR3_BITWORD FOLLOW_353_in_synpred57_fml1144_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_353_in_synpred57_fml1144	= { FOLLOW_353_in_synpred57_fml1144_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_272_in_synpred58_fml1158  */
static	ANTLR3_BITWORD FOLLOW_272_in_synpred58_fml1158_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_272_in_synpred58_fml1158	= { FOLLOW_272_in_synpred58_fml1158_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_406_in_synpred59_fml1181  */
static	ANTLR3_BITWORD FOLLOW_406_in_synpred59_fml1181_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_406_in_synpred59_fml1181	= { FOLLOW_406_in_synpred59_fml1181_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_393_in_synpred60_fml1198  */
static	ANTLR3_BITWORD FOLLOW_393_in_synpred60_fml1198_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_393_in_synpred60_fml1198	= { FOLLOW_393_in_synpred60_fml1198_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_306_in_synpred61_fml1215  */
static	ANTLR3_BITWORD FOLLOW_306_in_synpred61_fml1215_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_306_in_synpred61_fml1215	= { FOLLOW_306_in_synpred61_fml1215_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_314_in_synpred62_fml1224  */
static	ANTLR3_BITWORD FOLLOW_314_in_synpred62_fml1224_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_314_in_synpred62_fml1224	= { FOLLOW_314_in_synpred62_fml1224_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_synpred95_fml1857  */
static	ANTLR3_BITWORD FOLLOW_set_in_synpred95_fml1857_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_synpred95_fml1857	= { FOLLOW_set_in_synpred95_fml1857_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_synpred95_fml1893  */
static	ANTLR3_BITWORD FOLLOW_ID_in_synpred95_fml1893_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_synpred95_fml1893	= { FOLLOW_ID_in_synpred95_fml1893_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_type_var_in_synpred115_fml2387  */
static	ANTLR3_BITWORD FOLLOW_type_var_in_synpred115_fml2387_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000200000) };
static  ANTLR3_BITSET_LIST FOLLOW_type_var_in_synpred115_fml2387	= { FOLLOW_type_var_in_synpred115_fml2387_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COLON_in_synpred115_fml2389  */
static	ANTLR3_BITWORD FOLLOW_COLON_in_synpred115_fml2389_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_COLON_in_synpred115_fml2389	= { FOLLOW_COLON_in_synpred115_fml2389_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_type_var_in_synpred126_fml2689  */
static	ANTLR3_BITWORD FOLLOW_type_var_in_synpred126_fml2689_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000200000) };
static  ANTLR3_BITSET_LIST FOLLOW_type_var_in_synpred126_fml2689	= { FOLLOW_type_var_in_synpred126_fml2689_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COLON_in_synpred126_fml2691  */
static	ANTLR3_BITWORD FOLLOW_COLON_in_synpred126_fml2691_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_COLON_in_synpred126_fml2691	= { FOLLOW_COLON_in_synpred126_fml2691_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_body_machine_using_section_predicat_in_synpred127_fml2764  */
static	ANTLR3_BITWORD FOLLOW_def_body_machine_using_section_predicat_in_synpred127_fml2764_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_body_machine_using_section_predicat_in_synpred127_fml2764	= { FOLLOW_def_body_machine_using_section_predicat_in_synpred127_fml2764_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_modifier_declaration_in_synpred138_fml2939  */
static	ANTLR3_BITWORD FOLLOW_modifier_declaration_in_synpred138_fml2939_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_modifier_declaration_in_synpred138_fml2939	= { FOLLOW_modifier_declaration_in_synpred138_fml2939_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_executable_modifier_specifier_in_synpred153_fml3199  */
static	ANTLR3_BITWORD FOLLOW_executable_modifier_specifier_in_synpred153_fml3199_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_executable_modifier_specifier_in_synpred153_fml3199	= { FOLLOW_executable_modifier_specifier_in_synpred153_fml3199_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_lvalue_in_synpred170_fml3645  */
static	ANTLR3_BITWORD FOLLOW_lvalue_in_synpred170_fml3645_bits[]	= { ANTLR3_UINT64_LIT(0x00000000002000D0) };
static  ANTLR3_BITSET_LIST FOLLOW_lvalue_in_synpred170_fml3645	= { FOLLOW_lvalue_in_synpred170_fml3645_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_op_assign_param_in_synpred170_fml3648  */
static	ANTLR3_BITWORD FOLLOW_op_assign_param_in_synpred170_fml3648_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_op_assign_param_in_synpred170_fml3648	= { FOLLOW_op_assign_param_in_synpred170_fml3648_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_body_machine_using_section_predicat_in_synpred296_fml5973  */
static	ANTLR3_BITWORD FOLLOW_def_body_machine_using_section_predicat_in_synpred296_fml5973_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_body_machine_using_section_predicat_in_synpred296_fml5973	= { FOLLOW_def_body_machine_using_section_predicat_in_synpred296_fml5973_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_modifier_declaration_in_synpred304_fml6112  */
static	ANTLR3_BITWORD FOLLOW_modifier_declaration_in_synpred304_fml6112_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_modifier_declaration_in_synpred304_fml6112	= { FOLLOW_modifier_declaration_in_synpred304_fml6112_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_321_in_synpred324_fml6520  */
static	ANTLR3_BITWORD FOLLOW_321_in_synpred324_fml6520_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000100000000000), ANTLR3_UINT64_LIT(0x0000000014020000) };
static  ANTLR3_BITSET_LIST FOLLOW_321_in_synpred324_fml6520	= { FOLLOW_321_in_synpred324_fml6520_bits, 5	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_moc_transition_attribute_in_synpred324_fml6527  */
static	ANTLR3_BITWORD FOLLOW_moc_transition_attribute_in_synpred324_fml6527_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_moc_transition_attribute_in_synpred324_fml6527	= { FOLLOW_moc_transition_attribute_in_synpred324_fml6527_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_348_in_synpred326_fml6538  */
static	ANTLR3_BITWORD FOLLOW_348_in_synpred326_fml6538_bits[]	= { ANTLR3_UINT64_LIT(0x0084000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_348_in_synpred326_fml6538	= { FOLLOW_348_in_synpred326_fml6538_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_integer_constant_in_synpred326_fml6545  */
static	ANTLR3_BITWORD FOLLOW_integer_constant_in_synpred326_fml6545_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_integer_constant_in_synpred326_fml6545	= { FOLLOW_integer_constant_in_synpred326_fml6545_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_163_in_synpred329_fml6600  */
static	ANTLR3_BITWORD FOLLOW_163_in_synpred329_fml6600_bits[]	= { ANTLR3_UINT64_LIT(0x0004000080000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x00000000027F0000) };
static  ANTLR3_BITSET_LIST FOLLOW_163_in_synpred329_fml6600	= { FOLLOW_163_in_synpred329_fml6600_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_target_state_id_in_synpred329_fml6612  */
static	ANTLR3_BITWORD FOLLOW_target_state_id_in_synpred329_fml6612_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_target_state_id_in_synpred329_fml6612	= { FOLLOW_target_state_id_in_synpred329_fml6612_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_synpred329_fml6629  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_synpred329_fml6629_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_synpred329_fml6629	= { FOLLOW_SEMI_in_synpred329_fml6629_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred340_fml6840  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred340_fml6840_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred340_fml6840	= { FOLLOW_expression_in_synpred340_fml6840_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LBRACKET_in_synpred341_fml6851  */
static	ANTLR3_BITWORD FOLLOW_LBRACKET_in_synpred341_fml6851_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LBRACKET_in_synpred341_fml6851	= { FOLLOW_LBRACKET_in_synpred341_fml6851_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred341_fml6855  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred341_fml6855_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x1000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred341_fml6855	= { FOLLOW_expression_in_synpred341_fml6855_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RBRACKET_in_synpred341_fml6857  */
static	ANTLR3_BITWORD FOLLOW_RBRACKET_in_synpred341_fml6857_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RBRACKET_in_synpred341_fml6857	= { FOLLOW_RBRACKET_in_synpred341_fml6857_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred343_fml6900  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred343_fml6900_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred343_fml6900	= { FOLLOW_expression_in_synpred343_fml6900_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_synpred344_fml6911  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_synpred344_fml6911_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_synpred344_fml6911	= { FOLLOW_LCURLY_in_synpred344_fml6911_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred344_fml6915  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred344_fml6915_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred344_fml6915	= { FOLLOW_expression_in_synpred344_fml6915_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_synpred344_fml6917  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_synpred344_fml6917_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_synpred344_fml6917	= { FOLLOW_RCURLY_in_synpred344_fml6917_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_body_machine_using_section_header_predicat_in_synpred366_fml7316  */
static	ANTLR3_BITWORD FOLLOW_def_body_machine_using_section_header_predicat_in_synpred366_fml7316_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_body_machine_using_section_header_predicat_in_synpred366_fml7316	= { FOLLOW_def_body_machine_using_section_header_predicat_in_synpred366_fml7316_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_body_machine_using_section_import_predicat_in_synpred370_fml7380  */
static	ANTLR3_BITWORD FOLLOW_def_body_machine_using_section_import_predicat_in_synpred370_fml7380_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_body_machine_using_section_import_predicat_in_synpred370_fml7380	= { FOLLOW_def_body_machine_using_section_import_predicat_in_synpred370_fml7380_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_body_machine_using_section_parameter_predicat_in_synpred373_fml7432  */
static	ANTLR3_BITWORD FOLLOW_def_body_machine_using_section_parameter_predicat_in_synpred373_fml7432_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_body_machine_using_section_parameter_predicat_in_synpred373_fml7432	= { FOLLOW_def_body_machine_using_section_parameter_predicat_in_synpred373_fml7432_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_def_body_machine_using_section_property_predicat_in_synpred375_fml7472  */
static	ANTLR3_BITWORD FOLLOW_def_body_machine_using_section_property_predicat_in_synpred375_fml7472_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_def_body_machine_using_section_property_predicat_in_synpred375_fml7472	= { FOLLOW_def_body_machine_using_section_property_predicat_in_synpred375_fml7472_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_synpred407_fml7922  */
static	ANTLR3_BITWORD FOLLOW_ID_in_synpred407_fml7922_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000200000) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_synpred407_fml7922	= { FOLLOW_ID_in_synpred407_fml7922_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COLON_in_synpred407_fml7924  */
static	ANTLR3_BITWORD FOLLOW_COLON_in_synpred407_fml7924_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_COLON_in_synpred407_fml7924	= { FOLLOW_COLON_in_synpred407_fml7924_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LPAREN_in_synpred412_fml8076  */
static	ANTLR3_BITWORD FOLLOW_LPAREN_in_synpred412_fml8076_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LPAREN_in_synpred412_fml8076	= { FOLLOW_LPAREN_in_synpred412_fml8076_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_labelled_argument_in_synpred412_fml8085  */
static	ANTLR3_BITWORD FOLLOW_labelled_argument_in_synpred412_fml8085_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_labelled_argument_in_synpred412_fml8085	= { FOLLOW_labelled_argument_in_synpred412_fml8085_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_synpred412_fml8101  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_synpred412_fml8101_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_synpred412_fml8101	= { FOLLOW_COMMA_in_synpred412_fml8101_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_labelled_argument_in_synpred412_fml8112  */
static	ANTLR3_BITWORD FOLLOW_labelled_argument_in_synpred412_fml8112_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_labelled_argument_in_synpred412_fml8112	= { FOLLOW_labelled_argument_in_synpred412_fml8112_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RPAREN_in_synpred412_fml8136  */
static	ANTLR3_BITWORD FOLLOW_RPAREN_in_synpred412_fml8136_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RPAREN_in_synpred412_fml8136	= { FOLLOW_RPAREN_in_synpred412_fml8136_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LPAREN_in_synpred417_fml8265  */
static	ANTLR3_BITWORD FOLLOW_LPAREN_in_synpred417_fml8265_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LPAREN_in_synpred417_fml8265	= { FOLLOW_LPAREN_in_synpred417_fml8265_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_labelled_argument_in_synpred417_fml8274  */
static	ANTLR3_BITWORD FOLLOW_labelled_argument_in_synpred417_fml8274_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_labelled_argument_in_synpred417_fml8274	= { FOLLOW_labelled_argument_in_synpred417_fml8274_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_synpred417_fml8290  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_synpred417_fml8290_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_synpred417_fml8290	= { FOLLOW_COMMA_in_synpred417_fml8290_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_labelled_argument_in_synpred417_fml8301  */
static	ANTLR3_BITWORD FOLLOW_labelled_argument_in_synpred417_fml8301_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_labelled_argument_in_synpred417_fml8301	= { FOLLOW_labelled_argument_in_synpred417_fml8301_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RPAREN_in_synpred417_fml8325  */
static	ANTLR3_BITWORD FOLLOW_RPAREN_in_synpred417_fml8325_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RPAREN_in_synpred417_fml8325	= { FOLLOW_RPAREN_in_synpred417_fml8325_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_synpred419_fml8407  */
static	ANTLR3_BITWORD FOLLOW_ID_in_synpred419_fml8407_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_synpred419_fml8407	= { FOLLOW_ID_in_synpred419_fml8407_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_synpred426_fml8542  */
static	ANTLR3_BITWORD FOLLOW_ID_in_synpred426_fml8542_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_synpred426_fml8542	= { FOLLOW_ID_in_synpred426_fml8542_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_synpred431_fml8689  */
static	ANTLR3_BITWORD FOLLOW_ID_in_synpred431_fml8689_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_synpred431_fml8689	= { FOLLOW_ID_in_synpred431_fml8689_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_synpred438_fml8824  */
static	ANTLR3_BITWORD FOLLOW_ID_in_synpred438_fml8824_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_synpred438_fml8824	= { FOLLOW_ID_in_synpred438_fml8824_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_type_var_in_synpred446_fml9031  */
static	ANTLR3_BITWORD FOLLOW_type_var_in_synpred446_fml9031_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000200000) };
static  ANTLR3_BITSET_LIST FOLLOW_type_var_in_synpred446_fml9031	= { FOLLOW_type_var_in_synpred446_fml9031_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COLON_in_synpred446_fml9033  */
static	ANTLR3_BITWORD FOLLOW_COLON_in_synpred446_fml9033_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_COLON_in_synpred446_fml9033	= { FOLLOW_COLON_in_synpred446_fml9033_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_base_type_var_in_synpred493_fml10287  */
static	ANTLR3_BITWORD FOLLOW_base_type_var_in_synpred493_fml10287_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800002) };
static  ANTLR3_BITSET_LIST FOLLOW_base_type_var_in_synpred493_fml10287	= { FOLLOW_base_type_var_in_synpred493_fml10287_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_synpred493_fml10303  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_synpred493_fml10303_bits[]	= { ANTLR3_UINT64_LIT(0x0084000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000200), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0080000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_synpred493_fml10303	= { FOLLOW_COMMA_in_synpred493_fml10303_bits, 6	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_375_in_synpred493_fml10308  */
static	ANTLR3_BITWORD FOLLOW_375_in_synpred493_fml10308_bits[]	= { ANTLR3_UINT64_LIT(0x0084000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000200) };
static  ANTLR3_BITSET_LIST FOLLOW_375_in_synpred493_fml10308	= { FOLLOW_375_in_synpred493_fml10308_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_integer_constant_in_synpred493_fml10328  */
static	ANTLR3_BITWORD FOLLOW_integer_constant_in_synpred493_fml10328_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_integer_constant_in_synpred493_fml10328	= { FOLLOW_integer_constant_in_synpred493_fml10328_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_STAR_in_synpred493_fml10345  */
static	ANTLR3_BITWORD FOLLOW_STAR_in_synpred493_fml10345_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_STAR_in_synpred493_fml10345	= { FOLLOW_STAR_in_synpred493_fml10345_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_bit_field_size_in_synpred514_fml10755  */
static	ANTLR3_BITWORD FOLLOW_bit_field_size_in_synpred514_fml10755_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_bit_field_size_in_synpred514_fml10755	= { FOLLOW_bit_field_size_in_synpred514_fml10755_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_bit_field_size_in_synpred517_fml10794  */
static	ANTLR3_BITWORD FOLLOW_bit_field_size_in_synpred517_fml10794_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_bit_field_size_in_synpred517_fml10794	= { FOLLOW_bit_field_size_in_synpred517_fml10794_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_bit_field_size_in_synpred520_fml10831  */
static	ANTLR3_BITWORD FOLLOW_bit_field_size_in_synpred520_fml10831_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_bit_field_size_in_synpred520_fml10831	= { FOLLOW_bit_field_size_in_synpred520_fml10831_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_bit_field_size_in_synpred531_fml10968  */
static	ANTLR3_BITWORD FOLLOW_bit_field_size_in_synpred531_fml10968_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_bit_field_size_in_synpred531_fml10968	= { FOLLOW_bit_field_size_in_synpred531_fml10968_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_bit_field_size_in_synpred535_fml11020  */
static	ANTLR3_BITWORD FOLLOW_bit_field_size_in_synpred535_fml11020_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_bit_field_size_in_synpred535_fml11020	= { FOLLOW_bit_field_size_in_synpred535_fml11020_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_bit_field_size_in_synpred537_fml11051  */
static	ANTLR3_BITWORD FOLLOW_bit_field_size_in_synpred537_fml11051_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_bit_field_size_in_synpred537_fml11051	= { FOLLOW_bit_field_size_in_synpred537_fml11051_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_string_field_size_in_synpred539_fml11080  */
static	ANTLR3_BITWORD FOLLOW_string_field_size_in_synpred539_fml11080_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_string_field_size_in_synpred539_fml11080	= { FOLLOW_string_field_size_in_synpred539_fml11080_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_synpred555_fml11357  */
static	ANTLR3_BITWORD FOLLOW_set_in_synpred555_fml11357_bits[]	= { ANTLR3_UINT64_LIT(0x0084000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_synpred555_fml11357	= { FOLLOW_set_in_synpred555_fml11357_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_integer_constant_in_synpred555_fml11374  */
static	ANTLR3_BITWORD FOLLOW_integer_constant_in_synpred555_fml11374_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_integer_constant_in_synpred555_fml11374	= { FOLLOW_integer_constant_in_synpred555_fml11374_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_type_var_in_synpred559_fml11507  */
static	ANTLR3_BITWORD FOLLOW_type_var_in_synpred559_fml11507_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_type_var_in_synpred559_fml11507	= { FOLLOW_type_var_in_synpred559_fml11507_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_synpred559_fml11509  */
static	ANTLR3_BITWORD FOLLOW_ID_in_synpred559_fml11509_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_synpred559_fml11509	= { FOLLOW_ID_in_synpred559_fml11509_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_type_var_in_synpred574_fml12057  */
static	ANTLR3_BITWORD FOLLOW_type_var_in_synpred574_fml12057_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_type_var_in_synpred574_fml12057	= { FOLLOW_type_var_in_synpred574_fml12057_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_synpred609_fml12775  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_synpred609_fml12775_bits[]	= { ANTLR3_UINT64_LIT(0x0084000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_synpred609_fml12775	= { FOLLOW_COMMA_in_synpred609_fml12775_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_integer_constant_in_synpred609_fml12780  */
static	ANTLR3_BITWORD FOLLOW_integer_constant_in_synpred609_fml12780_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_integer_constant_in_synpred609_fml12780	= { FOLLOW_integer_constant_in_synpred609_fml12780_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_modifier_param_in_synpred636_fml13291  */
static	ANTLR3_BITWORD FOLLOW_modifier_param_in_synpred636_fml13291_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xC266000000000000), ANTLR3_UINT64_LIT(0x38E000000A00C128), ANTLR3_UINT64_LIT(0x0064016007002261), ANTLR3_UINT64_LIT(0x0000000013A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_modifier_param_in_synpred636_fml13291	= { FOLLOW_modifier_param_in_synpred636_fml13291_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_type_var_in_synpred636_fml13295  */
static	ANTLR3_BITWORD FOLLOW_type_var_in_synpred636_fml13295_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_type_var_in_synpred636_fml13295	= { FOLLOW_type_var_in_synpred636_fml13295_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_synpred636_fml13297  */
static	ANTLR3_BITWORD FOLLOW_ID_in_synpred636_fml13297_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_synpred636_fml13297	= { FOLLOW_ID_in_synpred636_fml13297_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_modifier_param_in_synpred643_fml13470  */
static	ANTLR3_BITWORD FOLLOW_modifier_param_in_synpred643_fml13470_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0xC266000000000000), ANTLR3_UINT64_LIT(0x38E000000A00C128), ANTLR3_UINT64_LIT(0x0064016007002261), ANTLR3_UINT64_LIT(0x0000000013A78108) };
static  ANTLR3_BITSET_LIST FOLLOW_modifier_param_in_synpred643_fml13470	= { FOLLOW_modifier_param_in_synpred643_fml13470_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_type_var_in_synpred643_fml13474  */
static	ANTLR3_BITWORD FOLLOW_type_var_in_synpred643_fml13474_bits[]	= { ANTLR3_UINT64_LIT(0x0004000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_type_var_in_synpred643_fml13474	= { FOLLOW_type_var_in_synpred643_fml13474_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ID_in_synpred643_fml13476  */
static	ANTLR3_BITWORD FOLLOW_ID_in_synpred643_fml13476_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_ID_in_synpred643_fml13476	= { FOLLOW_ID_in_synpred643_fml13476_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_qualifiedNameID_in_synpred705_fml14773  */
static	ANTLR3_BITWORD FOLLOW_qualifiedNameID_in_synpred705_fml14773_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000001000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_qualifiedNameID_in_synpred705_fml14773	= { FOLLOW_qualifiedNameID_in_synpred705_fml14773_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_164_in_synpred705_fml14775  */
static	ANTLR3_BITWORD FOLLOW_164_in_synpred705_fml14775_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_164_in_synpred705_fml14775	= { FOLLOW_164_in_synpred705_fml14775_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_statement_assign_in_synpred709_fml14981  */
static	ANTLR3_BITWORD FOLLOW_statement_assign_in_synpred709_fml14981_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_statement_assign_in_synpred709_fml14981	= { FOLLOW_statement_assign_in_synpred709_fml14981_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_statement_invoke_routine_in_synpred714_fml15083  */
static	ANTLR3_BITWORD FOLLOW_statement_invoke_routine_in_synpred714_fml15083_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_statement_invoke_routine_in_synpred714_fml15083	= { FOLLOW_statement_invoke_routine_in_synpred714_fml15083_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_prefix_statement_in_synpred778_fml16346  */
static	ANTLR3_BITWORD FOLLOW_prefix_statement_in_synpred778_fml16346_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_prefix_statement_in_synpred778_fml16346	= { FOLLOW_prefix_statement_in_synpred778_fml16346_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_unaryExpression_in_synpred779_fml16367  */
static	ANTLR3_BITWORD FOLLOW_unaryExpression_in_synpred779_fml16367_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_unaryExpression_in_synpred779_fml16367	= { FOLLOW_unaryExpression_in_synpred779_fml16367_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_prefix_expression_in_synpred780_fml16426  */
static	ANTLR3_BITWORD FOLLOW_prefix_expression_in_synpred780_fml16426_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_prefix_expression_in_synpred780_fml16426	= { FOLLOW_prefix_expression_in_synpred780_fml16426_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_unaryExpression_in_synpred781_fml16446  */
static	ANTLR3_BITWORD FOLLOW_unaryExpression_in_synpred781_fml16446_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_unaryExpression_in_synpred781_fml16446	= { FOLLOW_unaryExpression_in_synpred781_fml16446_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LPAREN_in_synpred802_fml17087  */
static	ANTLR3_BITWORD FOLLOW_LPAREN_in_synpred802_fml17087_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_LPAREN_in_synpred802_fml17087	= { FOLLOW_LPAREN_in_synpred802_fml17087_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_synpred804_fml17130  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_synpred804_fml17130_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_synpred804_fml17130	= { FOLLOW_LCURLY_in_synpred804_fml17130_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_277_in_synpred861_fml18455  */
static	ANTLR3_BITWORD FOLLOW_277_in_synpred861_fml18455_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_277_in_synpred861_fml18455	= { FOLLOW_277_in_synpred861_fml18455_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_277_in_synpred872_fml18685  */
static	ANTLR3_BITWORD FOLLOW_277_in_synpred872_fml18685_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_277_in_synpred872_fml18685	= { FOLLOW_277_in_synpred872_fml18685_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_274_in_synpred891_fml19245  */
static	ANTLR3_BITWORD FOLLOW_274_in_synpred891_fml19245_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_274_in_synpred891_fml19245	= { FOLLOW_274_in_synpred891_fml19245_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_273_in_synpred891_fml19249  */
static	ANTLR3_BITWORD FOLLOW_273_in_synpred891_fml19249_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000004000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_273_in_synpred891_fml19249	= { FOLLOW_273_in_synpred891_fml19249_bits, 5	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_294_in_synpred891_fml19251  */
static	ANTLR3_BITWORD FOLLOW_294_in_synpred891_fml19251_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_294_in_synpred891_fml19251	= { FOLLOW_294_in_synpred891_fml19251_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred891_fml19258  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred891_fml19258_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred891_fml19258	= { FOLLOW_expression_in_synpred891_fml19258_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_block_statement_in_synpred891_fml19263  */
static	ANTLR3_BITWORD FOLLOW_block_statement_in_synpred891_fml19263_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_block_statement_in_synpred891_fml19263	= { FOLLOW_block_statement_in_synpred891_fml19263_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_274_in_synpred894_fml19350  */
static	ANTLR3_BITWORD FOLLOW_274_in_synpred894_fml19350_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_274_in_synpred894_fml19350	= { FOLLOW_274_in_synpred894_fml19350_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_273_in_synpred894_fml19354  */
static	ANTLR3_BITWORD FOLLOW_273_in_synpred894_fml19354_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000004000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_273_in_synpred894_fml19354	= { FOLLOW_273_in_synpred894_fml19354_bits, 5	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_294_in_synpred894_fml19356  */
static	ANTLR3_BITWORD FOLLOW_294_in_synpred894_fml19356_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_294_in_synpred894_fml19356	= { FOLLOW_294_in_synpred894_fml19356_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred894_fml19362  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred894_fml19362_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000001) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred894_fml19362	= { FOLLOW_expression_in_synpred894_fml19362_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LCURLY_in_synpred894_fml19365  */
static	ANTLR3_BITWORD FOLLOW_LCURLY_in_synpred894_fml19365_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LCURLY_in_synpred894_fml19365	= { FOLLOW_LCURLY_in_synpred894_fml19365_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred894_fml19370  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred894_fml19370_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x2000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred894_fml19370	= { FOLLOW_expression_in_synpred894_fml19370_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RCURLY_in_synpred894_fml19373  */
static	ANTLR3_BITWORD FOLLOW_RCURLY_in_synpred894_fml19373_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RCURLY_in_synpred894_fml19373	= { FOLLOW_RCURLY_in_synpred894_fml19373_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_for_assign_header_in_synpred896_fml19460  */
static	ANTLR3_BITWORD FOLLOW_for_assign_header_in_synpred896_fml19460_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_for_assign_header_in_synpred896_fml19460	= { FOLLOW_for_assign_header_in_synpred896_fml19460_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_synpred896_fml19463  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_synpred896_fml19463_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_synpred896_fml19463	= { FOLLOW_SEMI_in_synpred896_fml19463_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred896_fml19468  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred896_fml19468_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred896_fml19468	= { FOLLOW_expression_in_synpred896_fml19468_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_synpred896_fml19471  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_synpred896_fml19471_bits[]	= { ANTLR3_UINT64_LIT(0x000C000004400000) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_synpred896_fml19471	= { FOLLOW_SEMI_in_synpred896_fml19471_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_for_assign_header_in_synpred896_fml19476  */
static	ANTLR3_BITWORD FOLLOW_for_assign_header_in_synpred896_fml19476_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_for_assign_header_in_synpred896_fml19476	= { FOLLOW_for_assign_header_in_synpred896_fml19476_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LPAREN_in_synpred897_fml19495  */
static	ANTLR3_BITWORD FOLLOW_LPAREN_in_synpred897_fml19495_bits[]	= { ANTLR3_UINT64_LIT(0x000C000004400000) };
static  ANTLR3_BITSET_LIST FOLLOW_LPAREN_in_synpred897_fml19495	= { FOLLOW_LPAREN_in_synpred897_fml19495_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_for_assign_header_in_synpred897_fml19506  */
static	ANTLR3_BITWORD FOLLOW_for_assign_header_in_synpred897_fml19506_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_for_assign_header_in_synpred897_fml19506	= { FOLLOW_for_assign_header_in_synpred897_fml19506_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_synpred897_fml19509  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_synpred897_fml19509_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_synpred897_fml19509	= { FOLLOW_SEMI_in_synpred897_fml19509_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred897_fml19514  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred897_fml19514_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000080) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred897_fml19514	= { FOLLOW_expression_in_synpred897_fml19514_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_SEMI_in_synpred897_fml19517  */
static	ANTLR3_BITWORD FOLLOW_SEMI_in_synpred897_fml19517_bits[]	= { ANTLR3_UINT64_LIT(0x000C000004400000) };
static  ANTLR3_BITSET_LIST FOLLOW_SEMI_in_synpred897_fml19517	= { FOLLOW_SEMI_in_synpred897_fml19517_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_for_assign_header_in_synpred897_fml19522  */
static	ANTLR3_BITWORD FOLLOW_for_assign_header_in_synpred897_fml19522_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_for_assign_header_in_synpred897_fml19522	= { FOLLOW_for_assign_header_in_synpred897_fml19522_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RPAREN_in_synpred897_fml19529  */
static	ANTLR3_BITWORD FOLLOW_RPAREN_in_synpred897_fml19529_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RPAREN_in_synpred897_fml19529	= { FOLLOW_RPAREN_in_synpred897_fml19529_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_lvalue_in_synpred898_fml19550  */
static	ANTLR3_BITWORD FOLLOW_lvalue_in_synpred898_fml19550_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000200000) };
static  ANTLR3_BITSET_LIST FOLLOW_lvalue_in_synpred898_fml19550	= { FOLLOW_lvalue_in_synpred898_fml19550_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COLON_in_synpred898_fml19553  */
static	ANTLR3_BITWORD FOLLOW_COLON_in_synpred898_fml19553_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_COLON_in_synpred898_fml19553	= { FOLLOW_COLON_in_synpred898_fml19553_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred898_fml19558  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred898_fml19558_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred898_fml19558	= { FOLLOW_expression_in_synpred898_fml19558_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LPAREN_in_synpred946_fml20614  */
static	ANTLR3_BITWORD FOLLOW_LPAREN_in_synpred946_fml20614_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LPAREN_in_synpred946_fml20614	= { FOLLOW_LPAREN_in_synpred946_fml20614_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_labelled_argument_in_synpred946_fml20623  */
static	ANTLR3_BITWORD FOLLOW_labelled_argument_in_synpred946_fml20623_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_labelled_argument_in_synpred946_fml20623	= { FOLLOW_labelled_argument_in_synpred946_fml20623_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COMMA_in_synpred946_fml20639  */
static	ANTLR3_BITWORD FOLLOW_COMMA_in_synpred946_fml20639_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_COMMA_in_synpred946_fml20639	= { FOLLOW_COMMA_in_synpred946_fml20639_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_labelled_argument_in_synpred946_fml20650  */
static	ANTLR3_BITWORD FOLLOW_labelled_argument_in_synpred946_fml20650_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000800000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_labelled_argument_in_synpred946_fml20650	= { FOLLOW_labelled_argument_in_synpred946_fml20650_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RPAREN_in_synpred946_fml20674  */
static	ANTLR3_BITWORD FOLLOW_RPAREN_in_synpred946_fml20674_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RPAREN_in_synpred946_fml20674	= { FOLLOW_RPAREN_in_synpred946_fml20674_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ASSIGN_in_synpred947_fml20766  */
static	ANTLR3_BITWORD FOLLOW_ASSIGN_in_synpred947_fml20766_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_ASSIGN_in_synpred947_fml20766	= { FOLLOW_ASSIGN_in_synpred947_fml20766_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred947_fml20771  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred947_fml20771_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred947_fml20771	= { FOLLOW_expression_in_synpred947_fml20771_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ASSIGN_MACRO_in_synpred948_fml20780  */
static	ANTLR3_BITWORD FOLLOW_ASSIGN_MACRO_in_synpred948_fml20780_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_ASSIGN_MACRO_in_synpred948_fml20780	= { FOLLOW_ASSIGN_MACRO_in_synpred948_fml20780_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred948_fml20785  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred948_fml20785_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred948_fml20785	= { FOLLOW_expression_in_synpred948_fml20785_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_ASSIGN_AFTER_in_synpred949_fml20794  */
static	ANTLR3_BITWORD FOLLOW_ASSIGN_AFTER_in_synpred949_fml20794_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_ASSIGN_AFTER_in_synpred949_fml20794	= { FOLLOW_ASSIGN_AFTER_in_synpred949_fml20794_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred949_fml20799  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred949_fml20799_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred949_fml20799	= { FOLLOW_expression_in_synpred949_fml20799_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_PLUS_ASSIGN_in_synpred950_fml20808  */
static	ANTLR3_BITWORD FOLLOW_PLUS_ASSIGN_in_synpred950_fml20808_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_PLUS_ASSIGN_in_synpred950_fml20808	= { FOLLOW_PLUS_ASSIGN_in_synpred950_fml20808_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred950_fml20813  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred950_fml20813_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred950_fml20813	= { FOLLOW_expression_in_synpred950_fml20813_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_PLUS_ASSIGN_AFTER_in_synpred951_fml20822  */
static	ANTLR3_BITWORD FOLLOW_PLUS_ASSIGN_AFTER_in_synpred951_fml20822_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_PLUS_ASSIGN_AFTER_in_synpred951_fml20822	= { FOLLOW_PLUS_ASSIGN_AFTER_in_synpred951_fml20822_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred951_fml20827  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred951_fml20827_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred951_fml20827	= { FOLLOW_expression_in_synpred951_fml20827_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_MINUS_ASSIGN_in_synpred952_fml20836  */
static	ANTLR3_BITWORD FOLLOW_MINUS_ASSIGN_in_synpred952_fml20836_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_MINUS_ASSIGN_in_synpred952_fml20836	= { FOLLOW_MINUS_ASSIGN_in_synpred952_fml20836_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred952_fml20841  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred952_fml20841_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred952_fml20841	= { FOLLOW_expression_in_synpred952_fml20841_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_MINUS_ASSIGN_AFTER_in_synpred953_fml20850  */
static	ANTLR3_BITWORD FOLLOW_MINUS_ASSIGN_AFTER_in_synpred953_fml20850_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_MINUS_ASSIGN_AFTER_in_synpred953_fml20850	= { FOLLOW_MINUS_ASSIGN_AFTER_in_synpred953_fml20850_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred953_fml20855  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred953_fml20855_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred953_fml20855	= { FOLLOW_expression_in_synpred953_fml20855_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_STAR_ASSIGN_in_synpred954_fml20864  */
static	ANTLR3_BITWORD FOLLOW_STAR_ASSIGN_in_synpred954_fml20864_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_STAR_ASSIGN_in_synpred954_fml20864	= { FOLLOW_STAR_ASSIGN_in_synpred954_fml20864_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred954_fml20869  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred954_fml20869_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred954_fml20869	= { FOLLOW_expression_in_synpred954_fml20869_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_STAR_ASSIGN_AFTER_in_synpred955_fml20878  */
static	ANTLR3_BITWORD FOLLOW_STAR_ASSIGN_AFTER_in_synpred955_fml20878_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_STAR_ASSIGN_AFTER_in_synpred955_fml20878	= { FOLLOW_STAR_ASSIGN_AFTER_in_synpred955_fml20878_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred955_fml20883  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred955_fml20883_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred955_fml20883	= { FOLLOW_expression_in_synpred955_fml20883_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_DIV_ASSIGN_in_synpred956_fml20892  */
static	ANTLR3_BITWORD FOLLOW_DIV_ASSIGN_in_synpred956_fml20892_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_DIV_ASSIGN_in_synpred956_fml20892	= { FOLLOW_DIV_ASSIGN_in_synpred956_fml20892_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred956_fml20897  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred956_fml20897_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred956_fml20897	= { FOLLOW_expression_in_synpred956_fml20897_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_DIV_ASSIGN_AFTER_in_synpred957_fml20906  */
static	ANTLR3_BITWORD FOLLOW_DIV_ASSIGN_AFTER_in_synpred957_fml20906_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_DIV_ASSIGN_AFTER_in_synpred957_fml20906	= { FOLLOW_DIV_ASSIGN_AFTER_in_synpred957_fml20906_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred957_fml20911  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred957_fml20911_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred957_fml20911	= { FOLLOW_expression_in_synpred957_fml20911_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_MOD_ASSIGN_in_synpred958_fml20920  */
static	ANTLR3_BITWORD FOLLOW_MOD_ASSIGN_in_synpred958_fml20920_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_MOD_ASSIGN_in_synpred958_fml20920	= { FOLLOW_MOD_ASSIGN_in_synpred958_fml20920_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred958_fml20925  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred958_fml20925_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred958_fml20925	= { FOLLOW_expression_in_synpred958_fml20925_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_MOD_ASSIGN_AFTER_in_synpred959_fml20934  */
static	ANTLR3_BITWORD FOLLOW_MOD_ASSIGN_AFTER_in_synpred959_fml20934_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_MOD_ASSIGN_AFTER_in_synpred959_fml20934	= { FOLLOW_MOD_ASSIGN_AFTER_in_synpred959_fml20934_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred959_fml20939  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred959_fml20939_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred959_fml20939	= { FOLLOW_expression_in_synpred959_fml20939_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LAND_ASSIGN_in_synpred960_fml20948  */
static	ANTLR3_BITWORD FOLLOW_LAND_ASSIGN_in_synpred960_fml20948_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LAND_ASSIGN_in_synpred960_fml20948	= { FOLLOW_LAND_ASSIGN_in_synpred960_fml20948_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred960_fml20953  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred960_fml20953_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred960_fml20953	= { FOLLOW_expression_in_synpred960_fml20953_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LAND_ASSIGN_AFTER_in_synpred961_fml20962  */
static	ANTLR3_BITWORD FOLLOW_LAND_ASSIGN_AFTER_in_synpred961_fml20962_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LAND_ASSIGN_AFTER_in_synpred961_fml20962	= { FOLLOW_LAND_ASSIGN_AFTER_in_synpred961_fml20962_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred961_fml20967  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred961_fml20967_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred961_fml20967	= { FOLLOW_expression_in_synpred961_fml20967_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LOR_ASSIGN_in_synpred962_fml20976  */
static	ANTLR3_BITWORD FOLLOW_LOR_ASSIGN_in_synpred962_fml20976_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LOR_ASSIGN_in_synpred962_fml20976	= { FOLLOW_LOR_ASSIGN_in_synpred962_fml20976_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred962_fml20981  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred962_fml20981_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred962_fml20981	= { FOLLOW_expression_in_synpred962_fml20981_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LOR_ASSIGN_AFTER_in_synpred963_fml20990  */
static	ANTLR3_BITWORD FOLLOW_LOR_ASSIGN_AFTER_in_synpred963_fml20990_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LOR_ASSIGN_AFTER_in_synpred963_fml20990	= { FOLLOW_LOR_ASSIGN_AFTER_in_synpred963_fml20990_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred963_fml20995  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred963_fml20995_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred963_fml20995	= { FOLLOW_expression_in_synpred963_fml20995_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_BAND_ASSIGN_in_synpred964_fml21004  */
static	ANTLR3_BITWORD FOLLOW_BAND_ASSIGN_in_synpred964_fml21004_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_BAND_ASSIGN_in_synpred964_fml21004	= { FOLLOW_BAND_ASSIGN_in_synpred964_fml21004_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred964_fml21009  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred964_fml21009_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred964_fml21009	= { FOLLOW_expression_in_synpred964_fml21009_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_BAND_ASSIGN_AFTER_in_synpred965_fml21018  */
static	ANTLR3_BITWORD FOLLOW_BAND_ASSIGN_AFTER_in_synpred965_fml21018_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_BAND_ASSIGN_AFTER_in_synpred965_fml21018	= { FOLLOW_BAND_ASSIGN_AFTER_in_synpred965_fml21018_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred965_fml21023  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred965_fml21023_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred965_fml21023	= { FOLLOW_expression_in_synpred965_fml21023_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_BOR_ASSIGN_in_synpred966_fml21032  */
static	ANTLR3_BITWORD FOLLOW_BOR_ASSIGN_in_synpred966_fml21032_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_BOR_ASSIGN_in_synpred966_fml21032	= { FOLLOW_BOR_ASSIGN_in_synpred966_fml21032_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred966_fml21037  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred966_fml21037_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred966_fml21037	= { FOLLOW_expression_in_synpred966_fml21037_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_BOR_ASSIGN_AFTER_in_synpred967_fml21046  */
static	ANTLR3_BITWORD FOLLOW_BOR_ASSIGN_AFTER_in_synpred967_fml21046_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_BOR_ASSIGN_AFTER_in_synpred967_fml21046	= { FOLLOW_BOR_ASSIGN_AFTER_in_synpred967_fml21046_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred967_fml21051  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred967_fml21051_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred967_fml21051	= { FOLLOW_expression_in_synpred967_fml21051_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_BXOR_ASSIGN_in_synpred968_fml21060  */
static	ANTLR3_BITWORD FOLLOW_BXOR_ASSIGN_in_synpred968_fml21060_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_BXOR_ASSIGN_in_synpred968_fml21060	= { FOLLOW_BXOR_ASSIGN_in_synpred968_fml21060_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred968_fml21065  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred968_fml21065_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred968_fml21065	= { FOLLOW_expression_in_synpred968_fml21065_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_BXOR_ASSIGN_AFTER_in_synpred969_fml21074  */
static	ANTLR3_BITWORD FOLLOW_BXOR_ASSIGN_AFTER_in_synpred969_fml21074_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_BXOR_ASSIGN_AFTER_in_synpred969_fml21074	= { FOLLOW_BXOR_ASSIGN_AFTER_in_synpred969_fml21074_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred969_fml21079  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred969_fml21079_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred969_fml21079	= { FOLLOW_expression_in_synpred969_fml21079_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LSHIFT_ASSIGN_in_synpred970_fml21088  */
static	ANTLR3_BITWORD FOLLOW_LSHIFT_ASSIGN_in_synpred970_fml21088_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LSHIFT_ASSIGN_in_synpred970_fml21088	= { FOLLOW_LSHIFT_ASSIGN_in_synpred970_fml21088_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred970_fml21093  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred970_fml21093_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred970_fml21093	= { FOLLOW_expression_in_synpred970_fml21093_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LSHIFT_ASSIGN_AFTER_in_synpred971_fml21102  */
static	ANTLR3_BITWORD FOLLOW_LSHIFT_ASSIGN_AFTER_in_synpred971_fml21102_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LSHIFT_ASSIGN_AFTER_in_synpred971_fml21102	= { FOLLOW_LSHIFT_ASSIGN_AFTER_in_synpred971_fml21102_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred971_fml21107  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred971_fml21107_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred971_fml21107	= { FOLLOW_expression_in_synpred971_fml21107_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RSHIFT_ASSIGN_in_synpred972_fml21116  */
static	ANTLR3_BITWORD FOLLOW_RSHIFT_ASSIGN_in_synpred972_fml21116_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_RSHIFT_ASSIGN_in_synpred972_fml21116	= { FOLLOW_RSHIFT_ASSIGN_in_synpred972_fml21116_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred972_fml21121  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred972_fml21121_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred972_fml21121	= { FOLLOW_expression_in_synpred972_fml21121_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RSHIFT_ASSIGN_AFTER_in_synpred973_fml21130  */
static	ANTLR3_BITWORD FOLLOW_RSHIFT_ASSIGN_AFTER_in_synpred973_fml21130_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_RSHIFT_ASSIGN_AFTER_in_synpred973_fml21130	= { FOLLOW_RSHIFT_ASSIGN_AFTER_in_synpred973_fml21130_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred973_fml21135  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred973_fml21135_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred973_fml21135	= { FOLLOW_expression_in_synpred973_fml21135_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_OP_PUSH_in_synpred974_fml21144  */
static	ANTLR3_BITWORD FOLLOW_OP_PUSH_in_synpred974_fml21144_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_OP_PUSH_in_synpred974_fml21144	= { FOLLOW_OP_PUSH_in_synpred974_fml21144_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred974_fml21149  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred974_fml21149_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred974_fml21149	= { FOLLOW_expression_in_synpred974_fml21149_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_OP_ASSIGN_TOP_in_synpred975_fml21158  */
static	ANTLR3_BITWORD FOLLOW_OP_ASSIGN_TOP_in_synpred975_fml21158_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_OP_ASSIGN_TOP_in_synpred975_fml21158	= { FOLLOW_OP_ASSIGN_TOP_in_synpred975_fml21158_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred975_fml21163  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred975_fml21163_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred975_fml21163	= { FOLLOW_expression_in_synpred975_fml21163_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_OP_POP_in_synpred976_fml21172  */
static	ANTLR3_BITWORD FOLLOW_OP_POP_in_synpred976_fml21172_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_OP_POP_in_synpred976_fml21172	= { FOLLOW_OP_POP_in_synpred976_fml21172_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred976_fml21177  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred976_fml21177_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred976_fml21177	= { FOLLOW_expression_in_synpred976_fml21177_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_QUESTION_in_synpred977_fml21215  */
static	ANTLR3_BITWORD FOLLOW_QUESTION_in_synpred977_fml21215_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_QUESTION_in_synpred977_fml21215	= { FOLLOW_QUESTION_in_synpred977_fml21215_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred977_fml21220  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred977_fml21220_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000200000) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred977_fml21220	= { FOLLOW_expression_in_synpred977_fml21220_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COLON_in_synpred977_fml21223  */
static	ANTLR3_BITWORD FOLLOW_COLON_in_synpred977_fml21223_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_COLON_in_synpred977_fml21223	= { FOLLOW_COLON_in_synpred977_fml21223_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred977_fml21228  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred977_fml21228_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred977_fml21228	= { FOLLOW_expression_in_synpred977_fml21228_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_op_sequence_in_synpred980_fml21270  */
static	ANTLR3_BITWORD FOLLOW_op_sequence_in_synpred980_fml21270_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_op_sequence_in_synpred980_fml21270	= { FOLLOW_op_sequence_in_synpred980_fml21270_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_op_scheduling_in_synpred980_fml21278  */
static	ANTLR3_BITWORD FOLLOW_op_scheduling_in_synpred980_fml21278_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_op_scheduling_in_synpred980_fml21278	= { FOLLOW_op_scheduling_in_synpred980_fml21278_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_op_concurrency_in_synpred980_fml21286  */
static	ANTLR3_BITWORD FOLLOW_op_concurrency_in_synpred980_fml21286_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_op_concurrency_in_synpred980_fml21286	= { FOLLOW_op_concurrency_in_synpred980_fml21286_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_conditionalOrExpression_in_synpred980_fml21297  */
static	ANTLR3_BITWORD FOLLOW_conditionalOrExpression_in_synpred980_fml21297_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_conditionalOrExpression_in_synpred980_fml21297	= { FOLLOW_conditionalOrExpression_in_synpred980_fml21297_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LOR_in_synpred981_fml21333  */
static	ANTLR3_BITWORD FOLLOW_LOR_in_synpred981_fml21333_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LOR_in_synpred981_fml21333	= { FOLLOW_LOR_in_synpred981_fml21333_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_conditionalAndExpression_in_synpred981_fml21337  */
static	ANTLR3_BITWORD FOLLOW_conditionalAndExpression_in_synpred981_fml21337_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_conditionalAndExpression_in_synpred981_fml21337	= { FOLLOW_conditionalAndExpression_in_synpred981_fml21337_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LAND_in_synpred982_fml21375  */
static	ANTLR3_BITWORD FOLLOW_LAND_in_synpred982_fml21375_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LAND_in_synpred982_fml21375	= { FOLLOW_LAND_in_synpred982_fml21375_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_bitwiseOrExpression_in_synpred982_fml21379  */
static	ANTLR3_BITWORD FOLLOW_bitwiseOrExpression_in_synpred982_fml21379_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_bitwiseOrExpression_in_synpred982_fml21379	= { FOLLOW_bitwiseOrExpression_in_synpred982_fml21379_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_BOR_in_synpred983_fml21417  */
static	ANTLR3_BITWORD FOLLOW_BOR_in_synpred983_fml21417_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_BOR_in_synpred983_fml21417	= { FOLLOW_BOR_in_synpred983_fml21417_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_bitwiseXorExpression_in_synpred983_fml21421  */
static	ANTLR3_BITWORD FOLLOW_bitwiseXorExpression_in_synpred983_fml21421_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_bitwiseXorExpression_in_synpred983_fml21421	= { FOLLOW_bitwiseXorExpression_in_synpred983_fml21421_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_BXOR_in_synpred984_fml21459  */
static	ANTLR3_BITWORD FOLLOW_BXOR_in_synpred984_fml21459_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_BXOR_in_synpred984_fml21459	= { FOLLOW_BXOR_in_synpred984_fml21459_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_bitwiseAndExpression_in_synpred984_fml21463  */
static	ANTLR3_BITWORD FOLLOW_bitwiseAndExpression_in_synpred984_fml21463_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_bitwiseAndExpression_in_synpred984_fml21463	= { FOLLOW_bitwiseAndExpression_in_synpred984_fml21463_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_BAND_in_synpred985_fml21501  */
static	ANTLR3_BITWORD FOLLOW_BAND_in_synpred985_fml21501_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_BAND_in_synpred985_fml21501	= { FOLLOW_BAND_in_synpred985_fml21501_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_equalityExpression_in_synpred985_fml21505  */
static	ANTLR3_BITWORD FOLLOW_equalityExpression_in_synpred985_fml21505_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_equalityExpression_in_synpred985_fml21505	= { FOLLOW_equalityExpression_in_synpred985_fml21505_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_equalOp_in_synpred986_fml21569  */
static	ANTLR3_BITWORD FOLLOW_equalOp_in_synpred986_fml21569_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_equalOp_in_synpred986_fml21569	= { FOLLOW_equalOp_in_synpred986_fml21569_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_relationalExpression_in_synpred986_fml21573  */
static	ANTLR3_BITWORD FOLLOW_relationalExpression_in_synpred986_fml21573_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_relationalExpression_in_synpred986_fml21573	= { FOLLOW_relationalExpression_in_synpred986_fml21573_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_equalOp_in_synpred987_fml21549  */
static	ANTLR3_BITWORD FOLLOW_equalOp_in_synpred987_fml21549_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_equalOp_in_synpred987_fml21549	= { FOLLOW_equalOp_in_synpred987_fml21549_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_relationalExpression_in_synpred987_fml21553  */
static	ANTLR3_BITWORD FOLLOW_relationalExpression_in_synpred987_fml21553_bits[]	= { ANTLR3_UINT64_LIT(0x0000008000000002), ANTLR3_UINT64_LIT(0x0000000000600000), ANTLR3_UINT64_LIT(0x0000000000000100) };
static  ANTLR3_BITSET_LIST FOLLOW_relationalExpression_in_synpred987_fml21553	= { FOLLOW_relationalExpression_in_synpred987_fml21553_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_equalOp_in_synpred987_fml21569  */
static	ANTLR3_BITWORD FOLLOW_equalOp_in_synpred987_fml21569_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_equalOp_in_synpred987_fml21569	= { FOLLOW_equalOp_in_synpred987_fml21569_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_relationalExpression_in_synpred987_fml21573  */
static	ANTLR3_BITWORD FOLLOW_relationalExpression_in_synpred987_fml21573_bits[]	= { ANTLR3_UINT64_LIT(0x0000008000000002), ANTLR3_UINT64_LIT(0x0000000000600000), ANTLR3_UINT64_LIT(0x0000000000000100) };
static  ANTLR3_BITSET_LIST FOLLOW_relationalExpression_in_synpred987_fml21573	= { FOLLOW_relationalExpression_in_synpred987_fml21573_bits, 3	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_relationalOp_in_synpred991_fml21695  */
static	ANTLR3_BITWORD FOLLOW_relationalOp_in_synpred991_fml21695_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_relationalOp_in_synpred991_fml21695	= { FOLLOW_relationalOp_in_synpred991_fml21695_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_shiftExpression_in_synpred991_fml21699  */
static	ANTLR3_BITWORD FOLLOW_shiftExpression_in_synpred991_fml21699_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_shiftExpression_in_synpred991_fml21699	= { FOLLOW_shiftExpression_in_synpred991_fml21699_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_relationalOp_in_synpred992_fml21675  */
static	ANTLR3_BITWORD FOLLOW_relationalOp_in_synpred992_fml21675_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_relationalOp_in_synpred992_fml21675	= { FOLLOW_relationalOp_in_synpred992_fml21675_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_shiftExpression_in_synpred992_fml21679  */
static	ANTLR3_BITWORD FOLLOW_shiftExpression_in_synpred992_fml21679_bits[]	= { ANTLR3_UINT64_LIT(0x0000600000000002), ANTLR3_UINT64_LIT(0x0000000000003000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000008000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_shiftExpression_in_synpred992_fml21679	= { FOLLOW_shiftExpression_in_synpred992_fml21679_bits, 5	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_relationalOp_in_synpred992_fml21695  */
static	ANTLR3_BITWORD FOLLOW_relationalOp_in_synpred992_fml21695_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_relationalOp_in_synpred992_fml21695	= { FOLLOW_relationalOp_in_synpred992_fml21695_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_shiftExpression_in_synpred992_fml21699  */
static	ANTLR3_BITWORD FOLLOW_shiftExpression_in_synpred992_fml21699_bits[]	= { ANTLR3_UINT64_LIT(0x0000600000000002), ANTLR3_UINT64_LIT(0x0000000000003000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x0000008000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_shiftExpression_in_synpred992_fml21699	= { FOLLOW_shiftExpression_in_synpred992_fml21699_bits, 5	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_shiftOp_in_synpred997_fml21818  */
static	ANTLR3_BITWORD FOLLOW_shiftOp_in_synpred997_fml21818_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_shiftOp_in_synpred997_fml21818	= { FOLLOW_shiftOp_in_synpred997_fml21818_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_additiveExpression_in_synpred997_fml21822  */
static	ANTLR3_BITWORD FOLLOW_additiveExpression_in_synpred997_fml21822_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_additiveExpression_in_synpred997_fml21822	= { FOLLOW_additiveExpression_in_synpred997_fml21822_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_synpred1000_fml21892  */
static	ANTLR3_BITWORD FOLLOW_set_in_synpred1000_fml21892_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_synpred1000_fml21892	= { FOLLOW_set_in_synpred1000_fml21892_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_multiplicativeExpression_in_synpred1000_fml21924  */
static	ANTLR3_BITWORD FOLLOW_multiplicativeExpression_in_synpred1000_fml21924_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_multiplicativeExpression_in_synpred1000_fml21924	= { FOLLOW_multiplicativeExpression_in_synpred1000_fml21924_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_set_in_synpred1003_fml21968  */
static	ANTLR3_BITWORD FOLLOW_set_in_synpred1003_fml21968_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_set_in_synpred1003_fml21968	= { FOLLOW_set_in_synpred1003_fml21968_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_unaryExpression_in_synpred1003_fml22012  */
static	ANTLR3_BITWORD FOLLOW_unaryExpression_in_synpred1003_fml22012_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_unaryExpression_in_synpred1003_fml22012	= { FOLLOW_unaryExpression_in_synpred1003_fml22012_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_INCR_in_synpred1020_fml22353  */
static	ANTLR3_BITWORD FOLLOW_INCR_in_synpred1020_fml22353_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_INCR_in_synpred1020_fml22353	= { FOLLOW_INCR_in_synpred1020_fml22353_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_DECR_in_synpred1021_fml22364  */
static	ANTLR3_BITWORD FOLLOW_DECR_in_synpred1021_fml22364_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_DECR_in_synpred1021_fml22364	= { FOLLOW_DECR_in_synpred1021_fml22364_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LPAREN_in_synpred1027_fml22603  */
static	ANTLR3_BITWORD FOLLOW_LPAREN_in_synpred1027_fml22603_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_LPAREN_in_synpred1027_fml22603	= { FOLLOW_LPAREN_in_synpred1027_fml22603_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_COLONx2_in_synpred1030_fml22666  */
static	ANTLR3_BITWORD FOLLOW_COLONx2_in_synpred1030_fml22666_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_COLONx2_in_synpred1030_fml22666	= { FOLLOW_COLONx2_in_synpred1030_fml22666_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LBRACKET_in_synpred1033_fml22761  */
static	ANTLR3_BITWORD FOLLOW_LBRACKET_in_synpred1033_fml22761_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LBRACKET_in_synpred1033_fml22761	= { FOLLOW_LBRACKET_in_synpred1033_fml22761_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred1033_fml22766  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred1033_fml22766_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x1000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred1033_fml22766	= { FOLLOW_expression_in_synpred1033_fml22766_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RBRACKET_in_synpred1033_fml22769  */
static	ANTLR3_BITWORD FOLLOW_RBRACKET_in_synpred1033_fml22769_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RBRACKET_in_synpred1033_fml22769	= { FOLLOW_RBRACKET_in_synpred1033_fml22769_bits, 1	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_LBRACKET_in_synpred1035_fml22857  */
static	ANTLR3_BITWORD FOLLOW_LBRACKET_in_synpred1035_fml22857_bits[]	= { ANTLR3_UINT64_LIT(0x308C080106402000), ANTLR3_UINT64_LIT(0x0124010000008185), ANTLR3_UINT64_LIT(0x00000007C0002040), ANTLR3_UINT64_LIT(0x0000200000000000), ANTLR3_UINT64_LIT(0x0200004001200201), ANTLR3_UINT64_LIT(0x0010000008801C00), ANTLR3_UINT64_LIT(0x0000000000002000) };
static  ANTLR3_BITSET_LIST FOLLOW_LBRACKET_in_synpred1035_fml22857	= { FOLLOW_LBRACKET_in_synpred1035_fml22857_bits, 7	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_expression_in_synpred1035_fml22862  */
static	ANTLR3_BITWORD FOLLOW_expression_in_synpred1035_fml22862_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000000), ANTLR3_UINT64_LIT(0x1000000000000000) };
static  ANTLR3_BITSET_LIST FOLLOW_expression_in_synpred1035_fml22862	= { FOLLOW_expression_in_synpred1035_fml22862_bits, 2	};
/** Bitset defining follow set for error recovery in rule state: FOLLOW_RBRACKET_in_synpred1035_fml22865  */
static	ANTLR3_BITWORD FOLLOW_RBRACKET_in_synpred1035_fml22865_bits[]	= { ANTLR3_UINT64_LIT(0x0000000000000002) };
static  ANTLR3_BITSET_LIST FOLLOW_RBRACKET_in_synpred1035_fml22865	= { FOLLOW_RBRACKET_in_synpred1035_fml22865_bits, 1	};


/* ==============================================
 * Parsing rules
 */
/**
 * $ANTLR start formalML
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:626:1: formalML[ sep::WObjectManager & aWObjectManager ] returns [ sep::System * spec ] : prologue_fml (s= def_system ) ;
 */
static sep::System *
formalML(pfmlParser ctx, sep::WObjectManager & aWObjectManager)
{
    sep::System * spec;

    ANTLR3_UINT32 formalML_StartIndex;

    sep::System * s;
    #undef	RETURN_TYPE_s
    #define	RETURN_TYPE_s sep::System *

    /* Initialize rule variables
     */
    formalML_StartIndex = INDEX();



    	mWObjectManager = &( aWObjectManager );

    	spec = NULL;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(1)) )
    {
        {

            	spec->setWObject(DIVERITY_PROLOG);

        }
        {
        }



        return spec;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:636:2: ( prologue_fml (s= def_system ) )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:636:4: prologue_fml (s= def_system )
        {
            FOLLOWPUSH(FOLLOW_prologue_fml_in_formalML90);
            prologue_fml(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruleformalMLEx;
            }
            if (HASFAILED())
            {
                return spec;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:637:4: (s= def_system )
            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:637:6: s= def_system
            {
                FOLLOWPUSH(FOLLOW_def_system_in_formalML99);
                s=def_system(ctx);

                FOLLOWPOP();
                if  (HASEXCEPTION())
                {
                    goto ruleformalMLEx;
                }
                if (HASFAILED())
                {
                    return spec;
                }


                if ( BACKTRACKING==0 )
                {
                     spec= 
                    s
                    ;
                      
                }


            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruleformalMLEx; /* Prevent compiler warnings */
    ruleformalMLEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
            else
            {
                {

                    	spec->setWObject(DIVERITY_PROLOG);

                }
            }


    if ( BACKTRACKING>0 ) { MEMOIZE(1, formalML_StartIndex); }

    return spec;
}
/* $ANTLR end formalML */

/**
 * $ANTLR start prologue_fml
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:647:1: prologue_fml : ( '@formalml' | '@xfml' | '@fml' | '@diversity' | '@xlia' | '@xfsp' )? LT_ ( 'system' | 'package' |id= ID ) ( ASSIGN id= ID )? ( COMMA ( FloatLiteral | ID | StringLiteral ) )* GT COLON ( prologue_attribute )? ( prologue_options )? ;
 */
static void
prologue_fml(pfmlParser ctx)
{
    ANTLR3_UINT32 prologue_fml_StartIndex;

    pANTLR3_COMMON_TOKEN    id;

    /* Initialize rule variables
     */
    prologue_fml_StartIndex = INDEX();



    	std::string attrID;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(2)) )
    {
        {
        }



        return ;
    }

    id       = NULL;

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:651:2: ( ( '@formalml' | '@xfml' | '@fml' | '@diversity' | '@xlia' | '@xfsp' )? LT_ ( 'system' | 'package' |id= ID ) ( ASSIGN id= ID )? ( COMMA ( FloatLiteral | ID | StringLiteral ) )* GT COLON ( prologue_attribute )? ( prologue_options )? )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:651:4: ( '@formalml' | '@xfml' | '@fml' | '@diversity' | '@xlia' | '@xfsp' )? LT_ ( 'system' | 'package' |id= ID ) ( ASSIGN id= ID )? ( COMMA ( FloatLiteral | ID | StringLiteral ) )* GT COLON ( prologue_attribute )? ( prologue_options )?
        {
            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:651:4: ( '@formalml' | '@xfml' | '@fml' | '@diversity' | '@xlia' | '@xfsp' )?
            {
                int alt1=7;
                switch ( LA(1) )
                {
                    case 186:
                    	{
                    		alt1=1;
                    	}
                        break;
                    case 233:
                    	{
                    		alt1=2;
                    	}
                        break;
                    case 185:
                    	{
                    		alt1=3;
                    	}
                        break;
                    case 180:
                    	{
                    		alt1=4;
                    	}
                        break;
                    case 235:
                    	{
                    		alt1=5;
                    	}
                        break;
                    case 234:
                    	{
                    		alt1=6;
                    	}
                        break;
                }

                switch (alt1)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:651:6: '@formalml'
            	    {
            	         MATCHT(186, &FOLLOW_186_in_prologue_fml131);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleprologue_fmlEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             DIVERITY_PROLOG = mWObjectManager->newWSequence(sep::WObject::_NULL_, "formalml" ); 
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:652:6: '@xfml'
            	    {
            	         MATCHT(233, &FOLLOW_233_in_prologue_fml141);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleprologue_fmlEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             DIVERITY_PROLOG = mWObjectManager->newWSequence(sep::WObject::_NULL_, "xfml"     ); 
            	        }


            	    }
            	    break;
            	case 3:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:653:6: '@fml'
            	    {
            	         MATCHT(185, &FOLLOW_185_in_prologue_fml155);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleprologue_fmlEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             DIVERITY_PROLOG = mWObjectManager->newWSequence(sep::WObject::_NULL_, "fml"      ); 
            	        }


            	    }
            	    break;
            	case 4:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:654:6: '@diversity'
            	    {
            	         MATCHT(180, &FOLLOW_180_in_prologue_fml170);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleprologue_fmlEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             DIVERITY_PROLOG = mWObjectManager->newWSequence(sep::WObject::_NULL_, "diversity"); 
            	        }


            	    }
            	    break;
            	case 5:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:655:6: '@xlia'
            	    {
            	         MATCHT(235, &FOLLOW_235_in_prologue_fml179);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleprologue_fmlEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             DIVERITY_PROLOG = mWObjectManager->newWSequence(sep::WObject::_NULL_, "xlia"     ); 
            	        }


            	    }
            	    break;
            	case 6:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:656:6: '@xfsp'
            	    {
            	         MATCHT(234, &FOLLOW_234_in_prologue_fml193);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleprologue_fmlEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             DIVERITY_PROLOG = mWObjectManager->newWSequence(sep::WObject::_NULL_, "xfsp"     ); 
            	        }


            	    }
            	    break;

                }
            }

            if ( BACKTRACKING==0 )
            {

                	  	if( DIVERITY_PROLOG == sep::WObject::_NULL_ )
                	  	{ DIVERITY_PROLOG = mWObjectManager->newWSequence(sep::WObject::_NULL_, "symbex"); }
                	  
            }


             MATCHT(LT_, &FOLLOW_LT__in_prologue_fml217);
            if  (HASEXCEPTION())
            {
                goto ruleprologue_fmlEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:663:6: ( 'system' | 'package' |id= ID )
            {
                int alt2=3;
                switch ( LA(1) )
                {
                case 390:
                	{
                		alt2=1;
                	}
                    break;
                case 342:
                	{
                		alt2=2;
                	}
                    break;
                case ID:
                	{
                		alt2=3;
                	}
                    break;

                default:
                    if (BACKTRACKING>0)
                    {
                        FAILEDFLAG = ANTLR3_TRUE;
                        return ;
                    }

                    CONSTRUCTEX();
                    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                    EXCEPTION->message      = (void *)"";
                    EXCEPTION->decisionNum  = 2;
                    EXCEPTION->state        = 0;


                    goto ruleprologue_fmlEx;

                }

                switch (alt2)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:663:8: 'system'
            	    {
            	         MATCHT(390, &FOLLOW_390_in_prologue_fml226);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleprologue_fmlEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             attrID = "system";  
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:664:8: 'package'
            	    {
            	         MATCHT(342, &FOLLOW_342_in_prologue_fml239);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleprologue_fmlEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             attrID = "package"; 
            	        }


            	    }
            	    break;
            	case 3:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:665:8: id= ID
            	    {
            	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_prologue_fml253);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleprologue_fmlEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             attrID = STR((id->getText(id))->chars); 
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:667:6: ( ASSIGN id= ID )?
            {
                int alt3=2;
                switch ( LA(1) )
                {
                    case ASSIGN:
                    	{
                    		alt3=1;
                    	}
                        break;
                }

                switch (alt3)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:667:8: ASSIGN id= ID
            	    {
            	         MATCHT(ASSIGN, &FOLLOW_ASSIGN_in_prologue_fml276);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleprologue_fmlEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_prologue_fml280);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleprologue_fmlEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {

            	            			DIVERITY_PROLOG->append( mWObjectManager->newWPropertyIdentifier(
            	            					DIVERITY_PROLOG, attrID, STR((id->getText(id))->chars) ) );
            	            		
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:673:4: ( COMMA ( FloatLiteral | ID | StringLiteral ) )*

            for (;;)
            {
                int alt4=2;
                switch ( LA(1) )
                {
                case COMMA:
                	{
                		alt4=1;
                	}
                    break;

                }

                switch (alt4)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:673:6: COMMA ( FloatLiteral | ID | StringLiteral )
            	    {
            	         MATCHT(COMMA, &FOLLOW_COMMA_in_prologue_fml299);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleprologue_fmlEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( LA(1) == FloatLiteral || LA(1) == ID || LA(1) == StringLiteral )
            	        {
            	            CONSUME();
            	            PERRORRECOVERY=ANTLR3_FALSE;
            	            FAILEDFLAG=ANTLR3_FALSE;

            	        }
            	        else
            	        {
            	            if (BACKTRACKING>0)
            	            {
            	                FAILEDFLAG = ANTLR3_TRUE;
            	                return ;
            	            }

            	            CONSTRUCTEX();
            	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
            	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
            	            EXCEPTION->expectingSet = NULL;

            	            goto ruleprologue_fmlEx;
            	        }


            	    }
            	    break;

            	default:
            	    goto loop4;	/* break out of the loop */
            	    break;
                }
            }
            loop4: ; /* Jump out to here if this rule does not match */


             MATCHT(GT, &FOLLOW_GT_in_prologue_fml321);
            if  (HASEXCEPTION())
            {
                goto ruleprologue_fmlEx;
            }
            if (HASFAILED())
            {
                return ;
            }


             MATCHT(COLON, &FOLLOW_COLON_in_prologue_fml326);
            if  (HASEXCEPTION())
            {
                goto ruleprologue_fmlEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:676:4: ( prologue_attribute )?
            {
                int alt5=2;
                switch ( LA(1) )
                {
                    case 208:
                    case 229:
                    	{
                    		alt5=1;
                    	}
                        break;
                }

                switch (alt5)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:676:6: prologue_attribute
            	    {
            	        FOLLOWPUSH(FOLLOW_prologue_attribute_in_prologue_fml333);
            	        prologue_attribute(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleprologue_fmlEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:677:4: ( prologue_options )?
            {
                int alt6=2;
                switch ( LA(1) )
                {
                    case 206:
                    	{
                    		alt6=1;
                    	}
                        break;
                }

                switch (alt6)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:677:6: prologue_options
            	    {
            	        FOLLOWPUSH(FOLLOW_prologue_options_in_prologue_fml343);
            	        prologue_options(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleprologue_fmlEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

                }
            }

        }

    }

    // This is where rules clean up and exit
    //
    goto ruleprologue_fmlEx; /* Prevent compiler warnings */
    ruleprologue_fmlEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(2, prologue_fml_StartIndex); }

    return ;
}
/* $ANTLR end prologue_fml */

/**
 * $ANTLR start prologue_attribute
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:681:1: prologue_attribute : ( '@package' ASSIGN id= ID SEMI | '@system' ASSIGN id= ID SEMI );
 */
static void
prologue_attribute(pfmlParser ctx)
{
    ANTLR3_UINT32 prologue_attribute_StartIndex;

    pANTLR3_COMMON_TOKEN    id;

    /* Initialize rule variables
     */
    prologue_attribute_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(3)) )
    {
        {
        }



        return ;
    }

    id       = NULL;

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:682:2: ( '@package' ASSIGN id= ID SEMI | '@system' ASSIGN id= ID SEMI )

            ANTLR3_UINT32 alt7;

            alt7=2;

            switch ( LA(1) )
            {
            case 208:
            	{
            		alt7=1;
            	}
                break;
            case 229:
            	{
            		alt7=2;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 7;
                EXCEPTION->state        = 0;


                goto ruleprologue_attributeEx;

            }

            switch (alt7)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:682:4: '@package' ASSIGN id= ID SEMI
        	    {
        	         MATCHT(208, &FOLLOW_208_in_prologue_attribute358);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleprologue_attributeEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	         MATCHT(ASSIGN, &FOLLOW_ASSIGN_in_prologue_attribute361);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleprologue_attributeEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_prologue_attribute366);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleprologue_attributeEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	         MATCHT(SEMI, &FOLLOW_SEMI_in_prologue_attribute369);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleprologue_attributeEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {

        	            		DIVERITY_PROLOG->append( mWObjectManager->newWPropertyIdentifier(
        	            				DIVERITY_PROLOG, "package", STR((id->getText(id))->chars) ) );
        	            	
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:688:4: '@system' ASSIGN id= ID SEMI
        	    {
        	         MATCHT(229, &FOLLOW_229_in_prologue_attribute378);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleprologue_attributeEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	         MATCHT(ASSIGN, &FOLLOW_ASSIGN_in_prologue_attribute381);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleprologue_attributeEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_prologue_attribute386);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleprologue_attributeEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	         MATCHT(SEMI, &FOLLOW_SEMI_in_prologue_attribute389);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleprologue_attributeEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {

        	            		DIVERITY_PROLOG->append( mWObjectManager->newWPropertyIdentifier(
        	            				DIVERITY_PROLOG, "system", STR((id->getText(id))->chars) ) );
        	            	
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruleprologue_attributeEx; /* Prevent compiler warnings */
    ruleprologue_attributeEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(3, prologue_attribute_StartIndex); }

    return ;
}
/* $ANTLR end prologue_attribute */

/**
 * $ANTLR start prologue_options
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:696:1: prologue_options : '@options' LCURLY (id= ID ASSIGN e= expression SEMI )* RCURLY ;
 */
static void
prologue_options(pfmlParser ctx)
{
    ANTLR3_UINT32 prologue_options_StartIndex;

    pANTLR3_COMMON_TOKEN    id;
    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    /* Initialize rule variables
     */
    prologue_options_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(4)) )
    {
        {
        }



        return ;
    }

    id       = NULL;

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:697:2: ( '@options' LCURLY (id= ID ASSIGN e= expression SEMI )* RCURLY )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:697:4: '@options' LCURLY (id= ID ASSIGN e= expression SEMI )* RCURLY
        {
             MATCHT(206, &FOLLOW_206_in_prologue_options404);
            if  (HASEXCEPTION())
            {
                goto ruleprologue_optionsEx;
            }
            if (HASFAILED())
            {
                return ;
            }


             MATCHT(LCURLY, &FOLLOW_LCURLY_in_prologue_options407);
            if  (HASEXCEPTION())
            {
                goto ruleprologue_optionsEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:698:5: (id= ID ASSIGN e= expression SEMI )*

            for (;;)
            {
                int alt8=2;
                switch ( LA(1) )
                {
                case ID:
                	{
                		alt8=1;
                	}
                    break;

                }

                switch (alt8)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:698:7: id= ID ASSIGN e= expression SEMI
            	    {
            	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_prologue_options417);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleprologue_optionsEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	         MATCHT(ASSIGN, &FOLLOW_ASSIGN_in_prologue_options419);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleprologue_optionsEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_prologue_options423);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleprologue_optionsEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	         MATCHT(SEMI, &FOLLOW_SEMI_in_prologue_options425);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleprologue_optionsEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             sep::ParserUtil::setPrologueOption(STR((id->getText(id))->chars), 
            	            e
            	            ); 
            	        }


            	    }
            	    break;

            	default:
            	    goto loop8;	/* break out of the loop */
            	    break;
                }
            }
            loop8: ; /* Jump out to here if this rule does not match */


             MATCHT(RCURLY, &FOLLOW_RCURLY_in_prologue_options444);
            if  (HASEXCEPTION())
            {
                goto ruleprologue_optionsEx;
            }
            if (HASFAILED())
            {
                return ;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruleprologue_optionsEx; /* Prevent compiler warnings */
    ruleprologue_optionsEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(4, prologue_options_StartIndex); }

    return ;
}
/* $ANTLR end prologue_options */

/**
 * $ANTLR start modifier_declaration
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:710:1: modifier_declaration returns [ sep::Modifier mdfr ] : ( 'final' | 'static' | 'volatile' | 'transient' | 'unsafe' | 'ref' | 'bind' | 'public' | 'private' | modifier_set_direction_strict_text[ mdfr ] )+ ;
 */
static sep::Modifier
modifier_declaration(pfmlParser ctx)
{
    sep::Modifier mdfr;

    ANTLR3_UINT32 modifier_declaration_StartIndex;

    /* Initialize rule variables
     */
    modifier_declaration_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(5)) )
    {
        {
        }



        return mdfr;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:712:2: ( ( 'final' | 'static' | 'volatile' | 'transient' | 'unsafe' | 'ref' | 'bind' | 'public' | 'private' | modifier_set_direction_strict_text[ mdfr ] )+ )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:712:4: ( 'final' | 'static' | 'volatile' | 'transient' | 'unsafe' | 'ref' | 'bind' | 'public' | 'private' | modifier_set_direction_strict_text[ mdfr ] )+
        {
            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:712:4: ( 'final' | 'static' | 'volatile' | 'transient' | 'unsafe' | 'ref' | 'bind' | 'public' | 'private' | modifier_set_direction_strict_text[ mdfr ] )+
            {
                int cnt9=0;

                for (;;)
                {
                    int alt9=11;
            	switch ( LA(1) )
            	{
            	case 282:
            		{
            			alt9=1;
            		}
            	    break;
            	case 380:
            		{
            			alt9=2;
            		}
            	    break;
            	case 414:
            		{
            			alt9=3;
            		}
            	    break;
            	case 395:
            		{
            			alt9=4;
            		}
            	    break;
            	case 406:
            		{
            			{
            			   /* dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState)
            			    */
            			    int LA9_5 = LA(2);
            			    if ( (synpred21_fml(ctx)))
            			    {
            			        alt9=5;
            			    }

            			}
            		}
            	    break;
            	case 361:
            		{
            			alt9=6;
            		}
            	    break;
            	case 243:
            		{
            			alt9=7;
            		}
            	    break;
            	case 355:
            		{
            			alt9=8;
            		}
            	    break;
            	case 349:
            		{
            			alt9=9;
            		}
            	    break;
            	case 298:
            	case 305:
            	case 341:
            	case 364:
            		{
            			alt9=10;
            		}
            	    break;

            	}

            	switch (alt9)
            	{
            	    case 1:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:712:6: 'final'
            	        {
            	             MATCHT(282, &FOLLOW_282_in_modifier_declaration467);
            	            if  (HASEXCEPTION())
            	            {
            	                goto rulemodifier_declarationEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return mdfr;
            	            }


            	            if ( BACKTRACKING==0 )
            	            {
            	                 mdfr.setFeatureFinal();     
            	            }


            	        }
            	        break;
            	    case 2:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:715:6: 'static'
            	        {
            	             MATCHT(380, &FOLLOW_380_in_modifier_declaration486);
            	            if  (HASEXCEPTION())
            	            {
            	                goto rulemodifier_declarationEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return mdfr;
            	            }


            	            if ( BACKTRACKING==0 )
            	            {
            	                 mdfr.setFeatureStatic();    
            	            }


            	        }
            	        break;
            	    case 3:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:717:6: 'volatile'
            	        {
            	             MATCHT(414, &FOLLOW_414_in_modifier_declaration503);
            	            if  (HASEXCEPTION())
            	            {
            	                goto rulemodifier_declarationEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return mdfr;
            	            }


            	            if ( BACKTRACKING==0 )
            	            {
            	                 mdfr.setFeatureVolatile();  
            	            }


            	        }
            	        break;
            	    case 4:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:718:6: 'transient'
            	        {
            	             MATCHT(395, &FOLLOW_395_in_modifier_declaration517);
            	            if  (HASEXCEPTION())
            	            {
            	                goto rulemodifier_declarationEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return mdfr;
            	            }


            	            if ( BACKTRACKING==0 )
            	            {
            	                 mdfr.setFeatureTransient(); 
            	            }


            	        }
            	        break;
            	    case 5:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:720:6: 'unsafe'
            	        {
            	             MATCHT(406, &FOLLOW_406_in_modifier_declaration531);
            	            if  (HASEXCEPTION())
            	            {
            	                goto rulemodifier_declarationEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return mdfr;
            	            }


            	            if ( BACKTRACKING==0 )
            	            {
            	                 mdfr.setFeatureUnsafe();    
            	            }


            	        }
            	        break;
            	    case 6:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:722:6: 'ref'
            	        {
            	             MATCHT(361, &FOLLOW_361_in_modifier_declaration548);
            	            if  (HASEXCEPTION())
            	            {
            	                goto rulemodifier_declarationEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return mdfr;
            	            }


            	            if ( BACKTRACKING==0 )
            	            {
            	                 mdfr.setNatureReference();  
            	            }


            	        }
            	        break;
            	    case 7:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:725:6: 'bind'
            	        {
            	             MATCHT(243, &FOLLOW_243_in_modifier_declaration569);
            	            if  (HASEXCEPTION())
            	            {
            	                goto rulemodifier_declarationEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return mdfr;
            	            }


            	            if ( BACKTRACKING==0 )
            	            {
            	                 mdfr.setNatureBind();       
            	            }


            	        }
            	        break;
            	    case 8:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:727:6: 'public'
            	        {
            	             MATCHT(355, &FOLLOW_355_in_modifier_declaration588);
            	            if  (HASEXCEPTION())
            	            {
            	                goto rulemodifier_declarationEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return mdfr;
            	            }


            	            if ( BACKTRACKING==0 )
            	            {
            	                 mdfr.setVisibilityPublic();    
            	            }


            	        }
            	        break;
            	    case 9:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:729:6: 'private'
            	        {
            	             MATCHT(349, &FOLLOW_349_in_modifier_declaration605);
            	            if  (HASEXCEPTION())
            	            {
            	                goto rulemodifier_declarationEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return mdfr;
            	            }


            	            if ( BACKTRACKING==0 )
            	            {
            	                 mdfr.setVisibilityPrivate();   
            	            }


            	        }
            	        break;
            	    case 10:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:731:6: modifier_set_direction_strict_text[ mdfr ]
            	        {
            	            FOLLOWPUSH(FOLLOW_modifier_set_direction_strict_text_in_modifier_declaration621);
            	            modifier_set_direction_strict_text(ctx, mdfr);

            	            FOLLOWPOP();
            	            if  (HASEXCEPTION())
            	            {
            	                goto rulemodifier_declarationEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return mdfr;
            	            }


            	        }
            	        break;

            	    default:

            		if ( cnt9 >= 1 )
            		{
            		    goto loop9;
            		}
            		if (BACKTRACKING>0)
            		{
            		    FAILEDFLAG = ANTLR3_TRUE;
            		    return mdfr;
            		}

            		/* mismatchedSetEx()
            		 */
            		CONSTRUCTEX();
            		EXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
            		EXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;


            		goto rulemodifier_declarationEx;
            	}
            	cnt9++;
                }
                loop9: ;	/* Jump to here if this rule does not match */
            }

        }

    }

    // This is where rules clean up and exit
    //
    goto rulemodifier_declarationEx; /* Prevent compiler warnings */
    rulemodifier_declarationEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(5, modifier_declaration_StartIndex); }

    return mdfr;
}
/* $ANTLR end modifier_declaration */

/**
 * $ANTLR start modifier_direction
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:737:1: modifier_direction returns [ sep::Modifier mdfr ] : ( ( '->' | 'in' | 'input' ) | ( '<-' | 'out' | 'output' ) | ( '<->' | 'inout' ) | ( '<=' | 'return' ) );
 */
static sep::Modifier
modifier_direction(pfmlParser ctx)
{
    sep::Modifier mdfr;

    ANTLR3_UINT32 modifier_direction_StartIndex;

    /* Initialize rule variables
     */
    modifier_direction_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(6)) )
    {
        {
        }



        return mdfr;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:739:2: ( ( '->' | 'in' | 'input' ) | ( '<-' | 'out' | 'output' ) | ( '<->' | 'inout' ) | ( '<=' | 'return' ) )

            ANTLR3_UINT32 alt10;

            alt10=4;

            switch ( LA(1) )
            {
            case 164:
            case 295:
            case 305:
            	{
            		alt10=1;
            	}
                break;
            case ASSIGN_REF:
            case 335:
            case 341:
            	{
            		alt10=2;
            	}
                break;
            case 166:
            case 298:
            	{
            		alt10=3;
            	}
                break;
            case LTE:
            case 364:
            	{
            		alt10=4;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return mdfr;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 10;
                EXCEPTION->state        = 0;


                goto rulemodifier_directionEx;

            }

            switch (alt10)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:739:4: ( '->' | 'in' | 'input' )
        	    {
        	        if ( LA(1) == 164 || LA(1) == 295 || LA(1) == 305 )
        	        {
        	            CONSUME();
        	            PERRORRECOVERY=ANTLR3_FALSE;
        	            FAILEDFLAG=ANTLR3_FALSE;

        	        }
        	        else
        	        {
        	            if (BACKTRACKING>0)
        	            {
        	                FAILEDFLAG = ANTLR3_TRUE;
        	                return mdfr;
        	            }

        	            CONSTRUCTEX();
        	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
        	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
        	            EXCEPTION->expectingSet = NULL;

        	            goto rulemodifier_directionEx;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             mdfr.setDirectionInput();  
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:740:4: ( '<-' | 'out' | 'output' )
        	    {
        	        if ( LA(1) == ASSIGN_REF || LA(1) == 335 || LA(1) == 341 )
        	        {
        	            CONSUME();
        	            PERRORRECOVERY=ANTLR3_FALSE;
        	            FAILEDFLAG=ANTLR3_FALSE;

        	        }
        	        else
        	        {
        	            if (BACKTRACKING>0)
        	            {
        	                FAILEDFLAG = ANTLR3_TRUE;
        	                return mdfr;
        	            }

        	            CONSTRUCTEX();
        	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
        	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
        	            EXCEPTION->expectingSet = NULL;

        	            goto rulemodifier_directionEx;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             mdfr.setDirectionOutput(); 
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:741:4: ( '<->' | 'inout' )
        	    {
        	        if ( LA(1) == 166 || LA(1) == 298 )
        	        {
        	            CONSUME();
        	            PERRORRECOVERY=ANTLR3_FALSE;
        	            FAILEDFLAG=ANTLR3_FALSE;

        	        }
        	        else
        	        {
        	            if (BACKTRACKING>0)
        	            {
        	                FAILEDFLAG = ANTLR3_TRUE;
        	                return mdfr;
        	            }

        	            CONSTRUCTEX();
        	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
        	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
        	            EXCEPTION->expectingSet = NULL;

        	            goto rulemodifier_directionEx;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             mdfr.setDirectionInout();  
        	        }


        	    }
        	    break;
        	case 4:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:742:4: ( '<=' | 'return' )
        	    {
        	        if ( LA(1) == LTE || LA(1) == 364 )
        	        {
        	            CONSUME();
        	            PERRORRECOVERY=ANTLR3_FALSE;
        	            FAILEDFLAG=ANTLR3_FALSE;

        	        }
        	        else
        	        {
        	            if (BACKTRACKING>0)
        	            {
        	                FAILEDFLAG = ANTLR3_TRUE;
        	                return mdfr;
        	            }

        	            CONSTRUCTEX();
        	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
        	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
        	            EXCEPTION->expectingSet = NULL;

        	            goto rulemodifier_directionEx;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             mdfr.setDirectionReturn(); 
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto rulemodifier_directionEx; /* Prevent compiler warnings */
    rulemodifier_directionEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(6, modifier_direction_StartIndex); }

    return mdfr;
}
/* $ANTLR end modifier_direction */

/**
 * $ANTLR start modifier_direction_text
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:745:1: modifier_direction_text returns [ sep::Modifier mdfr ] : ( ( 'in' | 'input' ) | ( 'out' | 'output' ) | ( 'inout' ) | ( 'return' ) );
 */
static sep::Modifier
modifier_direction_text(pfmlParser ctx)
{
    sep::Modifier mdfr;

    ANTLR3_UINT32 modifier_direction_text_StartIndex;

    /* Initialize rule variables
     */
    modifier_direction_text_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(7)) )
    {
        {
        }



        return mdfr;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:747:2: ( ( 'in' | 'input' ) | ( 'out' | 'output' ) | ( 'inout' ) | ( 'return' ) )

            ANTLR3_UINT32 alt11;

            alt11=4;

            switch ( LA(1) )
            {
            case 295:
            case 305:
            	{
            		alt11=1;
            	}
                break;
            case 335:
            case 341:
            	{
            		alt11=2;
            	}
                break;
            case 298:
            	{
            		alt11=3;
            	}
                break;
            case 364:
            	{
            		alt11=4;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return mdfr;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 11;
                EXCEPTION->state        = 0;


                goto rulemodifier_direction_textEx;

            }

            switch (alt11)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:747:4: ( 'in' | 'input' )
        	    {
        	        if ( LA(1) == 295 || LA(1) == 305 )
        	        {
        	            CONSUME();
        	            PERRORRECOVERY=ANTLR3_FALSE;
        	            FAILEDFLAG=ANTLR3_FALSE;

        	        }
        	        else
        	        {
        	            if (BACKTRACKING>0)
        	            {
        	                FAILEDFLAG = ANTLR3_TRUE;
        	                return mdfr;
        	            }

        	            CONSTRUCTEX();
        	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
        	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
        	            EXCEPTION->expectingSet = NULL;

        	            goto rulemodifier_direction_textEx;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             mdfr.setDirectionInput();  
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:748:4: ( 'out' | 'output' )
        	    {
        	        if ( LA(1) == 335 || LA(1) == 341 )
        	        {
        	            CONSUME();
        	            PERRORRECOVERY=ANTLR3_FALSE;
        	            FAILEDFLAG=ANTLR3_FALSE;

        	        }
        	        else
        	        {
        	            if (BACKTRACKING>0)
        	            {
        	                FAILEDFLAG = ANTLR3_TRUE;
        	                return mdfr;
        	            }

        	            CONSTRUCTEX();
        	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
        	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
        	            EXCEPTION->expectingSet = NULL;

        	            goto rulemodifier_direction_textEx;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             mdfr.setDirectionOutput(); 
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:749:4: ( 'inout' )
        	    {
        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:749:4: ( 'inout' )
        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:749:6: 'inout'
        	        {
        	             MATCHT(298, &FOLLOW_298_in_modifier_direction_text785);
        	            if  (HASEXCEPTION())
        	            {
        	                goto rulemodifier_direction_textEx;
        	            }
        	            if (HASFAILED())
        	            {
        	                return mdfr;
        	            }


        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             mdfr.setDirectionInout();  
        	        }


        	    }
        	    break;
        	case 4:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:750:4: ( 'return' )
        	    {
        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:750:4: ( 'return' )
        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:750:6: 'return'
        	        {
        	             MATCHT(364, &FOLLOW_364_in_modifier_direction_text806);
        	            if  (HASEXCEPTION())
        	            {
        	                goto rulemodifier_direction_textEx;
        	            }
        	            if (HASFAILED())
        	            {
        	                return mdfr;
        	            }


        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             mdfr.setDirectionReturn(); 
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto rulemodifier_direction_textEx; /* Prevent compiler warnings */
    rulemodifier_direction_textEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(7, modifier_direction_text_StartIndex); }

    return mdfr;
}
/* $ANTLR end modifier_direction_text */

/**
 * $ANTLR start modifier_set_direction_strict_text
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:753:1: modifier_set_direction_strict_text[ sep::Modifier & mdfr ] : ( 'input' | 'output' | 'inout' | 'return' );
 */
static void
modifier_set_direction_strict_text(pfmlParser ctx, sep::Modifier & mdfr)
{
    ANTLR3_UINT32 modifier_set_direction_strict_text_StartIndex;

    /* Initialize rule variables
     */
    modifier_set_direction_strict_text_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(8)) )
    {
        {
        }



        return ;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:755:2: ( 'input' | 'output' | 'inout' | 'return' )

            ANTLR3_UINT32 alt12;

            alt12=4;

            switch ( LA(1) )
            {
            case 305:
            	{
            		alt12=1;
            	}
                break;
            case 341:
            	{
            		alt12=2;
            	}
                break;
            case 298:
            	{
            		alt12=3;
            	}
                break;
            case 364:
            	{
            		alt12=4;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 12;
                EXCEPTION->state        = 0;


                goto rulemodifier_set_direction_strict_textEx;

            }

            switch (alt12)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:755:4: 'input'
        	    {
        	         MATCHT(305, &FOLLOW_305_in_modifier_set_direction_strict_text833);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulemodifier_set_direction_strict_textEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             mdfr.setDirectionInput();  
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:756:4: 'output'
        	    {
        	         MATCHT(341, &FOLLOW_341_in_modifier_set_direction_strict_text843);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulemodifier_set_direction_strict_textEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             mdfr.setDirectionOutput(); 
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:757:4: 'inout'
        	    {
        	         MATCHT(298, &FOLLOW_298_in_modifier_set_direction_strict_text852);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulemodifier_set_direction_strict_textEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             mdfr.setDirectionInout();  
        	        }


        	    }
        	    break;
        	case 4:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:758:4: 'return'
        	    {
        	         MATCHT(364, &FOLLOW_364_in_modifier_set_direction_strict_text862);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulemodifier_set_direction_strict_textEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             mdfr.setDirectionReturn(); 
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto rulemodifier_set_direction_strict_textEx; /* Prevent compiler warnings */
    rulemodifier_set_direction_strict_textEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(8, modifier_set_direction_strict_text_StartIndex); }

    return ;
}
/* $ANTLR end modifier_set_direction_strict_text */

/**
 * $ANTLR start modifier_direction_symbol
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:761:1: modifier_direction_symbol returns [ sep::Modifier mdfr ] : ( '->' | '<-' | '<->' | '<=' );
 */
static sep::Modifier
modifier_direction_symbol(pfmlParser ctx)
{
    sep::Modifier mdfr;

    ANTLR3_UINT32 modifier_direction_symbol_StartIndex;

    /* Initialize rule variables
     */
    modifier_direction_symbol_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(9)) )
    {
        {
        }



        return mdfr;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:763:2: ( '->' | '<-' | '<->' | '<=' )

            ANTLR3_UINT32 alt13;

            alt13=4;

            switch ( LA(1) )
            {
            case 164:
            	{
            		alt13=1;
            	}
                break;
            case ASSIGN_REF:
            	{
            		alt13=2;
            	}
                break;
            case 166:
            	{
            		alt13=3;
            	}
                break;
            case LTE:
            	{
            		alt13=4;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return mdfr;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 13;
                EXCEPTION->state        = 0;


                goto rulemodifier_direction_symbolEx;

            }

            switch (alt13)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:763:4: '->'
        	    {
        	         MATCHT(164, &FOLLOW_164_in_modifier_direction_symbol881);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulemodifier_direction_symbolEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return mdfr;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             mdfr.setDirectionInput();  
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:764:4: '<-'
        	    {
        	         MATCHT(ASSIGN_REF, &FOLLOW_ASSIGN_REF_in_modifier_direction_symbol891);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulemodifier_direction_symbolEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return mdfr;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             mdfr.setDirectionOutput(); 
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:765:4: '<->'
        	    {
        	         MATCHT(166, &FOLLOW_166_in_modifier_direction_symbol901);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulemodifier_direction_symbolEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return mdfr;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             mdfr.setDirectionInout();  
        	        }


        	    }
        	    break;
        	case 4:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:766:4: '<='
        	    {
        	         MATCHT(LTE, &FOLLOW_LTE_in_modifier_direction_symbol910);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulemodifier_direction_symbolEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return mdfr;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             mdfr.setDirectionReturn(); 
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto rulemodifier_direction_symbolEx; /* Prevent compiler warnings */
    rulemodifier_direction_symbolEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(9, modifier_direction_symbol_StartIndex); }

    return mdfr;
}
/* $ANTLR end modifier_direction_symbol */

/**
 * $ANTLR start modifier_param
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:771:1: modifier_param returns [ sep::Modifier mdfr ] : (m= modifier_direction | 'final' | 'const' | ( '&' | 'ref' ) | 'macro' | 'bind' );
 */
static sep::Modifier
modifier_param(pfmlParser ctx)
{
    sep::Modifier mdfr;

    ANTLR3_UINT32 modifier_param_StartIndex;

    sep::Modifier m;
    #undef	RETURN_TYPE_m
    #define	RETURN_TYPE_m sep::Modifier

    /* Initialize rule variables
     */
    modifier_param_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(10)) )
    {
        {
        }



        return mdfr;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:773:2: (m= modifier_direction | 'final' | 'const' | ( '&' | 'ref' ) | 'macro' | 'bind' )

            ANTLR3_UINT32 alt14;

            alt14=6;

            switch ( LA(1) )
            {
            case ASSIGN_REF:
            case LTE:
            case 164:
            case 166:
            case 295:
            case 298:
            case 305:
            case 335:
            case 341:
            case 364:
            	{
            		alt14=1;
            	}
                break;
            case 282:
            	{
            		alt14=2;
            	}
                break;
            case 262:
            	{
            		alt14=3;
            	}
                break;
            case BAND:
            case 361:
            	{
            		alt14=4;
            	}
                break;
            case 318:
            	{
            		alt14=5;
            	}
                break;
            case 243:
            	{
            		alt14=6;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return mdfr;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 14;
                EXCEPTION->state        = 0;


                goto rulemodifier_paramEx;

            }

            switch (alt14)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:773:4: m= modifier_direction
        	    {
        	        FOLLOWPUSH(FOLLOW_modifier_direction_in_modifier_param934);
        	        m=modifier_direction(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulemodifier_paramEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return mdfr;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             mdfr = m
        	            ; 
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:775:4: 'final'
        	    {
        	         MATCHT(282, &FOLLOW_282_in_modifier_param943);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulemodifier_paramEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return mdfr;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             mdfr.setFeatureFinal();    
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:776:4: 'const'
        	    {
        	         MATCHT(262, &FOLLOW_262_in_modifier_param960);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulemodifier_paramEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return mdfr;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             mdfr.setFeatureConst();    
        	        }


        	    }
        	    break;
        	case 4:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:778:4: ( '&' | 'ref' )
        	    {
        	        if ( LA(1) == BAND || LA(1) == 361 )
        	        {
        	            CONSUME();
        	            PERRORRECOVERY=ANTLR3_FALSE;
        	            FAILEDFLAG=ANTLR3_FALSE;

        	        }
        	        else
        	        {
        	            if (BACKTRACKING>0)
        	            {
        	                FAILEDFLAG = ANTLR3_TRUE;
        	                return mdfr;
        	            }

        	            CONSTRUCTEX();
        	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
        	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
        	            EXCEPTION->expectingSet = NULL;

        	            goto rulemodifier_paramEx;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             mdfr.setNatureReference(); 
        	        }


        	    }
        	    break;
        	case 5:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:779:4: 'macro'
        	    {
        	         MATCHT(318, &FOLLOW_318_in_modifier_param995);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulemodifier_paramEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return mdfr;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             mdfr.setNatureMacro();     
        	        }


        	    }
        	    break;
        	case 6:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:781:4: 'bind'
        	    {
        	         MATCHT(243, &FOLLOW_243_in_modifier_param1013);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulemodifier_paramEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return mdfr;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             mdfr.setNatureBind();      
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto rulemodifier_paramEx; /* Prevent compiler warnings */
    rulemodifier_paramEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(10, modifier_param_StartIndex); }

    return mdfr;
}
/* $ANTLR end modifier_param */

/**
 * $ANTLR start procedure_modifier_specifier
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:786:1: procedure_modifier_specifier returns [ sep::Modifier mdfr , sep::Specifier spcfr ] : ( 'timed' | 'input_enabled' | 'unsafe' )+ ;
 */
static fmlParser_procedure_modifier_specifier_return
procedure_modifier_specifier(pfmlParser ctx)
{
    fmlParser_procedure_modifier_specifier_return retval;

    ANTLR3_UINT32 procedure_modifier_specifier_StartIndex;

    /* Initialize rule variables
     */
    procedure_modifier_specifier_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(11)) )
    {
    	retval.start = 0;

        {
        }



        return retval;
    }

    retval.start = LT(1); retval.stop = retval.start;


    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:805:2: ( ( 'timed' | 'input_enabled' | 'unsafe' )+ )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:805:4: ( 'timed' | 'input_enabled' | 'unsafe' )+
        {
            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:805:4: ( 'timed' | 'input_enabled' | 'unsafe' )+
            {
                int cnt15=0;

                for (;;)
                {
                    int alt15=4;
            	switch ( LA(1) )
            	{
            	case 393:
            		{
            			alt15=1;
            		}
            	    break;
            	case 306:
            		{
            			alt15=2;
            		}
            	    break;
            	case 406:
            		{
            			alt15=3;
            		}
            	    break;

            	}

            	switch (alt15)
            	{
            	    case 1:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:805:6: 'timed'
            	        {
            	             MATCHT(393, &FOLLOW_393_in_procedure_modifier_specifier1062);
            	            if  (HASEXCEPTION())
            	            {
            	                goto ruleprocedure_modifier_specifierEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return retval;
            	            }


            	            if ( BACKTRACKING==0 )
            	            {
            	                 retval.spcfr
            	                .setFeatureTimed();        
            	            }


            	        }
            	        break;
            	    case 2:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:806:6: 'input_enabled'
            	        {
            	             MATCHT(306, &FOLLOW_306_in_procedure_modifier_specifier1079);
            	            if  (HASEXCEPTION())
            	            {
            	                goto ruleprocedure_modifier_specifierEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return retval;
            	            }


            	            if ( BACKTRACKING==0 )
            	            {
            	                 retval.spcfr
            	                .setFeatureInputEnabled(); 
            	            }


            	        }
            	        break;
            	    case 3:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:808:6: 'unsafe'
            	        {
            	             MATCHT(406, &FOLLOW_406_in_procedure_modifier_specifier1089);
            	            if  (HASEXCEPTION())
            	            {
            	                goto ruleprocedure_modifier_specifierEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return retval;
            	            }


            	            if ( BACKTRACKING==0 )
            	            {
            	                 retval.mdfr
            	                .setFeatureUnsafe();        
            	            }


            	        }
            	        break;

            	    default:

            		if ( cnt15 >= 1 )
            		{
            		    goto loop15;
            		}
            		if (BACKTRACKING>0)
            		{
            		    FAILEDFLAG = ANTLR3_TRUE;
            		    return retval;
            		}

            		/* mismatchedSetEx()
            		 */
            		CONSTRUCTEX();
            		EXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
            		EXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;


            		goto ruleprocedure_modifier_specifierEx;
            	}
            	cnt15++;
                }
                loop15: ;	/* Jump to here if this rule does not match */
            }

        }

    }

    // This is where rules clean up and exit
    //
    goto ruleprocedure_modifier_specifierEx; /* Prevent compiler warnings */
    ruleprocedure_modifier_specifierEx: ;
    retval.stop = LT(-1);


            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(11, procedure_modifier_specifier_StartIndex); }

    return retval;
}
/* $ANTLR end procedure_modifier_specifier */

/**
 * $ANTLR start executable_modifier_specifier
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:813:1: executable_modifier_specifier returns [ sep::Modifier mdfr , sep::Specifier spcfr ] : ( 'model' | 'prototype' | 'dynamic' | 'unsafe' | 'timed' | 'input_enabled' | 'lifeline' )+ ;
 */
static fmlParser_executable_modifier_specifier_return
executable_modifier_specifier(pfmlParser ctx)
{
    fmlParser_executable_modifier_specifier_return retval;

    ANTLR3_UINT32 executable_modifier_specifier_StartIndex;

    /* Initialize rule variables
     */
    executable_modifier_specifier_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(12)) )
    {
    	retval.start = 0;

        {
        }



        return retval;
    }

    retval.start = LT(1); retval.stop = retval.start;


    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:820:2: ( ( 'model' | 'prototype' | 'dynamic' | 'unsafe' | 'timed' | 'input_enabled' | 'lifeline' )+ )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:820:4: ( 'model' | 'prototype' | 'dynamic' | 'unsafe' | 'timed' | 'input_enabled' | 'lifeline' )+
        {
            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:820:4: ( 'model' | 'prototype' | 'dynamic' | 'unsafe' | 'timed' | 'input_enabled' | 'lifeline' )+
            {
                int cnt16=0;

                for (;;)
                {
                    int alt16=8;
            	switch ( LA(1) )
            	{
            	case 322:
            		{
            			{
            			   /* dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState)
            			    */
            			    int LA16_1 = LA(2);
            			    if ( (synpred56_fml(ctx)))
            			    {
            			        alt16=1;
            			    }

            			}
            		}
            	    break;
            	case 353:
            		{
            			{
            			   /* dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState)
            			    */
            			    int LA16_4 = LA(2);
            			    if ( (synpred57_fml(ctx)))
            			    {
            			        alt16=2;
            			    }

            			}
            		}
            	    break;
            	case 272:
            		{
            			{
            			   /* dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState)
            			    */
            			    int LA16_6 = LA(2);
            			    if ( (synpred58_fml(ctx)))
            			    {
            			        alt16=3;
            			    }

            			}
            		}
            	    break;
            	case 406:
            		{
            			{
            			   /* dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState)
            			    */
            			    int LA16_8 = LA(2);
            			    if ( (synpred59_fml(ctx)))
            			    {
            			        alt16=4;
            			    }

            			}
            		}
            	    break;
            	case 393:
            		{
            			{
            			   /* dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState)
            			    */
            			    int LA16_10 = LA(2);
            			    if ( (synpred60_fml(ctx)))
            			    {
            			        alt16=5;
            			    }

            			}
            		}
            	    break;
            	case 306:
            		{
            			{
            			   /* dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState)
            			    */
            			    int LA16_12 = LA(2);
            			    if ( (synpred61_fml(ctx)))
            			    {
            			        alt16=6;
            			    }

            			}
            		}
            	    break;
            	case 314:
            		{
            			{
            			   /* dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState)
            			    */
            			    int LA16_14 = LA(2);
            			    if ( (synpred62_fml(ctx)))
            			    {
            			        alt16=7;
            			    }

            			}
            		}
            	    break;

            	}

            	switch (alt16)
            	{
            	    case 1:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:820:6: 'model'
            	        {
            	             MATCHT(322, &FOLLOW_322_in_executable_modifier_specifier1127);
            	            if  (HASEXCEPTION())
            	            {
            	                goto ruleexecutable_modifier_specifierEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return retval;
            	            }


            	            if ( BACKTRACKING==0 )
            	            {
            	                 retval.spcfr
            	                .setDesignModel();           
            	            }


            	        }
            	        break;
            	    case 2:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:821:6: 'prototype'
            	        {
            	             MATCHT(353, &FOLLOW_353_in_executable_modifier_specifier1144);
            	            if  (HASEXCEPTION())
            	            {
            	                goto ruleexecutable_modifier_specifierEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return retval;
            	            }


            	            if ( BACKTRACKING==0 )
            	            {
            	                 retval.spcfr
            	                .setDesignPrototypeStatic(); 
            	            }


            	        }
            	        break;
            	    case 3:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:823:6: 'dynamic'
            	        {
            	             MATCHT(272, &FOLLOW_272_in_executable_modifier_specifier1158);
            	            if  (HASEXCEPTION())
            	            {
            	                goto ruleexecutable_modifier_specifierEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return retval;
            	            }


            	            if ( BACKTRACKING==0 )
            	            {
            	                 retval.spcfr
            	                .setDesignInstanceDynamic(); 
            	            }


            	        }
            	        break;
            	    case 4:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:832:6: 'unsafe'
            	        {
            	             MATCHT(406, &FOLLOW_406_in_executable_modifier_specifier1181);
            	            if  (HASEXCEPTION())
            	            {
            	                goto ruleexecutable_modifier_specifierEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return retval;
            	            }


            	            if ( BACKTRACKING==0 )
            	            {
            	                 retval.mdfr
            	                .setFeatureUnsafe();        
            	            }


            	        }
            	        break;
            	    case 5:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:834:6: 'timed'
            	        {
            	             MATCHT(393, &FOLLOW_393_in_executable_modifier_specifier1198);
            	            if  (HASEXCEPTION())
            	            {
            	                goto ruleexecutable_modifier_specifierEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return retval;
            	            }


            	            if ( BACKTRACKING==0 )
            	            {
            	                 retval.spcfr
            	                .setFeatureTimed();        
            	            }


            	        }
            	        break;
            	    case 6:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:835:6: 'input_enabled'
            	        {
            	             MATCHT(306, &FOLLOW_306_in_executable_modifier_specifier1215);
            	            if  (HASEXCEPTION())
            	            {
            	                goto ruleexecutable_modifier_specifierEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return retval;
            	            }


            	            if ( BACKTRACKING==0 )
            	            {
            	                 retval.spcfr
            	                .setFeatureInputEnabled(); 
            	            }


            	        }
            	        break;
            	    case 7:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:836:6: 'lifeline'
            	        {
            	             MATCHT(314, &FOLLOW_314_in_executable_modifier_specifier1224);
            	            if  (HASEXCEPTION())
            	            {
            	                goto ruleexecutable_modifier_specifierEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return retval;
            	            }


            	            if ( BACKTRACKING==0 )
            	            {
            	                 retval.spcfr
            	                .setFeatureLifeline();     
            	            }


            	        }
            	        break;

            	    default:

            		if ( cnt16 >= 1 )
            		{
            		    goto loop16;
            		}
            		if (BACKTRACKING>0)
            		{
            		    FAILEDFLAG = ANTLR3_TRUE;
            		    return retval;
            		}

            		/* mismatchedSetEx()
            		 */
            		CONSTRUCTEX();
            		EXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
            		EXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;


            		goto ruleexecutable_modifier_specifierEx;
            	}
            	cnt16++;
                }
                loop16: ;	/* Jump to here if this rule does not match */
            }

        }

    }

    // This is where rules clean up and exit
    //
    goto ruleexecutable_modifier_specifierEx; /* Prevent compiler warnings */
    ruleexecutable_modifier_specifierEx: ;
    retval.stop = LT(-1);


            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(12, executable_modifier_specifier_StartIndex); }

    return retval;
}
/* $ANTLR end executable_modifier_specifier */

/**
 * $ANTLR start instance_modifier_specifier
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:840:1: instance_modifier_specifier returns [ sep::Modifier mdfr , sep::Specifier spcfr ] : ( 'final' | 'dynamic' | 'public' | 'protected' | 'private' | 'unsafe' | 'timed' | 'input_enabled' | 'lifeline' )+ ;
 */
static fmlParser_instance_modifier_specifier_return
instance_modifier_specifier(pfmlParser ctx)
{
    fmlParser_instance_modifier_specifier_return retval;

    ANTLR3_UINT32 instance_modifier_specifier_StartIndex;

    /* Initialize rule variables
     */
    instance_modifier_specifier_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(13)) )
    {
    	retval.start = 0;

        {
        }



        return retval;
    }

    retval.start = LT(1); retval.stop = retval.start;


    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:842:2: ( ( 'final' | 'dynamic' | 'public' | 'protected' | 'private' | 'unsafe' | 'timed' | 'input_enabled' | 'lifeline' )+ )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:842:4: ( 'final' | 'dynamic' | 'public' | 'protected' | 'private' | 'unsafe' | 'timed' | 'input_enabled' | 'lifeline' )+
        {
            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:842:4: ( 'final' | 'dynamic' | 'public' | 'protected' | 'private' | 'unsafe' | 'timed' | 'input_enabled' | 'lifeline' )+
            {
                int cnt17=0;

                for (;;)
                {
                    int alt17=10;
            	switch ( LA(1) )
            	{
            	case 282:
            		{
            			alt17=1;
            		}
            	    break;
            	case 272:
            		{
            			alt17=2;
            		}
            	    break;
            	case 355:
            		{
            			alt17=3;
            		}
            	    break;
            	case 352:
            		{
            			alt17=4;
            		}
            	    break;
            	case 349:
            		{
            			alt17=5;
            		}
            	    break;
            	case 406:
            		{
            			alt17=6;
            		}
            	    break;
            	case 393:
            		{
            			alt17=7;
            		}
            	    break;
            	case 306:
            		{
            			alt17=8;
            		}
            	    break;
            	case 314:
            		{
            			alt17=9;
            		}
            	    break;

            	}

            	switch (alt17)
            	{
            	    case 1:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:842:6: 'final'
            	        {
            	             MATCHT(282, &FOLLOW_282_in_instance_modifier_specifier1254);
            	            if  (HASEXCEPTION())
            	            {
            	                goto ruleinstance_modifier_specifierEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return retval;
            	            }


            	            if ( BACKTRACKING==0 )
            	            {
            	                 retval.mdfr
            	                .setFeatureFinal();     
            	            }


            	        }
            	        break;
            	    case 2:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:850:6: 'dynamic'
            	        {
            	             MATCHT(272, &FOLLOW_272_in_instance_modifier_specifier1278);
            	            if  (HASEXCEPTION())
            	            {
            	                goto ruleinstance_modifier_specifierEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return retval;
            	            }


            	            if ( BACKTRACKING==0 )
            	            {
            	                 retval.spcfr
            	                .setDesignInstanceDynamic(); 
            	            }


            	        }
            	        break;
            	    case 3:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:855:6: 'public'
            	        {
            	             MATCHT(355, &FOLLOW_355_in_instance_modifier_specifier1297);
            	            if  (HASEXCEPTION())
            	            {
            	                goto ruleinstance_modifier_specifierEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return retval;
            	            }


            	            if ( BACKTRACKING==0 )
            	            {
            	                 retval.mdfr
            	                .setVisibilityPublic();    
            	            }


            	        }
            	        break;
            	    case 4:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:856:6: 'protected'
            	        {
            	             MATCHT(352, &FOLLOW_352_in_instance_modifier_specifier1313);
            	            if  (HASEXCEPTION())
            	            {
            	                goto ruleinstance_modifier_specifierEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return retval;
            	            }


            	            if ( BACKTRACKING==0 )
            	            {
            	                 retval.mdfr
            	                .setVisibilityProtected(); 
            	            }


            	        }
            	        break;
            	    case 5:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:857:6: 'private'
            	        {
            	             MATCHT(349, &FOLLOW_349_in_instance_modifier_specifier1326);
            	            if  (HASEXCEPTION())
            	            {
            	                goto ruleinstance_modifier_specifierEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return retval;
            	            }


            	            if ( BACKTRACKING==0 )
            	            {
            	                 retval.mdfr
            	                .setVisibilityPrivate();   
            	            }


            	        }
            	        break;
            	    case 6:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:859:6: 'unsafe'
            	        {
            	             MATCHT(406, &FOLLOW_406_in_instance_modifier_specifier1342);
            	            if  (HASEXCEPTION())
            	            {
            	                goto ruleinstance_modifier_specifierEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return retval;
            	            }


            	            if ( BACKTRACKING==0 )
            	            {
            	                 retval.mdfr
            	                .setFeatureUnsafe();       
            	            }


            	        }
            	        break;
            	    case 7:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:861:6: 'timed'
            	        {
            	             MATCHT(393, &FOLLOW_393_in_instance_modifier_specifier1359);
            	            if  (HASEXCEPTION())
            	            {
            	                goto ruleinstance_modifier_specifierEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return retval;
            	            }


            	            if ( BACKTRACKING==0 )
            	            {
            	                 retval.spcfr
            	                .setFeatureTimed();        
            	            }


            	        }
            	        break;
            	    case 8:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:862:6: 'input_enabled'
            	        {
            	             MATCHT(306, &FOLLOW_306_in_instance_modifier_specifier1376);
            	            if  (HASEXCEPTION())
            	            {
            	                goto ruleinstance_modifier_specifierEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return retval;
            	            }


            	            if ( BACKTRACKING==0 )
            	            {
            	                 retval.spcfr
            	                .setFeatureInputEnabled(); 
            	            }


            	        }
            	        break;
            	    case 9:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:863:6: 'lifeline'
            	        {
            	             MATCHT(314, &FOLLOW_314_in_instance_modifier_specifier1385);
            	            if  (HASEXCEPTION())
            	            {
            	                goto ruleinstance_modifier_specifierEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return retval;
            	            }


            	            if ( BACKTRACKING==0 )
            	            {
            	                 retval.spcfr
            	                .setFeatureLifeline();     
            	            }


            	        }
            	        break;

            	    default:

            		if ( cnt17 >= 1 )
            		{
            		    goto loop17;
            		}
            		if (BACKTRACKING>0)
            		{
            		    FAILEDFLAG = ANTLR3_TRUE;
            		    return retval;
            		}

            		/* mismatchedSetEx()
            		 */
            		CONSTRUCTEX();
            		EXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
            		EXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;


            		goto ruleinstance_modifier_specifierEx;
            	}
            	cnt17++;
                }
                loop17: ;	/* Jump to here if this rule does not match */
            }

        }

    }

    // This is where rules clean up and exit
    //
    goto ruleinstance_modifier_specifierEx; /* Prevent compiler warnings */
    ruleinstance_modifier_specifierEx: ;
    retval.stop = LT(-1);


            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(13, instance_modifier_specifier_StartIndex); }

    return retval;
}
/* $ANTLR end instance_modifier_specifier */

/**
 * $ANTLR start modifier_transition
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:869:1: modifier_transition returns [ sep::Modifier mdfr , sep::Specifier spcfr ] : ( 'transient' | 'timed' | 'input_enabled' )+ ;
 */
static fmlParser_modifier_transition_return
modifier_transition(pfmlParser ctx)
{
    fmlParser_modifier_transition_return retval;

    ANTLR3_UINT32 modifier_transition_StartIndex;

    /* Initialize rule variables
     */
    modifier_transition_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(14)) )
    {
    	retval.start = 0;

        {
        }



        return retval;
    }

    retval.start = LT(1); retval.stop = retval.start;


    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:874:2: ( ( 'transient' | 'timed' | 'input_enabled' )+ )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:874:4: ( 'transient' | 'timed' | 'input_enabled' )+
        {
            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:874:4: ( 'transient' | 'timed' | 'input_enabled' )+
            {
                int cnt18=0;

                for (;;)
                {
                    int alt18=4;
            	switch ( LA(1) )
            	{
            	case 395:
            		{
            			alt18=1;
            		}
            	    break;
            	case 393:
            		{
            			alt18=2;
            		}
            	    break;
            	case 306:
            		{
            			alt18=3;
            		}
            	    break;

            	}

            	switch (alt18)
            	{
            	    case 1:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:874:6: 'transient'
            	        {
            	             MATCHT(395, &FOLLOW_395_in_modifier_transition1420);
            	            if  (HASEXCEPTION())
            	            {
            	                goto rulemodifier_transitionEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return retval;
            	            }


            	            if ( BACKTRACKING==0 )
            	            {
            	                 retval.mdfr
            	                .setFeatureTransient();     
            	            }


            	        }
            	        break;
            	    case 2:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:878:6: 'timed'
            	        {
            	             MATCHT(393, &FOLLOW_393_in_modifier_transition1436);
            	            if  (HASEXCEPTION())
            	            {
            	                goto rulemodifier_transitionEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return retval;
            	            }


            	            if ( BACKTRACKING==0 )
            	            {
            	                 retval.spcfr
            	                .setFeatureTimed();        
            	            }


            	        }
            	        break;
            	    case 3:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:879:6: 'input_enabled'
            	        {
            	             MATCHT(306, &FOLLOW_306_in_modifier_transition1453);
            	            if  (HASEXCEPTION())
            	            {
            	                goto rulemodifier_transitionEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return retval;
            	            }


            	            if ( BACKTRACKING==0 )
            	            {
            	                 retval.spcfr
            	                .setFeatureInputEnabled(); 
            	            }


            	        }
            	        break;

            	    default:

            		if ( cnt18 >= 1 )
            		{
            		    goto loop18;
            		}
            		if (BACKTRACKING>0)
            		{
            		    FAILEDFLAG = ANTLR3_TRUE;
            		    return retval;
            		}

            		/* mismatchedSetEx()
            		 */
            		CONSTRUCTEX();
            		EXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
            		EXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;


            		goto rulemodifier_transitionEx;
            	}
            	cnt18++;
                }
                loop18: ;	/* Jump to here if this rule does not match */
            }

        }

    }

    // This is where rules clean up and exit
    //
    goto rulemodifier_transitionEx; /* Prevent compiler warnings */
    rulemodifier_transitionEx: ;
    retval.stop = LT(-1);


            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(14, modifier_transition_StartIndex); }

    return retval;
}
/* $ANTLR end modifier_transition */

/**
 * $ANTLR start def_package
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:888:1: def_package returns [ sep::Package * pack ] : 'package' id= ID ( StringLiteral )? LCURLY ( section_header[ pack ] )? ( section_import[ pack ] )? ( section_property[ pack ] )* ( section_composite_structure[ pack ] )* RCURLY ;
 */
static sep::Package *
def_package(pfmlParser ctx)
{
    sep::Package * pack;

    ANTLR3_UINT32 def_package_StartIndex;

    pANTLR3_COMMON_TOKEN    id;
    pANTLR3_COMMON_TOKEN    StringLiteral1;

    /* Initialize rule variables
     */
    def_package_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(15)) )
    {
        {

            	POP_CTX;

            	sep::ParserUtil::declareDefaultEndingStateIfNeed(needDefaultStateFinal,
            			needDefaultStateTerminal, needDefaultStateReturn);

        }
        {
        }



        return pack;
    }

    id       = NULL;
    StringLiteral1       = NULL;

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:896:2: ( 'package' id= ID ( StringLiteral )? LCURLY ( section_header[ pack ] )? ( section_import[ pack ] )? ( section_property[ pack ] )* ( section_composite_structure[ pack ] )* RCURLY )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:896:4: 'package' id= ID ( StringLiteral )? LCURLY ( section_header[ pack ] )? ( section_import[ pack ] )? ( section_property[ pack ] )* ( section_composite_structure[ pack ] )* RCURLY
        {
             MATCHT(342, &FOLLOW_342_in_def_package1485);
            if  (HASEXCEPTION())
            {
                goto ruledef_packageEx;
            }
            if (HASFAILED())
            {
                return pack;
            }


            id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_def_package1489);
            if  (HASEXCEPTION())
            {
                goto ruledef_packageEx;
            }
            if (HASFAILED())
            {
                return pack;
            }


            if ( BACKTRACKING==0 )
            {
                 PUSH_CTX_CPM( pack= new sep::Package(STR((id->getText(id))->chars)) );
                 
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:899:6: ( StringLiteral )?
            {
                int alt19=2;
                switch ( LA(1) )
                {
                    case StringLiteral:
                    	{
                    		alt19=1;
                    	}
                        break;
                }

                switch (alt19)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:899:8: StringLiteral
            	    {
            	        StringLiteral1 = (pANTLR3_COMMON_TOKEN) MATCHT(StringLiteral, &FOLLOW_StringLiteral_in_def_package1506);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_packageEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return pack;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             pack
            	            ->setUnrestrictedName(STR((StringLiteral1->getText(StringLiteral1))->chars)); 
            	        }


            	    }
            	    break;

                }
            }

             MATCHT(LCURLY, &FOLLOW_LCURLY_in_def_package1527);
            if  (HASEXCEPTION())
            {
                goto ruledef_packageEx;
            }
            if (HASFAILED())
            {
                return pack;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:904:4: ( section_header[ pack ] )?
            {
                int alt20=2;
                switch ( LA(1) )
                {
                    case 188:
                    	{
                    		alt20=1;
                    	}
                        break;
                }

                switch (alt20)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:904:4: section_header[ pack ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_header_in_def_package1532);
            	        section_header(ctx, pack);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_packageEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return pack;
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:905:4: ( section_import[ pack ] )?
            {
                int alt21=2;
                switch ( LA(1) )
                {
                    case 192:
                    	{
                    		alt21=1;
                    	}
                        break;
                }

                switch (alt21)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:905:4: section_import[ pack ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_import_in_def_package1540);
            	        section_import(ctx, pack);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_packageEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return pack;
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:907:4: ( section_property[ pack ] )*

            for (;;)
            {
                int alt22=2;
                switch ( LA(1) )
                {
                case 178:
                case 211:
                case 213:
                case 214:
                case 216:
                	{
                		alt22=1;
                	}
                    break;

                }

                switch (alt22)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:907:6: section_property[ pack ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_property_in_def_package1551);
            	        section_property(ctx, pack);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_packageEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return pack;
            	        }


            	    }
            	    break;

            	default:
            	    goto loop22;	/* break out of the loop */
            	    break;
                }
            }
            loop22: ; /* Jump out to here if this rule does not match */


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:909:4: ( section_composite_structure[ pack ] )*

            for (;;)
            {
                int alt23=2;
                switch ( LA(1) )
                {
                case 174:
                case 183:
                case 197:
                case 200:
                case 201:
                case 203:
                case 212:
                case 215:
                case 222:
                	{
                		alt23=1;
                	}
                    break;

                }

                switch (alt23)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:909:6: section_composite_structure[ pack ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_composite_structure_in_def_package1563);
            	        section_composite_structure(ctx, pack);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_packageEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return pack;
            	        }


            	    }
            	    break;

            	default:
            	    goto loop23;	/* break out of the loop */
            	    break;
                }
            }
            loop23: ; /* Jump out to here if this rule does not match */


             MATCHT(RCURLY, &FOLLOW_RCURLY_in_def_package1572);
            if  (HASEXCEPTION())
            {
                goto ruledef_packageEx;
            }
            if (HASFAILED())
            {
                return pack;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_packageEx; /* Prevent compiler warnings */
    ruledef_packageEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
            else
            {
                {

                    	POP_CTX;

                    	sep::ParserUtil::declareDefaultEndingStateIfNeed(needDefaultStateFinal,
                    			needDefaultStateTerminal, needDefaultStateReturn);

                }
            }


    if ( BACKTRACKING>0 ) { MEMOIZE(15, def_package_StartIndex); }

    return pack;
}
/* $ANTLR end def_package */

/**
 * $ANTLR start def_system
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:918:1: def_system returns [ sep::System * sys ] : (ms= executable_modifier_specifier )? 'system' ( LT_ ( 'moc:' )? executable_specifier[ spcfr ] GT )? id= ID ( StringLiteral )? LCURLY ( section_header[ sys ] )? ( section_import[ sys ] )? ( section_parameter[ sys ] )* ( section_property[ sys ] )* ( section_composite_structure[ sys ] )* ( section_behavior[ sys ] | section_statemachine[ sys ] )? ( section_model_of_computation[ sys ] | section_model_of_interaction[ sys ] | section_model_of_execution[ sys ] )* RCURLY ;
 */
static sep::System *
def_system(pfmlParser ctx)
{
    sep::System * sys;

    ANTLR3_UINT32 def_system_StartIndex;

    pANTLR3_COMMON_TOKEN    id;
    pANTLR3_COMMON_TOKEN    StringLiteral2;
    fmlParser_executable_modifier_specifier_return ms;
    #undef	RETURN_TYPE_ms
    #define	RETURN_TYPE_ms fmlParser_executable_modifier_specifier_return

    /* Initialize rule variables
     */
    def_system_StartIndex = INDEX();



    	 sep::Modifier mdfr;

    	sep::Specifier spcfr( sep::Specifier::COMPONENT_SYSTEM_KIND );

    	SAVE_RULE_BEGIN_LOCATION;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(16)) )
    {
        {

            	POP_CTX;

            	sep::ParserUtil::declareDefaultEndingStateIfNeed(needDefaultStateFinal,
            			needDefaultStateTerminal, needDefaultStateReturn);

            	SET_RULE_LOCATION(sys);

        }
        {
        }



        return sys;
    }

    id       = NULL;
    StringLiteral2       = NULL;

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:935:2: ( (ms= executable_modifier_specifier )? 'system' ( LT_ ( 'moc:' )? executable_specifier[ spcfr ] GT )? id= ID ( StringLiteral )? LCURLY ( section_header[ sys ] )? ( section_import[ sys ] )? ( section_parameter[ sys ] )* ( section_property[ sys ] )* ( section_composite_structure[ sys ] )* ( section_behavior[ sys ] | section_statemachine[ sys ] )? ( section_model_of_computation[ sys ] | section_model_of_interaction[ sys ] | section_model_of_execution[ sys ] )* RCURLY )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:935:4: (ms= executable_modifier_specifier )? 'system' ( LT_ ( 'moc:' )? executable_specifier[ spcfr ] GT )? id= ID ( StringLiteral )? LCURLY ( section_header[ sys ] )? ( section_import[ sys ] )? ( section_parameter[ sys ] )* ( section_property[ sys ] )* ( section_composite_structure[ sys ] )* ( section_behavior[ sys ] | section_statemachine[ sys ] )? ( section_model_of_computation[ sys ] | section_model_of_interaction[ sys ] | section_model_of_execution[ sys ] )* RCURLY
        {
            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:935:4: (ms= executable_modifier_specifier )?
            {
                int alt24=2;
                switch ( LA(1) )
                {
                    case 272:
                    case 306:
                    case 314:
                    case 322:
                    case 353:
                    case 393:
                    case 406:
                    	{
                    		alt24=1;
                    	}
                        break;
                }

                switch (alt24)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:935:6: ms= executable_modifier_specifier
            	    {
            	        FOLLOWPUSH(FOLLOW_executable_modifier_specifier_in_def_system1604);
            	        ms=executable_modifier_specifier(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_systemEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return sys;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             mdfr = ms.mdfr
            	            ; spcfr.ifnot_define( ms.spcfr
            	             ); 
            	        }


            	    }
            	    break;

                }
            }

             MATCHT(390, &FOLLOW_390_in_def_system1618);
            if  (HASEXCEPTION())
            {
                goto ruledef_systemEx;
            }
            if (HASFAILED())
            {
                return sys;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:939:4: ( LT_ ( 'moc:' )? executable_specifier[ spcfr ] GT )?
            {
                int alt26=2;
                switch ( LA(1) )
                {
                    case LT_:
                    	{
                    		alt26=1;
                    	}
                        break;
                }

                switch (alt26)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:939:6: LT_ ( 'moc:' )? executable_specifier[ spcfr ] GT
            	    {
            	         MATCHT(LT_, &FOLLOW_LT__in_def_system1626);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_systemEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return sys;
            	        }


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:939:10: ( 'moc:' )?
            	        {
            	            int alt25=2;
            	            switch ( LA(1) )
            	            {
            	                case 321:
            	                	{
            	                		alt25=1;
            	                	}
            	                    break;
            	            }

            	            switch (alt25)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:939:12: 'moc:'
            	        	    {
            	        	         MATCHT(321, &FOLLOW_321_in_def_system1630);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledef_systemEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return sys;
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	        FOLLOWPUSH(FOLLOW_executable_specifier_in_def_system1636);
            	        executable_specifier(ctx, spcfr);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_systemEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return sys;
            	        }


            	         MATCHT(GT, &FOLLOW_GT_in_def_system1639);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_systemEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return sys;
            	        }


            	    }
            	    break;

                }
            }

            id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_def_system1649);
            if  (HASEXCEPTION())
            {
                goto ruledef_systemEx;
            }
            if (HASFAILED())
            {
                return sys;
            }


            if ( BACKTRACKING==0 )
            {

                	  	PUSH_CTX_CPM( _SYSTEM_ = sys= new sep::System(STR((id->getText(id))->chars)) );


                	  	sys
                ->getwModifier().override_ifdef( mdfr );

                	  	sys
                ->getwSpecifier().ifnot_define( spcfr );
                	  
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:949:4: ( StringLiteral )?
            {
                int alt27=2;
                switch ( LA(1) )
                {
                    case StringLiteral:
                    	{
                    		alt27=1;
                    	}
                        break;
                }

                switch (alt27)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:949:6: StringLiteral
            	    {
            	        StringLiteral2 = (pANTLR3_COMMON_TOKEN) MATCHT(StringLiteral, &FOLLOW_StringLiteral_in_def_system1662);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_systemEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return sys;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             sys
            	            ->setUnrestrictedName(STR((StringLiteral2->getText(StringLiteral2))->chars)); 
            	        }


            	    }
            	    break;

                }
            }

             MATCHT(LCURLY, &FOLLOW_LCURLY_in_def_system1679);
            if  (HASEXCEPTION())
            {
                goto ruledef_systemEx;
            }
            if (HASFAILED())
            {
                return sys;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:957:4: ( section_header[ sys ] )?
            {
                int alt28=2;
                switch ( LA(1) )
                {
                    case 188:
                    	{
                    		alt28=1;
                    	}
                        break;
                }

                switch (alt28)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:957:4: section_header[ sys ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_header_in_def_system1687);
            	        section_header(ctx, sys);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_systemEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return sys;
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:958:4: ( section_import[ sys ] )?
            {
                int alt29=2;
                switch ( LA(1) )
                {
                    case 192:
                    	{
                    		alt29=1;
                    	}
                        break;
                }

                switch (alt29)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:958:4: section_import[ sys ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_import_in_def_system1695);
            	        section_import(ctx, sys);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_systemEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return sys;
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:960:4: ( section_parameter[ sys ] )*

            for (;;)
            {
                int alt30=2;
                switch ( LA(1) )
                {
                case 195:
                case 196:
                case 207:
                case 209:
                case 210:
                case 219:
                case 220:
                	{
                		alt30=1;
                	}
                    break;

                }

                switch (alt30)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:960:6: section_parameter[ sys ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_parameter_in_def_system1706);
            	        section_parameter(ctx, sys);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_systemEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return sys;
            	        }


            	    }
            	    break;

            	default:
            	    goto loop30;	/* break out of the loop */
            	    break;
                }
            }
            loop30: ; /* Jump out to here if this rule does not match */


            if ( BACKTRACKING==0 )
            {
                  sep::TemplateFactory::genProperty(sys); 
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:965:4: ( section_property[ sys ] )*

            for (;;)
            {
                int alt31=2;
                switch ( LA(1) )
                {
                case 178:
                case 211:
                case 213:
                case 214:
                case 216:
                	{
                		alt31=1;
                	}
                    break;

                }

                switch (alt31)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:965:6: section_property[ sys ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_property_in_def_system1728);
            	        section_property(ctx, sys);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_systemEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return sys;
            	        }


            	    }
            	    break;

            	default:
            	    goto loop31;	/* break out of the loop */
            	    break;
                }
            }
            loop31: ; /* Jump out to here if this rule does not match */


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:967:4: ( section_composite_structure[ sys ] )*

            for (;;)
            {
                int alt32=2;
                switch ( LA(1) )
                {
                case 174:
                case 183:
                case 197:
                case 200:
                case 201:
                case 203:
                case 212:
                case 215:
                case 222:
                	{
                		alt32=1;
                	}
                    break;

                }

                switch (alt32)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:967:6: section_composite_structure[ sys ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_composite_structure_in_def_system1740);
            	        section_composite_structure(ctx, sys);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_systemEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return sys;
            	        }


            	    }
            	    break;

            	default:
            	    goto loop32;	/* break out of the loop */
            	    break;
                }
            }
            loop32: ; /* Jump out to here if this rule does not match */


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:969:4: ( section_behavior[ sys ] | section_statemachine[ sys ] )?
            {
                int alt33=3;
                switch ( LA(1) )
                {
                    case 171:
                    	{
                    		alt33=1;
                    	}
                        break;
                    case 227:
                    	{
                    		alt33=2;
                    	}
                        break;
                }

                switch (alt33)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:969:6: section_behavior[ sys ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_behavior_in_def_system1752);
            	        section_behavior(ctx, sys);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_systemEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return sys;
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:970:6: section_statemachine[ sys ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_statemachine_in_def_system1760);
            	        section_statemachine(ctx, sys);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_systemEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return sys;
            	        }


            	    }
            	    break;

                }
            }

            if ( BACKTRACKING==0 )
            {
                  sep::TemplateFactory::genBehavior(sys); 
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:976:4: ( section_model_of_computation[ sys ] | section_model_of_interaction[ sys ] | section_model_of_execution[ sys ] )*

            for (;;)
            {
                int alt34=4;
                switch ( LA(1) )
                {
                case 202:
                	{
                		alt34=1;
                	}
                    break;
                case 172:
                case 198:
                	{
                		alt34=2;
                	}
                    break;
                case 204:
                	{
                		alt34=3;
                	}
                    break;

                }

                switch (alt34)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:976:6: section_model_of_computation[ sys ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_model_of_computation_in_def_system1788);
            	        section_model_of_computation(ctx, sys);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_systemEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return sys;
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:977:6: section_model_of_interaction[ sys ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_model_of_interaction_in_def_system1796);
            	        section_model_of_interaction(ctx, sys);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_systemEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return sys;
            	        }


            	    }
            	    break;
            	case 3:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:978:6: section_model_of_execution[ sys ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_model_of_execution_in_def_system1804);
            	        section_model_of_execution(ctx, sys);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_systemEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return sys;
            	        }


            	    }
            	    break;

            	default:
            	    goto loop34;	/* break out of the loop */
            	    break;
                }
            }
            loop34: ; /* Jump out to here if this rule does not match */


             MATCHT(RCURLY, &FOLLOW_RCURLY_in_def_system1816);
            if  (HASEXCEPTION())
            {
                goto ruledef_systemEx;
            }
            if (HASFAILED())
            {
                return sys;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_systemEx; /* Prevent compiler warnings */
    ruledef_systemEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
            else
            {
                {

                    	POP_CTX;

                    	sep::ParserUtil::declareDefaultEndingStateIfNeed(needDefaultStateFinal,
                    			needDefaultStateTerminal, needDefaultStateReturn);

                    	SET_RULE_LOCATION(sys);

                }
            }


    if ( BACKTRACKING>0 ) { MEMOIZE(16, def_system_StartIndex); }

    return sys;
}
/* $ANTLR end def_system */

/**
 * $ANTLR start qualifiedNameID
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:988:1: qualifiedNameID returns [ std::string s , sep::avm_size_t nb = 1 ] : id= ID ( ( DOT | COLONx2 ) id= ID )* ;
 */
static fmlParser_qualifiedNameID_return
qualifiedNameID(pfmlParser ctx)
{
    fmlParser_qualifiedNameID_return retval;

    ANTLR3_UINT32 qualifiedNameID_StartIndex;

    pANTLR3_COMMON_TOKEN    id;

    /* Initialize rule variables
     */
    retval.nb =  1;

    qualifiedNameID_StartIndex = INDEX();



    	cpLOCATOR.clear();
    	cpQNID.clear();

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(17)) )
    {
    	retval.start = 0;

        {
        }



        return retval;
    }

    id       = NULL;
    retval.start = LT(1); retval.stop = retval.start;


    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:994:2: (id= ID ( ( DOT | COLONx2 ) id= ID )* )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:994:4: id= ID ( ( DOT | COLONx2 ) id= ID )*
        {
            id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_qualifiedNameID1842);
            if  (HASEXCEPTION())
            {
                goto rulequalifiedNameIDEx;
            }
            if (HASFAILED())
            {
                return retval;
            }


            if ( BACKTRACKING==0 )
            {
                 retval.s= STR((id->getText(id))->chars);
                 
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:995:4: ( ( DOT | COLONx2 ) id= ID )*

            for (;;)
            {
                int alt36=2;
                switch ( LA(1) )
                {
                case COLONx2:
                	{
                		{
                		   /* dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState)
                		    */
                		    int LA36_1 = LA(2);
                		    if ( (synpred95_fml(ctx)))
                		    {
                		        alt36=1;
                		    }

                		}
                	}
                    break;
                case DOT:
                	{
                		alt36=1;
                	}
                    break;

                }

                switch (alt36)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:995:6: ( DOT | COLONx2 ) id= ID
            	    {
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:995:6: ( DOT | COLONx2 )
            	        {
            	            int alt35=2;
            	            switch ( LA(1) )
            	            {
            	            case DOT:
            	            	{
            	            		alt35=1;
            	            	}
            	                break;
            	            case COLONx2:
            	            	{
            	            		alt35=2;
            	            	}
            	                break;

            	            default:
            	                if (BACKTRACKING>0)
            	                {
            	                    FAILEDFLAG = ANTLR3_TRUE;
            	                    return retval;
            	                }

            	                CONSTRUCTEX();
            	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
            	                EXCEPTION->message      = (void *)"";
            	                EXCEPTION->decisionNum  = 35;
            	                EXCEPTION->state        = 0;


            	                goto rulequalifiedNameIDEx;

            	            }

            	            switch (alt35)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:995:8: DOT
            	        	    {
            	        	         MATCHT(DOT, &FOLLOW_DOT_in_qualifiedNameID1859);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto rulequalifiedNameIDEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return retval;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             cpQNID.push_back(retval.s
            	        	            ); retval.s= 
            	        	            retval.s
            	        	             + "." ;
            	        	              ++retval.nb
            	        	            ; 
            	        	        }


            	        	    }
            	        	    break;
            	        	case 2:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:997:8: COLONx2
            	        	    {
            	        	         MATCHT(COLONx2, &FOLLOW_COLONx2_in_qualifiedNameID1875);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto rulequalifiedNameIDEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return retval;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             cpLOCATOR = retval.s
            	        	            ; cpQNID.clear(); retval.s= 
            	        	            retval.s
            	        	             + "::";
            	        	             
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_qualifiedNameID1893);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulequalifiedNameIDEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return retval;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             cpQNID.push_back(STR_ID(id));  
            	            retval.s= 
            	            retval.s
            	             + STR_ID(id);
            	             
            	        }


            	    }
            	    break;

            	default:
            	    goto loop36;	/* break out of the loop */
            	    break;
                }
            }
            loop36: ; /* Jump out to here if this rule does not match */


        }

    }

    // This is where rules clean up and exit
    //
    goto rulequalifiedNameIDEx; /* Prevent compiler warnings */
    rulequalifiedNameIDEx: ;
    retval.stop = LT(-1);


            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(17, qualifiedNameID_StartIndex); }

    return retval;
}
/* $ANTLR end qualifiedNameID */

/**
 * $ANTLR start integer_constant
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1004:1: integer_constant returns [ sep::avm_size_t val ] : (n= IntegerLiteral |cid= qualifiedNameID );
 */
static sep::avm_size_t
integer_constant(pfmlParser ctx)
{
    sep::avm_size_t val;

    ANTLR3_UINT32 integer_constant_StartIndex;

    pANTLR3_COMMON_TOKEN    n;
    fmlParser_qualifiedNameID_return cid;
    #undef	RETURN_TYPE_cid
    #define	RETURN_TYPE_cid fmlParser_qualifiedNameID_return

    /* Initialize rule variables
     */
    integer_constant_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(18)) )
    {
        {
        }



        return val;
    }

    n       = NULL;

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1006:2: (n= IntegerLiteral |cid= qualifiedNameID )

            ANTLR3_UINT32 alt37;

            alt37=2;

            switch ( LA(1) )
            {
            case IntegerLiteral:
            	{
            		alt37=1;
            	}
                break;
            case ID:
            	{
            		alt37=2;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return val;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 37;
                EXCEPTION->state        = 0;


                goto ruleinteger_constantEx;

            }

            switch (alt37)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1006:4: n= IntegerLiteral
        	    {
        	        n = (pANTLR3_COMMON_TOKEN) MATCHT(IntegerLiteral, &FOLLOW_IntegerLiteral_in_integer_constant1923);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleinteger_constantEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return val;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             val= NUM_INT((n->getText(n))->chars);
        	             
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1009:4: cid= qualifiedNameID
        	    {
        	        FOLLOWPUSH(FOLLOW_qualifiedNameID_in_integer_constant1934);
        	        cid=qualifiedNameID(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleinteger_constantEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return val;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             val= sep::ParserUtil::getIntegerConstant(
        	            cid.s
        	            , cid.nb
        	            );
        	             
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruleinteger_constantEx; /* Prevent compiler warnings */
    ruleinteger_constantEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(18, integer_constant_StartIndex); }

    return val;
}
/* $ANTLR end integer_constant */

/**
 * $ANTLR start float_constant
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1014:1: float_constant returns [ sep::avm_float_t val ] : (f= FloatLiteral |cid= qualifiedNameID );
 */
static sep::avm_float_t
float_constant(pfmlParser ctx)
{
    sep::avm_float_t val;

    ANTLR3_UINT32 float_constant_StartIndex;

    pANTLR3_COMMON_TOKEN    f;
    fmlParser_qualifiedNameID_return cid;
    #undef	RETURN_TYPE_cid
    #define	RETURN_TYPE_cid fmlParser_qualifiedNameID_return

    /* Initialize rule variables
     */
    float_constant_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(19)) )
    {
        {
        }



        return val;
    }

    f       = NULL;

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1016:2: (f= FloatLiteral |cid= qualifiedNameID )

            ANTLR3_UINT32 alt38;

            alt38=2;

            switch ( LA(1) )
            {
            case FloatLiteral:
            	{
            		alt38=1;
            	}
                break;
            case ID:
            	{
            		alt38=2;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return val;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 38;
                EXCEPTION->state        = 0;


                goto rulefloat_constantEx;

            }

            switch (alt38)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1016:4: f= FloatLiteral
        	    {
        	        f = (pANTLR3_COMMON_TOKEN) MATCHT(FloatLiteral, &FOLLOW_FloatLiteral_in_float_constant1955);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulefloat_constantEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return val;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             val= NUM_FLOAT((f->getText(f))->chars);
        	             
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1019:4: cid= qualifiedNameID
        	    {
        	        FOLLOWPUSH(FOLLOW_qualifiedNameID_in_float_constant1966);
        	        cid=qualifiedNameID(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulefloat_constantEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return val;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             val= sep::ParserUtil::getFloatConstant(
        	            cid.s
        	            , cid.nb
        	            );
        	             
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto rulefloat_constantEx; /* Prevent compiler warnings */
    rulefloat_constantEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(19, float_constant_StartIndex); }

    return val;
}
/* $ANTLR end float_constant */

/**
 * $ANTLR start section_header
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1028:1: section_header[ sep::Machine * container ] : '@header:' ;
 */
static void
section_header(pfmlParser ctx, sep::Machine * container)
{
    ANTLR3_UINT32 section_header_StartIndex;

    /* Initialize rule variables
     */
    section_header_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(20)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1029:2: ( '@header:' )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1029:4: '@header:'
        {
             MATCHT(188, &FOLLOW_188_in_section_header1987);
            if  (HASEXCEPTION())
            {
                goto rulesection_headerEx;
            }
            if (HASFAILED())
            {
                return ;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto rulesection_headerEx; /* Prevent compiler warnings */
    rulesection_headerEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(20, section_header_StartIndex); }

    return ;
}
/* $ANTLR end section_header */

/**
 * $ANTLR start section_import
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1037:1: section_import[ sep::Machine * container ] : '@import:' ( include_package )+ ;
 */
static void
section_import(pfmlParser ctx, sep::Machine * container)
{
    ANTLR3_UINT32 section_import_StartIndex;

    /* Initialize rule variables
     */
    section_import_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(21)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1038:2: ( '@import:' ( include_package )+ )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1038:4: '@import:' ( include_package )+
        {
             MATCHT(192, &FOLLOW_192_in_section_import2005);
            if  (HASEXCEPTION())
            {
                goto rulesection_importEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1038:15: ( include_package )+
            {
                int cnt39=0;

                for (;;)
                {
                    int alt39=2;
            	switch ( LA(1) )
            	{
            	case 193:
            		{
            			alt39=1;
            		}
            	    break;

            	}

            	switch (alt39)
            	{
            	    case 1:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1038:17: include_package
            	        {
            	            FOLLOWPUSH(FOLLOW_include_package_in_section_import2009);
            	            include_package(ctx);

            	            FOLLOWPOP();
            	            if  (HASEXCEPTION())
            	            {
            	                goto rulesection_importEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return ;
            	            }


            	        }
            	        break;

            	    default:

            		if ( cnt39 >= 1 )
            		{
            		    goto loop39;
            		}
            		if (BACKTRACKING>0)
            		{
            		    FAILEDFLAG = ANTLR3_TRUE;
            		    return ;
            		}

            		/* mismatchedSetEx()
            		 */
            		CONSTRUCTEX();
            		EXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
            		EXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;


            		goto rulesection_importEx;
            	}
            	cnt39++;
                }
                loop39: ;	/* Jump to here if this rule does not match */
            }

        }

    }

    // This is where rules clean up and exit
    //
    goto rulesection_importEx; /* Prevent compiler warnings */
    rulesection_importEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(21, section_import_StartIndex); }

    return ;
}
/* $ANTLR end section_import */

/**
 * $ANTLR start include_package
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1041:1: include_package : '@include' ( StringLiteral SEMI | LCURLY ( StringLiteral )+ RCURLY ) ;
 */
static void
include_package(pfmlParser ctx)
{
    ANTLR3_UINT32 include_package_StartIndex;

    /* Initialize rule variables
     */
    include_package_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(22)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1042:2: ( '@include' ( StringLiteral SEMI | LCURLY ( StringLiteral )+ RCURLY ) )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1042:4: '@include' ( StringLiteral SEMI | LCURLY ( StringLiteral )+ RCURLY )
        {
             MATCHT(193, &FOLLOW_193_in_include_package2023);
            if  (HASEXCEPTION())
            {
                goto ruleinclude_packageEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1043:4: ( StringLiteral SEMI | LCURLY ( StringLiteral )+ RCURLY )
            {
                int alt41=2;
                switch ( LA(1) )
                {
                case StringLiteral:
                	{
                		alt41=1;
                	}
                    break;
                case LCURLY:
                	{
                		alt41=2;
                	}
                    break;

                default:
                    if (BACKTRACKING>0)
                    {
                        FAILEDFLAG = ANTLR3_TRUE;
                        return ;
                    }

                    CONSTRUCTEX();
                    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                    EXCEPTION->message      = (void *)"";
                    EXCEPTION->decisionNum  = 41;
                    EXCEPTION->state        = 0;


                    goto ruleinclude_packageEx;

                }

                switch (alt41)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1043:6: StringLiteral SEMI
            	    {
            	         MATCHT(StringLiteral, &FOLLOW_StringLiteral_in_include_package2030);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleinclude_packageEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	         MATCHT(SEMI, &FOLLOW_SEMI_in_include_package2033);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleinclude_packageEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1044:6: LCURLY ( StringLiteral )+ RCURLY
            	    {
            	         MATCHT(LCURLY, &FOLLOW_LCURLY_in_include_package2040);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleinclude_packageEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1044:14: ( StringLiteral )+
            	        {
            	            int cnt40=0;

            	            for (;;)
            	            {
            	                int alt40=2;
            	        	switch ( LA(1) )
            	        	{
            	        	case StringLiteral:
            	        		{
            	        			alt40=1;
            	        		}
            	        	    break;

            	        	}

            	        	switch (alt40)
            	        	{
            	        	    case 1:
            	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1044:16: StringLiteral
            	        	        {
            	        	             MATCHT(StringLiteral, &FOLLOW_StringLiteral_in_include_package2045);
            	        	            if  (HASEXCEPTION())
            	        	            {
            	        	                goto ruleinclude_packageEx;
            	        	            }
            	        	            if (HASFAILED())
            	        	            {
            	        	                return ;
            	        	            }


            	        	        }
            	        	        break;

            	        	    default:

            	        		if ( cnt40 >= 1 )
            	        		{
            	        		    goto loop40;
            	        		}
            	        		if (BACKTRACKING>0)
            	        		{
            	        		    FAILEDFLAG = ANTLR3_TRUE;
            	        		    return ;
            	        		}

            	        		/* mismatchedSetEx()
            	        		 */
            	        		CONSTRUCTEX();
            	        		EXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
            	        		EXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;


            	        		goto ruleinclude_packageEx;
            	        	}
            	        	cnt40++;
            	            }
            	            loop40: ;	/* Jump to here if this rule does not match */
            	        }

            	         MATCHT(RCURLY, &FOLLOW_RCURLY_in_include_package2051);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleinclude_packageEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

                }
            }

        }

    }

    // This is where rules clean up and exit
    //
    goto ruleinclude_packageEx; /* Prevent compiler warnings */
    ruleinclude_packageEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(22, include_package_StartIndex); }

    return ;
}
/* $ANTLR end include_package */

/**
 * $ANTLR start section_procedure
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1117:1: section_procedure[ sep::Machine * container ] : '@procedure:' (p= def_procedure[ container ] )* ;
 */
static void
section_procedure(pfmlParser ctx, sep::Machine * container)
{
    ANTLR3_UINT32 section_procedure_StartIndex;

    sep::Machine * p;
    #undef	RETURN_TYPE_p
    #define	RETURN_TYPE_p sep::Machine *

    /* Initialize rule variables
     */
    section_procedure_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(23)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1118:2: ( '@procedure:' (p= def_procedure[ container ] )* )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1118:4: '@procedure:' (p= def_procedure[ container ] )*
        {
             MATCHT(212, &FOLLOW_212_in_section_procedure2081);
            if  (HASEXCEPTION())
            {
                goto rulesection_procedureEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1119:4: (p= def_procedure[ container ] )*

            for (;;)
            {
                int alt42=2;
                switch ( LA(1) )
                {
                case 306:
                case 351:
                case 393:
                case 406:
                	{
                		alt42=1;
                	}
                    break;

                }

                switch (alt42)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1119:6: p= def_procedure[ container ]
            	    {
            	        FOLLOWPUSH(FOLLOW_def_procedure_in_section_procedure2090);
            	        p=def_procedure(ctx, container);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulesection_procedureEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

            	default:
            	    goto loop42;	/* break out of the loop */
            	    break;
                }
            }
            loop42: ; /* Jump out to here if this rule does not match */


        }

    }

    // This is where rules clean up and exit
    //
    goto rulesection_procedureEx; /* Prevent compiler warnings */
    rulesection_procedureEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(23, section_procedure_StartIndex); }

    return ;
}
/* $ANTLR end section_procedure */

/**
 * $ANTLR start def_procedure
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1123:1: def_procedure[ sep::Machine * container ] returns [ sep::Machine * procedure ] : (ms= procedure_modifier_specifier )? 'procedure' ( LT_ ( 'moc:' )? executable_specifier[ spcfr ] GT )? id= ID ( StringLiteral )? ( def_machine_parameters[ procedure ] )? ( def_machine_returns[ procedure ,\n\t \t\tsep::Modifier::PROPERTY_RETURN_PARAMETER_MODIFIER ] )? def_body_procedure[ procedure ] ;
 */
static sep::Machine *
def_procedure(pfmlParser ctx, sep::Machine * container)
{
    sep::Machine * procedure;

    ANTLR3_UINT32 def_procedure_StartIndex;

    pANTLR3_COMMON_TOKEN    id;
    pANTLR3_COMMON_TOKEN    StringLiteral3;
    fmlParser_procedure_modifier_specifier_return ms;
    #undef	RETURN_TYPE_ms
    #define	RETURN_TYPE_ms fmlParser_procedure_modifier_specifier_return

    /* Initialize rule variables
     */
    def_procedure_StartIndex = INDEX();



    	sep::Modifier mdfr;

    	sep::Specifier spcfr( sep::Specifier::EXECUTABLE_PROCEDURE_MODEL_SPECIFIER );

    	SAVE_RULE_BEGIN_LOCATION;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(24)) )
    {
        {

            	POP_CTX;

            	sep::ParserUtil::checkProcedureCompositeMocKind(procedure);

            	SET_RULE_LOCATION(procedure);

        }
        {
        }



        return procedure;
    }

    id       = NULL;
    StringLiteral3       = NULL;

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1139:2: ( (ms= procedure_modifier_specifier )? 'procedure' ( LT_ ( 'moc:' )? executable_specifier[ spcfr ] GT )? id= ID ( StringLiteral )? ( def_machine_parameters[ procedure ] )? ( def_machine_returns[ procedure ,\n\t \t\tsep::Modifier::PROPERTY_RETURN_PARAMETER_MODIFIER ] )? def_body_procedure[ procedure ] )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1139:4: (ms= procedure_modifier_specifier )? 'procedure' ( LT_ ( 'moc:' )? executable_specifier[ spcfr ] GT )? id= ID ( StringLiteral )? ( def_machine_parameters[ procedure ] )? ( def_machine_returns[ procedure ,\n\t \t\tsep::Modifier::PROPERTY_RETURN_PARAMETER_MODIFIER ] )? def_body_procedure[ procedure ]
        {
            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1139:4: (ms= procedure_modifier_specifier )?
            {
                int alt43=2;
                switch ( LA(1) )
                {
                    case 306:
                    case 393:
                    case 406:
                    	{
                    		alt43=1;
                    	}
                        break;
                }

                switch (alt43)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1139:6: ms= procedure_modifier_specifier
            	    {
            	        FOLLOWPUSH(FOLLOW_procedure_modifier_specifier_in_def_procedure2124);
            	        ms=procedure_modifier_specifier(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_procedureEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return procedure;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             mdfr.override_ifdef( ms.mdfr
            	             ); spcfr.override_ifdef( ms.spcfr
            	             ); 
            	        }


            	    }
            	    break;

                }
            }

             MATCHT(351, &FOLLOW_351_in_def_procedure2140);
            if  (HASEXCEPTION())
            {
                goto ruledef_procedureEx;
            }
            if (HASFAILED())
            {
                return procedure;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1143:4: ( LT_ ( 'moc:' )? executable_specifier[ spcfr ] GT )?
            {
                int alt45=2;
                switch ( LA(1) )
                {
                    case LT_:
                    	{
                    		alt45=1;
                    	}
                        break;
                }

                switch (alt45)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1143:6: LT_ ( 'moc:' )? executable_specifier[ spcfr ] GT
            	    {
            	         MATCHT(LT_, &FOLLOW_LT__in_def_procedure2147);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_procedureEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return procedure;
            	        }


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1143:10: ( 'moc:' )?
            	        {
            	            int alt44=2;
            	            switch ( LA(1) )
            	            {
            	                case 321:
            	                	{
            	                		alt44=1;
            	                	}
            	                    break;
            	            }

            	            switch (alt44)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1143:12: 'moc:'
            	        	    {
            	        	         MATCHT(321, &FOLLOW_321_in_def_procedure2151);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledef_procedureEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return procedure;
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	        FOLLOWPUSH(FOLLOW_executable_specifier_in_def_procedure2157);
            	        executable_specifier(ctx, spcfr);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_procedureEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return procedure;
            	        }


            	         MATCHT(GT, &FOLLOW_GT_in_def_procedure2161);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_procedureEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return procedure;
            	        }


            	    }
            	    break;

                }
            }

            id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_def_procedure2171);
            if  (HASEXCEPTION())
            {
                goto ruledef_procedureEx;
            }
            if (HASFAILED())
            {
                return procedure;
            }


            if ( BACKTRACKING==0 )
            {

                		PUSH_CTX_CPM( procedure= sep::Machine::newProcedure(
                				container, STR((id->getText(id))->chars), spcfr) );


                		procedure
                ->getwModifier().override_ifdef( mdfr );

                		container->saveOwnedElement( procedure
                 );
                	  
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1154:4: ( StringLiteral )?
            {
                int alt46=2;
                switch ( LA(1) )
                {
                    case StringLiteral:
                    	{
                    		alt46=1;
                    	}
                        break;
                }

                switch (alt46)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1154:6: StringLiteral
            	    {
            	        StringLiteral3 = (pANTLR3_COMMON_TOKEN) MATCHT(StringLiteral, &FOLLOW_StringLiteral_in_def_procedure2184);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_procedureEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return procedure;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             procedure
            	            ->setUnrestrictedName(STR((StringLiteral3->getText(StringLiteral3))->chars)); 
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1158:4: ( def_machine_parameters[ procedure ] )?
            {
                int alt47=2;
                switch ( LA(1) )
                {
                    case LBRACKET:
                    case LPAREN:
                    	{
                    		alt47=1;
                    	}
                        break;
                }

                switch (alt47)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1158:4: def_machine_parameters[ procedure ]
            	    {
            	        FOLLOWPUSH(FOLLOW_def_machine_parameters_in_def_procedure2201);
            	        def_machine_parameters(ctx, procedure);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_procedureEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return procedure;
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1160:4: ( def_machine_returns[ procedure ,\n\t \t\tsep::Modifier::PROPERTY_RETURN_PARAMETER_MODIFIER ] )?
            {
                int alt48=2;
                switch ( LA(1) )
                {
                    case 163:
                    case 365:
                    	{
                    		alt48=1;
                    	}
                        break;
                }

                switch (alt48)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1160:4: def_machine_returns[ procedure ,\n\t \t\tsep::Modifier::PROPERTY_RETURN_PARAMETER_MODIFIER ]
            	    {
            	        FOLLOWPUSH(FOLLOW_def_machine_returns_in_def_procedure2210);
            	        def_machine_returns(ctx, procedure, sep::Modifier::PROPERTY_RETURN_PARAMETER_MODIFIER);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_procedureEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return procedure;
            	        }


            	    }
            	    break;

                }
            }

            FOLLOWPUSH(FOLLOW_def_body_procedure_in_def_procedure2219);
            def_body_procedure(ctx, procedure);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruledef_procedureEx;
            }
            if (HASFAILED())
            {
                return procedure;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_procedureEx; /* Prevent compiler warnings */
    ruledef_procedureEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
            else
            {
                {

                    	POP_CTX;

                    	sep::ParserUtil::checkProcedureCompositeMocKind(procedure);

                    	SET_RULE_LOCATION(procedure);

                }
            }


    if ( BACKTRACKING>0 ) { MEMOIZE(24, def_procedure_StartIndex); }

    return procedure;
}
/* $ANTLR end def_procedure */

/**
 * $ANTLR start def_machine_parameters
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1167:1: def_machine_parameters[ sep::Machine * machine ] : ( LBRACKET def_machine_variable_parameter_atom[ declProperty , mdfr , offset ] ( COMMA def_machine_variable_parameter_atom[ declProperty , mdfr , ++offset ] )* RBRACKET | LPAREN def_machine_variable_parameter_atom[ declProperty , mdfr , offset ] ( COMMA def_machine_variable_parameter_atom[ declProperty , mdfr , ++offset ] )* RPAREN );
 */
static void
def_machine_parameters(pfmlParser ctx, sep::Machine * machine)
{
    ANTLR3_UINT32 def_machine_parameters_StartIndex;

    /* Initialize rule variables
     */
    def_machine_parameters_StartIndex = INDEX();



    	sep::avm_offset_t offset = 0;
    	sep::Modifier mdfr = sep::Modifier::PROPERTY_PARAMETER_MODIFIER;

    	sep::PropertyPart & declProperty = machine->getPropertyPart();

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(25)) )
    {
        {
        }



        return ;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1174:2: ( LBRACKET def_machine_variable_parameter_atom[ declProperty , mdfr , offset ] ( COMMA def_machine_variable_parameter_atom[ declProperty , mdfr , ++offset ] )* RBRACKET | LPAREN def_machine_variable_parameter_atom[ declProperty , mdfr , offset ] ( COMMA def_machine_variable_parameter_atom[ declProperty , mdfr , ++offset ] )* RPAREN )

            ANTLR3_UINT32 alt51;

            alt51=2;

            switch ( LA(1) )
            {
            case LBRACKET:
            	{
            		alt51=1;
            	}
                break;
            case LPAREN:
            	{
            		alt51=2;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 51;
                EXCEPTION->state        = 0;


                goto ruledef_machine_parametersEx;

            }

            switch (alt51)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1174:4: LBRACKET def_machine_variable_parameter_atom[ declProperty , mdfr , offset ] ( COMMA def_machine_variable_parameter_atom[ declProperty , mdfr , ++offset ] )* RBRACKET
        	    {
        	         MATCHT(LBRACKET, &FOLLOW_LBRACKET_in_def_machine_parameters2238);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_machine_parametersEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_def_machine_variable_parameter_atom_in_def_machine_parameters2241);
        	        def_machine_variable_parameter_atom(ctx, declProperty, mdfr, offset);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_machine_parametersEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1175:4: ( COMMA def_machine_variable_parameter_atom[ declProperty , mdfr , ++offset ] )*

        	        for (;;)
        	        {
        	            int alt49=2;
        	            switch ( LA(1) )
        	            {
        	            case COMMA:
        	            	{
        	            		alt49=1;
        	            	}
        	                break;

        	            }

        	            switch (alt49)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1175:6: COMMA def_machine_variable_parameter_atom[ declProperty , mdfr , ++offset ]
        	        	    {
        	        	         MATCHT(COMMA, &FOLLOW_COMMA_in_def_machine_parameters2249);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_machine_parametersEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_def_machine_variable_parameter_atom_in_def_machine_parameters2253);
        	        	        def_machine_variable_parameter_atom(ctx, declProperty, mdfr, ++offset);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_machine_parametersEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;

        	        	default:
        	        	    goto loop49;	/* break out of the loop */
        	        	    break;
        	            }
        	        }
        	        loop49: ; /* Jump out to here if this rule does not match */


        	         MATCHT(RBRACKET, &FOLLOW_RBRACKET_in_def_machine_parameters2262);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_machine_parametersEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1178:4: LPAREN def_machine_variable_parameter_atom[ declProperty , mdfr , offset ] ( COMMA def_machine_variable_parameter_atom[ declProperty , mdfr , ++offset ] )* RPAREN
        	    {
        	         MATCHT(LPAREN, &FOLLOW_LPAREN_in_def_machine_parameters2268);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_machine_parametersEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_def_machine_variable_parameter_atom_in_def_machine_parameters2272);
        	        def_machine_variable_parameter_atom(ctx, declProperty, mdfr, offset);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_machine_parametersEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1179:4: ( COMMA def_machine_variable_parameter_atom[ declProperty , mdfr , ++offset ] )*

        	        for (;;)
        	        {
        	            int alt50=2;
        	            switch ( LA(1) )
        	            {
        	            case COMMA:
        	            	{
        	            		alt50=1;
        	            	}
        	                break;

        	            }

        	            switch (alt50)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1179:6: COMMA def_machine_variable_parameter_atom[ declProperty , mdfr , ++offset ]
        	        	    {
        	        	         MATCHT(COMMA, &FOLLOW_COMMA_in_def_machine_parameters2280);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_machine_parametersEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_def_machine_variable_parameter_atom_in_def_machine_parameters2283);
        	        	        def_machine_variable_parameter_atom(ctx, declProperty, mdfr, ++offset);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_machine_parametersEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;

        	        	default:
        	        	    goto loop50;	/* break out of the loop */
        	        	    break;
        	            }
        	        }
        	        loop50: ; /* Jump out to here if this rule does not match */


        	         MATCHT(RPAREN, &FOLLOW_RPAREN_in_def_machine_parameters2292);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_machine_parametersEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruledef_machine_parametersEx; /* Prevent compiler warnings */
    ruledef_machine_parametersEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(25, def_machine_parameters_StartIndex); }

    return ;
}
/* $ANTLR end def_machine_parameters */

/**
 * $ANTLR start def_machine_variable_parameter_atom
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1184:1: def_machine_variable_parameter_atom[ sep::PropertyPart & paramDecl ,\n\t\tsep::Modifier mdfr , sep::avm_offset_t offset ] : ( (m= modifier_param )? tv= type_var (id= ID (iv= initial_value )? )? | 'bind:' ( ( type_var COLON )=>tv= type_var COLON e= expression |vid= qualifiedNameID ) );
 */
static void
def_machine_variable_parameter_atom(pfmlParser ctx, sep::PropertyPart & paramDecl, sep::Modifier mdfr, sep::avm_offset_t offset)
{
    ANTLR3_UINT32 def_machine_variable_parameter_atom_StartIndex;

    pANTLR3_COMMON_TOKEN    id;
    sep::Modifier m;
    #undef	RETURN_TYPE_m
    #define	RETURN_TYPE_m sep::Modifier

    sep::BF tv;
    #undef	RETURN_TYPE_tv
    #define	RETURN_TYPE_tv sep::BF

    sep::BF iv;
    #undef	RETURN_TYPE_iv
    #define	RETURN_TYPE_iv sep::BF

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    fmlParser_qualifiedNameID_return vid;
    #undef	RETURN_TYPE_vid
    #define	RETURN_TYPE_vid fmlParser_qualifiedNameID_return

    /* Initialize rule variables
     */
    def_machine_variable_parameter_atom_StartIndex = INDEX();



    	sep::Variable * variable;
    	sep::Machine * machine = paramDecl.getContainer()->as< sep::Machine >();
    	sep::BF paramT = sep::TypeManager::UNIVERSAL;
    	std::string paramID;
    	sep::BF value;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(26)) )
    {
        {
        }



        return ;
    }

    id       = NULL;

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1194:2: ( (m= modifier_param )? tv= type_var (id= ID (iv= initial_value )? )? | 'bind:' ( ( type_var COLON )=>tv= type_var COLON e= expression |vid= qualifiedNameID ) )

            ANTLR3_UINT32 alt56;

            alt56=2;

            switch ( LA(1) )
            {
            case ASSIGN_REF:
            case BAND:
            case ID:
            case LTE:
            case 164:
            case 166:
            case 241:
            case 242:
            case 243:
            case 245:
            case 246:
            case 249:
            case 254:
            case 255:
            case 259:
            case 261:
            case 262:
            case 264:
            case 270:
            case 271:
            case 281:
            case 282:
            case 283:
            case 295:
            case 298:
            case 305:
            case 309:
            case 310:
            case 311:
            case 315:
            case 316:
            case 317:
            case 318:
            case 320:
            case 325:
            case 326:
            case 329:
            case 333:
            case 335:
            case 341:
            case 344:
            case 345:
            case 346:
            case 357:
            case 358:
            case 360:
            case 361:
            case 364:
            case 370:
            case 373:
            case 374:
            case 387:
            case 392:
            case 399:
            case 400:
            case 401:
            case 402:
            case 405:
            case 407:
            case 408:
            case 409:
            case 412:
            	{
            		alt56=1;
            	}
                break;
            case 244:
            	{
            		alt56=2;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 56;
                EXCEPTION->state        = 0;


                goto ruledef_machine_variable_parameter_atomEx;

            }

            switch (alt56)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1194:4: (m= modifier_param )? tv= type_var (id= ID (iv= initial_value )? )?
        	    {
        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1194:4: (m= modifier_param )?
        	        {
        	            int alt52=2;
        	            switch ( LA(1) )
        	            {
        	                case ASSIGN_REF:
        	                case BAND:
        	                case LTE:
        	                case 164:
        	                case 166:
        	                case 243:
        	                case 262:
        	                case 282:
        	                case 295:
        	                case 298:
        	                case 305:
        	                case 318:
        	                case 335:
        	                case 341:
        	                case 361:
        	                case 364:
        	                	{
        	                		alt52=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt52)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1194:6: m= modifier_param
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_modifier_param_in_def_machine_variable_parameter_atom2315);
        	        	        m=modifier_param(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_machine_variable_parameter_atomEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             mdfr.override_ifdef( m
        	        	             ); 
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	        FOLLOWPUSH(FOLLOW_type_var_in_def_machine_variable_parameter_atom2327);
        	        tv=type_var(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_machine_variable_parameter_atomEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             paramT = tv
        	            ; 
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1196:4: (id= ID (iv= initial_value )? )?
        	        {
        	            int alt54=2;
        	            switch ( LA(1) )
        	            {
        	                case ID:
        	                	{
        	                		alt54=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt54)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1196:6: id= ID (iv= initial_value )?
        	        	    {
        	        	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_def_machine_variable_parameter_atom2338);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_machine_variable_parameter_atomEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             paramID = STR((id->getText(id))->chars); 
        	        	        }


        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1197:6: (iv= initial_value )?
        	        	        {
        	        	            int alt53=2;
        	        	            switch ( LA(1) )
        	        	            {
        	        	                case ASSIGN:
        	        	                case LPAREN:
        	        	                	{
        	        	                		alt53=1;
        	        	                	}
        	        	                    break;
        	        	            }

        	        	            switch (alt53)
        	        	            {
        	        	        	case 1:
        	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1197:8: iv= initial_value
        	        	        	    {
        	        	        	        FOLLOWPUSH(FOLLOW_initial_value_in_def_machine_variable_parameter_atom2355);
        	        	        	        iv=initial_value(ctx);

        	        	        	        FOLLOWPOP();
        	        	        	        if  (HASEXCEPTION())
        	        	        	        {
        	        	        	            goto ruledef_machine_variable_parameter_atomEx;
        	        	        	        }
        	        	        	        if (HASFAILED())
        	        	        	        {
        	        	        	            return ;
        	        	        	        }


        	        	        	        if ( BACKTRACKING==0 )
        	        	        	        {
        	        	        	             value = iv
        	        	        	            ; 
        	        	        	        }


        	        	        	    }
        	        	        	    break;

        	        	            }
        	        	        }

        	        	    }
        	        	    break;

        	            }
        	        }

        	        if ( BACKTRACKING==0 )
        	        {

        	            		paramDecl.saveOwnedVariable( variable = new sep::Variable(
        	            				machine, mdfr, paramT, paramID, value ) );
        	            	  
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1204:4: 'bind:' ( ( type_var COLON )=>tv= type_var COLON e= expression |vid= qualifiedNameID )
        	    {
        	         MATCHT(244, &FOLLOW_244_in_def_machine_variable_parameter_atom2378);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_machine_variable_parameter_atomEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1205:4: ( ( type_var COLON )=>tv= type_var COLON e= expression |vid= qualifiedNameID )
        	        {
        	            int alt55=2;
        	            {
        	                int LA55_0 = LA(1);
        	                if ( (synpred115_fml(ctx)) && (((LA55_0 >= 245) && (LA55_0 <= 246))))
        	                {
        	                    alt55=1;
        	                }
        	                else if ( (synpred115_fml(ctx)) && (((LA55_0 >= 309) && (LA55_0 <= 310))))
        	                {
        	                    alt55=1;
        	                }
        	                else if ( (synpred115_fml(ctx)) && (((LA55_0 >= 401) && (LA55_0 <= 402))))
        	                {
        	                    alt55=1;
        	                }
        	                else if ( (synpred115_fml(ctx)) && (((LA55_0 >= 345) && (LA55_0 <= 346))))
        	                {
        	                    alt55=1;
        	                }
        	                else if ( (synpred115_fml(ctx)) && (((LA55_0 >= 357) && (LA55_0 <= 358))))
        	                {
        	                    alt55=1;
        	                }
        	                else if ( (synpred115_fml(ctx)) && (((LA55_0 >= 407) && (LA55_0 <= 408))))
        	                {
        	                    alt55=1;
        	                }
        	                else if ( (synpred115_fml(ctx)) && (LA55_0 == 283))
        	                {
        	                    alt55=1;
        	                }
        	                else if ( (synpred115_fml(ctx)) && (LA55_0 == 400))
        	                {
        	                    alt55=1;
        	                }
        	                else if ( (synpred115_fml(ctx)) && (LA55_0 == 270))
        	                {
        	                    alt55=1;
        	                }
        	                else if ( (synpred115_fml(ctx)) && (LA55_0 == 399))
        	                {
        	                    alt55=1;
        	                }
        	                else if ( (synpred115_fml(ctx)) && (LA55_0 == 360))
        	                {
        	                    alt55=1;
        	                }
        	                else if ( (synpred115_fml(ctx)) && (LA55_0 == 409))
        	                {
        	                    alt55=1;
        	                }
        	                else if ( (synpred115_fml(ctx)) && (LA55_0 == 259))
        	                {
        	                    alt55=1;
        	                }
        	                else if ( (synpred115_fml(ctx)) && (LA55_0 == 392))
        	                {
        	                    alt55=1;
        	                }
        	                else if ( (synpred115_fml(ctx)) && (LA55_0 == 264))
        	                {
        	                    alt55=1;
        	                }
        	                else if ( (synpred115_fml(ctx)) && (LA55_0 == 271))
        	                {
        	                    alt55=1;
        	                }
        	                else if ( (synpred115_fml(ctx)) && (LA55_0 == 254))
        	                {
        	                    alt55=1;
        	                }
        	                else if ( (synpred115_fml(ctx)) && (LA55_0 == 255))
        	                {
        	                    alt55=1;
        	                }
        	                else if ( (synpred115_fml(ctx)) && (LA55_0 == 387))
        	                {
        	                    alt55=1;
        	                }
        	                else if ( (synpred115_fml(ctx)) && (LA55_0 == 333))
        	                {
        	                    alt55=1;
        	                }
        	                else if ( (synpred115_fml(ctx)) && (LA55_0 == 242))
        	                {
        	                    alt55=1;
        	                }
        	                else if ( (synpred115_fml(ctx)) && (LA55_0 == 344))
        	                {
        	                    alt55=1;
        	                }
        	                else if ( (synpred115_fml(ctx)) && (LA55_0 == 249))
        	                {
        	                    alt55=1;
        	                }
        	                else if ( (synpred115_fml(ctx)) && (LA55_0 == 320))
        	                {
        	                    alt55=1;
        	                }
        	                else if ( (synpred115_fml(ctx)) && (LA55_0 == 374))
        	                {
        	                    alt55=1;
        	                }
        	                else if ( (synpred115_fml(ctx)) && (LA55_0 == 261))
        	                {
        	                    alt55=1;
        	                }
        	                else if ( (synpred115_fml(ctx)) && (LA55_0 == 317))
        	                {
        	                    alt55=1;
        	                }
        	                else if ( (synpred115_fml(ctx)) && (LA55_0 == 405))
        	                {
        	                    alt55=1;
        	                }
        	                else if ( (LA55_0 == ID))
        	                {
        	                    {
        	                        int LA55_29 = LA(2);
        	                        if ( (synpred115_fml(ctx)))
        	                        {
        	                            alt55=1;
        	                        }
        	                        else if ( (ANTLR3_TRUE))
        	                        {
        	                            alt55=2;
        	                        }
        	                        else
        	                        {
        	                            if (BACKTRACKING>0)
        	                            {
        	                                FAILEDFLAG = ANTLR3_TRUE;
        	                                return ;
        	                            }


        	                            CONSTRUCTEX();
        	                            EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
        	                            EXCEPTION->message      = (void *)"";
        	                            EXCEPTION->decisionNum  = 55;
        	                            EXCEPTION->state        = 29;


        	                            goto ruledef_machine_variable_parameter_atomEx;

        	                        }
        	                    }
        	                }
        	                else if ( (synpred115_fml(ctx)) && (LA55_0 == 241))
        	                {
        	                    alt55=1;
        	                }
        	                else if ( (synpred115_fml(ctx)) && (LA55_0 == 412))
        	                {
        	                    alt55=1;
        	                }
        	                else if ( (synpred115_fml(ctx)) && (LA55_0 == 370))
        	                {
        	                    alt55=1;
        	                }
        	                else if ( (synpred115_fml(ctx)) && (LA55_0 == 316))
        	                {
        	                    alt55=1;
        	                }
        	                else if ( (synpred115_fml(ctx)) && (LA55_0 == 281))
        	                {
        	                    alt55=1;
        	                }
        	                else if ( (synpred115_fml(ctx)) && (LA55_0 == 315))
        	                {
        	                    alt55=1;
        	                }
        	                else if ( (synpred115_fml(ctx)) && (LA55_0 == 325))
        	                {
        	                    alt55=1;
        	                }
        	                else if ( (synpred115_fml(ctx)) && (LA55_0 == 326))
        	                {
        	                    alt55=1;
        	                }
        	                else if ( (synpred115_fml(ctx)) && (LA55_0 == 373))
        	                {
        	                    alt55=1;
        	                }
        	                else if ( (synpred115_fml(ctx)) && (LA55_0 == 329))
        	                {
        	                    alt55=1;
        	                }
        	                else if ( (synpred115_fml(ctx)) && (LA55_0 == 311))
        	                {
        	                    alt55=1;
        	                }
        	                else
        	                {
        	                    if (BACKTRACKING>0)
        	                    {
        	                        FAILEDFLAG = ANTLR3_TRUE;
        	                        return ;
        	                    }


        	                    CONSTRUCTEX();
        	                    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
        	                    EXCEPTION->message      = (void *)"";
        	                    EXCEPTION->decisionNum  = 55;
        	                    EXCEPTION->state        = 0;


        	                    goto ruledef_machine_variable_parameter_atomEx;

        	                }
        	            }
        	            switch (alt55)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1205:6: ( type_var COLON )=>tv= type_var COLON e= expression
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_type_var_in_def_machine_variable_parameter_atom2399);
        	        	        tv=type_var(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_machine_variable_parameter_atomEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	         MATCHT(COLON, &FOLLOW_COLON_in_def_machine_variable_parameter_atom2401);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_machine_variable_parameter_atomEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             paramT = tv
        	        	            ; 
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_expression_in_def_machine_variable_parameter_atom2412);
        	        	        e=expression(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_machine_variable_parameter_atomEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             value = e
        	        	            ; 
        	        	        }


        	        	    }
        	        	    break;
        	        	case 2:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1207:6: vid= qualifiedNameID
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_qualifiedNameID_in_def_machine_variable_parameter_atom2423);
        	        	        vid=qualifiedNameID(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_machine_variable_parameter_atomEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {

        	        	            	  	value = sep::ParserUtil::getVariable(vid.s
        	        	            , vid.nb
        	        	            );
        	        	            	  	if( value.valid() ) { paramT = value.to_ptr< sep::Variable >()->getType(); }
        	        	            	  
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	        if ( BACKTRACKING==0 )
        	        {

        	            		paramID = sep::OSS() << '#' << offset;
        	            		paramDecl.saveOwnedVariable( variable = new sep::Variable(machine,
        	            						mdfr.addNatureKind( sep::Modifier::NATURE_BIND_KIND ),
        	            						paramT, paramID, value ) );

        	            		variable->setOffset( offset );
        	            	  
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruledef_machine_variable_parameter_atomEx; /* Prevent compiler warnings */
    ruledef_machine_variable_parameter_atomEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(26, def_machine_variable_parameter_atom_StartIndex); }

    return ;
}
/* $ANTLR end def_machine_variable_parameter_atom */

/**
 * $ANTLR start def_machine_returns
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1224:1: def_machine_returns[ sep::Machine * machine , sep::Modifier mdfr ] : ( '-->' | 'returns:' ) ( ( LBRACKET def_machine_variable_return_atom[ declProperty , mdfr , offset] ( COMMA def_machine_variable_return_atom[ declProperty , mdfr , ++offset ] )* RBRACKET ) | ( LPAREN def_machine_variable_return_atom[ declProperty , mdfr , offset] ( COMMA def_machine_variable_return_atom[ declProperty , mdfr , ++offset ] )* RPAREN ) |tv= type_var (iv= initial_value )? ) ;
 */
static void
def_machine_returns(pfmlParser ctx, sep::Machine * machine, sep::Modifier mdfr)
{
    ANTLR3_UINT32 def_machine_returns_StartIndex;

    sep::BF tv;
    #undef	RETURN_TYPE_tv
    #define	RETURN_TYPE_tv sep::BF

    sep::BF iv;
    #undef	RETURN_TYPE_iv
    #define	RETURN_TYPE_iv sep::BF

    /* Initialize rule variables
     */
    def_machine_returns_StartIndex = INDEX();



    	sep::avm_offset_t offset = 0;
    	mdfr.setDirectionKind( sep::Modifier::DIRECTION_RETURN_KIND );
    	sep::BF value;

    	sep::PropertyPart & declProperty = machine->getPropertyPart();

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(27)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1233:2: ( ( '-->' | 'returns:' ) ( ( LBRACKET def_machine_variable_return_atom[ declProperty , mdfr , offset] ( COMMA def_machine_variable_return_atom[ declProperty , mdfr , ++offset ] )* RBRACKET ) | ( LPAREN def_machine_variable_return_atom[ declProperty , mdfr , offset] ( COMMA def_machine_variable_return_atom[ declProperty , mdfr , ++offset ] )* RPAREN ) |tv= type_var (iv= initial_value )? ) )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1233:4: ( '-->' | 'returns:' ) ( ( LBRACKET def_machine_variable_return_atom[ declProperty , mdfr , offset] ( COMMA def_machine_variable_return_atom[ declProperty , mdfr , ++offset ] )* RBRACKET ) | ( LPAREN def_machine_variable_return_atom[ declProperty , mdfr , offset] ( COMMA def_machine_variable_return_atom[ declProperty , mdfr , ++offset ] )* RPAREN ) |tv= type_var (iv= initial_value )? )
        {
            if ( LA(1) == 163 || LA(1) == 365 )
            {
                CONSUME();
                PERRORRECOVERY=ANTLR3_FALSE;
                FAILEDFLAG=ANTLR3_FALSE;

            }
            else
            {
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
                EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
                EXCEPTION->expectingSet = NULL;

                goto ruledef_machine_returnsEx;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1234:4: ( ( LBRACKET def_machine_variable_return_atom[ declProperty , mdfr , offset] ( COMMA def_machine_variable_return_atom[ declProperty , mdfr , ++offset ] )* RBRACKET ) | ( LPAREN def_machine_variable_return_atom[ declProperty , mdfr , offset] ( COMMA def_machine_variable_return_atom[ declProperty , mdfr , ++offset ] )* RPAREN ) |tv= type_var (iv= initial_value )? )
            {
                int alt60=3;
                switch ( LA(1) )
                {
                case LBRACKET:
                	{
                		alt60=1;
                	}
                    break;
                case LPAREN:
                	{
                		alt60=2;
                	}
                    break;
                case ID:
                case 241:
                case 242:
                case 245:
                case 246:
                case 249:
                case 254:
                case 255:
                case 259:
                case 261:
                case 264:
                case 270:
                case 271:
                case 281:
                case 283:
                case 309:
                case 310:
                case 311:
                case 315:
                case 316:
                case 317:
                case 320:
                case 325:
                case 326:
                case 329:
                case 333:
                case 344:
                case 345:
                case 346:
                case 357:
                case 358:
                case 360:
                case 370:
                case 373:
                case 374:
                case 387:
                case 392:
                case 399:
                case 400:
                case 401:
                case 402:
                case 405:
                case 407:
                case 408:
                case 409:
                case 412:
                	{
                		alt60=3;
                	}
                    break;

                default:
                    if (BACKTRACKING>0)
                    {
                        FAILEDFLAG = ANTLR3_TRUE;
                        return ;
                    }

                    CONSTRUCTEX();
                    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                    EXCEPTION->message      = (void *)"";
                    EXCEPTION->decisionNum  = 60;
                    EXCEPTION->state        = 0;


                    goto ruledef_machine_returnsEx;

                }

                switch (alt60)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1234:6: ( LBRACKET def_machine_variable_return_atom[ declProperty , mdfr , offset] ( COMMA def_machine_variable_return_atom[ declProperty , mdfr , ++offset ] )* RBRACKET )
            	    {
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1234:6: ( LBRACKET def_machine_variable_return_atom[ declProperty , mdfr , offset] ( COMMA def_machine_variable_return_atom[ declProperty , mdfr , ++offset ] )* RBRACKET )
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1234:8: LBRACKET def_machine_variable_return_atom[ declProperty , mdfr , offset] ( COMMA def_machine_variable_return_atom[ declProperty , mdfr , ++offset ] )* RBRACKET
            	        {
            	             MATCHT(LBRACKET, &FOLLOW_LBRACKET_in_def_machine_returns2474);
            	            if  (HASEXCEPTION())
            	            {
            	                goto ruledef_machine_returnsEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return ;
            	            }


            	            FOLLOWPUSH(FOLLOW_def_machine_variable_return_atom_in_def_machine_returns2477);
            	            def_machine_variable_return_atom(ctx, declProperty, mdfr, offset);

            	            FOLLOWPOP();
            	            if  (HASEXCEPTION())
            	            {
            	                goto ruledef_machine_returnsEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return ;
            	            }


            	            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1235:8: ( COMMA def_machine_variable_return_atom[ declProperty , mdfr , ++offset ] )*

            	            for (;;)
            	            {
            	                int alt57=2;
            	                switch ( LA(1) )
            	                {
            	                case COMMA:
            	                	{
            	                		alt57=1;
            	                	}
            	                    break;

            	                }

            	                switch (alt57)
            	                {
            	            	case 1:
            	            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1235:10: COMMA def_machine_variable_return_atom[ declProperty , mdfr , ++offset ]
            	            	    {
            	            	         MATCHT(COMMA, &FOLLOW_COMMA_in_def_machine_returns2489);
            	            	        if  (HASEXCEPTION())
            	            	        {
            	            	            goto ruledef_machine_returnsEx;
            	            	        }
            	            	        if (HASFAILED())
            	            	        {
            	            	            return ;
            	            	        }


            	            	        FOLLOWPUSH(FOLLOW_def_machine_variable_return_atom_in_def_machine_returns2493);
            	            	        def_machine_variable_return_atom(ctx, declProperty, mdfr, ++offset);

            	            	        FOLLOWPOP();
            	            	        if  (HASEXCEPTION())
            	            	        {
            	            	            goto ruledef_machine_returnsEx;
            	            	        }
            	            	        if (HASFAILED())
            	            	        {
            	            	            return ;
            	            	        }


            	            	    }
            	            	    break;

            	            	default:
            	            	    goto loop57;	/* break out of the loop */
            	            	    break;
            	                }
            	            }
            	            loop57: ; /* Jump out to here if this rule does not match */


            	             MATCHT(RBRACKET, &FOLLOW_RBRACKET_in_def_machine_returns2506);
            	            if  (HASEXCEPTION())
            	            {
            	                goto ruledef_machine_returnsEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return ;
            	            }


            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1239:6: ( LPAREN def_machine_variable_return_atom[ declProperty , mdfr , offset] ( COMMA def_machine_variable_return_atom[ declProperty , mdfr , ++offset ] )* RPAREN )
            	    {
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1239:6: ( LPAREN def_machine_variable_return_atom[ declProperty , mdfr , offset] ( COMMA def_machine_variable_return_atom[ declProperty , mdfr , ++offset ] )* RPAREN )
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1239:8: LPAREN def_machine_variable_return_atom[ declProperty , mdfr , offset] ( COMMA def_machine_variable_return_atom[ declProperty , mdfr , ++offset ] )* RPAREN
            	        {
            	             MATCHT(LPAREN, &FOLLOW_LPAREN_in_def_machine_returns2523);
            	            if  (HASEXCEPTION())
            	            {
            	                goto ruledef_machine_returnsEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return ;
            	            }


            	            FOLLOWPUSH(FOLLOW_def_machine_variable_return_atom_in_def_machine_returns2527);
            	            def_machine_variable_return_atom(ctx, declProperty, mdfr, offset);

            	            FOLLOWPOP();
            	            if  (HASEXCEPTION())
            	            {
            	                goto ruledef_machine_returnsEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return ;
            	            }


            	            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1240:8: ( COMMA def_machine_variable_return_atom[ declProperty , mdfr , ++offset ] )*

            	            for (;;)
            	            {
            	                int alt58=2;
            	                switch ( LA(1) )
            	                {
            	                case COMMA:
            	                	{
            	                		alt58=1;
            	                	}
            	                    break;

            	                }

            	                switch (alt58)
            	                {
            	            	case 1:
            	            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1240:10: COMMA def_machine_variable_return_atom[ declProperty , mdfr , ++offset ]
            	            	    {
            	            	         MATCHT(COMMA, &FOLLOW_COMMA_in_def_machine_returns2539);
            	            	        if  (HASEXCEPTION())
            	            	        {
            	            	            goto ruledef_machine_returnsEx;
            	            	        }
            	            	        if (HASFAILED())
            	            	        {
            	            	            return ;
            	            	        }


            	            	        FOLLOWPUSH(FOLLOW_def_machine_variable_return_atom_in_def_machine_returns2542);
            	            	        def_machine_variable_return_atom(ctx, declProperty, mdfr, ++offset);

            	            	        FOLLOWPOP();
            	            	        if  (HASEXCEPTION())
            	            	        {
            	            	            goto ruledef_machine_returnsEx;
            	            	        }
            	            	        if (HASFAILED())
            	            	        {
            	            	            return ;
            	            	        }


            	            	    }
            	            	    break;

            	            	default:
            	            	    goto loop58;	/* break out of the loop */
            	            	    break;
            	                }
            	            }
            	            loop58: ; /* Jump out to here if this rule does not match */


            	             MATCHT(RPAREN, &FOLLOW_RPAREN_in_def_machine_returns2555);
            	            if  (HASEXCEPTION())
            	            {
            	                goto ruledef_machine_returnsEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return ;
            	            }


            	        }


            	    }
            	    break;
            	case 3:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1244:6: tv= type_var (iv= initial_value )?
            	    {
            	        FOLLOWPUSH(FOLLOW_type_var_in_def_machine_returns2572);
            	        tv=type_var(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_machine_returnsEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1244:18: (iv= initial_value )?
            	        {
            	            int alt59=2;
            	            switch ( LA(1) )
            	            {
            	                case ASSIGN:
            	                case LPAREN:
            	                	{
            	                		alt59=1;
            	                	}
            	                    break;
            	            }

            	            switch (alt59)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1244:20: iv= initial_value
            	        	    {
            	        	        FOLLOWPUSH(FOLLOW_initial_value_in_def_machine_returns2578);
            	        	        iv=initial_value(ctx);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledef_machine_returnsEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             value = iv
            	        	            ; 
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	        if ( BACKTRACKING==0 )
            	        {

            	            		sep::Variable * variable =
            	            				new sep::Variable(machine, mdfr, tv
            	            , "#0", value);

            	            		declProperty.saveOwnedVariable( variable );
            	            	  
            	        }


            	    }
            	    break;

                }
            }

        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_machine_returnsEx; /* Prevent compiler warnings */
    ruledef_machine_returnsEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(27, def_machine_returns_StartIndex); }

    return ;
}
/* $ANTLR end def_machine_returns */

/**
 * $ANTLR start def_machine_variable_return_atom
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1255:1: def_machine_variable_return_atom[ sep::PropertyPart & paramDecl ,\n\t\tsep::Modifier mdfr , sep::avm_offset_t offset ] : ( (m= modifier_param )? tv= type_var (id= ID (iv= initial_value )? )? | 'bind:' ( ( type_var COLON )=>tv= type_var COLON e= expression |vid= qualifiedNameID ) );
 */
static void
def_machine_variable_return_atom(pfmlParser ctx, sep::PropertyPart & paramDecl, sep::Modifier mdfr, sep::avm_offset_t offset)
{
    ANTLR3_UINT32 def_machine_variable_return_atom_StartIndex;

    pANTLR3_COMMON_TOKEN    id;
    sep::Modifier m;
    #undef	RETURN_TYPE_m
    #define	RETURN_TYPE_m sep::Modifier

    sep::BF tv;
    #undef	RETURN_TYPE_tv
    #define	RETURN_TYPE_tv sep::BF

    sep::BF iv;
    #undef	RETURN_TYPE_iv
    #define	RETURN_TYPE_iv sep::BF

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    fmlParser_qualifiedNameID_return vid;
    #undef	RETURN_TYPE_vid
    #define	RETURN_TYPE_vid fmlParser_qualifiedNameID_return

    /* Initialize rule variables
     */
    def_machine_variable_return_atom_StartIndex = INDEX();



    	sep::Variable * variable;
    	sep::Machine * machine = paramDecl.getContainer()->as< sep::Machine >();
    	sep::BF paramT = sep::TypeManager::UNIVERSAL;
    	std::string paramID;
    	sep::BF value;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(28)) )
    {
        {
        }



        return ;
    }

    id       = NULL;

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1265:2: ( (m= modifier_param )? tv= type_var (id= ID (iv= initial_value )? )? | 'bind:' ( ( type_var COLON )=>tv= type_var COLON e= expression |vid= qualifiedNameID ) )

            ANTLR3_UINT32 alt65;

            alt65=2;

            switch ( LA(1) )
            {
            case ASSIGN_REF:
            case BAND:
            case ID:
            case LTE:
            case 164:
            case 166:
            case 241:
            case 242:
            case 243:
            case 245:
            case 246:
            case 249:
            case 254:
            case 255:
            case 259:
            case 261:
            case 262:
            case 264:
            case 270:
            case 271:
            case 281:
            case 282:
            case 283:
            case 295:
            case 298:
            case 305:
            case 309:
            case 310:
            case 311:
            case 315:
            case 316:
            case 317:
            case 318:
            case 320:
            case 325:
            case 326:
            case 329:
            case 333:
            case 335:
            case 341:
            case 344:
            case 345:
            case 346:
            case 357:
            case 358:
            case 360:
            case 361:
            case 364:
            case 370:
            case 373:
            case 374:
            case 387:
            case 392:
            case 399:
            case 400:
            case 401:
            case 402:
            case 405:
            case 407:
            case 408:
            case 409:
            case 412:
            	{
            		alt65=1;
            	}
                break;
            case 244:
            	{
            		alt65=2;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 65;
                EXCEPTION->state        = 0;


                goto ruledef_machine_variable_return_atomEx;

            }

            switch (alt65)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1265:4: (m= modifier_param )? tv= type_var (id= ID (iv= initial_value )? )?
        	    {
        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1265:4: (m= modifier_param )?
        	        {
        	            int alt61=2;
        	            switch ( LA(1) )
        	            {
        	                case ASSIGN_REF:
        	                case BAND:
        	                case LTE:
        	                case 164:
        	                case 166:
        	                case 243:
        	                case 262:
        	                case 282:
        	                case 295:
        	                case 298:
        	                case 305:
        	                case 318:
        	                case 335:
        	                case 341:
        	                case 361:
        	                case 364:
        	                	{
        	                		alt61=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt61)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1265:6: m= modifier_param
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_modifier_param_in_def_machine_variable_return_atom2617);
        	        	        m=modifier_param(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_machine_variable_return_atomEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             mdfr.override_ifdef( m
        	        	             ); 
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	        FOLLOWPUSH(FOLLOW_type_var_in_def_machine_variable_return_atom2629);
        	        tv=type_var(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_machine_variable_return_atomEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             paramT = tv
        	            ; 
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1267:4: (id= ID (iv= initial_value )? )?
        	        {
        	            int alt63=2;
        	            switch ( LA(1) )
        	            {
        	                case ID:
        	                	{
        	                		alt63=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt63)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1267:6: id= ID (iv= initial_value )?
        	        	    {
        	        	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_def_machine_variable_return_atom2640);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_machine_variable_return_atomEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             paramID = STR((id->getText(id))->chars); 
        	        	        }


        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1268:6: (iv= initial_value )?
        	        	        {
        	        	            int alt62=2;
        	        	            switch ( LA(1) )
        	        	            {
        	        	                case ASSIGN:
        	        	                case LPAREN:
        	        	                	{
        	        	                		alt62=1;
        	        	                	}
        	        	                    break;
        	        	            }

        	        	            switch (alt62)
        	        	            {
        	        	        	case 1:
        	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1268:8: iv= initial_value
        	        	        	    {
        	        	        	        FOLLOWPUSH(FOLLOW_initial_value_in_def_machine_variable_return_atom2657);
        	        	        	        iv=initial_value(ctx);

        	        	        	        FOLLOWPOP();
        	        	        	        if  (HASEXCEPTION())
        	        	        	        {
        	        	        	            goto ruledef_machine_variable_return_atomEx;
        	        	        	        }
        	        	        	        if (HASFAILED())
        	        	        	        {
        	        	        	            return ;
        	        	        	        }


        	        	        	        if ( BACKTRACKING==0 )
        	        	        	        {
        	        	        	             value = iv
        	        	        	            ; 
        	        	        	        }


        	        	        	    }
        	        	        	    break;

        	        	            }
        	        	        }

        	        	    }
        	        	    break;

        	            }
        	        }

        	        if ( BACKTRACKING==0 )
        	        {

        	            		paramDecl.saveOwnedVariable( variable =
        	            				new sep::Variable(machine, mdfr, paramT, paramID, value) );
        	            	  
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1275:4: 'bind:' ( ( type_var COLON )=>tv= type_var COLON e= expression |vid= qualifiedNameID )
        	    {
        	         MATCHT(244, &FOLLOW_244_in_def_machine_variable_return_atom2680);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_machine_variable_return_atomEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1276:4: ( ( type_var COLON )=>tv= type_var COLON e= expression |vid= qualifiedNameID )
        	        {
        	            int alt64=2;
        	            {
        	                int LA64_0 = LA(1);
        	                if ( (synpred126_fml(ctx)) && (((LA64_0 >= 245) && (LA64_0 <= 246))))
        	                {
        	                    alt64=1;
        	                }
        	                else if ( (synpred126_fml(ctx)) && (((LA64_0 >= 309) && (LA64_0 <= 310))))
        	                {
        	                    alt64=1;
        	                }
        	                else if ( (synpred126_fml(ctx)) && (((LA64_0 >= 401) && (LA64_0 <= 402))))
        	                {
        	                    alt64=1;
        	                }
        	                else if ( (synpred126_fml(ctx)) && (((LA64_0 >= 345) && (LA64_0 <= 346))))
        	                {
        	                    alt64=1;
        	                }
        	                else if ( (synpred126_fml(ctx)) && (((LA64_0 >= 357) && (LA64_0 <= 358))))
        	                {
        	                    alt64=1;
        	                }
        	                else if ( (synpred126_fml(ctx)) && (((LA64_0 >= 407) && (LA64_0 <= 408))))
        	                {
        	                    alt64=1;
        	                }
        	                else if ( (synpred126_fml(ctx)) && (LA64_0 == 283))
        	                {
        	                    alt64=1;
        	                }
        	                else if ( (synpred126_fml(ctx)) && (LA64_0 == 400))
        	                {
        	                    alt64=1;
        	                }
        	                else if ( (synpred126_fml(ctx)) && (LA64_0 == 270))
        	                {
        	                    alt64=1;
        	                }
        	                else if ( (synpred126_fml(ctx)) && (LA64_0 == 399))
        	                {
        	                    alt64=1;
        	                }
        	                else if ( (synpred126_fml(ctx)) && (LA64_0 == 360))
        	                {
        	                    alt64=1;
        	                }
        	                else if ( (synpred126_fml(ctx)) && (LA64_0 == 409))
        	                {
        	                    alt64=1;
        	                }
        	                else if ( (synpred126_fml(ctx)) && (LA64_0 == 259))
        	                {
        	                    alt64=1;
        	                }
        	                else if ( (synpred126_fml(ctx)) && (LA64_0 == 392))
        	                {
        	                    alt64=1;
        	                }
        	                else if ( (synpred126_fml(ctx)) && (LA64_0 == 264))
        	                {
        	                    alt64=1;
        	                }
        	                else if ( (synpred126_fml(ctx)) && (LA64_0 == 271))
        	                {
        	                    alt64=1;
        	                }
        	                else if ( (synpred126_fml(ctx)) && (LA64_0 == 254))
        	                {
        	                    alt64=1;
        	                }
        	                else if ( (synpred126_fml(ctx)) && (LA64_0 == 255))
        	                {
        	                    alt64=1;
        	                }
        	                else if ( (synpred126_fml(ctx)) && (LA64_0 == 387))
        	                {
        	                    alt64=1;
        	                }
        	                else if ( (synpred126_fml(ctx)) && (LA64_0 == 333))
        	                {
        	                    alt64=1;
        	                }
        	                else if ( (synpred126_fml(ctx)) && (LA64_0 == 242))
        	                {
        	                    alt64=1;
        	                }
        	                else if ( (synpred126_fml(ctx)) && (LA64_0 == 344))
        	                {
        	                    alt64=1;
        	                }
        	                else if ( (synpred126_fml(ctx)) && (LA64_0 == 249))
        	                {
        	                    alt64=1;
        	                }
        	                else if ( (synpred126_fml(ctx)) && (LA64_0 == 320))
        	                {
        	                    alt64=1;
        	                }
        	                else if ( (synpred126_fml(ctx)) && (LA64_0 == 374))
        	                {
        	                    alt64=1;
        	                }
        	                else if ( (synpred126_fml(ctx)) && (LA64_0 == 261))
        	                {
        	                    alt64=1;
        	                }
        	                else if ( (synpred126_fml(ctx)) && (LA64_0 == 317))
        	                {
        	                    alt64=1;
        	                }
        	                else if ( (synpred126_fml(ctx)) && (LA64_0 == 405))
        	                {
        	                    alt64=1;
        	                }
        	                else if ( (LA64_0 == ID))
        	                {
        	                    {
        	                        int LA64_29 = LA(2);
        	                        if ( (synpred126_fml(ctx)))
        	                        {
        	                            alt64=1;
        	                        }
        	                        else if ( (ANTLR3_TRUE))
        	                        {
        	                            alt64=2;
        	                        }
        	                        else
        	                        {
        	                            if (BACKTRACKING>0)
        	                            {
        	                                FAILEDFLAG = ANTLR3_TRUE;
        	                                return ;
        	                            }


        	                            CONSTRUCTEX();
        	                            EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
        	                            EXCEPTION->message      = (void *)"";
        	                            EXCEPTION->decisionNum  = 64;
        	                            EXCEPTION->state        = 29;


        	                            goto ruledef_machine_variable_return_atomEx;

        	                        }
        	                    }
        	                }
        	                else if ( (synpred126_fml(ctx)) && (LA64_0 == 241))
        	                {
        	                    alt64=1;
        	                }
        	                else if ( (synpred126_fml(ctx)) && (LA64_0 == 412))
        	                {
        	                    alt64=1;
        	                }
        	                else if ( (synpred126_fml(ctx)) && (LA64_0 == 370))
        	                {
        	                    alt64=1;
        	                }
        	                else if ( (synpred126_fml(ctx)) && (LA64_0 == 316))
        	                {
        	                    alt64=1;
        	                }
        	                else if ( (synpred126_fml(ctx)) && (LA64_0 == 281))
        	                {
        	                    alt64=1;
        	                }
        	                else if ( (synpred126_fml(ctx)) && (LA64_0 == 315))
        	                {
        	                    alt64=1;
        	                }
        	                else if ( (synpred126_fml(ctx)) && (LA64_0 == 325))
        	                {
        	                    alt64=1;
        	                }
        	                else if ( (synpred126_fml(ctx)) && (LA64_0 == 326))
        	                {
        	                    alt64=1;
        	                }
        	                else if ( (synpred126_fml(ctx)) && (LA64_0 == 373))
        	                {
        	                    alt64=1;
        	                }
        	                else if ( (synpred126_fml(ctx)) && (LA64_0 == 329))
        	                {
        	                    alt64=1;
        	                }
        	                else if ( (synpred126_fml(ctx)) && (LA64_0 == 311))
        	                {
        	                    alt64=1;
        	                }
        	                else
        	                {
        	                    if (BACKTRACKING>0)
        	                    {
        	                        FAILEDFLAG = ANTLR3_TRUE;
        	                        return ;
        	                    }


        	                    CONSTRUCTEX();
        	                    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
        	                    EXCEPTION->message      = (void *)"";
        	                    EXCEPTION->decisionNum  = 64;
        	                    EXCEPTION->state        = 0;


        	                    goto ruledef_machine_variable_return_atomEx;

        	                }
        	            }
        	            switch (alt64)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1276:6: ( type_var COLON )=>tv= type_var COLON e= expression
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_type_var_in_def_machine_variable_return_atom2701);
        	        	        tv=type_var(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_machine_variable_return_atomEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	         MATCHT(COLON, &FOLLOW_COLON_in_def_machine_variable_return_atom2703);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_machine_variable_return_atomEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             paramT = tv
        	        	            ; 
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_expression_in_def_machine_variable_return_atom2714);
        	        	        e=expression(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_machine_variable_return_atomEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             value = e
        	        	            ; 
        	        	        }


        	        	    }
        	        	    break;
        	        	case 2:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1278:6: vid= qualifiedNameID
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_qualifiedNameID_in_def_machine_variable_return_atom2725);
        	        	        vid=qualifiedNameID(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_machine_variable_return_atomEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {

        	        	            	  	value = sep::ParserUtil::getVariable(vid.s
        	        	            , vid.nb
        	        	            );
        	        	            	  	if( value.valid() ) { paramT = value.to_ptr< sep::Variable >()->getType(); }
        	        	            	  
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	        if ( BACKTRACKING==0 )
        	        {

        	            		paramID = sep::OSS() << '#' << offset;

        	            		variable = new sep::Variable(machine,
        	            				mdfr.addNatureKind( sep::Modifier::NATURE_BIND_KIND ),
        	            				paramT, paramID, value);

        	            		paramDecl.saveOwnedVariable( variable );

        	            		variable->setOffset( offset );
        	            	  
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruledef_machine_variable_return_atomEx; /* Prevent compiler warnings */
    ruledef_machine_variable_return_atomEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(28, def_machine_variable_return_atom_StartIndex); }

    return ;
}
/* $ANTLR end def_machine_variable_return_atom */

/**
 * $ANTLR start def_body_procedure
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1299:1: def_body_procedure[ sep::Machine * procedure ] : LCURLY ( ( def_body_machine_using_section_predicat )=> def_body_procedure_section[ procedure ] | def_body_procedure_simplif[ procedure ] ) RCURLY ;
 */
static void
def_body_procedure(pfmlParser ctx, sep::Machine * procedure)
{
    ANTLR3_UINT32 def_body_procedure_StartIndex;

    /* Initialize rule variables
     */
    def_body_procedure_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(29)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1300:2: ( LCURLY ( ( def_body_machine_using_section_predicat )=> def_body_procedure_section[ procedure ] | def_body_procedure_simplif[ procedure ] ) RCURLY )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1300:4: LCURLY ( ( def_body_machine_using_section_predicat )=> def_body_procedure_section[ procedure ] | def_body_procedure_simplif[ procedure ] ) RCURLY
        {
             MATCHT(LCURLY, &FOLLOW_LCURLY_in_def_body_procedure2755);
            if  (HASEXCEPTION())
            {
                goto ruledef_body_procedureEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1301:4: ( ( def_body_machine_using_section_predicat )=> def_body_procedure_section[ procedure ] | def_body_procedure_simplif[ procedure ] )
            {
                int alt66=2;
                {
                    int LA66_0 = LA(1);
                    if ( (synpred127_fml(ctx)) && (LA66_0 == 188))
                    {
                        alt66=1;
                    }
                    else if ( (synpred127_fml(ctx)) && (LA66_0 == 192))
                    {
                        alt66=1;
                    }
                    else if ( (synpred127_fml(ctx)) && (((LA66_0 >= 209) && (LA66_0 <= 210))))
                    {
                        alt66=1;
                    }
                    else if ( (synpred127_fml(ctx)) && (LA66_0 == 196))
                    {
                        alt66=1;
                    }
                    else if ( (synpred127_fml(ctx)) && (LA66_0 == 195))
                    {
                        alt66=1;
                    }
                    else if ( (synpred127_fml(ctx)) && (LA66_0 == 207))
                    {
                        alt66=1;
                    }
                    else if ( (synpred127_fml(ctx)) && (((LA66_0 >= 219) && (LA66_0 <= 220))))
                    {
                        alt66=1;
                    }
                    else if ( (synpred127_fml(ctx)) && (LA66_0 == 178 || LA66_0 == 213))
                    {
                        alt66=1;
                    }
                    else if ( (synpred127_fml(ctx)) && (LA66_0 == 216))
                    {
                        alt66=1;
                    }
                    else if ( (synpred127_fml(ctx)) && (LA66_0 == 214))
                    {
                        alt66=1;
                    }
                    else if ( (synpred127_fml(ctx)) && (LA66_0 == 211))
                    {
                        alt66=1;
                    }
                    else if ( (synpred127_fml(ctx)) && (LA66_0 == 222))
                    {
                        alt66=1;
                    }
                    else if ( (synpred127_fml(ctx)) && (LA66_0 == 201))
                    {
                        alt66=1;
                    }
                    else if ( (synpred127_fml(ctx)) && (LA66_0 == 212))
                    {
                        alt66=1;
                    }
                    else if ( (synpred127_fml(ctx)) && (LA66_0 == 174 || LA66_0 == 183 || LA66_0 == 200))
                    {
                        alt66=1;
                    }
                    else if ( (synpred127_fml(ctx)) && (LA66_0 == 203))
                    {
                        alt66=1;
                    }
                    else if ( (synpred127_fml(ctx)) && (LA66_0 == 215))
                    {
                        alt66=1;
                    }
                    else if ( (synpred127_fml(ctx)) && (LA66_0 == 197))
                    {
                        alt66=1;
                    }
                    else if ( (synpred127_fml(ctx)) && (LA66_0 == 171))
                    {
                        alt66=1;
                    }
                    else if ( (synpred127_fml(ctx)) && (LA66_0 == 227))
                    {
                        alt66=1;
                    }
                    else if ( (synpred127_fml(ctx)) && (LA66_0 == 202))
                    {
                        alt66=1;
                    }
                    else if ( (synpred127_fml(ctx)) && (LA66_0 == 204))
                    {
                        alt66=1;
                    }
                    else if ( (synpred127_fml(ctx)) && (LA66_0 == 172 || LA66_0 == 198))
                    {
                        alt66=1;
                    }
                    else if ( (synpred127_fml(ctx)) && (LA66_0 == RCURLY))
                    {
                        alt66=1;
                    }
                    else if ( (((LA66_0 >= 144) && (LA66_0 <= 145)) || ((LA66_0 >= 147) && (LA66_0 <= 150)) || LA66_0 == 153 || LA66_0 == 170 || LA66_0 == 177 || LA66_0 == 179 || LA66_0 == 182 || LA66_0 == 184 || ((LA66_0 >= 189) && (LA66_0 <= 191)) || LA66_0 == 194 || LA66_0 == 199 || ((LA66_0 >= 223) && (LA66_0 <= 224)) || LA66_0 == 243 || LA66_0 == 259 || LA66_0 == 262 || LA66_0 == 272 || LA66_0 == 282 || LA66_0 == 298 || ((LA66_0 >= 305) && (LA66_0 <= 306)) || LA66_0 == 314 || LA66_0 == 318 || LA66_0 == 322 || LA66_0 == 341 || LA66_0 == 349 || LA66_0 == 353 || LA66_0 == 355 || LA66_0 == 361 || LA66_0 == 364 || ((LA66_0 >= 378) && (LA66_0 <= 380)) || LA66_0 == 393 || LA66_0 == 395 || LA66_0 == 406 || ((LA66_0 >= 410) && (LA66_0 <= 411)) || LA66_0 == 414))
                    {
                        alt66=2;
                    }
                    else
                    {
                        if (BACKTRACKING>0)
                        {
                            FAILEDFLAG = ANTLR3_TRUE;
                            return ;
                        }


                        CONSTRUCTEX();
                        EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                        EXCEPTION->message      = (void *)"";
                        EXCEPTION->decisionNum  = 66;
                        EXCEPTION->state        = 0;


                        goto ruledef_body_procedureEx;

                    }
                }
                switch (alt66)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1301:6: ( def_body_machine_using_section_predicat )=> def_body_procedure_section[ procedure ]
            	    {
            	        FOLLOWPUSH(FOLLOW_def_body_procedure_section_in_def_body_procedure2775);
            	        def_body_procedure_section(ctx, procedure);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_procedureEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1304:6: def_body_procedure_simplif[ procedure ]
            	    {
            	        FOLLOWPUSH(FOLLOW_def_body_procedure_simplif_in_def_body_procedure2784);
            	        def_body_procedure_simplif(ctx, procedure);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_procedureEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

                }
            }

             MATCHT(RCURLY, &FOLLOW_RCURLY_in_def_body_procedure2795);
            if  (HASEXCEPTION())
            {
                goto ruledef_body_procedureEx;
            }
            if (HASFAILED())
            {
                return ;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_body_procedureEx; /* Prevent compiler warnings */
    ruledef_body_procedureEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(29, def_body_procedure_StartIndex); }

    return ;
}
/* $ANTLR end def_body_procedure */

/**
 * $ANTLR start def_body_procedure_section
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1309:1: def_body_procedure_section[ sep::Machine * procedure ] : ( section_header[ procedure ] )? ( section_import[ procedure ] )? ( section_parameter[ procedure ] )* ( section_property[ procedure ] )* ( section_composite_structure[ procedure ] )* ( section_behavior[ procedure ] | section_statemachine[ procedure ] )? ( section_model_of_computation[ procedure ] | section_model_of_execution[ procedure ] | section_model_of_interaction[ procedure ] )* ;
 */
static void
def_body_procedure_section(pfmlParser ctx, sep::Machine * procedure)
{
    ANTLR3_UINT32 def_body_procedure_section_StartIndex;

    /* Initialize rule variables
     */
    def_body_procedure_section_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(30)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1310:2: ( ( section_header[ procedure ] )? ( section_import[ procedure ] )? ( section_parameter[ procedure ] )* ( section_property[ procedure ] )* ( section_composite_structure[ procedure ] )* ( section_behavior[ procedure ] | section_statemachine[ procedure ] )? ( section_model_of_computation[ procedure ] | section_model_of_execution[ procedure ] | section_model_of_interaction[ procedure ] )* )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1310:4: ( section_header[ procedure ] )? ( section_import[ procedure ] )? ( section_parameter[ procedure ] )* ( section_property[ procedure ] )* ( section_composite_structure[ procedure ] )* ( section_behavior[ procedure ] | section_statemachine[ procedure ] )? ( section_model_of_computation[ procedure ] | section_model_of_execution[ procedure ] | section_model_of_interaction[ procedure ] )*
        {
            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1310:4: ( section_header[ procedure ] )?
            {
                int alt67=2;
                switch ( LA(1) )
                {
                    case 188:
                    	{
                    		alt67=1;
                    	}
                        break;
                }

                switch (alt67)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1310:4: section_header[ procedure ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_header_in_def_body_procedure_section2808);
            	        section_header(ctx, procedure);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_procedure_sectionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1311:4: ( section_import[ procedure ] )?
            {
                int alt68=2;
                switch ( LA(1) )
                {
                    case 192:
                    	{
                    		alt68=1;
                    	}
                        break;
                }

                switch (alt68)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1311:4: section_import[ procedure ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_import_in_def_body_procedure_section2816);
            	        section_import(ctx, procedure);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_procedure_sectionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1313:4: ( section_parameter[ procedure ] )*

            for (;;)
            {
                int alt69=2;
                switch ( LA(1) )
                {
                case 195:
                case 196:
                case 207:
                case 209:
                case 210:
                case 219:
                case 220:
                	{
                		alt69=1;
                	}
                    break;

                }

                switch (alt69)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1313:6: section_parameter[ procedure ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_parameter_in_def_body_procedure_section2827);
            	        section_parameter(ctx, procedure);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_procedure_sectionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

            	default:
            	    goto loop69;	/* break out of the loop */
            	    break;
                }
            }
            loop69: ; /* Jump out to here if this rule does not match */


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1315:4: ( section_property[ procedure ] )*

            for (;;)
            {
                int alt70=2;
                switch ( LA(1) )
                {
                case 178:
                case 211:
                case 213:
                case 214:
                case 216:
                	{
                		alt70=1;
                	}
                    break;

                }

                switch (alt70)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1315:6: section_property[ procedure ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_property_in_def_body_procedure_section2839);
            	        section_property(ctx, procedure);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_procedure_sectionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

            	default:
            	    goto loop70;	/* break out of the loop */
            	    break;
                }
            }
            loop70: ; /* Jump out to here if this rule does not match */


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1317:4: ( section_composite_structure[ procedure ] )*

            for (;;)
            {
                int alt71=2;
                switch ( LA(1) )
                {
                case 174:
                case 183:
                case 197:
                case 200:
                case 201:
                case 203:
                case 212:
                case 215:
                case 222:
                	{
                		alt71=1;
                	}
                    break;

                }

                switch (alt71)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1317:6: section_composite_structure[ procedure ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_composite_structure_in_def_body_procedure_section2852);
            	        section_composite_structure(ctx, procedure);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_procedure_sectionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

            	default:
            	    goto loop71;	/* break out of the loop */
            	    break;
                }
            }
            loop71: ; /* Jump out to here if this rule does not match */


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1319:4: ( section_behavior[ procedure ] | section_statemachine[ procedure ] )?
            {
                int alt72=3;
                switch ( LA(1) )
                {
                    case 171:
                    	{
                    		alt72=1;
                    	}
                        break;
                    case 227:
                    	{
                    		alt72=2;
                    	}
                        break;
                }

                switch (alt72)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1319:6: section_behavior[ procedure ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_behavior_in_def_body_procedure_section2864);
            	        section_behavior(ctx, procedure);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_procedure_sectionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1320:6: section_statemachine[ procedure ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_statemachine_in_def_body_procedure_section2872);
            	        section_statemachine(ctx, procedure);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_procedure_sectionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1323:4: ( section_model_of_computation[ procedure ] | section_model_of_execution[ procedure ] | section_model_of_interaction[ procedure ] )*

            for (;;)
            {
                int alt73=4;
                switch ( LA(1) )
                {
                case 202:
                	{
                		alt73=1;
                	}
                    break;
                case 204:
                	{
                		alt73=2;
                	}
                    break;
                case 172:
                case 198:
                	{
                		alt73=3;
                	}
                    break;

                }

                switch (alt73)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1323:6: section_model_of_computation[ procedure ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_model_of_computation_in_def_body_procedure_section2887);
            	        section_model_of_computation(ctx, procedure);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_procedure_sectionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1324:6: section_model_of_execution[ procedure ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_model_of_execution_in_def_body_procedure_section2895);
            	        section_model_of_execution(ctx, procedure);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_procedure_sectionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;
            	case 3:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1325:6: section_model_of_interaction[ procedure ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_model_of_interaction_in_def_body_procedure_section2903);
            	        section_model_of_interaction(ctx, procedure);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_procedure_sectionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

            	default:
            	    goto loop73;	/* break out of the loop */
            	    break;
                }
            }
            loop73: ; /* Jump out to here if this rule does not match */


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_body_procedure_sectionEx; /* Prevent compiler warnings */
    ruledef_body_procedure_sectionEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(30, def_body_procedure_section_StartIndex); }

    return ;
}
/* $ANTLR end def_body_procedure_section */

/**
 * $ANTLR start def_body_procedure_simplif
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1330:1: def_body_procedure_simplif[ sep::Machine * procedure ] : ( (m= modifier_declaration )? ( decl_variable[ procedure->getPropertyPart() , mdfr ] |ads= any_def_statemachine[ procedure , mdfr , spcfr ] | def_state_activity[ procedure ] ) )+ ;
 */
static void
def_body_procedure_simplif(pfmlParser ctx, sep::Machine * procedure)
{
    ANTLR3_UINT32 def_body_procedure_simplif_StartIndex;

    sep::Modifier m;
    #undef	RETURN_TYPE_m
    #define	RETURN_TYPE_m sep::Modifier

    sep::Machine * ads;
    #undef	RETURN_TYPE_ads
    #define	RETURN_TYPE_ads sep::Machine *

    /* Initialize rule variables
     */
    def_body_procedure_simplif_StartIndex = INDEX();



    	 sep::Modifier mdfr;

    	sep::Specifier spcfr;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(31)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1336:2: ( ( (m= modifier_declaration )? ( decl_variable[ procedure->getPropertyPart() , mdfr ] |ads= any_def_statemachine[ procedure , mdfr , spcfr ] | def_state_activity[ procedure ] ) )+ )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1336:4: ( (m= modifier_declaration )? ( decl_variable[ procedure->getPropertyPart() , mdfr ] |ads= any_def_statemachine[ procedure , mdfr , spcfr ] | def_state_activity[ procedure ] ) )+
        {
            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1336:4: ( (m= modifier_declaration )? ( decl_variable[ procedure->getPropertyPart() , mdfr ] |ads= any_def_statemachine[ procedure , mdfr , spcfr ] | def_state_activity[ procedure ] ) )+
            {
                int cnt76=0;

                for (;;)
                {
                    int alt76=2;
            	switch ( LA(1) )
            	{
            	case 144:
            	case 145:
            	case 147:
            	case 148:
            	case 149:
            	case 150:
            	case 153:
            	case 170:
            	case 177:
            	case 179:
            	case 182:
            	case 184:
            	case 189:
            	case 190:
            	case 191:
            	case 194:
            	case 199:
            	case 223:
            	case 224:
            	case 243:
            	case 259:
            	case 262:
            	case 272:
            	case 282:
            	case 298:
            	case 305:
            	case 306:
            	case 314:
            	case 318:
            	case 322:
            	case 341:
            	case 349:
            	case 353:
            	case 355:
            	case 361:
            	case 364:
            	case 378:
            	case 379:
            	case 380:
            	case 393:
            	case 395:
            	case 406:
            	case 410:
            	case 411:
            	case 414:
            		{
            			alt76=1;
            		}
            	    break;

            	}

            	switch (alt76)
            	{
            	    case 1:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1336:6: (m= modifier_declaration )? ( decl_variable[ procedure->getPropertyPart() , mdfr ] |ads= any_def_statemachine[ procedure , mdfr , spcfr ] | def_state_activity[ procedure ] )
            	        {
            	            if ( BACKTRACKING==0 )
            	            {
            	                 mdfr = sep::Modifier::PROPERTY_UNDEFINED_MODIFIER; 
            	            }


            	            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1338:3: (m= modifier_declaration )?
            	            {
            	                int alt74=2;
            	                switch ( LA(1) )
            	                {
            	                    case 406:
            	                    	{
            	                    		{
            	                    		    int LA74_1 = LA(2);
            	                    		    if ( (synpred138_fml(ctx)))
            	                    		    {
            	                    		        alt74=1;
            	                    		    }
            	                    		}
            	                    	}
            	                        break;
            	                    case 243:
            	                    case 282:
            	                    case 298:
            	                    case 305:
            	                    case 341:
            	                    case 349:
            	                    case 355:
            	                    case 361:
            	                    case 364:
            	                    case 380:
            	                    case 395:
            	                    case 414:
            	                    	{
            	                    		alt74=1;
            	                    	}
            	                        break;
            	                }

            	                switch (alt74)
            	                {
            	            	case 1:
            	            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1338:5: m= modifier_declaration
            	            	    {
            	            	        FOLLOWPUSH(FOLLOW_modifier_declaration_in_def_body_procedure_simplif2939);
            	            	        m=modifier_declaration(ctx);

            	            	        FOLLOWPOP();
            	            	        if  (HASEXCEPTION())
            	            	        {
            	            	            goto ruledef_body_procedure_simplifEx;
            	            	        }
            	            	        if (HASFAILED())
            	            	        {
            	            	            return ;
            	            	        }


            	            	        if ( BACKTRACKING==0 )
            	            	        {
            	            	             mdfr = m
            	            	            ; 
            	            	        }


            	            	    }
            	            	    break;

            	                }
            	            }

            	            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1340:6: ( decl_variable[ procedure->getPropertyPart() , mdfr ] |ads= any_def_statemachine[ procedure , mdfr , spcfr ] | def_state_activity[ procedure ] )
            	            {
            	                int alt75=3;
            	                switch ( LA(1) )
            	                {
            	                case 259:
            	                case 262:
            	                case 318:
            	                case 410:
            	                case 411:
            	                	{
            	                		alt75=1;
            	                	}
            	                    break;
            	                case 144:
            	                case 145:
            	                case 147:
            	                case 148:
            	                case 149:
            	                case 150:
            	                case 153:
            	                case 272:
            	                case 306:
            	                case 314:
            	                case 322:
            	                case 353:
            	                case 378:
            	                case 379:
            	                case 393:
            	                case 406:
            	                	{
            	                		alt75=2;
            	                	}
            	                    break;
            	                case 170:
            	                case 177:
            	                case 179:
            	                case 182:
            	                case 184:
            	                case 189:
            	                case 190:
            	                case 191:
            	                case 194:
            	                case 199:
            	                case 223:
            	                case 224:
            	                	{
            	                		alt75=3;
            	                	}
            	                    break;

            	                default:
            	                    if (BACKTRACKING>0)
            	                    {
            	                        FAILEDFLAG = ANTLR3_TRUE;
            	                        return ;
            	                    }

            	                    CONSTRUCTEX();
            	                    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
            	                    EXCEPTION->message      = (void *)"";
            	                    EXCEPTION->decisionNum  = 75;
            	                    EXCEPTION->state        = 0;


            	                    goto ruledef_body_procedure_simplifEx;

            	                }

            	                switch (alt75)
            	                {
            	            	case 1:
            	            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1340:8: decl_variable[ procedure->getPropertyPart() , mdfr ]
            	            	    {
            	            	        FOLLOWPUSH(FOLLOW_decl_variable_in_def_body_procedure_simplif2955);
            	            	        decl_variable(ctx, procedure->getPropertyPart(), mdfr);

            	            	        FOLLOWPOP();
            	            	        if  (HASEXCEPTION())
            	            	        {
            	            	            goto ruledef_body_procedure_simplifEx;
            	            	        }
            	            	        if (HASFAILED())
            	            	        {
            	            	            return ;
            	            	        }


            	            	    }
            	            	    break;
            	            	case 2:
            	            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1342:8: ads= any_def_statemachine[ procedure , mdfr , spcfr ]
            	            	    {
            	            	        FOLLOWPUSH(FOLLOW_any_def_statemachine_in_def_body_procedure_simplif2968);
            	            	        ads=any_def_statemachine(ctx, procedure, mdfr, spcfr);

            	            	        FOLLOWPOP();
            	            	        if  (HASEXCEPTION())
            	            	        {
            	            	            goto ruledef_body_procedure_simplifEx;
            	            	        }
            	            	        if (HASFAILED())
            	            	        {
            	            	            return ;
            	            	        }


            	            	    }
            	            	    break;
            	            	case 3:
            	            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1344:8: def_state_activity[ procedure ]
            	            	    {
            	            	        FOLLOWPUSH(FOLLOW_def_state_activity_in_def_body_procedure_simplif2979);
            	            	        def_state_activity(ctx, procedure);

            	            	        FOLLOWPOP();
            	            	        if  (HASEXCEPTION())
            	            	        {
            	            	            goto ruledef_body_procedure_simplifEx;
            	            	        }
            	            	        if (HASFAILED())
            	            	        {
            	            	            return ;
            	            	        }


            	            	    }
            	            	    break;

            	                }
            	            }

            	        }
            	        break;

            	    default:

            		if ( cnt76 >= 1 )
            		{
            		    goto loop76;
            		}
            		if (BACKTRACKING>0)
            		{
            		    FAILEDFLAG = ANTLR3_TRUE;
            		    return ;
            		}

            		/* mismatchedSetEx()
            		 */
            		CONSTRUCTEX();
            		EXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
            		EXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;


            		goto ruledef_body_procedure_simplifEx;
            	}
            	cnt76++;
                }
                loop76: ;	/* Jump to here if this rule does not match */
            }

        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_body_procedure_simplifEx; /* Prevent compiler warnings */
    ruledef_body_procedure_simplifEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(31, def_body_procedure_simplif_StartIndex); }

    return ;
}
/* $ANTLR end def_body_procedure_simplif */

/**
 * $ANTLR start section_composite_structure
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1354:1: section_composite_structure[ sep::Machine * container ] : ( section_routine[ container ] | section_procedure[ container ] | section_composite_generic[ container ] | section_machine_model[ container ] | section_machine_prototype[ container ] | section_machine_instance[ container ] );
 */
static void
section_composite_structure(pfmlParser ctx, sep::Machine * container)
{
    ANTLR3_UINT32 section_composite_structure_StartIndex;

    /* Initialize rule variables
     */
    section_composite_structure_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(32)) )
    {
        {
        }



        return ;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1355:2: ( section_routine[ container ] | section_procedure[ container ] | section_composite_generic[ container ] | section_machine_model[ container ] | section_machine_prototype[ container ] | section_machine_instance[ container ] )

            ANTLR3_UINT32 alt77;

            alt77=6;

            switch ( LA(1) )
            {
            case 201:
            case 222:
            	{
            		alt77=1;
            	}
                break;
            case 212:
            	{
            		alt77=2;
            	}
                break;
            case 174:
            case 183:
            case 200:
            	{
            		alt77=3;
            	}
                break;
            case 203:
            	{
            		alt77=4;
            	}
                break;
            case 215:
            	{
            		alt77=5;
            	}
                break;
            case 197:
            	{
            		alt77=6;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 77;
                EXCEPTION->state        = 0;


                goto rulesection_composite_structureEx;

            }

            switch (alt77)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1355:4: section_routine[ container ]
        	    {
        	        FOLLOWPUSH(FOLLOW_section_routine_in_section_composite_structure3011);
        	        section_routine(ctx, container);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesection_composite_structureEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1356:4: section_procedure[ container ]
        	    {
        	        FOLLOWPUSH(FOLLOW_section_procedure_in_section_composite_structure3017);
        	        section_procedure(ctx, container);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesection_composite_structureEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1358:4: section_composite_generic[ container ]
        	    {
        	        FOLLOWPUSH(FOLLOW_section_composite_generic_in_section_composite_structure3024);
        	        section_composite_generic(ctx, container);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesection_composite_structureEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 4:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1359:4: section_machine_model[ container ]
        	    {
        	        FOLLOWPUSH(FOLLOW_section_machine_model_in_section_composite_structure3030);
        	        section_machine_model(ctx, container);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesection_composite_structureEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 5:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1360:4: section_machine_prototype[ container ]
        	    {
        	        FOLLOWPUSH(FOLLOW_section_machine_prototype_in_section_composite_structure3036);
        	        section_machine_prototype(ctx, container);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesection_composite_structureEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 6:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1361:4: section_machine_instance[ container ]
        	    {
        	        FOLLOWPUSH(FOLLOW_section_machine_instance_in_section_composite_structure3042);
        	        section_machine_instance(ctx, container);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesection_composite_structureEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto rulesection_composite_structureEx; /* Prevent compiler warnings */
    rulesection_composite_structureEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(32, section_composite_structure_StartIndex); }

    return ;
}
/* $ANTLR end section_composite_structure */

/**
 * $ANTLR start section_composite_generic
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1364:1: section_composite_generic[ sep::Machine * container ] : ( '@composite:' | '@executable:' | '@machine:' ) (m= executable_machine[ container ] )* ;
 */
static void
section_composite_generic(pfmlParser ctx, sep::Machine * container)
{
    ANTLR3_UINT32 section_composite_generic_StartIndex;

    sep::Machine * m;
    #undef	RETURN_TYPE_m
    #define	RETURN_TYPE_m sep::Machine *

    /* Initialize rule variables
     */
    section_composite_generic_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(33)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1365:2: ( ( '@composite:' | '@executable:' | '@machine:' ) (m= executable_machine[ container ] )* )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1365:4: ( '@composite:' | '@executable:' | '@machine:' ) (m= executable_machine[ container ] )*
        {
            if ( LA(1) == 174 || LA(1) == 183 || LA(1) == 200 )
            {
                CONSUME();
                PERRORRECOVERY=ANTLR3_FALSE;
                FAILEDFLAG=ANTLR3_FALSE;

            }
            else
            {
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
                EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
                EXCEPTION->expectingSet = NULL;

                goto rulesection_composite_genericEx;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1366:4: (m= executable_machine[ container ] )*

            for (;;)
            {
                int alt78=2;
                switch ( LA(1) )
                {
                case 144:
                case 145:
                case 147:
                case 148:
                case 149:
                case 150:
                case 153:
                case 272:
                case 306:
                case 307:
                case 314:
                case 317:
                case 322:
                case 353:
                case 378:
                case 379:
                case 393:
                case 406:
                	{
                		alt78=1;
                	}
                    break;

                }

                switch (alt78)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1366:6: m= executable_machine[ container ]
            	    {
            	        FOLLOWPUSH(FOLLOW_executable_machine_in_section_composite_generic3081);
            	        m=executable_machine(ctx, container);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulesection_composite_genericEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

            	default:
            	    goto loop78;	/* break out of the loop */
            	    break;
                }
            }
            loop78: ; /* Jump out to here if this rule does not match */


        }

    }

    // This is where rules clean up and exit
    //
    goto rulesection_composite_genericEx; /* Prevent compiler warnings */
    rulesection_composite_genericEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(33, section_composite_generic_StartIndex); }

    return ;
}
/* $ANTLR end section_composite_generic */

/**
 * $ANTLR start section_machine_model
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1370:1: section_machine_model[ sep::Machine * container ] : '@model:' (m= executable_model_definiton[ container , mdfr , spcfr ] )* ;
 */
static void
section_machine_model(pfmlParser ctx, sep::Machine * container)
{
    ANTLR3_UINT32 section_machine_model_StartIndex;

    sep::Machine * m;
    #undef	RETURN_TYPE_m
    #define	RETURN_TYPE_m sep::Machine *

    /* Initialize rule variables
     */
    section_machine_model_StartIndex = INDEX();



    	sep::Modifier mdfr;

    	sep::Specifier spcfr( sep::Specifier::DESIGN_MODEL_SPECIFIER );

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(34)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1376:2: ( '@model:' (m= executable_model_definiton[ container , mdfr , spcfr ] )* )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1376:4: '@model:' (m= executable_model_definiton[ container , mdfr , spcfr ] )*
        {
             MATCHT(203, &FOLLOW_203_in_section_machine_model3103);
            if  (HASEXCEPTION())
            {
                goto rulesection_machine_modelEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1377:4: (m= executable_model_definiton[ container , mdfr , spcfr ] )*

            for (;;)
            {
                int alt79=2;
                switch ( LA(1) )
                {
                case 272:
                case 306:
                case 314:
                case 317:
                case 322:
                case 353:
                case 379:
                case 393:
                case 406:
                	{
                		alt79=1;
                	}
                    break;

                }

                switch (alt79)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1377:6: m= executable_model_definiton[ container , mdfr , spcfr ]
            	    {
            	        FOLLOWPUSH(FOLLOW_executable_model_definiton_in_section_machine_model3112);
            	        m=executable_model_definiton(ctx, container, mdfr, spcfr);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulesection_machine_modelEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

            	default:
            	    goto loop79;	/* break out of the loop */
            	    break;
                }
            }
            loop79: ; /* Jump out to here if this rule does not match */


        }

    }

    // This is where rules clean up and exit
    //
    goto rulesection_machine_modelEx; /* Prevent compiler warnings */
    rulesection_machine_modelEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(34, section_machine_model_StartIndex); }

    return ;
}
/* $ANTLR end section_machine_model */

/**
 * $ANTLR start section_machine_prototype
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1381:1: section_machine_prototype[ sep::Machine * container ] : '@prototype:' (m= executable_model_definiton[ container , mdfr , spcfr ] )* ;
 */
static void
section_machine_prototype(pfmlParser ctx, sep::Machine * container)
{
    ANTLR3_UINT32 section_machine_prototype_StartIndex;

    sep::Machine * m;
    #undef	RETURN_TYPE_m
    #define	RETURN_TYPE_m sep::Machine *

    /* Initialize rule variables
     */
    section_machine_prototype_StartIndex = INDEX();



    	sep::Modifier mdfr;

    	sep::Specifier spcfr( sep::Specifier::DESIGN_PROTOTYPE_STATIC_SPECIFIER );

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(35)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1387:2: ( '@prototype:' (m= executable_model_definiton[ container , mdfr , spcfr ] )* )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1387:4: '@prototype:' (m= executable_model_definiton[ container , mdfr , spcfr ] )*
        {
             MATCHT(215, &FOLLOW_215_in_section_machine_prototype3134);
            if  (HASEXCEPTION())
            {
                goto rulesection_machine_prototypeEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1388:4: (m= executable_model_definiton[ container , mdfr , spcfr ] )*

            for (;;)
            {
                int alt80=2;
                switch ( LA(1) )
                {
                case 272:
                case 306:
                case 314:
                case 317:
                case 322:
                case 353:
                case 379:
                case 393:
                case 406:
                	{
                		alt80=1;
                	}
                    break;

                }

                switch (alt80)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1388:6: m= executable_model_definiton[ container , mdfr , spcfr ]
            	    {
            	        FOLLOWPUSH(FOLLOW_executable_model_definiton_in_section_machine_prototype3143);
            	        m=executable_model_definiton(ctx, container, mdfr, spcfr);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulesection_machine_prototypeEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

            	default:
            	    goto loop80;	/* break out of the loop */
            	    break;
                }
            }
            loop80: ; /* Jump out to here if this rule does not match */


        }

    }

    // This is where rules clean up and exit
    //
    goto rulesection_machine_prototypeEx; /* Prevent compiler warnings */
    rulesection_machine_prototypeEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(35, section_machine_prototype_StartIndex); }

    return ;
}
/* $ANTLR end section_machine_prototype */

/**
 * $ANTLR start section_machine_instance
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1391:1: section_machine_instance[ sep::Machine * container ] : '@instance:' (edi= executable_instance_definiton[ container ] )* ;
 */
static void
section_machine_instance(pfmlParser ctx, sep::Machine * container)
{
    ANTLR3_UINT32 section_machine_instance_StartIndex;

    sep::Machine * edi;
    #undef	RETURN_TYPE_edi
    #define	RETURN_TYPE_edi sep::Machine *

    /* Initialize rule variables
     */
    section_machine_instance_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(36)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1392:2: ( '@instance:' (edi= executable_instance_definiton[ container ] )* )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1392:4: '@instance:' (edi= executable_instance_definiton[ container ] )*
        {
             MATCHT(197, &FOLLOW_197_in_section_machine_instance3160);
            if  (HASEXCEPTION())
            {
                goto rulesection_machine_instanceEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1393:4: (edi= executable_instance_definiton[ container ] )*

            for (;;)
            {
                int alt81=2;
                switch ( LA(1) )
                {
                case 272:
                case 282:
                case 306:
                case 307:
                case 314:
                case 349:
                case 352:
                case 355:
                case 393:
                case 406:
                	{
                		alt81=1;
                	}
                    break;

                }

                switch (alt81)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1393:6: edi= executable_instance_definiton[ container ]
            	    {
            	        FOLLOWPUSH(FOLLOW_executable_instance_definiton_in_section_machine_instance3169);
            	        edi=executable_instance_definiton(ctx, container);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulesection_machine_instanceEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

            	default:
            	    goto loop81;	/* break out of the loop */
            	    break;
                }
            }
            loop81: ; /* Jump out to here if this rule does not match */


        }

    }

    // This is where rules clean up and exit
    //
    goto rulesection_machine_instanceEx; /* Prevent compiler warnings */
    rulesection_machine_instanceEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(36, section_machine_instance_StartIndex); }

    return ;
}
/* $ANTLR end section_machine_instance */

/**
 * $ANTLR start executable_machine
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1397:1: executable_machine[ sep::Machine * container ] returns [ sep::Machine * machine ] : (ms= executable_modifier_specifier )? (dm= def_machine[ container , mdfr , spcfr ] |ads= any_def_statemachine[ container , mdfr , spcfr ] |emi= decl_instance[ container , mdfr , spcfr ] ) ;
 */
static sep::Machine *
executable_machine(pfmlParser ctx, sep::Machine * container)
{
    sep::Machine * machine;

    ANTLR3_UINT32 executable_machine_StartIndex;

    fmlParser_executable_modifier_specifier_return ms;
    #undef	RETURN_TYPE_ms
    #define	RETURN_TYPE_ms fmlParser_executable_modifier_specifier_return

    sep::Machine * dm;
    #undef	RETURN_TYPE_dm
    #define	RETURN_TYPE_dm sep::Machine *

    sep::Machine * ads;
    #undef	RETURN_TYPE_ads
    #define	RETURN_TYPE_ads sep::Machine *

    sep::Machine * emi;
    #undef	RETURN_TYPE_emi
    #define	RETURN_TYPE_emi sep::Machine *

    /* Initialize rule variables
     */
    executable_machine_StartIndex = INDEX();



    	 sep::Modifier mdfr;

    	sep::Specifier spcfr;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(37)) )
    {
        {
        }



        return machine;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1404:2: ( (ms= executable_modifier_specifier )? (dm= def_machine[ container , mdfr , spcfr ] |ads= any_def_statemachine[ container , mdfr , spcfr ] |emi= decl_instance[ container , mdfr , spcfr ] ) )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1404:4: (ms= executable_modifier_specifier )? (dm= def_machine[ container , mdfr , spcfr ] |ads= any_def_statemachine[ container , mdfr , spcfr ] |emi= decl_instance[ container , mdfr , spcfr ] )
        {
            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1404:4: (ms= executable_modifier_specifier )?
            {
                int alt82=2;
                switch ( LA(1) )
                {
                    case 272:
                    case 306:
                    case 314:
                    case 322:
                    case 353:
                    case 393:
                    case 406:
                    	{
                    		{
                    		    int LA82_1 = LA(2);
                    		    if ( (synpred153_fml(ctx)))
                    		    {
                    		        alt82=1;
                    		    }
                    		}
                    	}
                        break;
                }

                switch (alt82)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1404:6: ms= executable_modifier_specifier
            	    {
            	        FOLLOWPUSH(FOLLOW_executable_modifier_specifier_in_executable_machine3199);
            	        ms=executable_modifier_specifier(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexecutable_machineEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return machine;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             mdfr = ms.mdfr
            	            ; spcfr = ms.spcfr
            	            ; 
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1408:4: (dm= def_machine[ container , mdfr , spcfr ] |ads= any_def_statemachine[ container , mdfr , spcfr ] |emi= decl_instance[ container , mdfr , spcfr ] )
            {
                int alt83=3;
                switch ( LA(1) )
                {
                case 317:
                	{
                		alt83=1;
                	}
                    break;
                case 144:
                case 145:
                case 147:
                case 148:
                case 149:
                case 150:
                case 153:
                case 272:
                case 306:
                case 314:
                case 322:
                case 353:
                case 378:
                case 379:
                case 393:
                case 406:
                	{
                		alt83=2;
                	}
                    break;
                case 307:
                	{
                		alt83=3;
                	}
                    break;

                default:
                    if (BACKTRACKING>0)
                    {
                        FAILEDFLAG = ANTLR3_TRUE;
                        return machine;
                    }

                    CONSTRUCTEX();
                    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                    EXCEPTION->message      = (void *)"";
                    EXCEPTION->decisionNum  = 83;
                    EXCEPTION->state        = 0;


                    goto ruleexecutable_machineEx;

                }

                switch (alt83)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1408:6: dm= def_machine[ container , mdfr , spcfr ]
            	    {
            	        FOLLOWPUSH(FOLLOW_def_machine_in_executable_machine3220);
            	        dm=def_machine(ctx, container, mdfr, spcfr);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexecutable_machineEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return machine;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             machine= 
            	            dm
            	            ;
            	              
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1411:6: ads= any_def_statemachine[ container , mdfr , spcfr ]
            	    {
            	        FOLLOWPUSH(FOLLOW_any_def_statemachine_in_executable_machine3236);
            	        ads=any_def_statemachine(ctx, container, mdfr, spcfr);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexecutable_machineEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return machine;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             machine= 
            	            ads
            	            ;
            	              
            	        }


            	    }
            	    break;
            	case 3:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1414:6: emi= decl_instance[ container , mdfr , spcfr ]
            	    {
            	        FOLLOWPUSH(FOLLOW_decl_instance_in_executable_machine3252);
            	        emi=decl_instance(ctx, container, mdfr, spcfr);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexecutable_machineEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return machine;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             machine= 
            	            emi
            	            ;
            	             
            	        }


            	    }
            	    break;

                }
            }

        }

    }

    // This is where rules clean up and exit
    //
    goto ruleexecutable_machineEx; /* Prevent compiler warnings */
    ruleexecutable_machineEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(37, executable_machine_StartIndex); }

    return machine;
}
/* $ANTLR end executable_machine */

/**
 * $ANTLR start executable_model_definiton
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1420:1: executable_model_definiton[ sep::Machine * container ,\n\t\tsep::Modifier mdfr , sep::Specifier spcfr ] returns [ sep::Machine * machine ] : (ms= executable_modifier_specifier )? (dm= def_machine[ container , mdfr , spcfr ] |ads= def_statemachine[ container , mdfr , spcfr ] ) ;
 */
static sep::Machine *
executable_model_definiton(pfmlParser ctx, sep::Machine * container, sep::Modifier mdfr, sep::Specifier spcfr)
{
    sep::Machine * machine;

    ANTLR3_UINT32 executable_model_definiton_StartIndex;

    fmlParser_executable_modifier_specifier_return ms;
    #undef	RETURN_TYPE_ms
    #define	RETURN_TYPE_ms fmlParser_executable_modifier_specifier_return

    sep::Machine * dm;
    #undef	RETURN_TYPE_dm
    #define	RETURN_TYPE_dm sep::Machine *

    sep::Machine * ads;
    #undef	RETURN_TYPE_ads
    #define	RETURN_TYPE_ads sep::Machine *

    /* Initialize rule variables
     */
    executable_model_definiton_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(38)) )
    {
        {
        }



        return machine;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1424:2: ( (ms= executable_modifier_specifier )? (dm= def_machine[ container , mdfr , spcfr ] |ads= def_statemachine[ container , mdfr , spcfr ] ) )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1424:4: (ms= executable_modifier_specifier )? (dm= def_machine[ container , mdfr , spcfr ] |ads= def_statemachine[ container , mdfr , spcfr ] )
        {
            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1424:4: (ms= executable_modifier_specifier )?
            {
                int alt84=2;
                switch ( LA(1) )
                {
                    case 272:
                    case 306:
                    case 314:
                    case 322:
                    case 353:
                    case 393:
                    case 406:
                    	{
                    		alt84=1;
                    	}
                        break;
                }

                switch (alt84)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1424:6: ms= executable_modifier_specifier
            	    {
            	        FOLLOWPUSH(FOLLOW_executable_modifier_specifier_in_executable_model_definiton3286);
            	        ms=executable_modifier_specifier(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexecutable_model_definitonEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return machine;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             mdfr.override_ifdef( ms.mdfr
            	             );  spcfr.override_ifdef( ms.spcfr
            	             ); 
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1428:4: (dm= def_machine[ container , mdfr , spcfr ] |ads= def_statemachine[ container , mdfr , spcfr ] )
            {
                int alt85=2;
                switch ( LA(1) )
                {
                case 317:
                	{
                		alt85=1;
                	}
                    break;
                case 379:
                	{
                		alt85=2;
                	}
                    break;

                default:
                    if (BACKTRACKING>0)
                    {
                        FAILEDFLAG = ANTLR3_TRUE;
                        return machine;
                    }

                    CONSTRUCTEX();
                    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                    EXCEPTION->message      = (void *)"";
                    EXCEPTION->decisionNum  = 85;
                    EXCEPTION->state        = 0;


                    goto ruleexecutable_model_definitonEx;

                }

                switch (alt85)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1428:6: dm= def_machine[ container , mdfr , spcfr ]
            	    {
            	        FOLLOWPUSH(FOLLOW_def_machine_in_executable_model_definiton3307);
            	        dm=def_machine(ctx, container, mdfr, spcfr);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexecutable_model_definitonEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return machine;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             machine= 
            	            dm
            	            ;
            	              
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1431:6: ads= def_statemachine[ container , mdfr , spcfr ]
            	    {
            	        FOLLOWPUSH(FOLLOW_def_statemachine_in_executable_model_definiton3329);
            	        ads=def_statemachine(ctx, container, mdfr, spcfr);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexecutable_model_definitonEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return machine;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             machine= 
            	            ads
            	            ;
            	             
            	        }


            	    }
            	    break;

                }
            }

        }

    }

    // This is where rules clean up and exit
    //
    goto ruleexecutable_model_definitonEx; /* Prevent compiler warnings */
    ruleexecutable_model_definitonEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(38, executable_model_definiton_StartIndex); }

    return machine;
}
/* $ANTLR end executable_model_definiton */

/**
 * $ANTLR start executable_instance_definiton
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1436:1: executable_instance_definiton[ sep::Machine * container ] returns [ sep::Machine * instance ] : (ms= instance_modifier_specifier )? emi= decl_instance[ container , mdfr , spcfr ] ;
 */
static sep::Machine *
executable_instance_definiton(pfmlParser ctx, sep::Machine * container)
{
    sep::Machine * instance;

    ANTLR3_UINT32 executable_instance_definiton_StartIndex;

    fmlParser_instance_modifier_specifier_return ms;
    #undef	RETURN_TYPE_ms
    #define	RETURN_TYPE_ms fmlParser_instance_modifier_specifier_return

    sep::Machine * emi;
    #undef	RETURN_TYPE_emi
    #define	RETURN_TYPE_emi sep::Machine *

    /* Initialize rule variables
     */
    executable_instance_definiton_StartIndex = INDEX();



    	sep::Modifier mdfr;

    	sep::Specifier spcfr( sep::Specifier::DESIGN_INSTANCE_STATIC_SPECIFIER );

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(39)) )
    {
        {
        }



        return instance;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1443:2: ( (ms= instance_modifier_specifier )? emi= decl_instance[ container , mdfr , spcfr ] )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1443:4: (ms= instance_modifier_specifier )? emi= decl_instance[ container , mdfr , spcfr ]
        {
            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1443:4: (ms= instance_modifier_specifier )?
            {
                int alt86=2;
                switch ( LA(1) )
                {
                    case 272:
                    case 282:
                    case 306:
                    case 314:
                    case 349:
                    case 352:
                    case 355:
                    case 393:
                    case 406:
                    	{
                    		alt86=1;
                    	}
                        break;
                }

                switch (alt86)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1443:6: ms= instance_modifier_specifier
            	    {
            	        FOLLOWPUSH(FOLLOW_instance_modifier_specifier_in_executable_instance_definiton3365);
            	        ms=instance_modifier_specifier(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexecutable_instance_definitonEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return instance;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             mdfr = ms.mdfr
            	            ; spcfr = ms.spcfr
            	            ; 
            	        }


            	    }
            	    break;

                }
            }

            FOLLOWPUSH(FOLLOW_decl_instance_in_executable_instance_definiton3384);
            emi=decl_instance(ctx, container, mdfr, spcfr);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruleexecutable_instance_definitonEx;
            }
            if (HASFAILED())
            {
                return instance;
            }


            if ( BACKTRACKING==0 )
            {
                 instance= 
                emi
                ;
                 
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruleexecutable_instance_definitonEx; /* Prevent compiler warnings */
    ruleexecutable_instance_definitonEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(39, executable_instance_definiton_StartIndex); }

    return instance;
}
/* $ANTLR end executable_instance_definiton */

/**
 * $ANTLR start decl_instance
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1456:1: decl_instance[ sep::Machine * container ,\n\t\tsep::Modifier mdfr , sep::Specifier spcfr ] returns [ sep::Machine * instance ] : 'instance' ( 'machine' | 'statemachine' )? LT_ ( 'model:' )? mm= instance_machine_model ( COMMA def_instance_count[ initialCount , maximalCount ] )? GT id= ID ( StringLiteral )? ( LPAREN ( def_instance_on_new_activity[ $instance ] )? RPAREN )? ( SEMI | LCURLY (s= statement )* ( def_instance_activity[ $instance ] )* RCURLY ) ;
 */
static sep::Machine *
decl_instance(pfmlParser ctx, sep::Machine * container, sep::Modifier mdfr, sep::Specifier spcfr)
{
    sep::Machine * instance;

    ANTLR3_UINT32 decl_instance_StartIndex;

    pANTLR3_COMMON_TOKEN    id;
    pANTLR3_COMMON_TOKEN    StringLiteral4;
    sep::BF mm;
    #undef	RETURN_TYPE_mm
    #define	RETURN_TYPE_mm sep::BF

    sep::BFCode s;
    #undef	RETURN_TYPE_s
    #define	RETURN_TYPE_s sep::BFCode

    /* Initialize rule variables
     */
    decl_instance_StartIndex = INDEX();



    	sep::BF aModel;

    	sep::avm_size_t initialCount = 1;
    	sep::avm_size_t maximalCount = AVM_NUMERIC_MAX_SIZE_T;

    	SAVE_RULE_BEGIN_LOCATION;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(40)) )
    {
        {

            	if( aModel.is< sep::Machine >() )
            	{
            		POP_CTX;
            	}
            	SET_RULE_LOCATION(instance);

        }
        {
        }



        return instance;
    }

    id       = NULL;
    StringLiteral4       = NULL;

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1475:2: ( 'instance' ( 'machine' | 'statemachine' )? LT_ ( 'model:' )? mm= instance_machine_model ( COMMA def_instance_count[ initialCount , maximalCount ] )? GT id= ID ( StringLiteral )? ( LPAREN ( def_instance_on_new_activity[ $instance ] )? RPAREN )? ( SEMI | LCURLY (s= statement )* ( def_instance_activity[ $instance ] )* RCURLY ) )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1475:4: 'instance' ( 'machine' | 'statemachine' )? LT_ ( 'model:' )? mm= instance_machine_model ( COMMA def_instance_count[ initialCount , maximalCount ] )? GT id= ID ( StringLiteral )? ( LPAREN ( def_instance_on_new_activity[ $instance ] )? RPAREN )? ( SEMI | LCURLY (s= statement )* ( def_instance_activity[ $instance ] )* RCURLY )
        {
             MATCHT(307, &FOLLOW_307_in_decl_instance3421);
            if  (HASEXCEPTION())
            {
                goto ruledecl_instanceEx;
            }
            if (HASFAILED())
            {
                return instance;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1475:16: ( 'machine' | 'statemachine' )?
            {
                int alt87=2;
                switch ( LA(1) )
                {
                    case 317:
                    case 379:
                    	{
                    		alt87=1;
                    	}
                        break;
                }

                switch (alt87)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:
            	    {
            	        if ( LA(1) == 317 || LA(1) == 379 )
            	        {
            	            CONSUME();
            	            PERRORRECOVERY=ANTLR3_FALSE;
            	            FAILEDFLAG=ANTLR3_FALSE;

            	        }
            	        else
            	        {
            	            if (BACKTRACKING>0)
            	            {
            	                FAILEDFLAG = ANTLR3_TRUE;
            	                return instance;
            	            }

            	            CONSTRUCTEX();
            	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
            	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
            	            EXCEPTION->expectingSet = NULL;

            	            goto ruledecl_instanceEx;
            	        }


            	    }
            	    break;

                }
            }

             MATCHT(LT_, &FOLLOW_LT__in_decl_instance3438);
            if  (HASEXCEPTION())
            {
                goto ruledecl_instanceEx;
            }
            if (HASFAILED())
            {
                return instance;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1477:5: ( 'model:' )?
            {
                int alt88=2;
                switch ( LA(1) )
                {
                    case 323:
                    	{
                    		alt88=1;
                    	}
                        break;
                }

                switch (alt88)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1477:7: 'model:'
            	    {
            	         MATCHT(323, &FOLLOW_323_in_decl_instance3446);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledecl_instanceEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return instance;
            	        }


            	    }
            	    break;

                }
            }

            FOLLOWPUSH(FOLLOW_instance_machine_model_in_decl_instance3453);
            mm=instance_machine_model(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruledecl_instanceEx;
            }
            if (HASFAILED())
            {
                return instance;
            }


            if ( BACKTRACKING==0 )
            {
                 aModel = mm
                ; 
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1479:5: ( COMMA def_instance_count[ initialCount , maximalCount ] )?
            {
                int alt89=2;
                switch ( LA(1) )
                {
                    case COMMA:
                    	{
                    		alt89=1;
                    	}
                        break;
                }

                switch (alt89)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1479:7: COMMA def_instance_count[ initialCount , maximalCount ]
            	    {
            	         MATCHT(COMMA, &FOLLOW_COMMA_in_decl_instance3465);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledecl_instanceEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return instance;
            	        }


            	        FOLLOWPUSH(FOLLOW_def_instance_count_in_decl_instance3468);
            	        def_instance_count(ctx, initialCount, maximalCount);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledecl_instanceEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return instance;
            	        }


            	    }
            	    break;

                }
            }

             MATCHT(GT, &FOLLOW_GT_in_decl_instance3477);
            if  (HASEXCEPTION())
            {
                goto ruledecl_instanceEx;
            }
            if (HASFAILED())
            {
                return instance;
            }


            id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_decl_instance3482);
            if  (HASEXCEPTION())
            {
                goto ruledecl_instanceEx;
            }
            if (HASFAILED())
            {
                return instance;
            }


            if ( BACKTRACKING==0 )
            {

                	  	if( aModel.is< sep::Machine >() )
                	  	{
                	  		PUSH_CTX_NEW( aModel.to_ptr< sep::Machine >() );
                	  	}

                	  	instance= sep::Machine::newInstance(container,
                	  			STR((id->getText(id))->chars), aModel, initialCount, maximalCount);


                		instance
                ->getwModifier().override_ifdef( mdfr );

                		instance
                ->getwSpecifier().override_ifdef(
                				spcfr.isDesignInstanceDynamic() ?
                						spcfr : spcfr.setDesignInstanceStatic() );

                	  	container->saveOwnedElement( instance
                 );
                	  
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1499:4: ( StringLiteral )?
            {
                int alt90=2;
                switch ( LA(1) )
                {
                    case StringLiteral:
                    	{
                    		alt90=1;
                    	}
                        break;
                }

                switch (alt90)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1499:6: StringLiteral
            	    {
            	        StringLiteral4 = (pANTLR3_COMMON_TOKEN) MATCHT(StringLiteral, &FOLLOW_StringLiteral_in_decl_instance3495);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledecl_instanceEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return instance;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             instance
            	            ->setUnrestrictedName(STR((StringLiteral4->getText(StringLiteral4))->chars)); 
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1508:4: ( LPAREN ( def_instance_on_new_activity[ $instance ] )? RPAREN )?
            {
                int alt92=2;
                switch ( LA(1) )
                {
                    case LPAREN:
                    	{
                    		alt92=1;
                    	}
                        break;
                }

                switch (alt92)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1508:6: LPAREN ( def_instance_on_new_activity[ $instance ] )? RPAREN
            	    {
            	         MATCHT(LPAREN, &FOLLOW_LPAREN_in_decl_instance3515);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledecl_instanceEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return instance;
            	        }


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1509:6: ( def_instance_on_new_activity[ $instance ] )?
            	        {
            	            int alt91=2;
            	            switch ( LA(1) )
            	            {
            	                case BNOT:
            	                case COLONx2:
            	                case CharLiteral:
            	                case DECR:
            	                case DOLLAR_LCURLY:
            	                case FloatLiteral:
            	                case ID:
            	                case INCR:
            	                case IntegerLiteral:
            	                case LBRACKET:
            	                case LBRACKET_BAR:
            	                case LCURLY:
            	                case LNOT:
            	                case LPAREN:
            	                case LPAREN_INVOKE:
            	                case MINUS:
            	                case OP_POP:
            	                case OP_TOP:
            	                case PERCENT_LCURLY:
            	                case PLUS:
            	                case RationalLiteral:
            	                case StringLiteral:
            	                case 158:
            	                case 159:
            	                case 160:
            	                case 161:
            	                case 162:
            	                case 237:
            	                case 256:
            	                case 265:
            	                case 277:
            	                case 280:
            	                case 294:
            	                case 313:
            	                case 330:
            	                case 331:
            	                case 332:
            	                case 343:
            	                case 347:
            	                case 372:
            	                case 397:
            	                	{
            	                		alt91=1;
            	                	}
            	                    break;
            	            }

            	            switch (alt91)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1509:8: def_instance_on_new_activity[ $instance ]
            	        	    {
            	        	        FOLLOWPUSH(FOLLOW_def_instance_on_new_activity_in_decl_instance3524);
            	        	        def_instance_on_new_activity(ctx, 
            	        	        instance
            	        	        );

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledecl_instanceEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return instance;
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	         MATCHT(RPAREN, &FOLLOW_RPAREN_in_decl_instance3536);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledecl_instanceEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return instance;
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1513:4: ( SEMI | LCURLY (s= statement )* ( def_instance_activity[ $instance ] )* RCURLY )
            {
                int alt95=2;
                switch ( LA(1) )
                {
                case SEMI:
                	{
                		alt95=1;
                	}
                    break;
                case LCURLY:
                	{
                		alt95=2;
                	}
                    break;

                default:
                    if (BACKTRACKING>0)
                    {
                        FAILEDFLAG = ANTLR3_TRUE;
                        return instance;
                    }

                    CONSTRUCTEX();
                    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                    EXCEPTION->message      = (void *)"";
                    EXCEPTION->decisionNum  = 95;
                    EXCEPTION->state        = 0;


                    goto ruledecl_instanceEx;

                }

                switch (alt95)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1513:6: SEMI
            	    {
            	         MATCHT(SEMI, &FOLLOW_SEMI_in_decl_instance3550);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledecl_instanceEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return instance;
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1515:6: LCURLY (s= statement )* ( def_instance_activity[ $instance ] )* RCURLY
            	    {
            	         MATCHT(LCURLY, &FOLLOW_LCURLY_in_decl_instance3558);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledecl_instanceEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return instance;
            	        }


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1516:3: (s= statement )*

            	        for (;;)
            	        {
            	            int alt93=2;
            	            switch ( LA(1) )
            	            {
            	            case COLONx2:
            	            case DECR:
            	            case DOLLAR_LCURLY:
            	            case ID:
            	            case INCR:
            	            case LCURLY:
            	            case LPAREN_INVOKE:
            	            case STATEMENT_PROMPT:
            	            case 154:
            	            case 155:
            	            case 156:
            	            case 157:
            	            case 236:
            	            case 247:
            	            case 250:
            	            case 256:
            	            case 263:
            	            case 267:
            	            case 268:
            	            case 269:
            	            case 275:
            	            case 278:
            	            case 279:
            	            case 282:
            	            case 285:
            	            case 289:
            	            case 290:
            	            case 291:
            	            case 292:
            	            case 293:
            	            case 294:
            	            case 296:
            	            case 299:
            	            case 300:
            	            case 301:
            	            case 302:
            	            case 303:
            	            case 304:
            	            case 305:
            	            case 312:
            	            case 330:
            	            case 336:
            	            case 337:
            	            case 338:
            	            case 339:
            	            case 340:
            	            case 341:
            	            case 362:
            	            case 363:
            	            case 364:
            	            case 368:
            	            case 369:
            	            case 371:
            	            case 377:
            	            case 385:
            	            case 386:
            	            case 389:
            	            case 391:
            	            case 415:
            	            case 416:
            	            	{
            	            		alt93=1;
            	            	}
            	                break;

            	            }

            	            switch (alt93)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1516:5: s= statement
            	        	    {
            	        	        FOLLOWPUSH(FOLLOW_statement_in_decl_instance3566);
            	        	        s=statement(ctx);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledecl_instanceEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return instance;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             instance->getUniqBehaviorPart()->seqOnCreate(s
            	        	            ); 
            	        	        }


            	        	    }
            	        	    break;

            	        	default:
            	        	    goto loop93;	/* break out of the loop */
            	        	    break;
            	            }
            	        }
            	        loop93: ; /* Jump out to here if this rule does not match */


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1518:3: ( def_instance_activity[ $instance ] )*

            	        for (;;)
            	        {
            	            int alt94=2;
            	            switch ( LA(1) )
            	            {
            	            case 177:
            	            case 226:
            	            	{
            	            		alt94=1;
            	            	}
            	                break;

            	            }

            	            switch (alt94)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1518:5: def_instance_activity[ $instance ]
            	        	    {
            	        	        FOLLOWPUSH(FOLLOW_def_instance_activity_in_decl_instance3578);
            	        	        def_instance_activity(ctx, 
            	        	        instance
            	        	        );

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledecl_instanceEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return instance;
            	        	        }


            	        	    }
            	        	    break;

            	        	default:
            	        	    goto loop94;	/* break out of the loop */
            	        	    break;
            	            }
            	        }
            	        loop94: ; /* Jump out to here if this rule does not match */


            	         MATCHT(RCURLY, &FOLLOW_RCURLY_in_decl_instance3589);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledecl_instanceEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return instance;
            	        }


            	    }
            	    break;

                }
            }

        }

    }

    // This is where rules clean up and exit
    //
    goto ruledecl_instanceEx; /* Prevent compiler warnings */
    ruledecl_instanceEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
            else
            {
                {

                    	if( aModel.is< sep::Machine >() )
                    	{
                    		POP_CTX;
                    	}
                    	SET_RULE_LOCATION(instance);

                }
            }


    if ( BACKTRACKING>0 ) { MEMOIZE(40, decl_instance_StartIndex); }

    return instance;
}
/* $ANTLR end decl_instance */

/**
 * $ANTLR start def_instance_on_new_activity
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1524:1: def_instance_on_new_activity[ sep::Machine * instance ] : def_instance_on_new_activity_parameter[ $instance , position++ ] ( COMMA def_instance_on_new_activity_parameter[ $instance , position++ ] )* ;
 */
static void
def_instance_on_new_activity(pfmlParser ctx, sep::Machine * instance)
{
    ANTLR3_UINT32 def_instance_on_new_activity_StartIndex;

    /* Initialize rule variables
     */
    def_instance_on_new_activity_StartIndex = INDEX();



    	sep::avm_size_t position = 0;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(41)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1528:2: ( def_instance_on_new_activity_parameter[ $instance , position++ ] ( COMMA def_instance_on_new_activity_parameter[ $instance , position++ ] )* )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1528:4: def_instance_on_new_activity_parameter[ $instance , position++ ] ( COMMA def_instance_on_new_activity_parameter[ $instance , position++ ] )*
        {
            FOLLOWPUSH(FOLLOW_def_instance_on_new_activity_parameter_in_def_instance_on_new_activity3612);
            def_instance_on_new_activity_parameter(ctx, instance, position++);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruledef_instance_on_new_activityEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1529:7: ( COMMA def_instance_on_new_activity_parameter[ $instance , position++ ] )*

            for (;;)
            {
                int alt96=2;
                switch ( LA(1) )
                {
                case COMMA:
                	{
                		alt96=1;
                	}
                    break;

                }

                switch (alt96)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1529:9: COMMA def_instance_on_new_activity_parameter[ $instance , position++ ]
            	    {
            	         MATCHT(COMMA, &FOLLOW_COMMA_in_def_instance_on_new_activity3623);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_instance_on_new_activityEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        FOLLOWPUSH(FOLLOW_def_instance_on_new_activity_parameter_in_def_instance_on_new_activity3625);
            	        def_instance_on_new_activity_parameter(ctx, instance, position++);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_instance_on_new_activityEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

            	default:
            	    goto loop96;	/* break out of the loop */
            	    break;
                }
            }
            loop96: ; /* Jump out to here if this rule does not match */


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_instance_on_new_activityEx; /* Prevent compiler warnings */
    ruledef_instance_on_new_activityEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(41, def_instance_on_new_activity_StartIndex); }

    return ;
}
/* $ANTLR end def_instance_on_new_activity */

/**
 * $ANTLR start def_instance_on_new_activity_parameter
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1532:1: def_instance_on_new_activity_parameter[ sep::Machine * instance , sep::avm_size_t position ] : ( ( lvalue op_assign_param )=>lv= lvalue oap= op_assign_param e= expression |e= expression );
 */
static void
def_instance_on_new_activity_parameter(pfmlParser ctx, sep::Machine * instance, sep::avm_size_t position)
{
    ANTLR3_UINT32 def_instance_on_new_activity_parameter_StartIndex;

    sep::BF lv;
    #undef	RETURN_TYPE_lv
    #define	RETURN_TYPE_lv sep::BF

    sep::Operator * oap;
    #undef	RETURN_TYPE_oap
    #define	RETURN_TYPE_oap sep::Operator *

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    /* Initialize rule variables
     */
    def_instance_on_new_activity_parameter_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(42)) )
    {
        {
        }



        return ;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1534:2: ( ( lvalue op_assign_param )=>lv= lvalue oap= op_assign_param e= expression |e= expression )

            ANTLR3_UINT32 alt97;

            alt97=2;

            switch ( LA(1) )
            {
            case COLONx2:
            	{
            		{
            		    int LA97_1 = LA(2);
            		    if ( (synpred170_fml(ctx)))
            		    {
            		        alt97=1;
            		    }
            		    else if ( (ANTLR3_TRUE))
            		    {
            		        alt97=2;
            		    }
            		    else
            		    {
            		        if (BACKTRACKING>0)
            		        {
            		            FAILEDFLAG = ANTLR3_TRUE;
            		            return ;
            		        }


            		        CONSTRUCTEX();
            		        EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
            		        EXCEPTION->message      = (void *)"";
            		        EXCEPTION->decisionNum  = 97;
            		        EXCEPTION->state        = 1;


            		        goto ruledef_instance_on_new_activity_parameterEx;

            		    }
            		}
            	}
                break;
            case ID:
            	{
            		{
            		    int LA97_2 = LA(2);
            		    if ( (synpred170_fml(ctx)))
            		    {
            		        alt97=1;
            		    }
            		    else if ( (ANTLR3_TRUE))
            		    {
            		        alt97=2;
            		    }
            		    else
            		    {
            		        if (BACKTRACKING>0)
            		        {
            		            FAILEDFLAG = ANTLR3_TRUE;
            		            return ;
            		        }


            		        CONSTRUCTEX();
            		        EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
            		        EXCEPTION->message      = (void *)"";
            		        EXCEPTION->decisionNum  = 97;
            		        EXCEPTION->state        = 2;


            		        goto ruledef_instance_on_new_activity_parameterEx;

            		    }
            		}
            	}
                break;
            case BNOT:
            case CharLiteral:
            case DECR:
            case DOLLAR_LCURLY:
            case FloatLiteral:
            case INCR:
            case IntegerLiteral:
            case LBRACKET:
            case LBRACKET_BAR:
            case LCURLY:
            case LNOT:
            case LPAREN:
            case LPAREN_INVOKE:
            case MINUS:
            case OP_POP:
            case OP_TOP:
            case PERCENT_LCURLY:
            case PLUS:
            case RationalLiteral:
            case StringLiteral:
            case 158:
            case 159:
            case 160:
            case 161:
            case 162:
            case 237:
            case 256:
            case 265:
            case 277:
            case 280:
            case 294:
            case 313:
            case 330:
            case 331:
            case 332:
            case 343:
            case 347:
            case 372:
            case 397:
            	{
            		alt97=2;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 97;
                EXCEPTION->state        = 0;


                goto ruledef_instance_on_new_activity_parameterEx;

            }

            switch (alt97)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1534:4: ( lvalue op_assign_param )=>lv= lvalue oap= op_assign_param e= expression
        	    {
        	        FOLLOWPUSH(FOLLOW_lvalue_in_def_instance_on_new_activity_parameter3659);
        	        lv=lvalue(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_instance_on_new_activity_parameterEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_op_assign_param_in_def_instance_on_new_activity_parameter3664);
        	        oap=op_assign_param(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_instance_on_new_activity_parameterEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_expression_in_def_instance_on_new_activity_parameter3669);
        	        e=expression(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_instance_on_new_activity_parameterEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             instance->getUniqBehaviorPart()->seqOnCreate( NEW_STMT2(oap
        	            , lv
        	            , e
        	            ) ); 
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1538:4: e= expression
        	    {
        	        FOLLOWPUSH(FOLLOW_expression_in_def_instance_on_new_activity_parameter3682);
        	        e=expression(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_instance_on_new_activity_parameterEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {

        	            	  	sep::ParserUtil::appendInstanceDynamicPositionalParameter(
        	            	  			instance, e
        	            , position);
        	            	  
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruledef_instance_on_new_activity_parameterEx; /* Prevent compiler warnings */
    ruledef_instance_on_new_activity_parameterEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(42, def_instance_on_new_activity_parameter_StartIndex); }

    return ;
}
/* $ANTLR end def_instance_on_new_activity_parameter */

/**
 * $ANTLR start op_assign_param
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1545:1: op_assign_param returns [ sep::Operator * op ] : ( ( ASSIGN | COLON ) | ASSIGN_REF | ASSIGN_MACRO );
 */
static sep::Operator *
op_assign_param(pfmlParser ctx)
{
    sep::Operator * op;

    ANTLR3_UINT32 op_assign_param_StartIndex;

    /* Initialize rule variables
     */
    op_assign_param_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(43)) )
    {
        {
        }



        return op;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1547:2: ( ( ASSIGN | COLON ) | ASSIGN_REF | ASSIGN_MACRO )

            ANTLR3_UINT32 alt98;

            alt98=3;

            switch ( LA(1) )
            {
            case ASSIGN:
            case COLON:
            	{
            		alt98=1;
            	}
                break;
            case ASSIGN_REF:
            	{
            		alt98=2;
            	}
                break;
            case ASSIGN_MACRO:
            	{
            		alt98=3;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return op;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 98;
                EXCEPTION->state        = 0;


                goto ruleop_assign_paramEx;

            }

            switch (alt98)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1547:4: ( ASSIGN | COLON )
        	    {
        	        if ( LA(1) == ASSIGN || LA(1) == COLON )
        	        {
        	            CONSUME();
        	            PERRORRECOVERY=ANTLR3_FALSE;
        	            FAILEDFLAG=ANTLR3_FALSE;

        	        }
        	        else
        	        {
        	            if (BACKTRACKING>0)
        	            {
        	                FAILEDFLAG = ANTLR3_TRUE;
        	                return op;
        	            }

        	            CONSTRUCTEX();
        	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
        	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
        	            EXCEPTION->expectingSet = NULL;

        	            goto ruleop_assign_paramEx;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(ASSIGN);
        	                   
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1548:4: ASSIGN_REF
        	    {
        	         MATCHT(ASSIGN_REF, &FOLLOW_ASSIGN_REF_in_op_assign_param3718);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_assign_paramEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(ASSIGN_REF);
        	               
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1549:4: ASSIGN_MACRO
        	    {
        	         MATCHT(ASSIGN_MACRO, &FOLLOW_ASSIGN_MACRO_in_op_assign_param3734);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_assign_paramEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(ASSIGN_MACRO);
        	             
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruleop_assign_paramEx; /* Prevent compiler warnings */
    ruleop_assign_paramEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(43, op_assign_param_StartIndex); }

    return op;
}
/* $ANTLR end op_assign_param */

/**
 * $ANTLR start def_instance_activity
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1553:1: def_instance_activity[ sep::Machine * instance ] : ( '@create' bs= block_statement | '@start' bs= block_statement );
 */
static void
def_instance_activity(pfmlParser ctx, sep::Machine * instance)
{
    ANTLR3_UINT32 def_instance_activity_StartIndex;

    sep::BFCode bs;
    #undef	RETURN_TYPE_bs
    #define	RETURN_TYPE_bs sep::BFCode

    /* Initialize rule variables
     */
    def_instance_activity_StartIndex = INDEX();



    	sep::BehavioralPart * theBehavior = instance->getUniqBehaviorPart();

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(44)) )
    {
        {
        }



        return ;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1557:2: ( '@create' bs= block_statement | '@start' bs= block_statement )

            ANTLR3_UINT32 alt99;

            alt99=2;

            switch ( LA(1) )
            {
            case 177:
            	{
            		alt99=1;
            	}
                break;
            case 226:
            	{
            		alt99=2;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 99;
                EXCEPTION->state        = 0;


                goto ruledef_instance_activityEx;

            }

            switch (alt99)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1557:4: '@create' bs= block_statement
        	    {
        	         MATCHT(177, &FOLLOW_177_in_def_instance_activity3761);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_instance_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_block_statement_in_def_instance_activity3767);
        	        bs=block_statement(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_instance_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             theBehavior->seqOnCreate(bs
        	            ); 
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1558:4: '@start' bs= block_statement
        	    {
        	         MATCHT(226, &FOLLOW_226_in_def_instance_activity3775);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_instance_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_block_statement_in_def_instance_activity3783);
        	        bs=block_statement(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_instance_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             theBehavior->seqOnStart(bs
        	            );   
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruledef_instance_activityEx; /* Prevent compiler warnings */
    ruledef_instance_activityEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(44, def_instance_activity_StartIndex); }

    return ;
}
/* $ANTLR end def_instance_activity */

/**
 * $ANTLR start section_behavior
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1583:1: section_behavior[ sep::Machine * container ] : '@behavior:' (m= executable_machine[ container ] )+ ;
 */
static void
section_behavior(pfmlParser ctx, sep::Machine * container)
{
    ANTLR3_UINT32 section_behavior_StartIndex;

    sep::Machine * m;
    #undef	RETURN_TYPE_m
    #define	RETURN_TYPE_m sep::Machine *

    /* Initialize rule variables
     */
    section_behavior_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(45)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1584:2: ( '@behavior:' (m= executable_machine[ container ] )+ )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1584:4: '@behavior:' (m= executable_machine[ container ] )+
        {
             MATCHT(171, &FOLLOW_171_in_section_behavior3805);
            if  (HASEXCEPTION())
            {
                goto rulesection_behaviorEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1585:4: (m= executable_machine[ container ] )+
            {
                int cnt100=0;

                for (;;)
                {
                    int alt100=2;
            	switch ( LA(1) )
            	{
            	case 144:
            	case 145:
            	case 147:
            	case 148:
            	case 149:
            	case 150:
            	case 153:
            	case 272:
            	case 306:
            	case 307:
            	case 314:
            	case 317:
            	case 322:
            	case 353:
            	case 378:
            	case 379:
            	case 393:
            	case 406:
            		{
            			alt100=1;
            		}
            	    break;

            	}

            	switch (alt100)
            	{
            	    case 1:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1585:6: m= executable_machine[ container ]
            	        {
            	            FOLLOWPUSH(FOLLOW_executable_machine_in_section_behavior3814);
            	            m=executable_machine(ctx, container);

            	            FOLLOWPOP();
            	            if  (HASEXCEPTION())
            	            {
            	                goto rulesection_behaviorEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return ;
            	            }


            	        }
            	        break;

            	    default:

            		if ( cnt100 >= 1 )
            		{
            		    goto loop100;
            		}
            		if (BACKTRACKING>0)
            		{
            		    FAILEDFLAG = ANTLR3_TRUE;
            		    return ;
            		}

            		/* mismatchedSetEx()
            		 */
            		CONSTRUCTEX();
            		EXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
            		EXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;


            		goto rulesection_behaviorEx;
            	}
            	cnt100++;
                }
                loop100: ;	/* Jump to here if this rule does not match */
            }

        }

    }

    // This is where rules clean up and exit
    //
    goto rulesection_behaviorEx; /* Prevent compiler warnings */
    rulesection_behaviorEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(45, section_behavior_StartIndex); }

    return ;
}
/* $ANTLR end section_behavior */

/**
 * $ANTLR start def_instance_count
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1593:1: def_instance_count[ sep::avm_size_t & initial , sep::avm_size_t & maximal ] : ( 'multiplicity:' | 'instance:' )? ( LBRACKET (n= integer_constant COMMA (n= integer_constant | ( STAR | PLUS ) ) | STAR | PLUS ) RBRACKET | LPAREN def_instance_count_atom[ $initial , $maximal ] ( ( COMMA )? def_instance_count_atom[ $initial , $maximal ] )* RPAREN ) ;
 */
static void
def_instance_count(pfmlParser ctx, sep::avm_size_t & initial, sep::avm_size_t & maximal)
{
    ANTLR3_UINT32 def_instance_count_StartIndex;

    sep::avm_size_t n;
    #undef	RETURN_TYPE_n
    #define	RETURN_TYPE_n sep::avm_size_t

    /* Initialize rule variables
     */
    def_instance_count_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(46)) )
    {
        {

            	if( maximal < initial )
            	{
            		maximal= initial;
            	}

        }
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1601:2: ( ( 'multiplicity:' | 'instance:' )? ( LBRACKET (n= integer_constant COMMA (n= integer_constant | ( STAR | PLUS ) ) | STAR | PLUS ) RBRACKET | LPAREN def_instance_count_atom[ $initial , $maximal ] ( ( COMMA )? def_instance_count_atom[ $initial , $maximal ] )* RPAREN ) )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1601:4: ( 'multiplicity:' | 'instance:' )? ( LBRACKET (n= integer_constant COMMA (n= integer_constant | ( STAR | PLUS ) ) | STAR | PLUS ) RBRACKET | LPAREN def_instance_count_atom[ $initial , $maximal ] ( ( COMMA )? def_instance_count_atom[ $initial , $maximal ] )* RPAREN )
        {
            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1601:4: ( 'multiplicity:' | 'instance:' )?
            {
                int alt101=2;
                switch ( LA(1) )
                {
                    case 308:
                    case 327:
                    	{
                    		alt101=1;
                    	}
                        break;
                }

                switch (alt101)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:
            	    {
            	        if ( LA(1) == 308 || LA(1) == 327 )
            	        {
            	            CONSUME();
            	            PERRORRECOVERY=ANTLR3_FALSE;
            	            FAILEDFLAG=ANTLR3_FALSE;

            	        }
            	        else
            	        {
            	            if (BACKTRACKING>0)
            	            {
            	                FAILEDFLAG = ANTLR3_TRUE;
            	                return ;
            	            }

            	            CONSTRUCTEX();
            	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
            	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
            	            EXCEPTION->expectingSet = NULL;

            	            goto ruledef_instance_countEx;
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1602:4: ( LBRACKET (n= integer_constant COMMA (n= integer_constant | ( STAR | PLUS ) ) | STAR | PLUS ) RBRACKET | LPAREN def_instance_count_atom[ $initial , $maximal ] ( ( COMMA )? def_instance_count_atom[ $initial , $maximal ] )* RPAREN )
            {
                int alt106=2;
                switch ( LA(1) )
                {
                case LBRACKET:
                	{
                		alt106=1;
                	}
                    break;
                case LPAREN:
                	{
                		alt106=2;
                	}
                    break;

                default:
                    if (BACKTRACKING>0)
                    {
                        FAILEDFLAG = ANTLR3_TRUE;
                        return ;
                    }

                    CONSTRUCTEX();
                    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                    EXCEPTION->message      = (void *)"";
                    EXCEPTION->decisionNum  = 106;
                    EXCEPTION->state        = 0;


                    goto ruledef_instance_countEx;

                }

                switch (alt106)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1602:6: LBRACKET (n= integer_constant COMMA (n= integer_constant | ( STAR | PLUS ) ) | STAR | PLUS ) RBRACKET
            	    {
            	         MATCHT(LBRACKET, &FOLLOW_LBRACKET_in_def_instance_count3857);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_instance_countEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1603:6: (n= integer_constant COMMA (n= integer_constant | ( STAR | PLUS ) ) | STAR | PLUS )
            	        {
            	            int alt103=3;
            	            switch ( LA(1) )
            	            {
            	            case ID:
            	            case IntegerLiteral:
            	            	{
            	            		alt103=1;
            	            	}
            	                break;
            	            case STAR:
            	            	{
            	            		alt103=2;
            	            	}
            	                break;
            	            case PLUS:
            	            	{
            	            		alt103=3;
            	            	}
            	                break;

            	            default:
            	                if (BACKTRACKING>0)
            	                {
            	                    FAILEDFLAG = ANTLR3_TRUE;
            	                    return ;
            	                }

            	                CONSTRUCTEX();
            	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
            	                EXCEPTION->message      = (void *)"";
            	                EXCEPTION->decisionNum  = 103;
            	                EXCEPTION->state        = 0;


            	                goto ruledef_instance_countEx;

            	            }

            	            switch (alt103)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1603:8: n= integer_constant COMMA (n= integer_constant | ( STAR | PLUS ) )
            	        	    {
            	        	        FOLLOWPUSH(FOLLOW_integer_constant_in_def_instance_count3868);
            	        	        n=integer_constant(ctx);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledef_instance_countEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             initial= 
            	        	            n
            	        	            ; 
            	        	        }


            	        	         MATCHT(COMMA, &FOLLOW_COMMA_in_def_instance_count3880);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledef_instance_countEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1605:8: (n= integer_constant | ( STAR | PLUS ) )
            	        	        {
            	        	            int alt102=2;
            	        	            switch ( LA(1) )
            	        	            {
            	        	            case ID:
            	        	            case IntegerLiteral:
            	        	            	{
            	        	            		alt102=1;
            	        	            	}
            	        	                break;
            	        	            case PLUS:
            	        	            case STAR:
            	        	            	{
            	        	            		alt102=2;
            	        	            	}
            	        	                break;

            	        	            default:
            	        	                if (BACKTRACKING>0)
            	        	                {
            	        	                    FAILEDFLAG = ANTLR3_TRUE;
            	        	                    return ;
            	        	                }

            	        	                CONSTRUCTEX();
            	        	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
            	        	                EXCEPTION->message      = (void *)"";
            	        	                EXCEPTION->decisionNum  = 102;
            	        	                EXCEPTION->state        = 0;


            	        	                goto ruledef_instance_countEx;

            	        	            }

            	        	            switch (alt102)
            	        	            {
            	        	        	case 1:
            	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1605:10: n= integer_constant
            	        	        	    {
            	        	        	        FOLLOWPUSH(FOLLOW_integer_constant_in_def_instance_count3893);
            	        	        	        n=integer_constant(ctx);

            	        	        	        FOLLOWPOP();
            	        	        	        if  (HASEXCEPTION())
            	        	        	        {
            	        	        	            goto ruledef_instance_countEx;
            	        	        	        }
            	        	        	        if (HASFAILED())
            	        	        	        {
            	        	        	            return ;
            	        	        	        }


            	        	        	        if ( BACKTRACKING==0 )
            	        	        	        {
            	        	        	             maximal= 
            	        	        	            n
            	        	        	            ; 
            	        	        	        }


            	        	        	    }
            	        	        	    break;
            	        	        	case 2:
            	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1606:10: ( STAR | PLUS )
            	        	        	    {
            	        	        	        if ( LA(1) == PLUS || LA(1) == STAR )
            	        	        	        {
            	        	        	            CONSUME();
            	        	        	            PERRORRECOVERY=ANTLR3_FALSE;
            	        	        	            FAILEDFLAG=ANTLR3_FALSE;

            	        	        	        }
            	        	        	        else
            	        	        	        {
            	        	        	            if (BACKTRACKING>0)
            	        	        	            {
            	        	        	                FAILEDFLAG = ANTLR3_TRUE;
            	        	        	                return ;
            	        	        	            }

            	        	        	            CONSTRUCTEX();
            	        	        	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
            	        	        	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
            	        	        	            EXCEPTION->expectingSet = NULL;

            	        	        	            goto ruledef_instance_countEx;
            	        	        	        }


            	        	        	        if ( BACKTRACKING==0 )
            	        	        	        {
            	        	        	             maximal= AVM_NUMERIC_MAX_SIZE_T; 
            	        	        	        }


            	        	        	    }
            	        	        	    break;

            	        	            }
            	        	        }

            	        	    }
            	        	    break;
            	        	case 2:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1608:8: STAR
            	        	    {
            	        	         MATCHT(STAR, &FOLLOW_STAR_in_def_instance_count3939);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledef_instance_countEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             initial= 0; maximal= AVM_NUMERIC_MAX_SIZE_T; 
            	        	        }


            	        	    }
            	        	    break;
            	        	case 3:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1609:8: PLUS
            	        	    {
            	        	         MATCHT(PLUS, &FOLLOW_PLUS_in_def_instance_count3951);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledef_instance_countEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             initial= 1; maximal= AVM_NUMERIC_MAX_SIZE_T; 
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	         MATCHT(RBRACKET, &FOLLOW_RBRACKET_in_def_instance_count3968);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_instance_countEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1613:6: LPAREN def_instance_count_atom[ $initial , $maximal ] ( ( COMMA )? def_instance_count_atom[ $initial , $maximal ] )* RPAREN
            	    {
            	         MATCHT(LPAREN, &FOLLOW_LPAREN_in_def_instance_count3976);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_instance_countEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        FOLLOWPUSH(FOLLOW_def_instance_count_atom_in_def_instance_count3983);
            	        def_instance_count_atom(ctx, initial, maximal);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_instance_countEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1615:6: ( ( COMMA )? def_instance_count_atom[ $initial , $maximal ] )*

            	        for (;;)
            	        {
            	            int alt105=2;
            	            switch ( LA(1) )
            	            {
            	            case COMMA:
            	            case 297:
            	            case 319:
            	            	{
            	            		alt105=1;
            	            	}
            	                break;

            	            }

            	            switch (alt105)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1615:8: ( COMMA )? def_instance_count_atom[ $initial , $maximal ]
            	        	    {
            	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1615:8: ( COMMA )?
            	        	        {
            	        	            int alt104=2;
            	        	            switch ( LA(1) )
            	        	            {
            	        	                case COMMA:
            	        	                	{
            	        	                		alt104=1;
            	        	                	}
            	        	                    break;
            	        	            }

            	        	            switch (alt104)
            	        	            {
            	        	        	case 1:
            	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1615:8: COMMA
            	        	        	    {
            	        	        	         MATCHT(COMMA, &FOLLOW_COMMA_in_def_instance_count3993);
            	        	        	        if  (HASEXCEPTION())
            	        	        	        {
            	        	        	            goto ruledef_instance_countEx;
            	        	        	        }
            	        	        	        if (HASFAILED())
            	        	        	        {
            	        	        	            return ;
            	        	        	        }


            	        	        	    }
            	        	        	    break;

            	        	            }
            	        	        }

            	        	        FOLLOWPUSH(FOLLOW_def_instance_count_atom_in_def_instance_count3998);
            	        	        def_instance_count_atom(ctx, initial, maximal);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledef_instance_countEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	    }
            	        	    break;

            	        	default:
            	        	    goto loop105;	/* break out of the loop */
            	        	    break;
            	            }
            	        }
            	        loop105: ; /* Jump out to here if this rule does not match */


            	         MATCHT(RPAREN, &FOLLOW_RPAREN_in_def_instance_count4009);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_instance_countEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

                }
            }

        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_instance_countEx; /* Prevent compiler warnings */
    ruledef_instance_countEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
            else
            {
                {

                    	if( maximal < initial )
                    	{
                    		maximal= initial;
                    	}

                }
            }


    if ( BACKTRACKING>0 ) { MEMOIZE(46, def_instance_count_StartIndex); }

    return ;
}
/* $ANTLR end def_instance_count */

/**
 * $ANTLR start def_instance_count_atom
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1620:1: def_instance_count_atom[ sep::avm_size_t & initial , sep::avm_size_t & maximal ] : ( 'init:' n= integer_constant | 'max:' n= integer_constant );
 */
static void
def_instance_count_atom(pfmlParser ctx, sep::avm_size_t & initial, sep::avm_size_t & maximal)
{
    ANTLR3_UINT32 def_instance_count_atom_StartIndex;

    sep::avm_size_t n;
    #undef	RETURN_TYPE_n
    #define	RETURN_TYPE_n sep::avm_size_t

    /* Initialize rule variables
     */
    def_instance_count_atom_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(47)) )
    {
        {
        }



        return ;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1622:2: ( 'init:' n= integer_constant | 'max:' n= integer_constant )

            ANTLR3_UINT32 alt107;

            alt107=2;

            switch ( LA(1) )
            {
            case 297:
            	{
            		alt107=1;
            	}
                break;
            case 319:
            	{
            		alt107=2;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 107;
                EXCEPTION->state        = 0;


                goto ruledef_instance_count_atomEx;

            }

            switch (alt107)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1622:4: 'init:' n= integer_constant
        	    {
        	         MATCHT(297, &FOLLOW_297_in_def_instance_count_atom4028);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_instance_count_atomEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_integer_constant_in_def_instance_count_atom4032);
        	        n=integer_constant(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_instance_count_atomEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             initial= 
        	            n
        	            ; 
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1623:4: 'max:' n= integer_constant
        	    {
        	         MATCHT(319, &FOLLOW_319_in_def_instance_count_atom4040);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_instance_count_atomEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_integer_constant_in_def_instance_count_atom4045);
        	        n=integer_constant(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_instance_count_atomEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             maximal= 
        	            n
        	            ; 
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruledef_instance_count_atomEx; /* Prevent compiler warnings */
    ruledef_instance_count_atomEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(47, def_instance_count_atom_StartIndex); }

    return ;
}
/* $ANTLR end def_instance_count_atom */

/**
 * $ANTLR start def_machine
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1627:1: def_machine[ sep::Machine * container ,\n\t\tsep::Modifier mdfr , sep::Specifier spcfr ] returns [ sep::Machine * machine ] : 'machine' ( LT_ ( ( 'moc:' )? executable_specifier[ spcfr ] ( COMMA def_instance_count[ initialCount , maximalCount ] )? | def_instance_count[ initialCount , maximalCount ] )? GT )? id= ID ( StringLiteral )? ( def_machine_parameters[ machine ] )? ( def_machine_returns[ machine , sep::Modifier::PROPERTY_RETURN_PARAMETER_MODIFIER ] )? def_body_machine[ machine ] ;
 */
static sep::Machine *
def_machine(pfmlParser ctx, sep::Machine * container, sep::Modifier mdfr, sep::Specifier spcfr)
{
    sep::Machine * machine;

    ANTLR3_UINT32 def_machine_StartIndex;

    pANTLR3_COMMON_TOKEN    id;
    pANTLR3_COMMON_TOKEN    StringLiteral5;

    /* Initialize rule variables
     */
    def_machine_StartIndex = INDEX();



    	sep::avm_size_t initialCount = 1;
    	sep::avm_size_t maximalCount = AVM_NUMERIC_MAX_SIZE_T;

    	SAVE_RULE_BEGIN_LOCATION;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(48)) )
    {
        {

            	POP_CTX;

            	SET_RULE_LOCATION(machine);

        }
        {
        }



        return machine;
    }

    id       = NULL;
    StringLiteral5       = NULL;

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1642:2: ( 'machine' ( LT_ ( ( 'moc:' )? executable_specifier[ spcfr ] ( COMMA def_instance_count[ initialCount , maximalCount ] )? | def_instance_count[ initialCount , maximalCount ] )? GT )? id= ID ( StringLiteral )? ( def_machine_parameters[ machine ] )? ( def_machine_returns[ machine , sep::Modifier::PROPERTY_RETURN_PARAMETER_MODIFIER ] )? def_body_machine[ machine ] )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1642:4: 'machine' ( LT_ ( ( 'moc:' )? executable_specifier[ spcfr ] ( COMMA def_instance_count[ initialCount , maximalCount ] )? | def_instance_count[ initialCount , maximalCount ] )? GT )? id= ID ( StringLiteral )? ( def_machine_parameters[ machine ] )? ( def_machine_returns[ machine , sep::Modifier::PROPERTY_RETURN_PARAMETER_MODIFIER ] )? def_body_machine[ machine ]
        {
             MATCHT(317, &FOLLOW_317_in_def_machine4075);
            if  (HASEXCEPTION())
            {
                goto ruledef_machineEx;
            }
            if (HASFAILED())
            {
                return machine;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1643:4: ( LT_ ( ( 'moc:' )? executable_specifier[ spcfr ] ( COMMA def_instance_count[ initialCount , maximalCount ] )? | def_instance_count[ initialCount , maximalCount ] )? GT )?
            {
                int alt111=2;
                switch ( LA(1) )
                {
                    case LT_:
                    	{
                    		alt111=1;
                    	}
                        break;
                }

                switch (alt111)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1643:6: LT_ ( ( 'moc:' )? executable_specifier[ spcfr ] ( COMMA def_instance_count[ initialCount , maximalCount ] )? | def_instance_count[ initialCount , maximalCount ] )? GT
            	    {
            	         MATCHT(LT_, &FOLLOW_LT__in_def_machine4082);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_machineEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return machine;
            	        }


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1644:5: ( ( 'moc:' )? executable_specifier[ spcfr ] ( COMMA def_instance_count[ initialCount , maximalCount ] )? | def_instance_count[ initialCount , maximalCount ] )?
            	        {
            	            int alt110=3;
            	            switch ( LA(1) )
            	            {
            	                case ID:
            	                case 151:
            	                case 152:
            	                case 239:
            	                case 257:
            	                case 282:
            	                case 284:
            	                case 286:
            	                case 312:
            	                case 321:
            	                case 334:
            	                case 364:
            	                case 377:
            	                	{
            	                		alt110=1;
            	                	}
            	                    break;
            	                case LBRACKET:
            	                case LPAREN:
            	                case 308:
            	                case 327:
            	                	{
            	                		alt110=2;
            	                	}
            	                    break;
            	            }

            	            switch (alt110)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1644:7: ( 'moc:' )? executable_specifier[ spcfr ] ( COMMA def_instance_count[ initialCount , maximalCount ] )?
            	        	    {
            	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1644:7: ( 'moc:' )?
            	        	        {
            	        	            int alt108=2;
            	        	            switch ( LA(1) )
            	        	            {
            	        	                case 321:
            	        	                	{
            	        	                		alt108=1;
            	        	                	}
            	        	                    break;
            	        	            }

            	        	            switch (alt108)
            	        	            {
            	        	        	case 1:
            	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1644:9: 'moc:'
            	        	        	    {
            	        	        	         MATCHT(321, &FOLLOW_321_in_def_machine4092);
            	        	        	        if  (HASEXCEPTION())
            	        	        	        {
            	        	        	            goto ruledef_machineEx;
            	        	        	        }
            	        	        	        if (HASFAILED())
            	        	        	        {
            	        	        	            return machine;
            	        	        	        }


            	        	        	    }
            	        	        	    break;

            	        	            }
            	        	        }

            	        	        FOLLOWPUSH(FOLLOW_executable_specifier_in_def_machine4098);
            	        	        executable_specifier(ctx, spcfr);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledef_machineEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return machine;
            	        	        }


            	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1645:6: ( COMMA def_instance_count[ initialCount , maximalCount ] )?
            	        	        {
            	        	            int alt109=2;
            	        	            switch ( LA(1) )
            	        	            {
            	        	                case COMMA:
            	        	                	{
            	        	                		alt109=1;
            	        	                	}
            	        	                    break;
            	        	            }

            	        	            switch (alt109)
            	        	            {
            	        	        	case 1:
            	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1645:8: COMMA def_instance_count[ initialCount , maximalCount ]
            	        	        	    {
            	        	        	         MATCHT(COMMA, &FOLLOW_COMMA_in_def_machine4108);
            	        	        	        if  (HASEXCEPTION())
            	        	        	        {
            	        	        	            goto ruledef_machineEx;
            	        	        	        }
            	        	        	        if (HASFAILED())
            	        	        	        {
            	        	        	            return machine;
            	        	        	        }


            	        	        	        FOLLOWPUSH(FOLLOW_def_instance_count_in_def_machine4111);
            	        	        	        def_instance_count(ctx, initialCount, maximalCount);

            	        	        	        FOLLOWPOP();
            	        	        	        if  (HASEXCEPTION())
            	        	        	        {
            	        	        	            goto ruledef_machineEx;
            	        	        	        }
            	        	        	        if (HASFAILED())
            	        	        	        {
            	        	        	            return machine;
            	        	        	        }


            	        	        	    }
            	        	        	    break;

            	        	            }
            	        	        }

            	        	    }
            	        	    break;
            	        	case 2:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1647:7: def_instance_count[ initialCount , maximalCount ]
            	        	    {
            	        	        FOLLOWPUSH(FOLLOW_def_instance_count_in_def_machine4124);
            	        	        def_instance_count(ctx, initialCount, maximalCount);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledef_machineEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return machine;
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	         MATCHT(GT, &FOLLOW_GT_in_def_machine4137);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_machineEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return machine;
            	        }


            	    }
            	    break;

                }
            }

            id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_def_machine4147);
            if  (HASEXCEPTION())
            {
                goto ruledef_machineEx;
            }
            if (HASFAILED())
            {
                return machine;
            }


            if ( BACKTRACKING==0 )
            {

                	  	PUSH_CTX_CPM( machine= sep::Machine::newExecutable(
                	  			container, STR((id->getText(id))->chars), spcfr) );


                		machine
                ->getwModifier().override_ifdef( mdfr );

                	  	container->saveOwnedElement( machine
                 );

                		machine
                ->getUniqInstanceSpecifier()->
                				setInstanceCount(initialCount, maximalCount);
                	  
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1663:4: ( StringLiteral )?
            {
                int alt112=2;
                switch ( LA(1) )
                {
                    case StringLiteral:
                    	{
                    		alt112=1;
                    	}
                        break;
                }

                switch (alt112)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1663:6: StringLiteral
            	    {
            	        StringLiteral5 = (pANTLR3_COMMON_TOKEN) MATCHT(StringLiteral, &FOLLOW_StringLiteral_in_def_machine4160);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_machineEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return machine;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             machine
            	            ->setUnrestrictedName(STR((StringLiteral5->getText(StringLiteral5))->chars)); 
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1667:4: ( def_machine_parameters[ machine ] )?
            {
                int alt113=2;
                switch ( LA(1) )
                {
                    case LBRACKET:
                    case LPAREN:
                    	{
                    		alt113=1;
                    	}
                        break;
                }

                switch (alt113)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1667:4: def_machine_parameters[ machine ]
            	    {
            	        FOLLOWPUSH(FOLLOW_def_machine_parameters_in_def_machine4177);
            	        def_machine_parameters(ctx, machine);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_machineEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return machine;
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1669:4: ( def_machine_returns[ machine , sep::Modifier::PROPERTY_RETURN_PARAMETER_MODIFIER ] )?
            {
                int alt114=2;
                switch ( LA(1) )
                {
                    case 163:
                    case 365:
                    	{
                    		alt114=1;
                    	}
                        break;
                }

                switch (alt114)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1669:4: def_machine_returns[ machine , sep::Modifier::PROPERTY_RETURN_PARAMETER_MODIFIER ]
            	    {
            	        FOLLOWPUSH(FOLLOW_def_machine_returns_in_def_machine4186);
            	        def_machine_returns(ctx, machine, sep::Modifier::PROPERTY_RETURN_PARAMETER_MODIFIER);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_machineEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return machine;
            	        }


            	    }
            	    break;

                }
            }

            FOLLOWPUSH(FOLLOW_def_body_machine_in_def_machine4195);
            def_body_machine(ctx, machine);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruledef_machineEx;
            }
            if (HASFAILED())
            {
                return machine;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_machineEx; /* Prevent compiler warnings */
    ruledef_machineEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
            else
            {
                {

                    	POP_CTX;

                    	SET_RULE_LOCATION(machine);

                }
            }


    if ( BACKTRACKING>0 ) { MEMOIZE(48, def_machine_StartIndex); }

    return machine;
}
/* $ANTLR end def_machine */

/**
 * $ANTLR start def_body_machine_using_section_header_predicat
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1675:1: def_body_machine_using_section_header_predicat : '@header:' ;
 */
static void
def_body_machine_using_section_header_predicat(pfmlParser ctx)
{
    ANTLR3_UINT32 def_body_machine_using_section_header_predicat_StartIndex;

    /* Initialize rule variables
     */
    def_body_machine_using_section_header_predicat_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(49)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1676:2: ( '@header:' )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1676:4: '@header:'
        {
             MATCHT(188, &FOLLOW_188_in_def_body_machine_using_section_header_predicat4208);
            if  (HASEXCEPTION())
            {
                goto ruledef_body_machine_using_section_header_predicatEx;
            }
            if (HASFAILED())
            {
                return ;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_body_machine_using_section_header_predicatEx; /* Prevent compiler warnings */
    ruledef_body_machine_using_section_header_predicatEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(49, def_body_machine_using_section_header_predicat_StartIndex); }

    return ;
}
/* $ANTLR end def_body_machine_using_section_header_predicat */

/**
 * $ANTLR start def_body_machine_using_section_import_predicat
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1679:1: def_body_machine_using_section_import_predicat : '@import:' ;
 */
static void
def_body_machine_using_section_import_predicat(pfmlParser ctx)
{
    ANTLR3_UINT32 def_body_machine_using_section_import_predicat_StartIndex;

    /* Initialize rule variables
     */
    def_body_machine_using_section_import_predicat_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(50)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1680:2: ( '@import:' )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1680:4: '@import:'
        {
             MATCHT(192, &FOLLOW_192_in_def_body_machine_using_section_import_predicat4219);
            if  (HASEXCEPTION())
            {
                goto ruledef_body_machine_using_section_import_predicatEx;
            }
            if (HASFAILED())
            {
                return ;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_body_machine_using_section_import_predicatEx; /* Prevent compiler warnings */
    ruledef_body_machine_using_section_import_predicatEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(50, def_body_machine_using_section_import_predicat_StartIndex); }

    return ;
}
/* $ANTLR end def_body_machine_using_section_import_predicat */

/**
 * $ANTLR start def_body_machine_using_section_parameter_predicat
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1683:1: def_body_machine_using_section_parameter_predicat : ( '@parameter:' | '@param:' | '@input:' | '@inout:' | '@output:' | '@returns:' | '@return:' );
 */
static void
def_body_machine_using_section_parameter_predicat(pfmlParser ctx)
{
    ANTLR3_UINT32 def_body_machine_using_section_parameter_predicat_StartIndex;

    /* Initialize rule variables
     */
    def_body_machine_using_section_parameter_predicat_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(51)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1684:2: ( '@parameter:' | '@param:' | '@input:' | '@inout:' | '@output:' | '@returns:' | '@return:' )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:
        {
            if ( ((LA(1) >= 195) && (LA(1) <= 196)) || LA(1) == 207 || ((LA(1) >= 209) && (LA(1) <= 210)) || ((LA(1) >= 219) && (LA(1) <= 220)) )
            {
                CONSUME();
                PERRORRECOVERY=ANTLR3_FALSE;
                FAILEDFLAG=ANTLR3_FALSE;

            }
            else
            {
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
                EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
                EXCEPTION->expectingSet = NULL;

                goto ruledef_body_machine_using_section_parameter_predicatEx;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_body_machine_using_section_parameter_predicatEx; /* Prevent compiler warnings */
    ruledef_body_machine_using_section_parameter_predicatEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(51, def_body_machine_using_section_parameter_predicat_StartIndex); }

    return ;
}
/* $ANTLR end def_body_machine_using_section_parameter_predicat */

/**
 * $ANTLR start def_body_machine_using_section_property_predicat
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1689:1: def_body_machine_using_section_property_predicat : ( '@property:' | '@public:' | '@protected:' | '@private:' | '@declaration:' );
 */
static void
def_body_machine_using_section_property_predicat(pfmlParser ctx)
{
    ANTLR3_UINT32 def_body_machine_using_section_property_predicat_StartIndex;

    /* Initialize rule variables
     */
    def_body_machine_using_section_property_predicat_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(52)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1690:2: ( '@property:' | '@public:' | '@protected:' | '@private:' | '@declaration:' )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:
        {
            if ( LA(1) == 178 || LA(1) == 211 || ((LA(1) >= 213) && (LA(1) <= 214)) || LA(1) == 216 )
            {
                CONSUME();
                PERRORRECOVERY=ANTLR3_FALSE;
                FAILEDFLAG=ANTLR3_FALSE;

            }
            else
            {
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
                EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
                EXCEPTION->expectingSet = NULL;

                goto ruledef_body_machine_using_section_property_predicatEx;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_body_machine_using_section_property_predicatEx; /* Prevent compiler warnings */
    ruledef_body_machine_using_section_property_predicatEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(52, def_body_machine_using_section_property_predicat_StartIndex); }

    return ;
}
/* $ANTLR end def_body_machine_using_section_property_predicat */

/**
 * $ANTLR start def_body_machine_using_section_predicat
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1695:1: def_body_machine_using_section_predicat : ( def_body_machine_using_section_header_predicat | def_body_machine_using_section_import_predicat | def_body_machine_using_section_parameter_predicat | def_body_machine_using_section_property_predicat | '@macro:' | '@routine' | '@procedure:' | '@composite' | '@machine:' | '@region:' | '@statemachine:' | '@behavior:' | '@transition:' | '@moc:' | '@moe:' | '@com:' | '@interaction:' );
 */
static void
def_body_machine_using_section_predicat(pfmlParser ctx)
{
    ANTLR3_UINT32 def_body_machine_using_section_predicat_StartIndex;

    /* Initialize rule variables
     */
    def_body_machine_using_section_predicat_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(53)) )
    {
        {
        }



        return ;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1696:2: ( def_body_machine_using_section_header_predicat | def_body_machine_using_section_import_predicat | def_body_machine_using_section_parameter_predicat | def_body_machine_using_section_property_predicat | '@macro:' | '@routine' | '@procedure:' | '@composite' | '@machine:' | '@region:' | '@statemachine:' | '@behavior:' | '@transition:' | '@moc:' | '@moe:' | '@com:' | '@interaction:' )

            ANTLR3_UINT32 alt115;

            alt115=17;

            switch ( LA(1) )
            {
            case 188:
            	{
            		alt115=1;
            	}
                break;
            case 192:
            	{
            		alt115=2;
            	}
                break;
            case 195:
            case 196:
            case 207:
            case 209:
            case 210:
            case 219:
            case 220:
            	{
            		alt115=3;
            	}
                break;
            case 178:
            case 211:
            case 213:
            case 214:
            case 216:
            	{
            		alt115=4;
            	}
                break;
            case 201:
            	{
            		alt115=5;
            	}
                break;
            case 221:
            	{
            		alt115=6;
            	}
                break;
            case 212:
            	{
            		alt115=7;
            	}
                break;
            case 173:
            	{
            		alt115=8;
            	}
                break;
            case 200:
            	{
            		alt115=9;
            	}
                break;
            case 217:
            	{
            		alt115=10;
            	}
                break;
            case 227:
            	{
            		alt115=11;
            	}
                break;
            case 171:
            	{
            		alt115=12;
            	}
                break;
            case 231:
            	{
            		alt115=13;
            	}
                break;
            case 202:
            	{
            		alt115=14;
            	}
                break;
            case 204:
            	{
            		alt115=15;
            	}
                break;
            case 172:
            	{
            		alt115=16;
            	}
                break;
            case 198:
            	{
            		alt115=17;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 115;
                EXCEPTION->state        = 0;


                goto ruledef_body_machine_using_section_predicatEx;

            }

            switch (alt115)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1696:4: def_body_machine_using_section_header_predicat
        	    {
        	        FOLLOWPUSH(FOLLOW_def_body_machine_using_section_header_predicat_in_def_body_machine_using_section_predicat4313);
        	        def_body_machine_using_section_header_predicat(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_body_machine_using_section_predicatEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1697:4: def_body_machine_using_section_import_predicat
        	    {
        	        FOLLOWPUSH(FOLLOW_def_body_machine_using_section_import_predicat_in_def_body_machine_using_section_predicat4318);
        	        def_body_machine_using_section_import_predicat(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_body_machine_using_section_predicatEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1698:4: def_body_machine_using_section_parameter_predicat
        	    {
        	        FOLLOWPUSH(FOLLOW_def_body_machine_using_section_parameter_predicat_in_def_body_machine_using_section_predicat4323);
        	        def_body_machine_using_section_parameter_predicat(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_body_machine_using_section_predicatEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 4:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1699:4: def_body_machine_using_section_property_predicat
        	    {
        	        FOLLOWPUSH(FOLLOW_def_body_machine_using_section_property_predicat_in_def_body_machine_using_section_predicat4328);
        	        def_body_machine_using_section_property_predicat(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_body_machine_using_section_predicatEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 5:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1701:4: '@macro:'
        	    {
        	         MATCHT(201, &FOLLOW_201_in_def_body_machine_using_section_predicat4334);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_body_machine_using_section_predicatEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 6:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1701:16: '@routine'
        	    {
        	         MATCHT(221, &FOLLOW_221_in_def_body_machine_using_section_predicat4338);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_body_machine_using_section_predicatEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 7:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1701:29: '@procedure:'
        	    {
        	         MATCHT(212, &FOLLOW_212_in_def_body_machine_using_section_predicat4342);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_body_machine_using_section_predicatEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 8:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1703:4: '@composite'
        	    {
        	         MATCHT(173, &FOLLOW_173_in_def_body_machine_using_section_predicat4348);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_body_machine_using_section_predicatEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 9:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1703:19: '@machine:'
        	    {
        	         MATCHT(200, &FOLLOW_200_in_def_body_machine_using_section_predicat4352);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_body_machine_using_section_predicatEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 10:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1704:4: '@region:'
        	    {
        	         MATCHT(217, &FOLLOW_217_in_def_body_machine_using_section_predicat4357);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_body_machine_using_section_predicatEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 11:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1704:19: '@statemachine:'
        	    {
        	         MATCHT(227, &FOLLOW_227_in_def_body_machine_using_section_predicat4363);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_body_machine_using_section_predicatEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 12:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1706:4: '@behavior:'
        	    {
        	         MATCHT(171, &FOLLOW_171_in_def_body_machine_using_section_predicat4369);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_body_machine_using_section_predicatEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 13:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1706:19: '@transition:'
        	    {
        	         MATCHT(231, &FOLLOW_231_in_def_body_machine_using_section_predicat4373);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_body_machine_using_section_predicatEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 14:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1709:4: '@moc:'
        	    {
        	         MATCHT(202, &FOLLOW_202_in_def_body_machine_using_section_predicat4381);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_body_machine_using_section_predicatEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 15:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1709:14: '@moe:'
        	    {
        	         MATCHT(204, &FOLLOW_204_in_def_body_machine_using_section_predicat4385);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_body_machine_using_section_predicatEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 16:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1709:24: '@com:'
        	    {
        	         MATCHT(172, &FOLLOW_172_in_def_body_machine_using_section_predicat4389);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_body_machine_using_section_predicatEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 17:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1709:34: '@interaction:'
        	    {
        	         MATCHT(198, &FOLLOW_198_in_def_body_machine_using_section_predicat4393);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_body_machine_using_section_predicatEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruledef_body_machine_using_section_predicatEx; /* Prevent compiler warnings */
    ruledef_body_machine_using_section_predicatEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(53, def_body_machine_using_section_predicat_StartIndex); }

    return ;
}
/* $ANTLR end def_body_machine_using_section_predicat */

/**
 * $ANTLR start def_body_machine
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1713:1: def_body_machine[ sep::Machine * machine ] : LCURLY def_body_machine_section[ machine ] RCURLY ;
 */
static void
def_body_machine(pfmlParser ctx, sep::Machine * machine)
{
    ANTLR3_UINT32 def_body_machine_StartIndex;

    /* Initialize rule variables
     */
    def_body_machine_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(54)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1714:2: ( LCURLY def_body_machine_section[ machine ] RCURLY )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1714:4: LCURLY def_body_machine_section[ machine ] RCURLY
        {
             MATCHT(LCURLY, &FOLLOW_LCURLY_in_def_body_machine4407);
            if  (HASEXCEPTION())
            {
                goto ruledef_body_machineEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            FOLLOWPUSH(FOLLOW_def_body_machine_section_in_def_body_machine4424);
            def_body_machine_section(ctx, machine);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruledef_body_machineEx;
            }
            if (HASFAILED())
            {
                return ;
            }


             MATCHT(RCURLY, &FOLLOW_RCURLY_in_def_body_machine4437);
            if  (HASEXCEPTION())
            {
                goto ruledef_body_machineEx;
            }
            if (HASFAILED())
            {
                return ;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_body_machineEx; /* Prevent compiler warnings */
    ruledef_body_machineEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(54, def_body_machine_StartIndex); }

    return ;
}
/* $ANTLR end def_body_machine */

/**
 * $ANTLR start def_body_machine_section
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1722:1: def_body_machine_section[ sep::Machine * machine ] : ( section_header[ machine ] )? ( section_import[ machine ] )? ( section_parameter[ machine ] )* ( section_property[ machine ] )* ( section_composite_structure[ machine ] )* ( section_behavior[ machine ] | section_statemachine[ machine ] )? ( section_model_of_computation[ machine ] | section_model_of_execution[ machine ] | section_model_of_interaction[ machine ] )* ;
 */
static void
def_body_machine_section(pfmlParser ctx, sep::Machine * machine)
{
    ANTLR3_UINT32 def_body_machine_section_StartIndex;

    /* Initialize rule variables
     */
    def_body_machine_section_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(55)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1723:2: ( ( section_header[ machine ] )? ( section_import[ machine ] )? ( section_parameter[ machine ] )* ( section_property[ machine ] )* ( section_composite_structure[ machine ] )* ( section_behavior[ machine ] | section_statemachine[ machine ] )? ( section_model_of_computation[ machine ] | section_model_of_execution[ machine ] | section_model_of_interaction[ machine ] )* )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1723:4: ( section_header[ machine ] )? ( section_import[ machine ] )? ( section_parameter[ machine ] )* ( section_property[ machine ] )* ( section_composite_structure[ machine ] )* ( section_behavior[ machine ] | section_statemachine[ machine ] )? ( section_model_of_computation[ machine ] | section_model_of_execution[ machine ] | section_model_of_interaction[ machine ] )*
        {
            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1723:4: ( section_header[ machine ] )?
            {
                int alt116=2;
                switch ( LA(1) )
                {
                    case 188:
                    	{
                    		alt116=1;
                    	}
                        break;
                }

                switch (alt116)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1723:4: section_header[ machine ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_header_in_def_body_machine_section4450);
            	        section_header(ctx, machine);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_machine_sectionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1724:4: ( section_import[ machine ] )?
            {
                int alt117=2;
                switch ( LA(1) )
                {
                    case 192:
                    	{
                    		alt117=1;
                    	}
                        break;
                }

                switch (alt117)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1724:4: section_import[ machine ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_import_in_def_body_machine_section4458);
            	        section_import(ctx, machine);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_machine_sectionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1726:4: ( section_parameter[ machine ] )*

            for (;;)
            {
                int alt118=2;
                switch ( LA(1) )
                {
                case 195:
                case 196:
                case 207:
                case 209:
                case 210:
                case 219:
                case 220:
                	{
                		alt118=1;
                	}
                    break;

                }

                switch (alt118)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1726:6: section_parameter[ machine ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_parameter_in_def_body_machine_section4469);
            	        section_parameter(ctx, machine);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_machine_sectionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

            	default:
            	    goto loop118;	/* break out of the loop */
            	    break;
                }
            }
            loop118: ; /* Jump out to here if this rule does not match */


            if ( BACKTRACKING==0 )
            {
                  sep::TemplateFactory::genProperty( machine ); 
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1731:4: ( section_property[ machine ] )*

            for (;;)
            {
                int alt119=2;
                switch ( LA(1) )
                {
                case 178:
                case 211:
                case 213:
                case 214:
                case 216:
                	{
                		alt119=1;
                	}
                    break;

                }

                switch (alt119)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1731:6: section_property[ machine ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_property_in_def_body_machine_section4491);
            	        section_property(ctx, machine);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_machine_sectionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

            	default:
            	    goto loop119;	/* break out of the loop */
            	    break;
                }
            }
            loop119: ; /* Jump out to here if this rule does not match */


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1733:4: ( section_composite_structure[ machine ] )*

            for (;;)
            {
                int alt120=2;
                switch ( LA(1) )
                {
                case 174:
                case 183:
                case 197:
                case 200:
                case 201:
                case 203:
                case 212:
                case 215:
                case 222:
                	{
                		alt120=1;
                	}
                    break;

                }

                switch (alt120)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1733:6: section_composite_structure[ machine ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_composite_structure_in_def_body_machine_section4504);
            	        section_composite_structure(ctx, machine);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_machine_sectionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

            	default:
            	    goto loop120;	/* break out of the loop */
            	    break;
                }
            }
            loop120: ; /* Jump out to here if this rule does not match */


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1735:4: ( section_behavior[ machine ] | section_statemachine[ machine ] )?
            {
                int alt121=3;
                switch ( LA(1) )
                {
                    case 171:
                    	{
                    		alt121=1;
                    	}
                        break;
                    case 227:
                    	{
                    		alt121=2;
                    	}
                        break;
                }

                switch (alt121)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1735:6: section_behavior[ machine ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_behavior_in_def_body_machine_section4516);
            	        section_behavior(ctx, machine);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_machine_sectionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1736:6: section_statemachine[ machine ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_statemachine_in_def_body_machine_section4524);
            	        section_statemachine(ctx, machine);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_machine_sectionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

                }
            }

            if ( BACKTRACKING==0 )
            {
                  sep::TemplateFactory::genBehavior(machine); 
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1742:4: ( section_model_of_computation[ machine ] | section_model_of_execution[ machine ] | section_model_of_interaction[ machine ] )*

            for (;;)
            {
                int alt122=4;
                switch ( LA(1) )
                {
                case 202:
                	{
                		alt122=1;
                	}
                    break;
                case 204:
                	{
                		alt122=2;
                	}
                    break;
                case 172:
                case 198:
                	{
                		alt122=3;
                	}
                    break;

                }

                switch (alt122)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1742:6: section_model_of_computation[ machine ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_model_of_computation_in_def_body_machine_section4549);
            	        section_model_of_computation(ctx, machine);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_machine_sectionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1743:6: section_model_of_execution[ machine ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_model_of_execution_in_def_body_machine_section4557);
            	        section_model_of_execution(ctx, machine);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_machine_sectionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;
            	case 3:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1744:6: section_model_of_interaction[ machine ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_model_of_interaction_in_def_body_machine_section4565);
            	        section_model_of_interaction(ctx, machine);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_machine_sectionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

            	default:
            	    goto loop122;	/* break out of the loop */
            	    break;
                }
            }
            loop122: ; /* Jump out to here if this rule does not match */


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_body_machine_sectionEx; /* Prevent compiler warnings */
    ruledef_body_machine_sectionEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(55, def_body_machine_section_StartIndex); }

    return ;
}
/* $ANTLR end def_body_machine_section */

/**
 * $ANTLR start def_body_machine_simplif
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1748:1: def_body_machine_simplif[ sep::Machine * machine ] : ( ( property_declaration[ declProperty ,\n\t\t\t\tsep::Modifier::PROPERTY_UNDEFINED_MODIFIER ] )* | ( def_moe_primitive[ machine ] )+ ) ;
 */
static void
def_body_machine_simplif(pfmlParser ctx, sep::Machine * machine)
{
    ANTLR3_UINT32 def_body_machine_simplif_StartIndex;

    /* Initialize rule variables
     */
    def_body_machine_simplif_StartIndex = INDEX();



    	sep::PropertyPart & declProperty = machine->getPropertyPart();

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(56)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1752:2: ( ( ( property_declaration[ declProperty ,\n\t\t\t\tsep::Modifier::PROPERTY_UNDEFINED_MODIFIER ] )* | ( def_moe_primitive[ machine ] )+ ) )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1752:4: ( ( property_declaration[ declProperty ,\n\t\t\t\tsep::Modifier::PROPERTY_UNDEFINED_MODIFIER ] )* | ( def_moe_primitive[ machine ] )+ )
        {
            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1752:4: ( ( property_declaration[ declProperty ,\n\t\t\t\tsep::Modifier::PROPERTY_UNDEFINED_MODIFIER ] )* | ( def_moe_primitive[ machine ] )+ )
            {
                int alt125=2;
                switch ( LA(1) )
                {
                case EOF:
                case 243:
                case 249:
                case 253:
                case 257:
                case 258:
                case 259:
                case 262:
                case 276:
                case 282:
                case 298:
                case 305:
                case 318:
                case 320:
                case 341:
                case 344:
                case 349:
                case 355:
                case 361:
                case 364:
                case 374:
                case 380:
                case 388:
                case 395:
                case 398:
                case 404:
                case 406:
                case 410:
                case 411:
                case 414:
                	{
                		alt125=1;
                	}
                    break;
                case 170:
                case 175:
                case 177:
                case 179:
                case 182:
                case 184:
                case 189:
                case 190:
                case 191:
                case 194:
                case 199:
                case 218:
                case 223:
                case 224:
                case 225:
                case 226:
                case 228:
                case 367:
                	{
                		alt125=2;
                	}
                    break;

                default:
                    if (BACKTRACKING>0)
                    {
                        FAILEDFLAG = ANTLR3_TRUE;
                        return ;
                    }

                    CONSTRUCTEX();
                    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                    EXCEPTION->message      = (void *)"";
                    EXCEPTION->decisionNum  = 125;
                    EXCEPTION->state        = 0;


                    goto ruledef_body_machine_simplifEx;

                }

                switch (alt125)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1752:6: ( property_declaration[ declProperty ,\n\t\t\t\tsep::Modifier::PROPERTY_UNDEFINED_MODIFIER ] )*
            	    {
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1752:6: ( property_declaration[ declProperty ,\n\t\t\t\tsep::Modifier::PROPERTY_UNDEFINED_MODIFIER ] )*

            	        for (;;)
            	        {
            	            int alt123=2;
            	            switch ( LA(1) )
            	            {
            	            case 243:
            	            case 249:
            	            case 253:
            	            case 257:
            	            case 258:
            	            case 259:
            	            case 262:
            	            case 276:
            	            case 282:
            	            case 298:
            	            case 305:
            	            case 318:
            	            case 320:
            	            case 341:
            	            case 344:
            	            case 349:
            	            case 355:
            	            case 361:
            	            case 364:
            	            case 374:
            	            case 380:
            	            case 388:
            	            case 395:
            	            case 398:
            	            case 404:
            	            case 406:
            	            case 410:
            	            case 411:
            	            case 414:
            	            	{
            	            		alt123=1;
            	            	}
            	                break;

            	            }

            	            switch (alt123)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1752:8: property_declaration[ declProperty ,\n\t\t\t\tsep::Modifier::PROPERTY_UNDEFINED_MODIFIER ]
            	        	    {
            	        	        FOLLOWPUSH(FOLLOW_property_declaration_in_def_body_machine_simplif4593);
            	        	        property_declaration(ctx, declProperty, sep::Modifier::PROPERTY_UNDEFINED_MODIFIER);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledef_body_machine_simplifEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	    }
            	        	    break;

            	        	default:
            	        	    goto loop123;	/* break out of the loop */
            	        	    break;
            	            }
            	        }
            	        loop123: ; /* Jump out to here if this rule does not match */


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1756:6: ( def_moe_primitive[ machine ] )+
            	    {
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1756:6: ( def_moe_primitive[ machine ] )+
            	        {
            	            int cnt124=0;

            	            for (;;)
            	            {
            	                int alt124=2;
            	        	switch ( LA(1) )
            	        	{
            	        	case 170:
            	        	case 175:
            	        	case 177:
            	        	case 179:
            	        	case 182:
            	        	case 184:
            	        	case 189:
            	        	case 190:
            	        	case 191:
            	        	case 194:
            	        	case 199:
            	        	case 218:
            	        	case 223:
            	        	case 224:
            	        	case 225:
            	        	case 226:
            	        	case 228:
            	        	case 367:
            	        		{
            	        			alt124=1;
            	        		}
            	        	    break;

            	        	}

            	        	switch (alt124)
            	        	{
            	        	    case 1:
            	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1756:8: def_moe_primitive[ machine ]
            	        	        {
            	        	            FOLLOWPUSH(FOLLOW_def_moe_primitive_in_def_body_machine_simplif4609);
            	        	            def_moe_primitive(ctx, machine);

            	        	            FOLLOWPOP();
            	        	            if  (HASEXCEPTION())
            	        	            {
            	        	                goto ruledef_body_machine_simplifEx;
            	        	            }
            	        	            if (HASFAILED())
            	        	            {
            	        	                return ;
            	        	            }


            	        	        }
            	        	        break;

            	        	    default:

            	        		if ( cnt124 >= 1 )
            	        		{
            	        		    goto loop124;
            	        		}
            	        		if (BACKTRACKING>0)
            	        		{
            	        		    FAILEDFLAG = ANTLR3_TRUE;
            	        		    return ;
            	        		}

            	        		/* mismatchedSetEx()
            	        		 */
            	        		CONSTRUCTEX();
            	        		EXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
            	        		EXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;


            	        		goto ruledef_body_machine_simplifEx;
            	        	}
            	        	cnt124++;
            	            }
            	            loop124: ;	/* Jump to here if this rule does not match */
            	        }

            	    }
            	    break;

                }
            }

        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_body_machine_simplifEx; /* Prevent compiler warnings */
    ruledef_body_machine_simplifEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(56, def_body_machine_simplif_StartIndex); }

    return ;
}
/* $ANTLR end def_body_machine_simplif */

/**
 * $ANTLR start any_def_statemachine
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1764:1: any_def_statemachine[ sep::Machine * container ,\n\t\tsep::Modifier mdfr , sep::Specifier spcfr ] returns [ sep::Machine * machine ] : (ms= executable_modifier_specifier )? (st= def_state_singleton[ container , mdfr , spcfr ] |st= def_state[ container , mdfr , spcfr ] |sm= def_statemachine[ container , mdfr , spcfr ] ) ;
 */
static sep::Machine *
any_def_statemachine(pfmlParser ctx, sep::Machine * container, sep::Modifier mdfr, sep::Specifier spcfr)
{
    sep::Machine * machine;

    ANTLR3_UINT32 any_def_statemachine_StartIndex;

    fmlParser_executable_modifier_specifier_return ms;
    #undef	RETURN_TYPE_ms
    #define	RETURN_TYPE_ms fmlParser_executable_modifier_specifier_return

    sep::Machine * st;
    #undef	RETURN_TYPE_st
    #define	RETURN_TYPE_st sep::Machine *

    sep::Machine * sm;
    #undef	RETURN_TYPE_sm
    #define	RETURN_TYPE_sm sep::Machine *

    /* Initialize rule variables
     */
    any_def_statemachine_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(57)) )
    {
        {
        }



        return machine;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1768:2: ( (ms= executable_modifier_specifier )? (st= def_state_singleton[ container , mdfr , spcfr ] |st= def_state[ container , mdfr , spcfr ] |sm= def_statemachine[ container , mdfr , spcfr ] ) )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1768:4: (ms= executable_modifier_specifier )? (st= def_state_singleton[ container , mdfr , spcfr ] |st= def_state[ container , mdfr , spcfr ] |sm= def_statemachine[ container , mdfr , spcfr ] )
        {
            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1768:4: (ms= executable_modifier_specifier )?
            {
                int alt126=2;
                switch ( LA(1) )
                {
                    case 272:
                    case 306:
                    case 314:
                    case 322:
                    case 353:
                    case 393:
                    case 406:
                    	{
                    		alt126=1;
                    	}
                        break;
                }

                switch (alt126)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1768:6: ms= executable_modifier_specifier
            	    {
            	        FOLLOWPUSH(FOLLOW_executable_modifier_specifier_in_any_def_statemachine4644);
            	        ms=executable_modifier_specifier(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleany_def_statemachineEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return machine;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             mdfr.override_ifdef( ms.mdfr
            	             ); spcfr.override_ifdef( ms.spcfr
            	             ); 
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1772:4: (st= def_state_singleton[ container , mdfr , spcfr ] |st= def_state[ container , mdfr , spcfr ] |sm= def_statemachine[ container , mdfr , spcfr ] )
            {
                int alt127=3;
                switch ( LA(1) )
                {
                case 144:
                case 145:
                case 147:
                case 148:
                case 149:
                case 150:
                case 153:
                	{
                		alt127=1;
                	}
                    break;
                case 378:
                	{
                		alt127=2;
                	}
                    break;
                case 379:
                	{
                		alt127=3;
                	}
                    break;

                default:
                    if (BACKTRACKING>0)
                    {
                        FAILEDFLAG = ANTLR3_TRUE;
                        return machine;
                    }

                    CONSTRUCTEX();
                    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                    EXCEPTION->message      = (void *)"";
                    EXCEPTION->decisionNum  = 127;
                    EXCEPTION->state        = 0;


                    goto ruleany_def_statemachineEx;

                }

                switch (alt127)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1772:7: st= def_state_singleton[ container , mdfr , spcfr ]
            	    {
            	        FOLLOWPUSH(FOLLOW_def_state_singleton_in_any_def_statemachine4666);
            	        st=def_state_singleton(ctx, container, mdfr, spcfr);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleany_def_statemachineEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return machine;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             machine= 
            	            st
            	            ;
            	               
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1775:6: st= def_state[ container , mdfr , spcfr ]
            	    {
            	        FOLLOWPUSH(FOLLOW_def_state_in_any_def_statemachine4682);
            	        st=def_state(ctx, container, mdfr, spcfr);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleany_def_statemachineEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return machine;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             machine= 
            	            st
            	            ;
            	               
            	        }


            	    }
            	    break;
            	case 3:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1778:6: sm= def_statemachine[ container , mdfr , spcfr ]
            	    {
            	        FOLLOWPUSH(FOLLOW_def_statemachine_in_any_def_statemachine4698);
            	        sm=def_statemachine(ctx, container, mdfr, spcfr);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleany_def_statemachineEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return machine;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             machine= 
            	            sm
            	            ;
            	             
            	        }


            	    }
            	    break;

                }
            }

        }

    }

    // This is where rules clean up and exit
    //
    goto ruleany_def_statemachineEx; /* Prevent compiler warnings */
    ruleany_def_statemachineEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(57, any_def_statemachine_StartIndex); }

    return machine;
}
/* $ANTLR end any_def_statemachine */

/**
 * $ANTLR start def_statemachine
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1784:1: def_statemachine[ sep::Machine * container ,\n\t\tsep::Modifier mdfr , sep::Specifier spcfr ] returns [ sep::Machine * machine ] : 'statemachine' ( LT_ ( ( 'moc:' )? executable_specifier[ spcfr ] ( COMMA def_instance_count[ initialCount , maximalCount ] )? | def_instance_count[ initialCount , maximalCount ] )? GT )? (id= ID | ( LBRACKET | LBRACKET_EXCEPT ) (id= ID ( COMMA id= ID )* | STAR ) RBRACKET ) ( StringLiteral )? ( def_machine_parameters[ machine ] )? ( def_machine_returns[ machine , sep::Modifier::PROPERTY_RETURN_PARAMETER_MODIFIER ] )? def_body_statemachine[ machine ] ;
 */
static sep::Machine *
def_statemachine(pfmlParser ctx, sep::Machine * container, sep::Modifier mdfr, sep::Specifier spcfr)
{
    sep::Machine * machine;

    ANTLR3_UINT32 def_statemachine_StartIndex;

    pANTLR3_COMMON_TOKEN    id;
    pANTLR3_COMMON_TOKEN    StringLiteral6;

    /* Initialize rule variables
     */
    def_statemachine_StartIndex = INDEX();



    //	resetTransitionID();
    	resetConnectID();
    	resetBufferID();

    	sep::avm_size_t initialCount = 1;
    	sep::avm_size_t maximalCount = AVM_NUMERIC_MAX_SIZE_T;

    	SAVE_RULE_BEGIN_LOCATION;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(58)) )
    {
        {

            	POP_CTX;

            	SET_RULE_LOCATION(machine);

        }
        {
        }



        return machine;
    }

    id       = NULL;
    StringLiteral6       = NULL;

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1803:2: ( 'statemachine' ( LT_ ( ( 'moc:' )? executable_specifier[ spcfr ] ( COMMA def_instance_count[ initialCount , maximalCount ] )? | def_instance_count[ initialCount , maximalCount ] )? GT )? (id= ID | ( LBRACKET | LBRACKET_EXCEPT ) (id= ID ( COMMA id= ID )* | STAR ) RBRACKET ) ( StringLiteral )? ( def_machine_parameters[ machine ] )? ( def_machine_returns[ machine , sep::Modifier::PROPERTY_RETURN_PARAMETER_MODIFIER ] )? def_body_statemachine[ machine ] )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1803:4: 'statemachine' ( LT_ ( ( 'moc:' )? executable_specifier[ spcfr ] ( COMMA def_instance_count[ initialCount , maximalCount ] )? | def_instance_count[ initialCount , maximalCount ] )? GT )? (id= ID | ( LBRACKET | LBRACKET_EXCEPT ) (id= ID ( COMMA id= ID )* | STAR ) RBRACKET ) ( StringLiteral )? ( def_machine_parameters[ machine ] )? ( def_machine_returns[ machine , sep::Modifier::PROPERTY_RETURN_PARAMETER_MODIFIER ] )? def_body_statemachine[ machine ]
        {
             MATCHT(379, &FOLLOW_379_in_def_statemachine4736);
            if  (HASEXCEPTION())
            {
                goto ruledef_statemachineEx;
            }
            if (HASFAILED())
            {
                return machine;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1804:4: ( LT_ ( ( 'moc:' )? executable_specifier[ spcfr ] ( COMMA def_instance_count[ initialCount , maximalCount ] )? | def_instance_count[ initialCount , maximalCount ] )? GT )?
            {
                int alt131=2;
                switch ( LA(1) )
                {
                    case LT_:
                    	{
                    		alt131=1;
                    	}
                        break;
                }

                switch (alt131)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1804:6: LT_ ( ( 'moc:' )? executable_specifier[ spcfr ] ( COMMA def_instance_count[ initialCount , maximalCount ] )? | def_instance_count[ initialCount , maximalCount ] )? GT
            	    {
            	         MATCHT(LT_, &FOLLOW_LT__in_def_statemachine4743);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_statemachineEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return machine;
            	        }


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1805:5: ( ( 'moc:' )? executable_specifier[ spcfr ] ( COMMA def_instance_count[ initialCount , maximalCount ] )? | def_instance_count[ initialCount , maximalCount ] )?
            	        {
            	            int alt130=3;
            	            switch ( LA(1) )
            	            {
            	                case ID:
            	                case 151:
            	                case 152:
            	                case 239:
            	                case 257:
            	                case 282:
            	                case 284:
            	                case 286:
            	                case 312:
            	                case 321:
            	                case 334:
            	                case 364:
            	                case 377:
            	                	{
            	                		alt130=1;
            	                	}
            	                    break;
            	                case LBRACKET:
            	                case LPAREN:
            	                case 308:
            	                case 327:
            	                	{
            	                		alt130=2;
            	                	}
            	                    break;
            	            }

            	            switch (alt130)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1805:7: ( 'moc:' )? executable_specifier[ spcfr ] ( COMMA def_instance_count[ initialCount , maximalCount ] )?
            	        	    {
            	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1805:7: ( 'moc:' )?
            	        	        {
            	        	            int alt128=2;
            	        	            switch ( LA(1) )
            	        	            {
            	        	                case 321:
            	        	                	{
            	        	                		alt128=1;
            	        	                	}
            	        	                    break;
            	        	            }

            	        	            switch (alt128)
            	        	            {
            	        	        	case 1:
            	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1805:9: 'moc:'
            	        	        	    {
            	        	        	         MATCHT(321, &FOLLOW_321_in_def_statemachine4753);
            	        	        	        if  (HASEXCEPTION())
            	        	        	        {
            	        	        	            goto ruledef_statemachineEx;
            	        	        	        }
            	        	        	        if (HASFAILED())
            	        	        	        {
            	        	        	            return machine;
            	        	        	        }


            	        	        	    }
            	        	        	    break;

            	        	            }
            	        	        }

            	        	        FOLLOWPUSH(FOLLOW_executable_specifier_in_def_statemachine4759);
            	        	        executable_specifier(ctx, spcfr);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledef_statemachineEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return machine;
            	        	        }


            	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1806:6: ( COMMA def_instance_count[ initialCount , maximalCount ] )?
            	        	        {
            	        	            int alt129=2;
            	        	            switch ( LA(1) )
            	        	            {
            	        	                case COMMA:
            	        	                	{
            	        	                		alt129=1;
            	        	                	}
            	        	                    break;
            	        	            }

            	        	            switch (alt129)
            	        	            {
            	        	        	case 1:
            	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1806:8: COMMA def_instance_count[ initialCount , maximalCount ]
            	        	        	    {
            	        	        	         MATCHT(COMMA, &FOLLOW_COMMA_in_def_statemachine4769);
            	        	        	        if  (HASEXCEPTION())
            	        	        	        {
            	        	        	            goto ruledef_statemachineEx;
            	        	        	        }
            	        	        	        if (HASFAILED())
            	        	        	        {
            	        	        	            return machine;
            	        	        	        }


            	        	        	        FOLLOWPUSH(FOLLOW_def_instance_count_in_def_statemachine4772);
            	        	        	        def_instance_count(ctx, initialCount, maximalCount);

            	        	        	        FOLLOWPOP();
            	        	        	        if  (HASEXCEPTION())
            	        	        	        {
            	        	        	            goto ruledef_statemachineEx;
            	        	        	        }
            	        	        	        if (HASFAILED())
            	        	        	        {
            	        	        	            return machine;
            	        	        	        }


            	        	        	    }
            	        	        	    break;

            	        	            }
            	        	        }

            	        	    }
            	        	    break;
            	        	case 2:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1808:7: def_instance_count[ initialCount , maximalCount ]
            	        	    {
            	        	        FOLLOWPUSH(FOLLOW_def_instance_count_in_def_statemachine4785);
            	        	        def_instance_count(ctx, initialCount, maximalCount);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledef_statemachineEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return machine;
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	         MATCHT(GT, &FOLLOW_GT_in_def_statemachine4798);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_statemachineEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return machine;
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1813:4: (id= ID | ( LBRACKET | LBRACKET_EXCEPT ) (id= ID ( COMMA id= ID )* | STAR ) RBRACKET )
            {
                int alt135=2;
                switch ( LA(1) )
                {
                case ID:
                	{
                		alt135=1;
                	}
                    break;
                case LBRACKET:
                case LBRACKET_EXCEPT:
                	{
                		alt135=2;
                	}
                    break;

                default:
                    if (BACKTRACKING>0)
                    {
                        FAILEDFLAG = ANTLR3_TRUE;
                        return machine;
                    }

                    CONSTRUCTEX();
                    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                    EXCEPTION->message      = (void *)"";
                    EXCEPTION->decisionNum  = 135;
                    EXCEPTION->state        = 0;


                    goto ruledef_statemachineEx;

                }

                switch (alt135)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1813:6: id= ID
            	    {
            	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_def_statemachine4814);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_statemachineEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return machine;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {

            	            		  	if( spcfr.isUndefined() )
            	            		  	{
            	            		  		spcfr.setComponentExecutable();
            	            		  	}
            	            		  	PUSH_CTX_CPM( machine= sep::Machine::newStatemachine(
            	            		  			container, STR((id->getText(id))->chars), spcfr) );


            	            		  	machine
            	            ->getwModifier().override_ifdef( mdfr );

            	            			container->saveOwnedElement( machine
            	             );

            	            			machine
            	            ->getUniqInstanceSpecifier()->
            	            					setInstanceCount(initialCount, maximalCount);
            	            		
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1830:6: ( LBRACKET | LBRACKET_EXCEPT ) (id= ID ( COMMA id= ID )* | STAR ) RBRACKET
            	    {
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1830:6: ( LBRACKET | LBRACKET_EXCEPT )
            	        {
            	            int alt132=2;
            	            switch ( LA(1) )
            	            {
            	            case LBRACKET:
            	            	{
            	            		alt132=1;
            	            	}
            	                break;
            	            case LBRACKET_EXCEPT:
            	            	{
            	            		alt132=2;
            	            	}
            	                break;

            	            default:
            	                if (BACKTRACKING>0)
            	                {
            	                    FAILEDFLAG = ANTLR3_TRUE;
            	                    return machine;
            	                }

            	                CONSTRUCTEX();
            	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
            	                EXCEPTION->message      = (void *)"";
            	                EXCEPTION->decisionNum  = 132;
            	                EXCEPTION->state        = 0;


            	                goto ruledef_statemachineEx;

            	            }

            	            switch (alt132)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1830:8: LBRACKET
            	        	    {
            	        	         MATCHT(LBRACKET, &FOLLOW_LBRACKET_in_def_statemachine4828);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledef_statemachineEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return machine;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             spcfr.setGroupSome(); 
            	        	        }


            	        	    }
            	        	    break;
            	        	case 2:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1831:8: LBRACKET_EXCEPT
            	        	    {
            	        	         MATCHT(LBRACKET_EXCEPT, &FOLLOW_LBRACKET_EXCEPT_in_def_statemachine4847);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledef_statemachineEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return machine;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             spcfr.setGroupExcept(); 
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	        if ( BACKTRACKING==0 )
            	        {

            	            		  	PUSH_CTX_CPM( machine= sep::Machine::newStatemachine(
            	            		  			container, "[]", spcfr/*, type*/) );


            	            		  	machine
            	            ->getwModifier().override_ifdef( mdfr );

            	            			container->saveOwnedElement( machine
            	             );

            	            			machine
            	            ->getUniqInstanceSpecifier()->
            	            					setInstanceCount(initialCount, maximalCount);
            	            		
            	        }


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1845:6: (id= ID ( COMMA id= ID )* | STAR )
            	        {
            	            int alt134=2;
            	            switch ( LA(1) )
            	            {
            	            case ID:
            	            	{
            	            		alt134=1;
            	            	}
            	                break;
            	            case STAR:
            	            	{
            	            		alt134=2;
            	            	}
            	                break;

            	            default:
            	                if (BACKTRACKING>0)
            	                {
            	                    FAILEDFLAG = ANTLR3_TRUE;
            	                    return machine;
            	                }

            	                CONSTRUCTEX();
            	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
            	                EXCEPTION->message      = (void *)"";
            	                EXCEPTION->decisionNum  = 134;
            	                EXCEPTION->state        = 0;


            	                goto ruledef_statemachineEx;

            	            }

            	            switch (alt134)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1845:8: id= ID ( COMMA id= ID )*
            	        	    {
            	        	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_def_statemachine4873);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledef_statemachineEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return machine;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             machine
            	        	            ->appendGroupId( STR((id->getText(id))->chars) ); 
            	        	        }


            	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1846:8: ( COMMA id= ID )*

            	        	        for (;;)
            	        	        {
            	        	            int alt133=2;
            	        	            switch ( LA(1) )
            	        	            {
            	        	            case COMMA:
            	        	            	{
            	        	            		alt133=1;
            	        	            	}
            	        	                break;

            	        	            }

            	        	            switch (alt133)
            	        	            {
            	        	        	case 1:
            	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1846:10: COMMA id= ID
            	        	        	    {
            	        	        	         MATCHT(COMMA, &FOLLOW_COMMA_in_def_statemachine4895);
            	        	        	        if  (HASEXCEPTION())
            	        	        	        {
            	        	        	            goto ruledef_statemachineEx;
            	        	        	        }
            	        	        	        if (HASFAILED())
            	        	        	        {
            	        	        	            return machine;
            	        	        	        }


            	        	        	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_def_statemachine4899);
            	        	        	        if  (HASEXCEPTION())
            	        	        	        {
            	        	        	            goto ruledef_statemachineEx;
            	        	        	        }
            	        	        	        if (HASFAILED())
            	        	        	        {
            	        	        	            return machine;
            	        	        	        }


            	        	        	        if ( BACKTRACKING==0 )
            	        	        	        {
            	        	        	             machine
            	        	        	            ->appendGroupId( STR((id->getText(id))->chars) ); 
            	        	        	        }


            	        	        	    }
            	        	        	    break;

            	        	        	default:
            	        	        	    goto loop133;	/* break out of the loop */
            	        	        	    break;
            	        	            }
            	        	        }
            	        	        loop133: ; /* Jump out to here if this rule does not match */


            	        	    }
            	        	    break;
            	        	case 2:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1848:8: STAR
            	        	    {
            	        	         MATCHT(STAR, &FOLLOW_STAR_in_def_statemachine4915);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledef_statemachineEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return machine;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             machine
            	        	            ->getwSpecifier().setGroupEvery(); 
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	         MATCHT(RBRACKET, &FOLLOW_RBRACKET_in_def_statemachine4936);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_statemachineEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return machine;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             machine
            	            ->setGroupId(); 
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1854:4: ( StringLiteral )?
            {
                int alt136=2;
                switch ( LA(1) )
                {
                    case StringLiteral:
                    	{
                    		alt136=1;
                    	}
                        break;
                }

                switch (alt136)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1854:6: StringLiteral
            	    {
            	        StringLiteral6 = (pANTLR3_COMMON_TOKEN) MATCHT(StringLiteral, &FOLLOW_StringLiteral_in_def_statemachine4953);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_statemachineEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return machine;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             machine
            	            ->setUnrestrictedName(STR((StringLiteral6->getText(StringLiteral6))->chars)); 
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1858:4: ( def_machine_parameters[ machine ] )?
            {
                int alt137=2;
                switch ( LA(1) )
                {
                    case LBRACKET:
                    case LPAREN:
                    	{
                    		alt137=1;
                    	}
                        break;
                }

                switch (alt137)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1858:4: def_machine_parameters[ machine ]
            	    {
            	        FOLLOWPUSH(FOLLOW_def_machine_parameters_in_def_statemachine4970);
            	        def_machine_parameters(ctx, machine);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_statemachineEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return machine;
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1860:4: ( def_machine_returns[ machine , sep::Modifier::PROPERTY_RETURN_PARAMETER_MODIFIER ] )?
            {
                int alt138=2;
                switch ( LA(1) )
                {
                    case 163:
                    case 365:
                    	{
                    		alt138=1;
                    	}
                        break;
                }

                switch (alt138)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1860:4: def_machine_returns[ machine , sep::Modifier::PROPERTY_RETURN_PARAMETER_MODIFIER ]
            	    {
            	        FOLLOWPUSH(FOLLOW_def_machine_returns_in_def_statemachine4979);
            	        def_machine_returns(ctx, machine, sep::Modifier::PROPERTY_RETURN_PARAMETER_MODIFIER);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_statemachineEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return machine;
            	        }


            	    }
            	    break;

                }
            }

            FOLLOWPUSH(FOLLOW_def_body_statemachine_in_def_statemachine4988);
            def_body_statemachine(ctx, machine);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruledef_statemachineEx;
            }
            if (HASFAILED())
            {
                return machine;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_statemachineEx; /* Prevent compiler warnings */
    ruledef_statemachineEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
            else
            {
                {

                    	POP_CTX;

                    	SET_RULE_LOCATION(machine);

                }
            }


    if ( BACKTRACKING>0 ) { MEMOIZE(58, def_statemachine_StartIndex); }

    return machine;
}
/* $ANTLR end def_statemachine */

/**
 * $ANTLR start def_body_statemachine
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1923:1: def_body_statemachine[ sep::Machine * machine ] : LCURLY ( section_header[ machine ] )? ( section_import[ machine ] )? ( section_parameter[ machine ] )* ( section_property[ machine ] )* ( section_composite_structure[ machine ] )* ( section_region[ machine ] )? ( section_transition[ machine ] )? ( section_model_of_computation[ machine ] | section_model_of_execution[ machine ] | section_model_of_interaction[ machine ] )* RCURLY ;
 */
static void
def_body_statemachine(pfmlParser ctx, sep::Machine * machine)
{
    ANTLR3_UINT32 def_body_statemachine_StartIndex;

    /* Initialize rule variables
     */
    def_body_statemachine_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(59)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1924:2: ( LCURLY ( section_header[ machine ] )? ( section_import[ machine ] )? ( section_parameter[ machine ] )* ( section_property[ machine ] )* ( section_composite_structure[ machine ] )* ( section_region[ machine ] )? ( section_transition[ machine ] )? ( section_model_of_computation[ machine ] | section_model_of_execution[ machine ] | section_model_of_interaction[ machine ] )* RCURLY )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1924:4: LCURLY ( section_header[ machine ] )? ( section_import[ machine ] )? ( section_parameter[ machine ] )* ( section_property[ machine ] )* ( section_composite_structure[ machine ] )* ( section_region[ machine ] )? ( section_transition[ machine ] )? ( section_model_of_computation[ machine ] | section_model_of_execution[ machine ] | section_model_of_interaction[ machine ] )* RCURLY
        {
             MATCHT(LCURLY, &FOLLOW_LCURLY_in_def_body_statemachine5007);
            if  (HASEXCEPTION())
            {
                goto ruledef_body_statemachineEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1925:4: ( section_header[ machine ] )?
            {
                int alt139=2;
                switch ( LA(1) )
                {
                    case 188:
                    	{
                    		alt139=1;
                    	}
                        break;
                }

                switch (alt139)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1925:4: section_header[ machine ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_header_in_def_body_statemachine5012);
            	        section_header(ctx, machine);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_statemachineEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1926:4: ( section_import[ machine ] )?
            {
                int alt140=2;
                switch ( LA(1) )
                {
                    case 192:
                    	{
                    		alt140=1;
                    	}
                        break;
                }

                switch (alt140)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1926:4: section_import[ machine ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_import_in_def_body_statemachine5020);
            	        section_import(ctx, machine);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_statemachineEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1928:4: ( section_parameter[ machine ] )*

            for (;;)
            {
                int alt141=2;
                switch ( LA(1) )
                {
                case 195:
                case 196:
                case 207:
                case 209:
                case 210:
                case 219:
                case 220:
                	{
                		alt141=1;
                	}
                    break;

                }

                switch (alt141)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1928:6: section_parameter[ machine ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_parameter_in_def_body_statemachine5031);
            	        section_parameter(ctx, machine);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_statemachineEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

            	default:
            	    goto loop141;	/* break out of the loop */
            	    break;
                }
            }
            loop141: ; /* Jump out to here if this rule does not match */


            if ( BACKTRACKING==0 )
            {
                  sep::TemplateFactory::genProperty( machine ); 
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1933:4: ( section_property[ machine ] )*

            for (;;)
            {
                int alt142=2;
                switch ( LA(1) )
                {
                case 178:
                case 211:
                case 213:
                case 214:
                case 216:
                	{
                		alt142=1;
                	}
                    break;

                }

                switch (alt142)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1933:6: section_property[ machine ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_property_in_def_body_statemachine5053);
            	        section_property(ctx, machine);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_statemachineEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

            	default:
            	    goto loop142;	/* break out of the loop */
            	    break;
                }
            }
            loop142: ; /* Jump out to here if this rule does not match */


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1935:4: ( section_composite_structure[ machine ] )*

            for (;;)
            {
                int alt143=2;
                switch ( LA(1) )
                {
                case 174:
                case 183:
                case 197:
                case 200:
                case 201:
                case 203:
                case 212:
                case 215:
                case 222:
                	{
                		alt143=1;
                	}
                    break;

                }

                switch (alt143)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1935:6: section_composite_structure[ machine ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_composite_structure_in_def_body_statemachine5066);
            	        section_composite_structure(ctx, machine);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_statemachineEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

            	default:
            	    goto loop143;	/* break out of the loop */
            	    break;
                }
            }
            loop143: ; /* Jump out to here if this rule does not match */


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1937:4: ( section_region[ machine ] )?
            {
                int alt144=2;
                switch ( LA(1) )
                {
                    case 217:
                    	{
                    		alt144=1;
                    	}
                        break;
                }

                switch (alt144)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1937:4: section_region[ machine ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_region_in_def_body_statemachine5076);
            	        section_region(ctx, machine);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_statemachineEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1939:4: ( section_transition[ machine ] )?
            {
                int alt145=2;
                switch ( LA(1) )
                {
                    case 231:
                    	{
                    		alt145=1;
                    	}
                        break;
                }

                switch (alt145)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1939:4: section_transition[ machine ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_transition_in_def_body_statemachine5085);
            	        section_transition(ctx, machine);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_statemachineEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

                }
            }

            if ( BACKTRACKING==0 )
            {
                  sep::TemplateFactory::genBehavior(machine); 
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1944:4: ( section_model_of_computation[ machine ] | section_model_of_execution[ machine ] | section_model_of_interaction[ machine ] )*

            for (;;)
            {
                int alt146=4;
                switch ( LA(1) )
                {
                case 202:
                	{
                		alt146=1;
                	}
                    break;
                case 204:
                	{
                		alt146=2;
                	}
                    break;
                case 172:
                case 198:
                	{
                		alt146=3;
                	}
                    break;

                }

                switch (alt146)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1944:6: section_model_of_computation[ machine ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_model_of_computation_in_def_body_statemachine5106);
            	        section_model_of_computation(ctx, machine);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_statemachineEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1945:6: section_model_of_execution[ machine ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_model_of_execution_in_def_body_statemachine5114);
            	        section_model_of_execution(ctx, machine);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_statemachineEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;
            	case 3:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1946:6: section_model_of_interaction[ machine ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_model_of_interaction_in_def_body_statemachine5122);
            	        section_model_of_interaction(ctx, machine);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_statemachineEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

            	default:
            	    goto loop146;	/* break out of the loop */
            	    break;
                }
            }
            loop146: ; /* Jump out to here if this rule does not match */


             MATCHT(RCURLY, &FOLLOW_RCURLY_in_def_body_statemachine5134);
            if  (HASEXCEPTION())
            {
                goto ruledef_body_statemachineEx;
            }
            if (HASFAILED())
            {
                return ;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_body_statemachineEx; /* Prevent compiler warnings */
    ruledef_body_statemachineEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(59, def_body_statemachine_StartIndex); }

    return ;
}
/* $ANTLR end def_body_statemachine */

/**
 * $ANTLR start section_region
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1952:1: section_region[ sep::Machine * container ] : '@region:' (m= any_def_statemachine[ container , mdfr , spcfr ] )+ ;
 */
static void
section_region(pfmlParser ctx, sep::Machine * container)
{
    ANTLR3_UINT32 section_region_StartIndex;

    sep::Machine * m;
    #undef	RETURN_TYPE_m
    #define	RETURN_TYPE_m sep::Machine *

    /* Initialize rule variables
     */
    section_region_StartIndex = INDEX();



    	 sep::Modifier mdfr;

    	sep::Specifier spcfr;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(60)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1958:2: ( '@region:' (m= any_def_statemachine[ container , mdfr , spcfr ] )+ )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1958:4: '@region:' (m= any_def_statemachine[ container , mdfr , spcfr ] )+
        {
             MATCHT(217, &FOLLOW_217_in_section_region5152);
            if  (HASEXCEPTION())
            {
                goto rulesection_regionEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            if ( BACKTRACKING==0 )
            {
                 container->getwSpecifier().setMocStateTransitionSystem(); 
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1961:4: (m= any_def_statemachine[ container , mdfr , spcfr ] )+
            {
                int cnt147=0;

                for (;;)
                {
                    int alt147=2;
            	switch ( LA(1) )
            	{
            	case 144:
            	case 145:
            	case 147:
            	case 148:
            	case 149:
            	case 150:
            	case 153:
            	case 272:
            	case 306:
            	case 314:
            	case 322:
            	case 353:
            	case 378:
            	case 379:
            	case 393:
            	case 406:
            		{
            			alt147=1;
            		}
            	    break;

            	}

            	switch (alt147)
            	{
            	    case 1:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1961:6: m= any_def_statemachine[ container , mdfr , spcfr ]
            	        {
            	            FOLLOWPUSH(FOLLOW_any_def_statemachine_in_section_region5167);
            	            m=any_def_statemachine(ctx, container, mdfr, spcfr);

            	            FOLLOWPOP();
            	            if  (HASEXCEPTION())
            	            {
            	                goto rulesection_regionEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return ;
            	            }


            	        }
            	        break;

            	    default:

            		if ( cnt147 >= 1 )
            		{
            		    goto loop147;
            		}
            		if (BACKTRACKING>0)
            		{
            		    FAILEDFLAG = ANTLR3_TRUE;
            		    return ;
            		}

            		/* mismatchedSetEx()
            		 */
            		CONSTRUCTEX();
            		EXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
            		EXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;


            		goto rulesection_regionEx;
            	}
            	cnt147++;
                }
                loop147: ;	/* Jump to here if this rule does not match */
            }

        }

    }

    // This is where rules clean up and exit
    //
    goto rulesection_regionEx; /* Prevent compiler warnings */
    rulesection_regionEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(60, section_region_StartIndex); }

    return ;
}
/* $ANTLR end section_region */

/**
 * $ANTLR start section_statemachine
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1964:1: section_statemachine[ sep::Machine * container ] : '@statemachine:' (m= any_def_statemachine[ container , mdfr , spcfr ] )+ ;
 */
static void
section_statemachine(pfmlParser ctx, sep::Machine * container)
{
    ANTLR3_UINT32 section_statemachine_StartIndex;

    sep::Machine * m;
    #undef	RETURN_TYPE_m
    #define	RETURN_TYPE_m sep::Machine *

    /* Initialize rule variables
     */
    section_statemachine_StartIndex = INDEX();



    	 sep::Modifier mdfr;

    	sep::Specifier spcfr;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(61)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1970:2: ( '@statemachine:' (m= any_def_statemachine[ container , mdfr , spcfr ] )+ )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1970:4: '@statemachine:' (m= any_def_statemachine[ container , mdfr , spcfr ] )+
        {
             MATCHT(227, &FOLLOW_227_in_section_statemachine5188);
            if  (HASEXCEPTION())
            {
                goto rulesection_statemachineEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            if ( BACKTRACKING==0 )
            {
                 container->getwSpecifier().setMocStateTransitionSystem(); 
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1973:4: (m= any_def_statemachine[ container , mdfr , spcfr ] )+
            {
                int cnt148=0;

                for (;;)
                {
                    int alt148=2;
            	switch ( LA(1) )
            	{
            	case 144:
            	case 145:
            	case 147:
            	case 148:
            	case 149:
            	case 150:
            	case 153:
            	case 272:
            	case 306:
            	case 314:
            	case 322:
            	case 353:
            	case 378:
            	case 379:
            	case 393:
            	case 406:
            		{
            			alt148=1;
            		}
            	    break;

            	}

            	switch (alt148)
            	{
            	    case 1:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1973:6: m= any_def_statemachine[ container , mdfr , spcfr ]
            	        {
            	            FOLLOWPUSH(FOLLOW_any_def_statemachine_in_section_statemachine5203);
            	            m=any_def_statemachine(ctx, container, mdfr, spcfr);

            	            FOLLOWPOP();
            	            if  (HASEXCEPTION())
            	            {
            	                goto rulesection_statemachineEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return ;
            	            }


            	        }
            	        break;

            	    default:

            		if ( cnt148 >= 1 )
            		{
            		    goto loop148;
            		}
            		if (BACKTRACKING>0)
            		{
            		    FAILEDFLAG = ANTLR3_TRUE;
            		    return ;
            		}

            		/* mismatchedSetEx()
            		 */
            		CONSTRUCTEX();
            		EXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
            		EXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;


            		goto rulesection_statemachineEx;
            	}
            	cnt148++;
                }
                loop148: ;	/* Jump to here if this rule does not match */
            }

        }

    }

    // This is where rules clean up and exit
    //
    goto rulesection_statemachineEx; /* Prevent compiler warnings */
    rulesection_statemachineEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(61, section_statemachine_StartIndex); }

    return ;
}
/* $ANTLR end section_statemachine */

/**
 * $ANTLR start def_state
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1978:1: def_state[ sep::Machine * container ,\n\t\tsep::Modifier mdfr , sep::Specifier spcfr ] returns [ sep::Machine * state = NULL ] : 'state' ( LT_ ( 'moc:' )? executable_specifier[ spcfr ] GT )? (id= state_id | ( LBRACKET | LBRACKET_EXCEPT ) (id= state_id ( COMMA id= state_id )* | STAR ) RBRACKET )? ( StringLiteral )? ( def_body_state[ state ] | SEMI ) ;
 */
static sep::Machine *
def_state(pfmlParser ctx, sep::Machine * container, sep::Modifier mdfr, sep::Specifier spcfr)
{
    sep::Machine * state;

    ANTLR3_UINT32 def_state_StartIndex;

    pANTLR3_COMMON_TOKEN    StringLiteral7;
    std::string id;
    #undef	RETURN_TYPE_id
    #define	RETURN_TYPE_id std::string

    /* Initialize rule variables
     */
    state =  NULL;

    def_state_StartIndex = INDEX();



    	std::string sid;

    	SAVE_RULE_BEGIN_LOCATION;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(62)) )
    {
        {

            	POP_CTX;

            	SET_RULE_LOCATION(state);

        }
        {
        }



        return state;
    }

    StringLiteral7       = NULL;

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1992:2: ( 'state' ( LT_ ( 'moc:' )? executable_specifier[ spcfr ] GT )? (id= state_id | ( LBRACKET | LBRACKET_EXCEPT ) (id= state_id ( COMMA id= state_id )* | STAR ) RBRACKET )? ( StringLiteral )? ( def_body_state[ state ] | SEMI ) )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1992:4: 'state' ( LT_ ( 'moc:' )? executable_specifier[ spcfr ] GT )? (id= state_id | ( LBRACKET | LBRACKET_EXCEPT ) (id= state_id ( COMMA id= state_id )* | STAR ) RBRACKET )? ( StringLiteral )? ( def_body_state[ state ] | SEMI )
        {
             MATCHT(378, &FOLLOW_378_in_def_state5235);
            if  (HASEXCEPTION())
            {
                goto ruledef_stateEx;
            }
            if (HASFAILED())
            {
                return state;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1993:4: ( LT_ ( 'moc:' )? executable_specifier[ spcfr ] GT )?
            {
                int alt150=2;
                switch ( LA(1) )
                {
                    case LT_:
                    	{
                    		alt150=1;
                    	}
                        break;
                }

                switch (alt150)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1993:6: LT_ ( 'moc:' )? executable_specifier[ spcfr ] GT
            	    {
            	         MATCHT(LT_, &FOLLOW_LT__in_def_state5242);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_stateEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return state;
            	        }


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1993:10: ( 'moc:' )?
            	        {
            	            int alt149=2;
            	            switch ( LA(1) )
            	            {
            	                case 321:
            	                	{
            	                		alt149=1;
            	                	}
            	                    break;
            	            }

            	            switch (alt149)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1993:12: 'moc:'
            	        	    {
            	        	         MATCHT(321, &FOLLOW_321_in_def_state5246);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledef_stateEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return state;
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	        FOLLOWPUSH(FOLLOW_executable_specifier_in_def_state5252);
            	        executable_specifier(ctx, spcfr);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_stateEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return state;
            	        }


            	         MATCHT(GT, &FOLLOW_GT_in_def_state5256);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_stateEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return state;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             sid = "$" + spcfr.strAnyStateMoc(""); 
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1996:4: (id= state_id | ( LBRACKET | LBRACKET_EXCEPT ) (id= state_id ( COMMA id= state_id )* | STAR ) RBRACKET )?
            {
                int alt154=3;
                switch ( LA(1) )
                {
                    case DOLLAR:
                    case ID:
                    case 144:
                    case 145:
                    case 146:
                    case 147:
                    case 148:
                    case 149:
                    case 150:
                    case 153:
                    	{
                    		alt154=1;
                    	}
                        break;
                    case LBRACKET:
                    case LBRACKET_EXCEPT:
                    	{
                    		alt154=2;
                    	}
                        break;
                }

                switch (alt154)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1996:6: id= state_id
            	    {
            	        FOLLOWPUSH(FOLLOW_state_id_in_def_state5278);
            	        id=state_id(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_stateEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return state;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {

            	            	    	if( spcfr.couldBeStateMocSIMPLE() )
            	            	    	{
            	            	    		spcfr.setStateMocSIMPLE();
            	            	    	}

            	            	    	PUSH_CTX_CPM(
            	            	    			state= sep::Machine::newState(container, 
            	            id
            	            , spcfr) );


            	            	    	state
            	            ->getwModifier().override_ifdef( mdfr );

            	            			container->saveOwnedElement( state
            	             );
            	            	    
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2011:6: ( LBRACKET | LBRACKET_EXCEPT ) (id= state_id ( COMMA id= state_id )* | STAR ) RBRACKET
            	    {
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2011:6: ( LBRACKET | LBRACKET_EXCEPT )
            	        {
            	            int alt151=2;
            	            switch ( LA(1) )
            	            {
            	            case LBRACKET:
            	            	{
            	            		alt151=1;
            	            	}
            	                break;
            	            case LBRACKET_EXCEPT:
            	            	{
            	            		alt151=2;
            	            	}
            	                break;

            	            default:
            	                if (BACKTRACKING>0)
            	                {
            	                    FAILEDFLAG = ANTLR3_TRUE;
            	                    return state;
            	                }

            	                CONSTRUCTEX();
            	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
            	                EXCEPTION->message      = (void *)"";
            	                EXCEPTION->decisionNum  = 151;
            	                EXCEPTION->state        = 0;


            	                goto ruledef_stateEx;

            	            }

            	            switch (alt151)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2011:8: LBRACKET
            	        	    {
            	        	         MATCHT(LBRACKET, &FOLLOW_LBRACKET_in_def_state5295);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledef_stateEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return state;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             spcfr.setGroupSome(); 
            	        	        }


            	        	    }
            	        	    break;
            	        	case 2:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2012:8: LBRACKET_EXCEPT
            	        	    {
            	        	         MATCHT(LBRACKET_EXCEPT, &FOLLOW_LBRACKET_EXCEPT_in_def_state5314);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledef_stateEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return state;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             spcfr.setGroupExcept(); 
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	        if ( BACKTRACKING==0 )
            	        {

            	            		  	PUSH_CTX_CPM(
            	            		  			state= sep::Machine::newState(container, "[]", spcfr) );


            	            			container->saveOwnedElement( state
            	             );

            	            		  	state
            	            ->getwModifier().override_ifdef( mdfr );
            	            		
            	        }


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2023:6: (id= state_id ( COMMA id= state_id )* | STAR )
            	        {
            	            int alt153=2;
            	            switch ( LA(1) )
            	            {
            	            case DOLLAR:
            	            case ID:
            	            case 144:
            	            case 145:
            	            case 146:
            	            case 147:
            	            case 148:
            	            case 149:
            	            case 150:
            	            case 153:
            	            	{
            	            		alt153=1;
            	            	}
            	                break;
            	            case STAR:
            	            	{
            	            		alt153=2;
            	            	}
            	                break;

            	            default:
            	                if (BACKTRACKING>0)
            	                {
            	                    FAILEDFLAG = ANTLR3_TRUE;
            	                    return state;
            	                }

            	                CONSTRUCTEX();
            	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
            	                EXCEPTION->message      = (void *)"";
            	                EXCEPTION->decisionNum  = 153;
            	                EXCEPTION->state        = 0;


            	                goto ruledef_stateEx;

            	            }

            	            switch (alt153)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2023:8: id= state_id ( COMMA id= state_id )*
            	        	    {
            	        	        FOLLOWPUSH(FOLLOW_state_id_in_def_state5340);
            	        	        id=state_id(ctx);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledef_stateEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return state;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             state
            	        	            ->appendGroupId( id
            	        	             ); 
            	        	        }


            	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2024:8: ( COMMA id= state_id )*

            	        	        for (;;)
            	        	        {
            	        	            int alt152=2;
            	        	            switch ( LA(1) )
            	        	            {
            	        	            case COMMA:
            	        	            	{
            	        	            		alt152=1;
            	        	            	}
            	        	                break;

            	        	            }

            	        	            switch (alt152)
            	        	            {
            	        	        	case 1:
            	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2024:10: COMMA id= state_id
            	        	        	    {
            	        	        	         MATCHT(COMMA, &FOLLOW_COMMA_in_def_state5362);
            	        	        	        if  (HASEXCEPTION())
            	        	        	        {
            	        	        	            goto ruledef_stateEx;
            	        	        	        }
            	        	        	        if (HASFAILED())
            	        	        	        {
            	        	        	            return state;
            	        	        	        }


            	        	        	        FOLLOWPUSH(FOLLOW_state_id_in_def_state5366);
            	        	        	        id=state_id(ctx);

            	        	        	        FOLLOWPOP();
            	        	        	        if  (HASEXCEPTION())
            	        	        	        {
            	        	        	            goto ruledef_stateEx;
            	        	        	        }
            	        	        	        if (HASFAILED())
            	        	        	        {
            	        	        	            return state;
            	        	        	        }


            	        	        	        if ( BACKTRACKING==0 )
            	        	        	        {
            	        	        	             state
            	        	        	            ->appendGroupId( id
            	        	        	             ); 
            	        	        	        }


            	        	        	    }
            	        	        	    break;

            	        	        	default:
            	        	        	    goto loop152;	/* break out of the loop */
            	        	        	    break;
            	        	            }
            	        	        }
            	        	        loop152: ; /* Jump out to here if this rule does not match */


            	        	    }
            	        	    break;
            	        	case 2:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2026:8: STAR
            	        	    {
            	        	         MATCHT(STAR, &FOLLOW_STAR_in_def_state5382);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledef_stateEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return state;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             state
            	        	            ->getwSpecifier().setGroupEvery(); 
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	         MATCHT(RBRACKET, &FOLLOW_RBRACKET_in_def_state5403);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_stateEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return state;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             state
            	            ->setGroupId(); 
            	        }


            	    }
            	    break;

                }
            }

            if ( BACKTRACKING==0 )
            {

                		if( state
                 == NULL )
                		{
                			PUSH_CTX_CPM(
                					state= sep::Machine::newState(container, sid, spcfr) );


                			state
                ->getwModifier().override_ifdef( mdfr );

                			container->saveOwnedElement( state
                 );
                		}
                	  
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2044:4: ( StringLiteral )?
            {
                int alt155=2;
                switch ( LA(1) )
                {
                    case StringLiteral:
                    	{
                    		alt155=1;
                    	}
                        break;
                }

                switch (alt155)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2044:6: StringLiteral
            	    {
            	        StringLiteral7 = (pANTLR3_COMMON_TOKEN) MATCHT(StringLiteral, &FOLLOW_StringLiteral_in_def_state5427);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_stateEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return state;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             state
            	            ->setUnrestrictedName(STR((StringLiteral7->getText(StringLiteral7))->chars)); 
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2048:4: ( def_body_state[ state ] | SEMI )
            {
                int alt156=2;
                switch ( LA(1) )
                {
                case LCURLY:
                	{
                		alt156=1;
                	}
                    break;
                case SEMI:
                	{
                		alt156=2;
                	}
                    break;

                default:
                    if (BACKTRACKING>0)
                    {
                        FAILEDFLAG = ANTLR3_TRUE;
                        return state;
                    }

                    CONSTRUCTEX();
                    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                    EXCEPTION->message      = (void *)"";
                    EXCEPTION->decisionNum  = 156;
                    EXCEPTION->state        = 0;


                    goto ruledef_stateEx;

                }

                switch (alt156)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2048:6: def_body_state[ state ]
            	    {
            	        FOLLOWPUSH(FOLLOW_def_body_state_in_def_state5446);
            	        def_body_state(ctx, state);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_stateEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return state;
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2048:32: SEMI
            	    {
            	         MATCHT(SEMI, &FOLLOW_SEMI_in_def_state5451);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_stateEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return state;
            	        }


            	    }
            	    break;

                }
            }

        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_stateEx; /* Prevent compiler warnings */
    ruledef_stateEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
            else
            {
                {

                    	POP_CTX;

                    	SET_RULE_LOCATION(state);

                }
            }


    if ( BACKTRACKING>0 ) { MEMOIZE(62, def_state_StartIndex); }

    return state;
}
/* $ANTLR end def_state */

/**
 * $ANTLR start state_kw_id
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2052:1: state_kw_id returns [ std::string s ] : ( '#init' | '#initial' | '#start' | '#dhistory' | '#shistory' | '#final' | '#terminal' | '#return' );
 */
static std::string
state_kw_id(pfmlParser ctx)
{
    std::string s;

    ANTLR3_UINT32 state_kw_id_StartIndex;

    /* Initialize rule variables
     */
    state_kw_id_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(63)) )
    {
        {
        }



        return s;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2054:2: ( '#init' | '#initial' | '#start' | '#dhistory' | '#shistory' | '#final' | '#terminal' | '#return' )

            ANTLR3_UINT32 alt157;

            alt157=8;

            switch ( LA(1) )
            {
            case 146:
            	{
            		alt157=1;
            	}
                break;
            case 147:
            	{
            		alt157=2;
            	}
                break;
            case 150:
            	{
            		alt157=3;
            	}
                break;
            case 144:
            	{
            		alt157=4;
            	}
                break;
            case 149:
            	{
            		alt157=5;
            	}
                break;
            case 145:
            	{
            		alt157=6;
            	}
                break;
            case 153:
            	{
            		alt157=7;
            	}
                break;
            case 148:
            	{
            		alt157=8;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return s;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 157;
                EXCEPTION->state        = 0;


                goto rulestate_kw_idEx;

            }

            switch (alt157)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2054:4: '#init'
        	    {
        	         MATCHT(146, &FOLLOW_146_in_state_kw_id5469);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestate_kw_idEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return s;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             s= "#init"    ;
        	             
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2055:4: '#initial'
        	    {
        	         MATCHT(147, &FOLLOW_147_in_state_kw_id5481);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestate_kw_idEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return s;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             s= "#initial" ;
        	             
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2056:4: '#start'
        	    {
        	         MATCHT(150, &FOLLOW_150_in_state_kw_id5490);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestate_kw_idEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return s;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             s= "#start"   ;
        	             
        	        }


        	    }
        	    break;
        	case 4:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2058:4: '#dhistory'
        	    {
        	         MATCHT(144, &FOLLOW_144_in_state_kw_id5502);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestate_kw_idEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return s;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             s= "#dhistory";
        	             
        	        }


        	    }
        	    break;
        	case 5:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2059:4: '#shistory'
        	    {
        	         MATCHT(149, &FOLLOW_149_in_state_kw_id5510);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestate_kw_idEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return s;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             s= "#shistory";
        	             
        	        }


        	    }
        	    break;
        	case 6:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2061:4: '#final'
        	    {
        	         MATCHT(145, &FOLLOW_145_in_state_kw_id5519);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestate_kw_idEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return s;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             s= "#final"   ;
        	             needDefaultStateFinal.remove(_CPM_);    
        	        }


        	    }
        	    break;
        	case 7:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2064:4: '#terminal'
        	    {
        	         MATCHT(153, &FOLLOW_153_in_state_kw_id5528);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestate_kw_idEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return s;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             s= "#terminal";
        	             needDefaultStateTerminal.remove(_CPM_); 
        	        }


        	    }
        	    break;
        	case 8:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2067:4: '#return'
        	    {
        	         MATCHT(148, &FOLLOW_148_in_state_kw_id5537);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestate_kw_idEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return s;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             s= "#return"  ;
        	             needDefaultStateReturn.remove(_CPM_);   
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto rulestate_kw_idEx; /* Prevent compiler warnings */
    rulestate_kw_idEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(63, state_kw_id_StartIndex); }

    return s;
}
/* $ANTLR end state_kw_id */

/**
 * $ANTLR start state_id
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2071:1: state_id returns [ std::string s ] : (kw= state_kw_id |id= ID | DOLLAR id= ID );
 */
static std::string
state_id(pfmlParser ctx)
{
    std::string s;

    ANTLR3_UINT32 state_id_StartIndex;

    pANTLR3_COMMON_TOKEN    id;
    std::string kw;
    #undef	RETURN_TYPE_kw
    #define	RETURN_TYPE_kw std::string

    /* Initialize rule variables
     */
    state_id_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(64)) )
    {
        {
        }



        return s;
    }

    id       = NULL;

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2073:2: (kw= state_kw_id |id= ID | DOLLAR id= ID )

            ANTLR3_UINT32 alt158;

            alt158=3;

            switch ( LA(1) )
            {
            case 144:
            case 145:
            case 146:
            case 147:
            case 148:
            case 149:
            case 150:
            case 153:
            	{
            		alt158=1;
            	}
                break;
            case ID:
            	{
            		alt158=2;
            	}
                break;
            case DOLLAR:
            	{
            		alt158=3;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return s;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 158;
                EXCEPTION->state        = 0;


                goto rulestate_idEx;

            }

            switch (alt158)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2073:4: kw= state_kw_id
        	    {
        	        FOLLOWPUSH(FOLLOW_state_kw_id_in_state_id5557);
        	        kw=state_kw_id(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestate_idEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return s;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             s= 
        	            kw
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2074:4: id= ID
        	    {
        	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_state_id5567);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestate_idEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return s;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             s= STR((id->getText(id))->chars);
        	             
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2075:4: DOLLAR id= ID
        	    {
        	         MATCHT(DOLLAR, &FOLLOW_DOLLAR_in_state_id5584);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestate_idEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return s;
        	        }


        	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_state_id5588);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestate_idEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return s;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             s= "$" + STR((id->getText(id))->chars);
        	             
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto rulestate_idEx; /* Prevent compiler warnings */
    rulestate_idEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(64, state_id_StartIndex); }

    return s;
}
/* $ANTLR end state_id */

/**
 * $ANTLR start def_state_singleton
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2081:1: def_state_singleton[ sep::Machine * container ,\n\t\tsep::Modifier mdfr , sep::Specifier spcfr ] returns [ sep::Machine * state ] : ( ( '#initial' | '#start' | '#dhistory' | '#shistory' ) LCURLY def_body_state_simplif[ state ] RCURLY | '#final' bs= block_statement | '#terminal' bs= block_statement | '#return' bs= block_statement );
 */
static sep::Machine *
def_state_singleton(pfmlParser ctx, sep::Machine * container, sep::Modifier mdfr, sep::Specifier spcfr)
{
    sep::Machine * state;

    ANTLR3_UINT32 def_state_singleton_StartIndex;

    sep::BFCode bs;
    #undef	RETURN_TYPE_bs
    #define	RETURN_TYPE_bs sep::BFCode

    /* Initialize rule variables
     */
    def_state_singleton_StartIndex = INDEX();



    	SAVE_RULE_BEGIN_LOCATION;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(65)) )
    {
        {

            	state->getwModifier().override_ifdef( mdfr );

            	POP_CTX;

            	SET_RULE_LOCATION(state);

        }
        {
        }



        return state;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2095:2: ( ( '#initial' | '#start' | '#dhistory' | '#shistory' ) LCURLY def_body_state_simplif[ state ] RCURLY | '#final' bs= block_statement | '#terminal' bs= block_statement | '#return' bs= block_statement )

            ANTLR3_UINT32 alt160;

            alt160=4;

            switch ( LA(1) )
            {
            case 144:
            case 147:
            case 149:
            case 150:
            	{
            		alt160=1;
            	}
                break;
            case 145:
            	{
            		alt160=2;
            	}
                break;
            case 153:
            	{
            		alt160=3;
            	}
                break;
            case 148:
            	{
            		alt160=4;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return state;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 160;
                EXCEPTION->state        = 0;


                goto ruledef_state_singletonEx;

            }

            switch (alt160)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2095:4: ( '#initial' | '#start' | '#dhistory' | '#shistory' ) LCURLY def_body_state_simplif[ state ] RCURLY
        	    {
        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2095:4: ( '#initial' | '#start' | '#dhistory' | '#shistory' )
        	        {
        	            int alt159=4;
        	            switch ( LA(1) )
        	            {
        	            case 147:
        	            	{
        	            		alt159=1;
        	            	}
        	                break;
        	            case 150:
        	            	{
        	            		alt159=2;
        	            	}
        	                break;
        	            case 144:
        	            	{
        	            		alt159=3;
        	            	}
        	                break;
        	            case 149:
        	            	{
        	            		alt159=4;
        	            	}
        	                break;

        	            default:
        	                if (BACKTRACKING>0)
        	                {
        	                    FAILEDFLAG = ANTLR3_TRUE;
        	                    return state;
        	                }

        	                CONSTRUCTEX();
        	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
        	                EXCEPTION->message      = (void *)"";
        	                EXCEPTION->decisionNum  = 159;
        	                EXCEPTION->state        = 0;


        	                goto ruledef_state_singletonEx;

        	            }

        	            switch (alt159)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2095:6: '#initial'
        	        	    {
        	        	         MATCHT(147, &FOLLOW_147_in_def_state_singleton5624);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_state_singletonEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return state;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {

        	        	            	  	PUSH_CTX_CPM( state= sep::Machine::newState(
        	        	            	  			container, "#initial", spcfr.setPseudostateMocINITIAL()) );


        	        	            	  	container->saveOwnedElement( state
        	        	             );
        	        	            	  
        	        	        }


        	        	    }
        	        	    break;
        	        	case 2:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2103:6: '#start'
        	        	    {
        	        	         MATCHT(150, &FOLLOW_150_in_def_state_singleton5637);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_state_singletonEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return state;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {

        	        	            	  	PUSH_CTX_CPM( state= sep::Machine::newState(
        	        	            	  			container, "#start", spcfr.setStateMocSTART()) );


        	        	            	  	container->saveOwnedElement( state
        	        	             );
        	        	            	  
        	        	        }


        	        	    }
        	        	    break;
        	        	case 3:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2111:6: '#dhistory'
        	        	    {
        	        	         MATCHT(144, &FOLLOW_144_in_def_state_singleton5650);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_state_singletonEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return state;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {

        	        	            	  	PUSH_CTX_CPM( state= sep::Machine::newState(
        	        	            	  			container, "#dhistory",
        	        	            	  			spcfr.setPseudostateMocDEEP_HISTORY()) );


        	        	            	  	container->saveOwnedElement( state
        	        	             );
        	        	            	  
        	        	        }


        	        	    }
        	        	    break;
        	        	case 4:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2120:6: '#shistory'
        	        	    {
        	        	         MATCHT(149, &FOLLOW_149_in_def_state_singleton5663);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_state_singletonEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return state;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {

        	        	            	  	PUSH_CTX_CPM( state= sep::Machine::newState(
        	        	            	  			container, "#shistory",
        	        	            	  			spcfr.setPseudostateMocSHALLOW_HISTORY()) );


        	        	            	  	container->saveOwnedElement( state
        	        	             );
        	        	            	  
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	         MATCHT(LCURLY, &FOLLOW_LCURLY_in_def_state_singleton5678);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_state_singletonEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return state;
        	        }


        	        FOLLOWPUSH(FOLLOW_def_body_state_simplif_in_def_state_singleton5681);
        	        def_body_state_simplif(ctx, state);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_state_singletonEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return state;
        	        }


        	         MATCHT(RCURLY, &FOLLOW_RCURLY_in_def_state_singleton5685);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_state_singletonEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return state;
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2131:4: '#final' bs= block_statement
        	    {
        	         MATCHT(145, &FOLLOW_145_in_def_state_singleton5691);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_state_singletonEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return state;
        	        }


        	        FOLLOWPUSH(FOLLOW_block_statement_in_def_state_singleton5695);
        	        bs=block_statement(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_state_singletonEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return state;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {

        	            		PUSH_CTX_CPM( state= sep::Machine::newState(
        	            			container, "#final", spcfr.setStateMocFINAL()) );


        	            	  	container->saveOwnedElement( state
        	             );

        	            		state
        	            ->getUniqBehaviorPart()->seqOnFinal(bs
        	            );

        	            		needDefaultStateFinal.remove(container);
        	            	
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2143:4: '#terminal' bs= block_statement
        	    {
        	         MATCHT(153, &FOLLOW_153_in_def_state_singleton5704);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_state_singletonEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return state;
        	        }


        	        FOLLOWPUSH(FOLLOW_block_statement_in_def_state_singleton5708);
        	        bs=block_statement(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_state_singletonEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return state;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {

        	            		PUSH_CTX_CPM( state= sep::Machine::newState(
        	            			container, "#terminal", spcfr.setPseudostateMocTERMINAL()) );


        	            	  	container->saveOwnedElement( state
        	             );

        	            		state
        	            ->getUniqBehaviorPart()->seqOnFinal(bs
        	            );

        	            		needDefaultStateTerminal.remove(container);
        	            	
        	        }


        	    }
        	    break;
        	case 4:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2155:4: '#return' bs= block_statement
        	    {
        	         MATCHT(148, &FOLLOW_148_in_def_state_singleton5717);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_state_singletonEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return state;
        	        }


        	        FOLLOWPUSH(FOLLOW_block_statement_in_def_state_singleton5721);
        	        bs=block_statement(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_state_singletonEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return state;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {

        	            		PUSH_CTX_CPM( state= sep::Machine::newState(
        	            			container, "#return", spcfr.setPseudostateMocRETURN()) );


        	            	  	container->saveOwnedElement( state
        	             );

        	            		state
        	            ->getUniqBehaviorPart()->seqOnFinal(bs
        	            );

        	            		needDefaultStateReturn.remove(container);
        	            	
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruledef_state_singletonEx; /* Prevent compiler warnings */
    ruledef_state_singletonEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
            else
            {
                {

                    	state->getwModifier().override_ifdef( mdfr );

                    	POP_CTX;

                    	SET_RULE_LOCATION(state);

                }
            }


    if ( BACKTRACKING>0 ) { MEMOIZE(65, def_state_singleton_StartIndex); }

    return state;
}
/* $ANTLR end def_state_singleton */

/**
 * $ANTLR start executable_specifier
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2169:1: executable_specifier[ sep::Specifier & spcfr ] : ka= executable_specifier_atom[ spcfr ] ( BAND ka= executable_specifier_atom[ spcfr ] )* ;
 */
static void
executable_specifier(pfmlParser ctx, sep::Specifier & spcfr)
{
    ANTLR3_UINT32 executable_specifier_StartIndex;

    /* Initialize rule variables
     */
    executable_specifier_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(66)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2170:2: (ka= executable_specifier_atom[ spcfr ] ( BAND ka= executable_specifier_atom[ spcfr ] )* )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2170:4: ka= executable_specifier_atom[ spcfr ] ( BAND ka= executable_specifier_atom[ spcfr ] )*
        {
            FOLLOWPUSH(FOLLOW_executable_specifier_atom_in_executable_specifier5740);
            executable_specifier_atom(ctx, spcfr);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruleexecutable_specifierEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2171:4: ( BAND ka= executable_specifier_atom[ spcfr ] )*

            for (;;)
            {
                int alt161=2;
                switch ( LA(1) )
                {
                case BAND:
                	{
                		alt161=1;
                	}
                    break;

                }

                switch (alt161)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2171:6: BAND ka= executable_specifier_atom[ spcfr ]
            	    {
            	         MATCHT(BAND, &FOLLOW_BAND_in_executable_specifier5748);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexecutable_specifierEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        FOLLOWPUSH(FOLLOW_executable_specifier_atom_in_executable_specifier5752);
            	        executable_specifier_atom(ctx, spcfr);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexecutable_specifierEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

            	default:
            	    goto loop161;	/* break out of the loop */
            	    break;
                }
            }
            loop161: ; /* Jump out to here if this rule does not match */


        }

    }

    // This is where rules clean up and exit
    //
    goto ruleexecutable_specifierEx; /* Prevent compiler warnings */
    ruleexecutable_specifierEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(66, executable_specifier_StartIndex); }

    return ;
}
/* $ANTLR end executable_specifier */

/**
 * $ANTLR start executable_specifier_atom
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2175:1: executable_specifier_atom[ sep::Specifier & spcfr ] : (id= ID | 'start' | 'final' | 'return' | 'choice' | 'fork' | 'join' | 'and' | 'or' | '#sts' | '#stf' | 'flow' );
 */
static void
executable_specifier_atom(pfmlParser ctx, sep::Specifier & spcfr)
{
    ANTLR3_UINT32 executable_specifier_atom_StartIndex;

    pANTLR3_COMMON_TOKEN    id;

    /* Initialize rule variables
     */
    executable_specifier_atom_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(67)) )
    {
        {
        }



        return ;
    }

    id       = NULL;

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2176:2: (id= ID | 'start' | 'final' | 'return' | 'choice' | 'fork' | 'join' | 'and' | 'or' | '#sts' | '#stf' | 'flow' )

            ANTLR3_UINT32 alt162;

            alt162=12;

            switch ( LA(1) )
            {
            case ID:
            	{
            		alt162=1;
            	}
                break;
            case 377:
            	{
            		alt162=2;
            	}
                break;
            case 282:
            	{
            		alt162=3;
            	}
                break;
            case 364:
            	{
            		alt162=4;
            	}
                break;
            case 257:
            	{
            		alt162=5;
            	}
                break;
            case 286:
            	{
            		alt162=6;
            	}
                break;
            case 312:
            	{
            		alt162=7;
            	}
                break;
            case 239:
            	{
            		alt162=8;
            	}
                break;
            case 334:
            	{
            		alt162=9;
            	}
                break;
            case 152:
            	{
            		alt162=10;
            	}
                break;
            case 151:
            	{
            		alt162=11;
            	}
                break;
            case 284:
            	{
            		alt162=12;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 162;
                EXCEPTION->state        = 0;


                goto ruleexecutable_specifier_atomEx;

            }

            switch (alt162)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2176:4: id= ID
        	    {
        	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_executable_specifier_atom5772);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleexecutable_specifier_atomEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             spcfr.setMoc( STR((id->getText(id))->chars) ); 
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2179:4: 'start'
        	    {
        	         MATCHT(377, &FOLLOW_377_in_executable_specifier_atom5782);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleexecutable_specifier_atomEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             spcfr.setStateMocSTART();  
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2180:4: 'final'
        	    {
        	         MATCHT(282, &FOLLOW_282_in_executable_specifier_atom5794);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleexecutable_specifier_atomEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             spcfr.setStateMocFINAL();  
        	        }


        	    }
        	    break;
        	case 4:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2185:4: 'return'
        	    {
        	         MATCHT(364, &FOLLOW_364_in_executable_specifier_atom5810);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleexecutable_specifier_atomEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             spcfr.setPseudostateMocRETURN();   
        	        }


        	    }
        	    break;
        	case 5:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2188:4: 'choice'
        	    {
        	         MATCHT(257, &FOLLOW_257_in_executable_specifier_atom5823);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleexecutable_specifier_atomEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             spcfr.setPseudostateMocCHOICE();   
        	        }


        	    }
        	    break;
        	case 6:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2190:4: 'fork'
        	    {
        	         MATCHT(286, &FOLLOW_286_in_executable_specifier_atom5835);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleexecutable_specifier_atomEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             spcfr.setPseudostateMocFORK(); 
        	        }


        	    }
        	    break;
        	case 7:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2191:4: 'join'
        	    {
        	         MATCHT(312, &FOLLOW_312_in_executable_specifier_atom5848);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleexecutable_specifier_atomEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             spcfr.setPseudostateMocJOIN(); 
        	        }


        	    }
        	    break;
        	case 8:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2196:4: 'and'
        	    {
        	         MATCHT(239, &FOLLOW_239_in_executable_specifier_atom5865);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleexecutable_specifier_atomEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             spcfr.setMocCompositeStructure();     
        	        }


        	    }
        	    break;
        	case 9:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2197:4: 'or'
        	    {
        	         MATCHT(334, &FOLLOW_334_in_executable_specifier_atom5879);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleexecutable_specifier_atomEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             spcfr.setMocStateTransitionSystem();  
        	        }


        	    }
        	    break;
        	case 10:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2198:4: '#sts'
        	    {
        	         MATCHT(152, &FOLLOW_152_in_executable_specifier_atom5894);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleexecutable_specifier_atomEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             spcfr.setMocStateTransitionSystem();  
        	        }


        	    }
        	    break;
        	case 11:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2199:4: '#stf'
        	    {
        	         MATCHT(151, &FOLLOW_151_in_executable_specifier_atom5907);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleexecutable_specifier_atomEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             spcfr.setMocStateTransitionFlow();  
        	        }


        	    }
        	    break;
        	case 12:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2200:4: 'flow'
        	    {
        	         MATCHT(284, &FOLLOW_284_in_executable_specifier_atom5920);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleexecutable_specifier_atomEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             spcfr.setCompositeMocDataFlow();      
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruleexecutable_specifier_atomEx; /* Prevent compiler warnings */
    ruleexecutable_specifier_atomEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(67, executable_specifier_atom_StartIndex); }

    return ;
}
/* $ANTLR end executable_specifier_atom */

/**
 * $ANTLR start instance_machine_model
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2205:1: instance_machine_model returns [ sep::BF model ] : tid= qualifiedNameID ;
 */
static sep::BF
instance_machine_model(pfmlParser ctx)
{
    sep::BF model;

    ANTLR3_UINT32 instance_machine_model_StartIndex;

    fmlParser_qualifiedNameID_return tid;
    #undef	RETURN_TYPE_tid
    #define	RETURN_TYPE_tid fmlParser_qualifiedNameID_return

    /* Initialize rule variables
     */
    instance_machine_model_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(68)) )
    {
        {
        }



        return model;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2207:2: (tid= qualifiedNameID )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2207:4: tid= qualifiedNameID
        {
            FOLLOWPUSH(FOLLOW_qualifiedNameID_in_instance_machine_model5947);
            tid=qualifiedNameID(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruleinstance_machine_modelEx;
            }
            if (HASFAILED())
            {
                return model;
            }


            if ( BACKTRACKING==0 )
            {

                		model= sep::ParserUtil::getExecutableMachine(
                tid.s
                , tid.nb
                );

                		if( model
                .invalid() )
                		{
                			sep::ParserUtil::avm_syntax_error(
                				"instance_machine_model", LT(0)->getLine(LT(0)) )
                					<< "unexpected ID< " << tid.s
                 << " >"
                					<< sep::ParserUtil::SYNTAX_ERROR_EOL;
                		}
                	
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruleinstance_machine_modelEx; /* Prevent compiler warnings */
    ruleinstance_machine_modelEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(68, instance_machine_model_StartIndex); }

    return model;
}
/* $ANTLR end instance_machine_model */

/**
 * $ANTLR start def_body_state
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2221:1: def_body_state[ sep::Machine * state ] : LCURLY ( ( def_body_machine_using_section_predicat )=> def_body_state_section[ state ] | def_body_state_simplif[ state ] ) RCURLY ;
 */
static void
def_body_state(pfmlParser ctx, sep::Machine * state)
{
    ANTLR3_UINT32 def_body_state_StartIndex;

    /* Initialize rule variables
     */
    def_body_state_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(69)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2222:2: ( LCURLY ( ( def_body_machine_using_section_predicat )=> def_body_state_section[ state ] | def_body_state_simplif[ state ] ) RCURLY )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2222:4: LCURLY ( ( def_body_machine_using_section_predicat )=> def_body_state_section[ state ] | def_body_state_simplif[ state ] ) RCURLY
        {
             MATCHT(LCURLY, &FOLLOW_LCURLY_in_def_body_state5964);
            if  (HASEXCEPTION())
            {
                goto ruledef_body_stateEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2223:4: ( ( def_body_machine_using_section_predicat )=> def_body_state_section[ state ] | def_body_state_simplif[ state ] )
            {
                int alt163=2;
                {
                    int LA163_0 = LA(1);
                    if ( (synpred296_fml(ctx)) && (LA163_0 == 178 || LA163_0 == 213))
                    {
                        alt163=1;
                    }
                    else if ( (synpred296_fml(ctx)) && (LA163_0 == 216))
                    {
                        alt163=1;
                    }
                    else if ( (synpred296_fml(ctx)) && (LA163_0 == 214))
                    {
                        alt163=1;
                    }
                    else if ( (synpred296_fml(ctx)) && (LA163_0 == 211))
                    {
                        alt163=1;
                    }
                    else if ( (synpred296_fml(ctx)) && (LA163_0 == 222))
                    {
                        alt163=1;
                    }
                    else if ( (synpred296_fml(ctx)) && (LA163_0 == 201))
                    {
                        alt163=1;
                    }
                    else if ( (synpred296_fml(ctx)) && (LA163_0 == 212))
                    {
                        alt163=1;
                    }
                    else if ( (synpred296_fml(ctx)) && (LA163_0 == 174 || LA163_0 == 183 || LA163_0 == 200))
                    {
                        alt163=1;
                    }
                    else if ( (synpred296_fml(ctx)) && (LA163_0 == 203))
                    {
                        alt163=1;
                    }
                    else if ( (synpred296_fml(ctx)) && (LA163_0 == 215))
                    {
                        alt163=1;
                    }
                    else if ( (synpred296_fml(ctx)) && (LA163_0 == 197))
                    {
                        alt163=1;
                    }
                    else if ( (synpred296_fml(ctx)) && (LA163_0 == 217))
                    {
                        alt163=1;
                    }
                    else if ( (synpred296_fml(ctx)) && (LA163_0 == 231))
                    {
                        alt163=1;
                    }
                    else if ( (synpred296_fml(ctx)) && (LA163_0 == 202))
                    {
                        alt163=1;
                    }
                    else if ( (synpred296_fml(ctx)) && (LA163_0 == 204))
                    {
                        alt163=1;
                    }
                    else if ( (synpred296_fml(ctx)) && (LA163_0 == 172 || LA163_0 == 198))
                    {
                        alt163=1;
                    }
                    else if ( (LA163_0 == RCURLY))
                    {
                        {
                            int LA163_17 = LA(2);
                            if ( (synpred296_fml(ctx)))
                            {
                                alt163=1;
                            }
                            else if ( (ANTLR3_TRUE))
                            {
                                alt163=2;
                            }
                            else
                            {
                                if (BACKTRACKING>0)
                                {
                                    FAILEDFLAG = ANTLR3_TRUE;
                                    return ;
                                }


                                CONSTRUCTEX();
                                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                                EXCEPTION->message      = (void *)"";
                                EXCEPTION->decisionNum  = 163;
                                EXCEPTION->state        = 17;


                                goto ruledef_body_stateEx;

                            }
                        }
                    }
                    else if ( (LA163_0 == AT_ID || ((LA163_0 >= 144) && (LA163_0 <= 145)) || ((LA163_0 >= 147) && (LA163_0 <= 150)) || LA163_0 == 153 || ((LA163_0 >= 169) && (LA163_0 <= 170)) || LA163_0 == 177 || LA163_0 == 179 || LA163_0 == 182 || LA163_0 == 184 || ((LA163_0 >= 189) && (LA163_0 <= 191)) || LA163_0 == 194 || LA163_0 == 199 || ((LA163_0 >= 223) && (LA163_0 <= 224)) || LA163_0 == 243 || LA163_0 == 259 || LA163_0 == 262 || LA163_0 == 272 || LA163_0 == 282 || LA163_0 == 298 || ((LA163_0 >= 305) && (LA163_0 <= 306)) || LA163_0 == 314 || LA163_0 == 318 || LA163_0 == 322 || LA163_0 == 341 || LA163_0 == 349 || LA163_0 == 353 || LA163_0 == 355 || LA163_0 == 361 || LA163_0 == 364 || ((LA163_0 >= 378) && (LA163_0 <= 380)) || LA163_0 == 393 || ((LA163_0 >= 395) && (LA163_0 <= 396)) || LA163_0 == 406 || ((LA163_0 >= 410) && (LA163_0 <= 411)) || LA163_0 == 414))
                    {
                        alt163=2;
                    }
                    else
                    {
                        if (BACKTRACKING>0)
                        {
                            FAILEDFLAG = ANTLR3_TRUE;
                            return ;
                        }


                        CONSTRUCTEX();
                        EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                        EXCEPTION->message      = (void *)"";
                        EXCEPTION->decisionNum  = 163;
                        EXCEPTION->state        = 0;


                        goto ruledef_body_stateEx;

                    }
                }
                switch (alt163)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2223:6: ( def_body_machine_using_section_predicat )=> def_body_state_section[ state ]
            	    {
            	        FOLLOWPUSH(FOLLOW_def_body_state_section_in_def_body_state5984);
            	        def_body_state_section(ctx, state);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_stateEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2226:6: def_body_state_simplif[ state ]
            	    {
            	        FOLLOWPUSH(FOLLOW_def_body_state_simplif_in_def_body_state5993);
            	        def_body_state_simplif(ctx, state);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_stateEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

                }
            }

             MATCHT(RCURLY, &FOLLOW_RCURLY_in_def_body_state6004);
            if  (HASEXCEPTION())
            {
                goto ruledef_body_stateEx;
            }
            if (HASFAILED())
            {
                return ;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_body_stateEx; /* Prevent compiler warnings */
    ruledef_body_stateEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(69, def_body_state_StartIndex); }

    return ;
}
/* $ANTLR end def_body_state */

/**
 * $ANTLR start def_body_state_section
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2231:1: def_body_state_section[ sep::Machine * machine ] : ( section_property[ machine ] )* ( section_composite_structure[ machine ] )* ( section_region[ machine ] )? ( section_transition[ machine ] )? ( section_model_of_computation[ machine ] | section_model_of_execution[ machine ] | section_model_of_interaction[ machine ] )* ;
 */
static void
def_body_state_section(pfmlParser ctx, sep::Machine * machine)
{
    ANTLR3_UINT32 def_body_state_section_StartIndex;

    /* Initialize rule variables
     */
    def_body_state_section_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(70)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2232:2: ( ( section_property[ machine ] )* ( section_composite_structure[ machine ] )* ( section_region[ machine ] )? ( section_transition[ machine ] )? ( section_model_of_computation[ machine ] | section_model_of_execution[ machine ] | section_model_of_interaction[ machine ] )* )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2232:4: ( section_property[ machine ] )* ( section_composite_structure[ machine ] )* ( section_region[ machine ] )? ( section_transition[ machine ] )? ( section_model_of_computation[ machine ] | section_model_of_execution[ machine ] | section_model_of_interaction[ machine ] )*
        {
            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2232:4: ( section_property[ machine ] )*

            for (;;)
            {
                int alt164=2;
                switch ( LA(1) )
                {
                case 178:
                case 211:
                case 213:
                case 214:
                case 216:
                	{
                		alt164=1;
                	}
                    break;

                }

                switch (alt164)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2232:6: section_property[ machine ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_property_in_def_body_state_section6019);
            	        section_property(ctx, machine);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_state_sectionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

            	default:
            	    goto loop164;	/* break out of the loop */
            	    break;
                }
            }
            loop164: ; /* Jump out to here if this rule does not match */


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2234:4: ( section_composite_structure[ machine ] )*

            for (;;)
            {
                int alt165=2;
                switch ( LA(1) )
                {
                case 174:
                case 183:
                case 197:
                case 200:
                case 201:
                case 203:
                case 212:
                case 215:
                case 222:
                	{
                		alt165=1;
                	}
                    break;

                }

                switch (alt165)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2234:6: section_composite_structure[ machine ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_composite_structure_in_def_body_state_section6031);
            	        section_composite_structure(ctx, machine);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_state_sectionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

            	default:
            	    goto loop165;	/* break out of the loop */
            	    break;
                }
            }
            loop165: ; /* Jump out to here if this rule does not match */


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2236:4: ( section_region[ machine ] )?
            {
                int alt166=2;
                switch ( LA(1) )
                {
                    case 217:
                    	{
                    		alt166=1;
                    	}
                        break;
                }

                switch (alt166)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2236:4: section_region[ machine ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_region_in_def_body_state_section6041);
            	        section_region(ctx, machine);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_state_sectionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2238:4: ( section_transition[ machine ] )?
            {
                int alt167=2;
                switch ( LA(1) )
                {
                    case 231:
                    	{
                    		alt167=1;
                    	}
                        break;
                }

                switch (alt167)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2238:4: section_transition[ machine ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_transition_in_def_body_state_section6050);
            	        section_transition(ctx, machine);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_state_sectionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2240:4: ( section_model_of_computation[ machine ] | section_model_of_execution[ machine ] | section_model_of_interaction[ machine ] )*

            for (;;)
            {
                int alt168=4;
                switch ( LA(1) )
                {
                case 202:
                	{
                		alt168=1;
                	}
                    break;
                case 204:
                	{
                		alt168=2;
                	}
                    break;
                case 172:
                case 198:
                	{
                		alt168=3;
                	}
                    break;

                }

                switch (alt168)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2240:6: section_model_of_computation[ machine ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_model_of_computation_in_def_body_state_section6061);
            	        section_model_of_computation(ctx, machine);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_state_sectionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2241:6: section_model_of_execution[ machine ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_model_of_execution_in_def_body_state_section6069);
            	        section_model_of_execution(ctx, machine);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_state_sectionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;
            	case 3:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2242:6: section_model_of_interaction[ machine ]
            	    {
            	        FOLLOWPUSH(FOLLOW_section_model_of_interaction_in_def_body_state_section6077);
            	        section_model_of_interaction(ctx, machine);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_body_state_sectionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

            	default:
            	    goto loop168;	/* break out of the loop */
            	    break;
                }
            }
            loop168: ; /* Jump out to here if this rule does not match */


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_body_state_sectionEx; /* Prevent compiler warnings */
    ruledef_body_state_sectionEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(70, def_body_state_section_StartIndex); }

    return ;
}
/* $ANTLR end def_body_state_section */

/**
 * $ANTLR start def_body_state_simplif
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2246:1: def_body_state_simplif[ sep::Machine * state ] : ( (m= modifier_declaration )? ( decl_variable[ state->getPropertyPart() , mdfr ] |ads= any_def_statemachine[ state , mdfr , spcfr ] | def_transition[ state , mdfr , spcfr ] | def_state_activity[ state ] ) )* ;
 */
static void
def_body_state_simplif(pfmlParser ctx, sep::Machine * state)
{
    ANTLR3_UINT32 def_body_state_simplif_StartIndex;

    sep::Modifier m;
    #undef	RETURN_TYPE_m
    #define	RETURN_TYPE_m sep::Modifier

    sep::Machine * ads;
    #undef	RETURN_TYPE_ads
    #define	RETURN_TYPE_ads sep::Machine *

    /* Initialize rule variables
     */
    def_body_state_simplif_StartIndex = INDEX();



    	 sep::Modifier mdfr;

    	sep::Specifier spcfr;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(71)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2252:2: ( ( (m= modifier_declaration )? ( decl_variable[ state->getPropertyPart() , mdfr ] |ads= any_def_statemachine[ state , mdfr , spcfr ] | def_transition[ state , mdfr , spcfr ] | def_state_activity[ state ] ) )* )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2252:4: ( (m= modifier_declaration )? ( decl_variable[ state->getPropertyPart() , mdfr ] |ads= any_def_statemachine[ state , mdfr , spcfr ] | def_transition[ state , mdfr , spcfr ] | def_state_activity[ state ] ) )*
        {
            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2252:4: ( (m= modifier_declaration )? ( decl_variable[ state->getPropertyPart() , mdfr ] |ads= any_def_statemachine[ state , mdfr , spcfr ] | def_transition[ state , mdfr , spcfr ] | def_state_activity[ state ] ) )*

            for (;;)
            {
                int alt171=2;
                switch ( LA(1) )
                {
                case AT_ID:
                case 144:
                case 145:
                case 147:
                case 148:
                case 149:
                case 150:
                case 153:
                case 169:
                case 170:
                case 177:
                case 179:
                case 182:
                case 184:
                case 189:
                case 190:
                case 191:
                case 194:
                case 199:
                case 223:
                case 224:
                case 243:
                case 259:
                case 262:
                case 272:
                case 282:
                case 298:
                case 305:
                case 306:
                case 314:
                case 318:
                case 322:
                case 341:
                case 349:
                case 353:
                case 355:
                case 361:
                case 364:
                case 378:
                case 379:
                case 380:
                case 393:
                case 395:
                case 396:
                case 406:
                case 410:
                case 411:
                case 414:
                	{
                		alt171=1;
                	}
                    break;

                }

                switch (alt171)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2252:6: (m= modifier_declaration )? ( decl_variable[ state->getPropertyPart() , mdfr ] |ads= any_def_statemachine[ state , mdfr , spcfr ] | def_transition[ state , mdfr , spcfr ] | def_state_activity[ state ] )
            	    {
            	        if ( BACKTRACKING==0 )
            	        {
            	             mdfr = sep::Modifier::PROPERTY_UNDEFINED_MODIFIER; 
            	        }


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2254:3: (m= modifier_declaration )?
            	        {
            	            int alt169=2;
            	            switch ( LA(1) )
            	            {
            	                case 406:
            	                	{
            	                		{
            	                		    int LA169_1 = LA(2);
            	                		    if ( (synpred304_fml(ctx)))
            	                		    {
            	                		        alt169=1;
            	                		    }
            	                		}
            	                	}
            	                    break;
            	                case 243:
            	                case 282:
            	                case 298:
            	                case 305:
            	                case 341:
            	                case 349:
            	                case 355:
            	                case 361:
            	                case 364:
            	                case 380:
            	                case 395:
            	                case 414:
            	                	{
            	                		alt169=1;
            	                	}
            	                    break;
            	            }

            	            switch (alt169)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2254:5: m= modifier_declaration
            	        	    {
            	        	        FOLLOWPUSH(FOLLOW_modifier_declaration_in_def_body_state_simplif6112);
            	        	        m=modifier_declaration(ctx);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledef_body_state_simplifEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             mdfr = m
            	        	            ; 
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2256:6: ( decl_variable[ state->getPropertyPart() , mdfr ] |ads= any_def_statemachine[ state , mdfr , spcfr ] | def_transition[ state , mdfr , spcfr ] | def_state_activity[ state ] )
            	        {
            	            int alt170=4;
            	            switch ( LA(1) )
            	            {
            	            case 259:
            	            case 262:
            	            case 318:
            	            case 410:
            	            case 411:
            	            	{
            	            		alt170=1;
            	            	}
            	                break;
            	            case 144:
            	            case 145:
            	            case 147:
            	            case 148:
            	            case 149:
            	            case 150:
            	            case 153:
            	            case 272:
            	            case 306:
            	            case 314:
            	            case 322:
            	            case 353:
            	            case 378:
            	            case 379:
            	            case 393:
            	            case 406:
            	            	{
            	            		alt170=2;
            	            	}
            	                break;
            	            case AT_ID:
            	            case 169:
            	            case 396:
            	            	{
            	            		alt170=3;
            	            	}
            	                break;
            	            case 170:
            	            case 177:
            	            case 179:
            	            case 182:
            	            case 184:
            	            case 189:
            	            case 190:
            	            case 191:
            	            case 194:
            	            case 199:
            	            case 223:
            	            case 224:
            	            	{
            	            		alt170=4;
            	            	}
            	                break;

            	            default:
            	                if (BACKTRACKING>0)
            	                {
            	                    FAILEDFLAG = ANTLR3_TRUE;
            	                    return ;
            	                }

            	                CONSTRUCTEX();
            	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
            	                EXCEPTION->message      = (void *)"";
            	                EXCEPTION->decisionNum  = 170;
            	                EXCEPTION->state        = 0;


            	                goto ruledef_body_state_simplifEx;

            	            }

            	            switch (alt170)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2256:8: decl_variable[ state->getPropertyPart() , mdfr ]
            	        	    {
            	        	        FOLLOWPUSH(FOLLOW_decl_variable_in_def_body_state_simplif6128);
            	        	        decl_variable(ctx, state->getPropertyPart(), mdfr);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledef_body_state_simplifEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	    }
            	        	    break;
            	        	case 2:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2258:8: ads= any_def_statemachine[ state , mdfr , spcfr ]
            	        	    {
            	        	        FOLLOWPUSH(FOLLOW_any_def_statemachine_in_def_body_state_simplif6141);
            	        	        ads=any_def_statemachine(ctx, state, mdfr, spcfr);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledef_body_state_simplifEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	    }
            	        	    break;
            	        	case 3:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2260:8: def_transition[ state , mdfr , spcfr ]
            	        	    {
            	        	        FOLLOWPUSH(FOLLOW_def_transition_in_def_body_state_simplif6152);
            	        	        def_transition(ctx, state, mdfr, spcfr);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledef_body_state_simplifEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	    }
            	        	    break;
            	        	case 4:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2262:8: def_state_activity[ state ]
            	        	    {
            	        	        FOLLOWPUSH(FOLLOW_def_state_activity_in_def_body_state_simplif6163);
            	        	        def_state_activity(ctx, state);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledef_body_state_simplifEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	    }
            	    break;

            	default:
            	    goto loop171;	/* break out of the loop */
            	    break;
                }
            }
            loop171: ; /* Jump out to here if this rule does not match */


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_body_state_simplifEx; /* Prevent compiler warnings */
    ruledef_body_state_simplifEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(71, def_body_state_simplif_StartIndex); }

    return ;
}
/* $ANTLR end def_body_state_simplif */

/**
 * $ANTLR start section_transition
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2267:1: section_transition[ sep::Machine * state ] : '@transition:' ( (m= modifier_transition )? def_transition[ state , mdfr , spcfr ] )* ;
 */
static void
section_transition(pfmlParser ctx, sep::Machine * state)
{
    ANTLR3_UINT32 section_transition_StartIndex;

    fmlParser_modifier_transition_return m;
    #undef	RETURN_TYPE_m
    #define	RETURN_TYPE_m fmlParser_modifier_transition_return

    /* Initialize rule variables
     */
    section_transition_StartIndex = INDEX();



    	 sep::Modifier mdfr;

    	sep::Specifier spcfr;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(72)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2273:2: ( '@transition:' ( (m= modifier_transition )? def_transition[ state , mdfr , spcfr ] )* )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2273:4: '@transition:' ( (m= modifier_transition )? def_transition[ state , mdfr , spcfr ] )*
        {
             MATCHT(231, &FOLLOW_231_in_section_transition6194);
            if  (HASEXCEPTION())
            {
                goto rulesection_transitionEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2274:4: ( (m= modifier_transition )? def_transition[ state , mdfr , spcfr ] )*

            for (;;)
            {
                int alt173=2;
                switch ( LA(1) )
                {
                case AT_ID:
                case 169:
                case 306:
                case 393:
                case 395:
                case 396:
                	{
                		alt173=1;
                	}
                    break;

                }

                switch (alt173)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2274:6: (m= modifier_transition )? def_transition[ state , mdfr , spcfr ]
            	    {
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2274:6: (m= modifier_transition )?
            	        {
            	            int alt172=2;
            	            switch ( LA(1) )
            	            {
            	                case 306:
            	                case 393:
            	                case 395:
            	                	{
            	                		alt172=1;
            	                	}
            	                    break;
            	            }

            	            switch (alt172)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2274:8: m= modifier_transition
            	        	    {
            	        	        FOLLOWPUSH(FOLLOW_modifier_transition_in_section_transition6205);
            	        	        m=modifier_transition(ctx);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto rulesection_transitionEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             mdfr = m.mdfr
            	        	            ; 
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	        FOLLOWPUSH(FOLLOW_def_transition_in_section_transition6218);
            	        def_transition(ctx, state, mdfr, spcfr);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulesection_transitionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

            	default:
            	    goto loop173;	/* break out of the loop */
            	    break;
                }
            }
            loop173: ; /* Jump out to here if this rule does not match */


        }

    }

    // This is where rules clean up and exit
    //
    goto rulesection_transitionEx; /* Prevent compiler warnings */
    rulesection_transitionEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(72, section_transition_StartIndex); }

    return ;
}
/* $ANTLR end section_transition */

/**
 * $ANTLR start def_transition
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2279:1: def_transition[ sep::Machine * state ,\n\t\tsep::Modifier mdfr , sep::Specifier spcfr ] : ( (tok= '@' | (tok= AT_ID ) ) ( LT_ moc_transition[ trans ] GT )? moe_transition[ trans ] | 'transition' ( LT_ moc_transition[ trans ] GT )? (id= ID )? ( StringLiteral )? moe_transition[ trans ] );
 */
static void
def_transition(pfmlParser ctx, sep::Machine * state, sep::Modifier mdfr, sep::Specifier spcfr)
{
    ANTLR3_UINT32 def_transition_StartIndex;

    pANTLR3_COMMON_TOKEN    tok;
    pANTLR3_COMMON_TOKEN    id;
    pANTLR3_COMMON_TOKEN    StringLiteral8;

    /* Initialize rule variables
     */
    def_transition_StartIndex = INDEX();



    	sep::Transition * trans = NULL;
    	std::string t_id;

    	mProcedureCallCount = 0;

    	SAVE_RULE_BEGIN_LOCATION;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(73)) )
    {
        {

            	if( (mProcedureCallCount > 0) && (trans != NULL) )
            	{
            		sep::ParserUtil::inlineTransitionProcedureCall(trans, trans->getNameID());
            	}

            	SET_RULE_LOCATION(trans);

        }
        {
        }



        return ;
    }

    tok       = NULL;
    id       = NULL;
    StringLiteral8       = NULL;

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2298:2: ( (tok= '@' | (tok= AT_ID ) ) ( LT_ moc_transition[ trans ] GT )? moe_transition[ trans ] | 'transition' ( LT_ moc_transition[ trans ] GT )? (id= ID )? ( StringLiteral )? moe_transition[ trans ] )

            ANTLR3_UINT32 alt179;

            alt179=2;

            switch ( LA(1) )
            {
            case AT_ID:
            case 169:
            	{
            		alt179=1;
            	}
                break;
            case 396:
            	{
            		alt179=2;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 179;
                EXCEPTION->state        = 0;


                goto ruledef_transitionEx;

            }

            switch (alt179)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2298:4: (tok= '@' | (tok= AT_ID ) ) ( LT_ moc_transition[ trans ] GT )? moe_transition[ trans ]
        	    {
        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2298:4: (tok= '@' | (tok= AT_ID ) )
        	        {
        	            int alt174=2;
        	            switch ( LA(1) )
        	            {
        	            case 169:
        	            	{
        	            		alt174=1;
        	            	}
        	                break;
        	            case AT_ID:
        	            	{
        	            		alt174=2;
        	            	}
        	                break;

        	            default:
        	                if (BACKTRACKING>0)
        	                {
        	                    FAILEDFLAG = ANTLR3_TRUE;
        	                    return ;
        	                }

        	                CONSTRUCTEX();
        	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
        	                EXCEPTION->message      = (void *)"";
        	                EXCEPTION->decisionNum  = 174;
        	                EXCEPTION->state        = 0;


        	                goto ruledef_transitionEx;

        	            }

        	            switch (alt174)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2298:6: tok= '@'
        	        	    {
        	        	        tok = (pANTLR3_COMMON_TOKEN) MATCHT(169, &FOLLOW_169_in_def_transition6251);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_transitionEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;
        	        	case 2:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2299:6: (tok= AT_ID )
        	        	    {
        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2299:6: (tok= AT_ID )
        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2299:8: tok= AT_ID
        	        	        {
        	        	            tok = (pANTLR3_COMMON_TOKEN) MATCHT(AT_ID, &FOLLOW_AT_ID_in_def_transition6262);
        	        	            if  (HASEXCEPTION())
        	        	            {
        	        	                goto ruledef_transitionEx;
        	        	            }
        	        	            if (HASFAILED())
        	        	            {
        	        	                return ;
        	        	            }


        	        	            if ( BACKTRACKING==0 )
        	        	            {
        	        	                 t_id = STR((tok->getText(tok))->chars); 
        	        	            }


        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	        if ( BACKTRACKING==0 )
        	        {

        	            	  	state->getUniqBehaviorPart()->saveOutgoingTransition(
        	            	  			trans = new sep::Transition(state, newTransitionID(t_id)) );

        	            	  	trans->setModifier( mdfr );

        	            	  	trans->setSpecifier( spcfr );
        	            	  
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2309:4: ( LT_ moc_transition[ trans ] GT )?
        	        {
        	            int alt175=2;
        	            switch ( LA(1) )
        	            {
        	                case LT_:
        	                	{
        	                		alt175=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt175)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2309:6: LT_ moc_transition[ trans ] GT
        	        	    {
        	        	         MATCHT(LT_, &FOLLOW_LT__in_def_transition6284);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_transitionEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_moc_transition_in_def_transition6287);
        	        	        moc_transition(ctx, trans);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_transitionEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	         MATCHT(GT, &FOLLOW_GT_in_def_transition6291);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_transitionEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	        FOLLOWPUSH(FOLLOW_moe_transition_in_def_transition6300);
        	        moe_transition(ctx, trans);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_transitionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2313:4: 'transition' ( LT_ moc_transition[ trans ] GT )? (id= ID )? ( StringLiteral )? moe_transition[ trans ]
        	    {
        	         MATCHT(396, &FOLLOW_396_in_def_transition6307);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_transitionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {

        	            	  	state->getUniqBehaviorPart()->saveOutgoingTransition(
        	            	  			trans = new sep::Transition(state) );

        	            	  	trans->setModifier( mdfr );

        	            	  	trans->setSpecifier( spcfr );
        	            	  
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2322:4: ( LT_ moc_transition[ trans ] GT )?
        	        {
        	            int alt176=2;
        	            switch ( LA(1) )
        	            {
        	                case LT_:
        	                	{
        	                		alt176=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt176)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2322:6: LT_ moc_transition[ trans ] GT
        	        	    {
        	        	         MATCHT(LT_, &FOLLOW_LT__in_def_transition6319);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_transitionEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_moc_transition_in_def_transition6321);
        	        	        moc_transition(ctx, trans);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_transitionEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	         MATCHT(GT, &FOLLOW_GT_in_def_transition6324);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_transitionEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2324:4: (id= ID )?
        	        {
        	            int alt177=2;
        	            switch ( LA(1) )
        	            {
        	                case ID:
        	                	{
        	                		alt177=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt177)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2324:6: id= ID
        	        	    {
        	        	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_def_transition6337);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_transitionEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             t_id = STR((id->getText(id))->chars); 
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	        if ( BACKTRACKING==0 )
        	        {
        	             trans->fullyUpdateAllNameID( newTransitionID(t_id) ); 
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2327:4: ( StringLiteral )?
        	        {
        	            int alt178=2;
        	            switch ( LA(1) )
        	            {
        	                case StringLiteral:
        	                	{
        	                		alt178=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt178)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2327:6: StringLiteral
        	        	    {
        	        	        StringLiteral8 = (pANTLR3_COMMON_TOKEN) MATCHT(StringLiteral, &FOLLOW_StringLiteral_in_def_transition6355);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_transitionEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             trans->setUnrestrictedName(STR((StringLiteral8->getText(StringLiteral8))->chars)); 
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	        FOLLOWPUSH(FOLLOW_moe_transition_in_def_transition6372);
        	        moe_transition(ctx, trans);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_transitionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruledef_transitionEx; /* Prevent compiler warnings */
    ruledef_transitionEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
            else
            {
                {

                    	if( (mProcedureCallCount > 0) && (trans != NULL) )
                    	{
                    		sep::ParserUtil::inlineTransitionProcedureCall(trans, trans->getNameID());
                    	}

                    	SET_RULE_LOCATION(trans);

                }
            }


    if ( BACKTRACKING>0 ) { MEMOIZE(73, def_transition_StartIndex); }

    return ;
}
/* $ANTLR end def_transition */

/**
 * $ANTLR start kind_transition
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2334:1: kind_transition returns [ sep::Transition::MOC_KIND kind ] : (id= ID | 'abort' | 'final' | 'else' | 'flow' );
 */
static sep::Transition::MOC_KIND
kind_transition(pfmlParser ctx)
{
    sep::Transition::MOC_KIND kind;

    ANTLR3_UINT32 kind_transition_StartIndex;

    pANTLR3_COMMON_TOKEN    id;

    /* Initialize rule variables
     */
    kind_transition_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(74)) )
    {
        {
        }



        return kind;
    }

    id       = NULL;

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2336:2: (id= ID | 'abort' | 'final' | 'else' | 'flow' )

            ANTLR3_UINT32 alt180;

            alt180=5;

            switch ( LA(1) )
            {
            case ID:
            	{
            		alt180=1;
            	}
                break;
            case 236:
            	{
            		alt180=2;
            	}
                break;
            case 282:
            	{
            		alt180=3;
            	}
                break;
            case 273:
            	{
            		alt180=4;
            	}
                break;
            case 284:
            	{
            		alt180=5;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return kind;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 180;
                EXCEPTION->state        = 0;


                goto rulekind_transitionEx;

            }

            switch (alt180)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2336:4: id= ID
        	    {
        	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_kind_transition6390);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulekind_transitionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return kind;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {

        	            		if( (kind= sep::Transition::toMocKind(STR((id->getText(id))->chars))) ==
        	            			sep::Transition::MOC_UNDEFINED_KIND )
        	            		{
        	            			sep::ParserUtil::avm_syntax_error( "kind_transition", (id->getLine(id)) )
        	            					<< "unexpected ID< " << STR((id->getText(id))->chars) << " >"
        	            					<< sep::ParserUtil::SYNTAX_ERROR_EOL;

        	            		}
        	            	
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2347:4: 'abort'
        	    {
        	         MATCHT(236, &FOLLOW_236_in_kind_transition6399);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulekind_transitionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return kind;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             kind= sep::Transition::MOC_ABORT_KIND;
        	                
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2348:4: 'final'
        	    {
        	         MATCHT(282, &FOLLOW_282_in_kind_transition6409);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulekind_transitionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return kind;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             kind= sep::Transition::MOC_FINAL_KIND;
        	                
        	        }


        	    }
        	    break;
        	case 4:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2349:4: 'else'
        	    {
        	         MATCHT(273, &FOLLOW_273_in_kind_transition6419);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulekind_transitionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return kind;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             kind= sep::Transition::MOC_ELSE_KIND;
        	                 
        	        }


        	    }
        	    break;
        	case 5:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2352:4: 'flow'
        	    {
        	         MATCHT(284, &FOLLOW_284_in_kind_transition6432);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulekind_transitionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return kind;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             kind= sep::Transition::MOC_FLOW_KIND;
        	                 
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto rulekind_transitionEx; /* Prevent compiler warnings */
    rulekind_transitionEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(74, kind_transition_StartIndex); }

    return kind;
}
/* $ANTLR end kind_transition */

/**
 * $ANTLR start moc_transition_attribute
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2356:1: moc_transition_attribute returns [ sep::Transition::moc_kind_t kind ] : kt= kind_transition ( BAND 'else' )? ;
 */
static sep::Transition::moc_kind_t
moc_transition_attribute(pfmlParser ctx)
{
    sep::Transition::moc_kind_t kind;

    ANTLR3_UINT32 moc_transition_attribute_StartIndex;

    sep::Transition::MOC_KIND kt;
    #undef	RETURN_TYPE_kt
    #define	RETURN_TYPE_kt sep::Transition::MOC_KIND

    /* Initialize rule variables
     */
    moc_transition_attribute_StartIndex = INDEX();



    	kind= sep::Transition::MOC_UNDEFINED_KIND;


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(75)) )
    {
        {
        }



        return kind;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2361:2: (kt= kind_transition ( BAND 'else' )? )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2361:4: kt= kind_transition ( BAND 'else' )?
        {
            FOLLOWPUSH(FOLLOW_kind_transition_in_moc_transition_attribute6460);
            kt=kind_transition(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto rulemoc_transition_attributeEx;
            }
            if (HASFAILED())
            {
                return kind;
            }


            if ( BACKTRACKING==0 )
            {
                 kind= 
                kt
                ;
                 
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2362:2: ( BAND 'else' )?
            {
                int alt181=2;
                switch ( LA(1) )
                {
                    case BAND:
                    	{
                    		alt181=1;
                    	}
                        break;
                }

                switch (alt181)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2362:4: BAND 'else'
            	    {
            	         MATCHT(BAND, &FOLLOW_BAND_in_moc_transition_attribute6467);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulemoc_transition_attributeEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return kind;
            	        }


            	         MATCHT(273, &FOLLOW_273_in_moc_transition_attribute6469);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulemoc_transition_attributeEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return kind;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             kind= 
            	            kind
            	             | sep::Transition::MOC_ELSE_KIND;
            	             
            	        }


            	    }
            	    break;

                }
            }

        }

    }

    // This is where rules clean up and exit
    //
    goto rulemoc_transition_attributeEx; /* Prevent compiler warnings */
    rulemoc_transition_attributeEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(75, moc_transition_attribute_StartIndex); }

    return kind;
}
/* $ANTLR end moc_transition_attribute */

/**
 * $ANTLR start moc_transition
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2365:1: moc_transition[ sep::Transition * trans ] : moc_transition_atom[ trans ] ( COMMA moc_transition_atom[ trans ] )* ;
 */
static void
moc_transition(pfmlParser ctx, sep::Transition * trans)
{
    ANTLR3_UINT32 moc_transition_StartIndex;

    /* Initialize rule variables
     */
    moc_transition_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(76)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2366:2: ( moc_transition_atom[ trans ] ( COMMA moc_transition_atom[ trans ] )* )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2366:4: moc_transition_atom[ trans ] ( COMMA moc_transition_atom[ trans ] )*
        {
            FOLLOWPUSH(FOLLOW_moc_transition_atom_in_moc_transition6494);
            moc_transition_atom(ctx, trans);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto rulemoc_transitionEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2366:33: ( COMMA moc_transition_atom[ trans ] )*

            for (;;)
            {
                int alt182=2;
                switch ( LA(1) )
                {
                case COMMA:
                	{
                		alt182=1;
                	}
                    break;

                }

                switch (alt182)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2366:35: COMMA moc_transition_atom[ trans ]
            	    {
            	         MATCHT(COMMA, &FOLLOW_COMMA_in_moc_transition6499);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulemoc_transitionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        FOLLOWPUSH(FOLLOW_moc_transition_atom_in_moc_transition6501);
            	        moc_transition_atom(ctx, trans);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulemoc_transitionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

            	default:
            	    goto loop182;	/* break out of the loop */
            	    break;
                }
            }
            loop182: ; /* Jump out to here if this rule does not match */


        }

    }

    // This is where rules clean up and exit
    //
    goto rulemoc_transitionEx; /* Prevent compiler warnings */
    rulemoc_transitionEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(76, moc_transition_StartIndex); }

    return ;
}
/* $ANTLR end moc_transition */

/**
 * $ANTLR start moc_transition_atom
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2369:1: moc_transition_atom[ sep::Transition * trans ] : ( ( 'moc:' )? kt= moc_transition_attribute | ( 'prior:' )? n= integer_constant | ( 'proba:' )? p= float_constant );
 */
static void
moc_transition_atom(pfmlParser ctx, sep::Transition * trans)
{
    ANTLR3_UINT32 moc_transition_atom_StartIndex;

    sep::Transition::moc_kind_t kt;
    #undef	RETURN_TYPE_kt
    #define	RETURN_TYPE_kt sep::Transition::moc_kind_t

    sep::avm_size_t n;
    #undef	RETURN_TYPE_n
    #define	RETURN_TYPE_n sep::avm_size_t

    sep::avm_float_t p;
    #undef	RETURN_TYPE_p
    #define	RETURN_TYPE_p sep::avm_float_t

    /* Initialize rule variables
     */
    moc_transition_atom_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(77)) )
    {
        {
        }



        return ;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2370:2: ( ( 'moc:' )? kt= moc_transition_attribute | ( 'prior:' )? n= integer_constant | ( 'proba:' )? p= float_constant )

            ANTLR3_UINT32 alt186;

            alt186=3;

            switch ( LA(1) )
            {
            case ID:
            	{
            		{
            		    int LA186_1 = LA(2);
            		    if ( (synpred324_fml(ctx)))
            		    {
            		        alt186=1;
            		    }
            		    else if ( (synpred326_fml(ctx)))
            		    {
            		        alt186=2;
            		    }
            		    else if ( (ANTLR3_TRUE))
            		    {
            		        alt186=3;
            		    }
            		    else
            		    {
            		        if (BACKTRACKING>0)
            		        {
            		            FAILEDFLAG = ANTLR3_TRUE;
            		            return ;
            		        }


            		        CONSTRUCTEX();
            		        EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
            		        EXCEPTION->message      = (void *)"";
            		        EXCEPTION->decisionNum  = 186;
            		        EXCEPTION->state        = 1;


            		        goto rulemoc_transition_atomEx;

            		    }
            		}
            	}
                break;
            case 236:
            case 273:
            case 282:
            case 284:
            case 321:
            	{
            		alt186=1;
            	}
                break;
            case IntegerLiteral:
            case 348:
            	{
            		alt186=2;
            	}
                break;
            case FloatLiteral:
            case 350:
            	{
            		alt186=3;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 186;
                EXCEPTION->state        = 0;


                goto rulemoc_transition_atomEx;

            }

            switch (alt186)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2370:4: ( 'moc:' )? kt= moc_transition_attribute
        	    {
        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2370:4: ( 'moc:' )?
        	        {
        	            int alt183=2;
        	            switch ( LA(1) )
        	            {
        	                case 321:
        	                	{
        	                		alt183=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt183)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2370:6: 'moc:'
        	        	    {
        	        	         MATCHT(321, &FOLLOW_321_in_moc_transition_atom6520);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulemoc_transition_atomEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	        FOLLOWPUSH(FOLLOW_moc_transition_attribute_in_moc_transition_atom6527);
        	        kt=moc_transition_attribute(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulemoc_transition_atomEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             trans->setMocKind( kt
        	             ); 
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2373:4: ( 'prior:' )? n= integer_constant
        	    {
        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2373:4: ( 'prior:' )?
        	        {
        	            int alt184=2;
        	            switch ( LA(1) )
        	            {
        	                case 348:
        	                	{
        	                		alt184=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt184)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2373:6: 'prior:'
        	        	    {
        	        	         MATCHT(348, &FOLLOW_348_in_moc_transition_atom6538);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulemoc_transition_atomEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	        FOLLOWPUSH(FOLLOW_integer_constant_in_moc_transition_atom6545);
        	        n=integer_constant(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulemoc_transition_atomEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             trans->setPriority( n
        	             ); 
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2376:4: ( 'proba:' )? p= float_constant
        	    {
        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2376:4: ( 'proba:' )?
        	        {
        	            int alt185=2;
        	            switch ( LA(1) )
        	            {
        	                case 350:
        	                	{
        	                		alt185=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt185)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2376:6: 'proba:'
        	        	    {
        	        	         MATCHT(350, &FOLLOW_350_in_moc_transition_atom6556);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulemoc_transition_atomEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	        FOLLOWPUSH(FOLLOW_float_constant_in_moc_transition_atom6563);
        	        p=float_constant(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulemoc_transition_atomEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             trans->setProbability( p
        	             ); 
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto rulemoc_transition_atomEx; /* Prevent compiler warnings */
    rulemoc_transition_atomEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(77, moc_transition_atom_StartIndex); }

    return ;
}
/* $ANTLR end moc_transition_atom */

/**
 * $ANTLR start moe_transition
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2381:1: moe_transition[ sep::Transition * trans ] : (bs= transition_statement ( ( '-->' )? tid= target_state_id SEMI )? | '-->' tid= target_state_id (bs= transition_statement | SEMI ) );
 */
static void
moe_transition(pfmlParser ctx, sep::Transition * trans)
{
    ANTLR3_UINT32 moe_transition_StartIndex;

    sep::BFCode bs;
    #undef	RETURN_TYPE_bs
    #define	RETURN_TYPE_bs sep::BFCode

    sep::BF tid;
    #undef	RETURN_TYPE_tid
    #define	RETURN_TYPE_tid sep::BF

    /* Initialize rule variables
     */
    moe_transition_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(78)) )
    {
        {
        }



        return ;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2382:2: (bs= transition_statement ( ( '-->' )? tid= target_state_id SEMI )? | '-->' tid= target_state_id (bs= transition_statement | SEMI ) )

            ANTLR3_UINT32 alt190;

            alt190=2;

            switch ( LA(1) )
            {
            case LCURLY:
            	{
            		alt190=1;
            	}
                break;
            case 163:
            	{
            		alt190=2;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 190;
                EXCEPTION->state        = 0;


                goto rulemoe_transitionEx;

            }

            switch (alt190)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2382:4: bs= transition_statement ( ( '-->' )? tid= target_state_id SEMI )?
        	    {
        	        FOLLOWPUSH(FOLLOW_transition_statement_in_moe_transition6582);
        	        bs=transition_statement(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulemoe_transitionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             trans->setStatement(bs
        	            );   
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2383:4: ( ( '-->' )? tid= target_state_id SEMI )?
        	        {
        	            int alt188=2;
        	            switch ( LA(1) )
        	            {
        	                case 144:
        	                case 145:
        	                case 147:
        	                case 148:
        	                case 149:
        	                case 150:
        	                case 153:
        	                	{
        	                		{
        	                		    int LA188_1 = LA(2);
        	                		    if ( (synpred329_fml(ctx)))
        	                		    {
        	                		        alt188=1;
        	                		    }
        	                		}
        	                	}
        	                    break;
        	                case DOLLAR:
        	                case ID:
        	                case 146:
        	                case 163:
        	                	{
        	                		alt188=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt188)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2383:6: ( '-->' )? tid= target_state_id SEMI
        	        	    {
        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2383:6: ( '-->' )?
        	        	        {
        	        	            int alt187=2;
        	        	            switch ( LA(1) )
        	        	            {
        	        	                case 163:
        	        	                	{
        	        	                		alt187=1;
        	        	                	}
        	        	                    break;
        	        	            }

        	        	            switch (alt187)
        	        	            {
        	        	        	case 1:
        	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2383:8: '-->'
        	        	        	    {
        	        	        	         MATCHT(163, &FOLLOW_163_in_moe_transition6600);
        	        	        	        if  (HASEXCEPTION())
        	        	        	        {
        	        	        	            goto rulemoe_transitionEx;
        	        	        	        }
        	        	        	        if (HASFAILED())
        	        	        	        {
        	        	        	            return ;
        	        	        	        }


        	        	        	    }
        	        	        	    break;

        	        	            }
        	        	        }

        	        	        FOLLOWPUSH(FOLLOW_target_state_id_in_moe_transition6612);
        	        	        tid=target_state_id(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulemoe_transitionEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             trans->setTarget(tid
        	        	            ); 
        	        	        }


        	        	         MATCHT(SEMI, &FOLLOW_SEMI_in_moe_transition6629);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulemoe_transitionEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2388:4: '-->' tid= target_state_id (bs= transition_statement | SEMI )
        	    {
        	         MATCHT(163, &FOLLOW_163_in_moe_transition6638);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulemoe_transitionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_target_state_id_in_moe_transition6642);
        	        tid=target_state_id(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulemoe_transitionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             trans->setTarget(tid
        	            ); 
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2390:4: (bs= transition_statement | SEMI )
        	        {
        	            int alt189=2;
        	            switch ( LA(1) )
        	            {
        	            case LCURLY:
        	            	{
        	            		alt189=1;
        	            	}
        	                break;
        	            case SEMI:
        	            	{
        	            		alt189=2;
        	            	}
        	                break;

        	            default:
        	                if (BACKTRACKING>0)
        	                {
        	                    FAILEDFLAG = ANTLR3_TRUE;
        	                    return ;
        	                }

        	                CONSTRUCTEX();
        	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
        	                EXCEPTION->message      = (void *)"";
        	                EXCEPTION->decisionNum  = 189;
        	                EXCEPTION->state        = 0;


        	                goto rulemoe_transitionEx;

        	            }

        	            switch (alt189)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2390:6: bs= transition_statement
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_transition_statement_in_moe_transition6659);
        	        	        bs=transition_statement(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulemoe_transitionEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             trans->setStatement(bs
        	        	            ); 
        	        	        }


        	        	    }
        	        	    break;
        	        	case 2:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2391:6: SEMI
        	        	    {
        	        	         MATCHT(SEMI, &FOLLOW_SEMI_in_moe_transition6673);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulemoe_transitionEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto rulemoe_transitionEx; /* Prevent compiler warnings */
    rulemoe_transitionEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(78, moe_transition_StartIndex); }

    return ;
}
/* $ANTLR end moe_transition */

/**
 * $ANTLR start transition_statement
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2395:1: transition_statement returns [ sep::BFCode ac ] : LCURLY (o= op_block )? (s= statement )* ( transition_trigger[ ac ] )? ( transition_guard[ ac ] )? ( transition_timed_guard[ ac ] )? ( transition_effect[ ac ] )? RCURLY ;
 */
static sep::BFCode
transition_statement(pfmlParser ctx)
{
    sep::BFCode ac;

    ANTLR3_UINT32 transition_statement_StartIndex;

    sep::Operator * o;
    #undef	RETURN_TYPE_o
    #define	RETURN_TYPE_o sep::Operator *

    sep::BFCode s;
    #undef	RETURN_TYPE_s
    #define	RETURN_TYPE_s sep::BFCode

    /* Initialize rule variables
     */
    transition_statement_StartIndex = INDEX();



    	sep::Operator * op = OP(SEQUENCE);
    	bool implicitSequenceOp = true;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(79)) )
    {
        {

            	if( implicitSequenceOp && ac
            .valid() && ac
            ->singleton() &&
            			sep::OperatorManager::isSchedule(op) )
            	{
            		sep::BFCode singleCode = ac
            ->first().bfCode();
            		ac= singleCode;

            	}

        }
        {
        }



        return ac;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2409:2: ( LCURLY (o= op_block )? (s= statement )* ( transition_trigger[ ac ] )? ( transition_guard[ ac ] )? ( transition_timed_guard[ ac ] )? ( transition_effect[ ac ] )? RCURLY )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2409:4: LCURLY (o= op_block )? (s= statement )* ( transition_trigger[ ac ] )? ( transition_guard[ ac ] )? ( transition_timed_guard[ ac ] )? ( transition_effect[ ac ] )? RCURLY
        {
             MATCHT(LCURLY, &FOLLOW_LCURLY_in_transition_statement6701);
            if  (HASEXCEPTION())
            {
                goto ruletransition_statementEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2409:12: (o= op_block )?
            {
                int alt191=2;
                switch ( LA(1) )
                {
                    case OP_ATOMIC_SEQUENCE:
                    case OP_CONCURRENCY_AND:
                    case OP_CONCURRENCY_ASYNC:
                    case OP_CONCURRENCY_INTERLEAVING:
                    case OP_CONCURRENCY_OR:
                    case OP_CONCURRENCY_PARALLEL:
                    case OP_CONCURRENCY_RDV_AND:
                    case OP_CONCURRENCY_RDV_ASYNC:
                    case OP_CONCURRENCY_RDV_INTERLEAVING:
                    case OP_CONCURRENCY_RDV_OR:
                    case OP_CONCURRENCY_RDV_PARALLEL:
                    case OP_FORK:
                    case OP_JOIN:
                    case OP_NON_DETERMINISM:
                    case OP_SCHEDULE_AND_THEN:
                    case OP_SCHEDULE_GT:
                    case OP_SCHEDULE_LT:
                    case OP_SCHEDULE_OR_ELSE:
                    case OP_SCHEDULE_XOR:
                    case OP_SEQUENCE:
                    case OP_SEQUENCE_SIDE:
                    case OP_SEQUENCE_WEAK:
                    	{
                    		alt191=1;
                    	}
                        break;
                }

                switch (alt191)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2409:14: o= op_block
            	    {
            	        FOLLOWPUSH(FOLLOW_op_block_in_transition_statement6708);
            	        o=op_block(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruletransition_statementEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             op = o
            	            ; implicitSequenceOp = false; 
            	        }


            	    }
            	    break;

                }
            }

            if ( BACKTRACKING==0 )
            {
                 ac= NEW_STMT(op);
                 
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2411:3: (s= statement )*

            for (;;)
            {
                int alt192=2;
                switch ( LA(1) )
                {
                case COLONx2:
                case DECR:
                case DOLLAR_LCURLY:
                case ID:
                case INCR:
                case LCURLY:
                case LPAREN_INVOKE:
                case STATEMENT_PROMPT:
                case 154:
                case 155:
                case 156:
                case 157:
                case 236:
                case 247:
                case 250:
                case 256:
                case 263:
                case 267:
                case 268:
                case 269:
                case 275:
                case 278:
                case 279:
                case 282:
                case 285:
                case 289:
                case 290:
                case 291:
                case 292:
                case 293:
                case 294:
                case 296:
                case 299:
                case 300:
                case 301:
                case 302:
                case 303:
                case 304:
                case 305:
                case 312:
                case 330:
                case 336:
                case 337:
                case 338:
                case 339:
                case 340:
                case 341:
                case 362:
                case 363:
                case 364:
                case 368:
                case 369:
                case 371:
                case 377:
                case 385:
                case 386:
                case 389:
                case 391:
                case 415:
                case 416:
                	{
                		alt192=1;
                	}
                    break;

                }

                switch (alt192)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2411:5: s= statement
            	    {
            	        FOLLOWPUSH(FOLLOW_statement_in_transition_statement6728);
            	        s=statement(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruletransition_statementEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             ac
            	            ->append(s
            	            ); 
            	        }


            	    }
            	    break;

            	default:
            	    goto loop192;	/* break out of the loop */
            	    break;
                }
            }
            loop192: ; /* Jump out to here if this rule does not match */


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2413:3: ( transition_trigger[ ac ] )?
            {
                int alt193=2;
                switch ( LA(1) )
                {
                    case 232:
                    	{
                    		alt193=1;
                    	}
                        break;
                }

                switch (alt193)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2413:5: transition_trigger[ ac ]
            	    {
            	        FOLLOWPUSH(FOLLOW_transition_trigger_in_transition_statement6741);
            	        transition_trigger(ctx, ac);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruletransition_statementEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2414:3: ( transition_guard[ ac ] )?
            {
                int alt194=2;
                switch ( LA(1) )
                {
                    case 187:
                    	{
                    		alt194=1;
                    	}
                        break;
                }

                switch (alt194)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2414:5: transition_guard[ ac ]
            	    {
            	        FOLLOWPUSH(FOLLOW_transition_guard_in_transition_statement6751);
            	        transition_guard(ctx, ac);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruletransition_statementEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2415:3: ( transition_timed_guard[ ac ] )?
            {
                int alt195=2;
                switch ( LA(1) )
                {
                    case 230:
                    	{
                    		alt195=1;
                    	}
                        break;
                }

                switch (alt195)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2415:5: transition_timed_guard[ ac ]
            	    {
            	        FOLLOWPUSH(FOLLOW_transition_timed_guard_in_transition_statement6761);
            	        transition_timed_guard(ctx, ac);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruletransition_statementEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2416:3: ( transition_effect[ ac ] )?
            {
                int alt196=2;
                switch ( LA(1) )
                {
                    case 181:
                    	{
                    		alt196=1;
                    	}
                        break;
                }

                switch (alt196)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2416:5: transition_effect[ ac ]
            	    {
            	        FOLLOWPUSH(FOLLOW_transition_effect_in_transition_statement6771);
            	        transition_effect(ctx, ac);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruletransition_statementEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	    }
            	    break;

                }
            }

             MATCHT(RCURLY, &FOLLOW_RCURLY_in_transition_statement6780);
            if  (HASEXCEPTION())
            {
                goto ruletransition_statementEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruletransition_statementEx; /* Prevent compiler warnings */
    ruletransition_statementEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
            else
            {
                {

                    	if( implicitSequenceOp && ac
                    .valid() && ac
                    ->singleton() &&
                    			sep::OperatorManager::isSchedule(op) )
                    	{
                    		sep::BFCode singleCode = ac
                    ->first().bfCode();
                    		ac= singleCode;

                    	}

                }
            }


    if ( BACKTRACKING>0 ) { MEMOIZE(79, transition_statement_StartIndex); }

    return ac;
}
/* $ANTLR end transition_statement */

/**
 * $ANTLR start transition_trigger
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2420:1: transition_trigger[ sep::BFCode & ac ] : '@trigger:' (s= statement_com_input )* ;
 */
static void
transition_trigger(pfmlParser ctx, sep::BFCode & ac)
{
    ANTLR3_UINT32 transition_trigger_StartIndex;

    sep::BFCode s;
    #undef	RETURN_TYPE_s
    #define	RETURN_TYPE_s sep::BFCode

    /* Initialize rule variables
     */
    transition_trigger_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(80)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2421:2: ( '@trigger:' (s= statement_com_input )* )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2421:4: '@trigger:' (s= statement_com_input )*
        {
             MATCHT(232, &FOLLOW_232_in_transition_trigger6793);
            if  (HASEXCEPTION())
            {
                goto ruletransition_triggerEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2421:16: (s= statement_com_input )*

            for (;;)
            {
                int alt197=2;
                switch ( LA(1) )
                {
                case 299:
                case 300:
                case 301:
                case 302:
                case 303:
                case 304:
                case 305:
                	{
                		alt197=1;
                	}
                    break;

                }

                switch (alt197)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2421:18: s= statement_com_input
            	    {
            	        FOLLOWPUSH(FOLLOW_statement_com_input_in_transition_trigger6799);
            	        s=statement_com_input(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruletransition_triggerEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             ac->append( 
            	            s
            	             ); 
            	        }


            	    }
            	    break;

            	default:
            	    goto loop197;	/* break out of the loop */
            	    break;
                }
            }
            loop197: ; /* Jump out to here if this rule does not match */


        }

    }

    // This is where rules clean up and exit
    //
    goto ruletransition_triggerEx; /* Prevent compiler warnings */
    ruletransition_triggerEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(80, transition_trigger_StartIndex); }

    return ;
}
/* $ANTLR end transition_trigger */

/**
 * $ANTLR start transition_guard
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2424:1: transition_guard[ sep::BFCode & ac ] : '@guard:' (s= statement_guard |e= expression | LBRACKET e= expression RBRACKET )* ;
 */
static void
transition_guard(pfmlParser ctx, sep::BFCode & ac)
{
    ANTLR3_UINT32 transition_guard_StartIndex;

    sep::BFCode s;
    #undef	RETURN_TYPE_s
    #define	RETURN_TYPE_s sep::BFCode

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    /* Initialize rule variables
     */
    transition_guard_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(81)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2425:2: ( '@guard:' (s= statement_guard |e= expression | LBRACKET e= expression RBRACKET )* )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2425:4: '@guard:' (s= statement_guard |e= expression | LBRACKET e= expression RBRACKET )*
        {
             MATCHT(187, &FOLLOW_187_in_transition_guard6819);
            if  (HASEXCEPTION())
            {
                goto ruletransition_guardEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2426:3: (s= statement_guard |e= expression | LBRACKET e= expression RBRACKET )*

            for (;;)
            {
                int alt198=4;
                switch ( LA(1) )
                {
                case 278:
                case 290:
                	{
                		alt198=1;
                	}
                    break;
                case LBRACKET:
                	{
                		{
                		   /* dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState)
                		    */
                		    int LA198_2 = LA(2);
                		    if ( (synpred340_fml(ctx)))
                		    {
                		        alt198=2;
                		    }
                		    else if ( (synpred341_fml(ctx)))
                		    {
                		        alt198=3;
                		    }

                		}
                	}
                    break;
                case BNOT:
                case COLONx2:
                case CharLiteral:
                case DECR:
                case DOLLAR_LCURLY:
                case FloatLiteral:
                case ID:
                case INCR:
                case IntegerLiteral:
                case LBRACKET_BAR:
                case LCURLY:
                case LNOT:
                case LPAREN:
                case LPAREN_INVOKE:
                case MINUS:
                case OP_POP:
                case OP_TOP:
                case PERCENT_LCURLY:
                case PLUS:
                case RationalLiteral:
                case StringLiteral:
                case 158:
                case 159:
                case 160:
                case 161:
                case 162:
                case 237:
                case 256:
                case 265:
                case 277:
                case 280:
                case 294:
                case 313:
                case 330:
                case 331:
                case 332:
                case 343:
                case 347:
                case 372:
                case 397:
                	{
                		alt198=2;
                	}
                    break;

                }

                switch (alt198)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2426:5: s= statement_guard
            	    {
            	        FOLLOWPUSH(FOLLOW_statement_guard_in_transition_guard6827);
            	        s=statement_guard(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruletransition_guardEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             ac->append( 
            	            s
            	             ); 
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2429:5: e= expression
            	    {
            	        FOLLOWPUSH(FOLLOW_expression_in_transition_guard6840);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruletransition_guardEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             ac->append( NEW_STMT1(OP(GUARD), 
            	            e
            	            ) ); 
            	        }


            	    }
            	    break;
            	case 3:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2432:5: LBRACKET e= expression RBRACKET
            	    {
            	         MATCHT(LBRACKET, &FOLLOW_LBRACKET_in_transition_guard6851);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruletransition_guardEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_transition_guard6855);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruletransition_guardEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	         MATCHT(RBRACKET, &FOLLOW_RBRACKET_in_transition_guard6857);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruletransition_guardEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             ac->append( NEW_STMT1(OP(GUARD), 
            	            e
            	            ) ); 
            	        }


            	    }
            	    break;

            	default:
            	    goto loop198;	/* break out of the loop */
            	    break;
                }
            }
            loop198: ; /* Jump out to here if this rule does not match */


        }

    }

    // This is where rules clean up and exit
    //
    goto ruletransition_guardEx; /* Prevent compiler warnings */
    ruletransition_guardEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(81, transition_guard_StartIndex); }

    return ;
}
/* $ANTLR end transition_guard */

/**
 * $ANTLR start transition_timed_guard
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2437:1: transition_timed_guard[ sep::BFCode & ac ] : '@tguard:' (s= statement_timed_guard |e= expression | LCURLY e= expression RCURLY )* ;
 */
static void
transition_timed_guard(pfmlParser ctx, sep::BFCode & ac)
{
    ANTLR3_UINT32 transition_timed_guard_StartIndex;

    sep::BFCode s;
    #undef	RETURN_TYPE_s
    #define	RETURN_TYPE_s sep::BFCode

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    /* Initialize rule variables
     */
    transition_timed_guard_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(82)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2438:2: ( '@tguard:' (s= statement_timed_guard |e= expression | LCURLY e= expression RCURLY )* )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2438:4: '@tguard:' (s= statement_timed_guard |e= expression | LCURLY e= expression RCURLY )*
        {
             MATCHT(230, &FOLLOW_230_in_transition_timed_guard6879);
            if  (HASEXCEPTION())
            {
                goto ruletransition_timed_guardEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2439:3: (s= statement_timed_guard |e= expression | LCURLY e= expression RCURLY )*

            for (;;)
            {
                int alt199=4;
                switch ( LA(1) )
                {
                case 391:
                	{
                		alt199=1;
                	}
                    break;
                case LCURLY:
                	{
                		{
                		   /* dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState)
                		    */
                		    int LA199_2 = LA(2);
                		    if ( (synpred343_fml(ctx)))
                		    {
                		        alt199=2;
                		    }
                		    else if ( (synpred344_fml(ctx)))
                		    {
                		        alt199=3;
                		    }

                		}
                	}
                    break;
                case BNOT:
                case COLONx2:
                case CharLiteral:
                case DECR:
                case DOLLAR_LCURLY:
                case FloatLiteral:
                case ID:
                case INCR:
                case IntegerLiteral:
                case LBRACKET:
                case LBRACKET_BAR:
                case LNOT:
                case LPAREN:
                case LPAREN_INVOKE:
                case MINUS:
                case OP_POP:
                case OP_TOP:
                case PERCENT_LCURLY:
                case PLUS:
                case RationalLiteral:
                case StringLiteral:
                case 158:
                case 159:
                case 160:
                case 161:
                case 162:
                case 237:
                case 256:
                case 265:
                case 277:
                case 280:
                case 294:
                case 313:
                case 330:
                case 331:
                case 332:
                case 343:
                case 347:
                case 372:
                case 397:
                	{
                		alt199=2;
                	}
                    break;

                }

                switch (alt199)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2439:5: s= statement_timed_guard
            	    {
            	        FOLLOWPUSH(FOLLOW_statement_timed_guard_in_transition_timed_guard6887);
            	        s=statement_timed_guard(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruletransition_timed_guardEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             ac->append( 
            	            s
            	             ); 
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2442:5: e= expression
            	    {
            	        FOLLOWPUSH(FOLLOW_expression_in_transition_timed_guard6900);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruletransition_timed_guardEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             ac->append( NEW_STMT1(OP(TIMED_GUARD), 
            	            e
            	            ) ); 
            	        }


            	    }
            	    break;
            	case 3:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2445:5: LCURLY e= expression RCURLY
            	    {
            	         MATCHT(LCURLY, &FOLLOW_LCURLY_in_transition_timed_guard6911);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruletransition_timed_guardEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_transition_timed_guard6915);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruletransition_timed_guardEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	         MATCHT(RCURLY, &FOLLOW_RCURLY_in_transition_timed_guard6917);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruletransition_timed_guardEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             ac->append( NEW_STMT1(OP(TIMED_GUARD), 
            	            e
            	            ) ); 
            	        }


            	    }
            	    break;

            	default:
            	    goto loop199;	/* break out of the loop */
            	    break;
                }
            }
            loop199: ; /* Jump out to here if this rule does not match */


        }

    }

    // This is where rules clean up and exit
    //
    goto ruletransition_timed_guardEx; /* Prevent compiler warnings */
    ruletransition_timed_guardEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(82, transition_timed_guard_StartIndex); }

    return ;
}
/* $ANTLR end transition_timed_guard */

/**
 * $ANTLR start transition_effect
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2450:1: transition_effect[ sep::BFCode & ac ] : '@effect:' (s= statement )* ;
 */
static void
transition_effect(pfmlParser ctx, sep::BFCode & ac)
{
    ANTLR3_UINT32 transition_effect_StartIndex;

    sep::BFCode s;
    #undef	RETURN_TYPE_s
    #define	RETURN_TYPE_s sep::BFCode

    /* Initialize rule variables
     */
    transition_effect_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(83)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2451:2: ( '@effect:' (s= statement )* )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2451:4: '@effect:' (s= statement )*
        {
             MATCHT(181, &FOLLOW_181_in_transition_effect6939);
            if  (HASEXCEPTION())
            {
                goto ruletransition_effectEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2451:15: (s= statement )*

            for (;;)
            {
                int alt200=2;
                switch ( LA(1) )
                {
                case COLONx2:
                case DECR:
                case DOLLAR_LCURLY:
                case ID:
                case INCR:
                case LCURLY:
                case LPAREN_INVOKE:
                case STATEMENT_PROMPT:
                case 154:
                case 155:
                case 156:
                case 157:
                case 236:
                case 247:
                case 250:
                case 256:
                case 263:
                case 267:
                case 268:
                case 269:
                case 275:
                case 278:
                case 279:
                case 282:
                case 285:
                case 289:
                case 290:
                case 291:
                case 292:
                case 293:
                case 294:
                case 296:
                case 299:
                case 300:
                case 301:
                case 302:
                case 303:
                case 304:
                case 305:
                case 312:
                case 330:
                case 336:
                case 337:
                case 338:
                case 339:
                case 340:
                case 341:
                case 362:
                case 363:
                case 364:
                case 368:
                case 369:
                case 371:
                case 377:
                case 385:
                case 386:
                case 389:
                case 391:
                case 415:
                case 416:
                	{
                		alt200=1;
                	}
                    break;

                }

                switch (alt200)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2451:17: s= statement
            	    {
            	        FOLLOWPUSH(FOLLOW_statement_in_transition_effect6945);
            	        s=statement(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruletransition_effectEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             ac->append( 
            	            s
            	             ); 
            	        }


            	    }
            	    break;

            	default:
            	    goto loop200;	/* break out of the loop */
            	    break;
                }
            }
            loop200: ; /* Jump out to here if this rule does not match */


        }

    }

    // This is where rules clean up and exit
    //
    goto ruletransition_effectEx; /* Prevent compiler warnings */
    ruletransition_effectEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(83, transition_effect_StartIndex); }

    return ;
}
/* $ANTLR end transition_effect */

/**
 * $ANTLR start target_state_id
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2455:1: target_state_id returns [ sep::BF target ] : (kw= target_state_kw_id |u= qualifiedNameID | DOLLAR id= ID );
 */
static sep::BF
target_state_id(pfmlParser ctx)
{
    sep::BF target;

    ANTLR3_UINT32 target_state_id_StartIndex;

    pANTLR3_COMMON_TOKEN    id;
    std::string kw;
    #undef	RETURN_TYPE_kw
    #define	RETURN_TYPE_kw std::string

    fmlParser_qualifiedNameID_return u;
    #undef	RETURN_TYPE_u
    #define	RETURN_TYPE_u fmlParser_qualifiedNameID_return

    /* Initialize rule variables
     */
    target_state_id_StartIndex = INDEX();



    	std::string tid;
    	sep::avm_size_t nb = 1;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(84)) )
    {
        {

            	if( (target = sep::ParserUtil::getvarMachine(tid, nb)).invalid() )
            	{
            		target = NEW_QNID(tid, nb);
            	}

        }
        {
        }



        return target;
    }

    id       = NULL;

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2467:2: (kw= target_state_kw_id |u= qualifiedNameID | DOLLAR id= ID )

            ANTLR3_UINT32 alt201;

            alt201=3;

            switch ( LA(1) )
            {
            case 144:
            case 145:
            case 146:
            case 147:
            case 148:
            case 149:
            case 150:
            case 153:
            	{
            		alt201=1;
            	}
                break;
            case ID:
            	{
            		alt201=2;
            	}
                break;
            case DOLLAR:
            	{
            		alt201=3;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return target;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 201;
                EXCEPTION->state        = 0;


                goto ruletarget_state_idEx;

            }

            switch (alt201)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2467:4: kw= target_state_kw_id
        	    {
        	        FOLLOWPUSH(FOLLOW_target_state_kw_id_in_target_state_id6977);
        	        kw=target_state_kw_id(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruletarget_state_idEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return target;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             tid = kw
        	            ; 
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2469:4: u= qualifiedNameID
        	    {
        	        FOLLOWPUSH(FOLLOW_qualifiedNameID_in_target_state_id6988);
        	        u=qualifiedNameID(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruletarget_state_idEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return target;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             tid = u.s
        	            ; nb = u.nb
        	            ; 
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2471:4: DOLLAR id= ID
        	    {
        	         MATCHT(DOLLAR, &FOLLOW_DOLLAR_in_target_state_id7005);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruletarget_state_idEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return target;
        	        }


        	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_target_state_id7009);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruletarget_state_idEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return target;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             tid ="$" + STR((id->getText(id))->chars); 
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruletarget_state_idEx; /* Prevent compiler warnings */
    ruletarget_state_idEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
            else
            {
                {

                    	if( (target = sep::ParserUtil::getvarMachine(tid, nb)).invalid() )
                    	{
                    		target = NEW_QNID(tid, nb);
                    	}

                }
            }


    if ( BACKTRACKING>0 ) { MEMOIZE(84, target_state_id_StartIndex); }

    return target;
}
/* $ANTLR end target_state_id */

/**
 * $ANTLR start target_state_kw_id
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2475:1: target_state_kw_id returns [ std::string s ] : ( '#init' | '#initial' | '#start' | '#dhistory' | '#shistory' | '#final' | '#terminal' | '#return' );
 */
static std::string
target_state_kw_id(pfmlParser ctx)
{
    std::string s;

    ANTLR3_UINT32 target_state_kw_id_StartIndex;

    /* Initialize rule variables
     */
    target_state_kw_id_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(85)) )
    {
        {
        }



        return s;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2477:2: ( '#init' | '#initial' | '#start' | '#dhistory' | '#shistory' | '#final' | '#terminal' | '#return' )

            ANTLR3_UINT32 alt202;

            alt202=8;

            switch ( LA(1) )
            {
            case 146:
            	{
            		alt202=1;
            	}
                break;
            case 147:
            	{
            		alt202=2;
            	}
                break;
            case 150:
            	{
            		alt202=3;
            	}
                break;
            case 144:
            	{
            		alt202=4;
            	}
                break;
            case 149:
            	{
            		alt202=5;
            	}
                break;
            case 145:
            	{
            		alt202=6;
            	}
                break;
            case 153:
            	{
            		alt202=7;
            	}
                break;
            case 148:
            	{
            		alt202=8;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return s;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 202;
                EXCEPTION->state        = 0;


                goto ruletarget_state_kw_idEx;

            }

            switch (alt202)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2477:4: '#init'
        	    {
        	         MATCHT(146, &FOLLOW_146_in_target_state_kw_id7030);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruletarget_state_kw_idEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return s;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             s= "#init"    ;
        	             
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2478:4: '#initial'
        	    {
        	         MATCHT(147, &FOLLOW_147_in_target_state_kw_id7042);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruletarget_state_kw_idEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return s;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             s= "#initial" ;
        	             
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2479:4: '#start'
        	    {
        	         MATCHT(150, &FOLLOW_150_in_target_state_kw_id7051);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruletarget_state_kw_idEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return s;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             s= "#start"   ;
        	             
        	        }


        	    }
        	    break;
        	case 4:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2481:4: '#dhistory'
        	    {
        	         MATCHT(144, &FOLLOW_144_in_target_state_kw_id7063);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruletarget_state_kw_idEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return s;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             s= "#dhistory";
        	             
        	        }


        	    }
        	    break;
        	case 5:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2482:4: '#shistory'
        	    {
        	         MATCHT(149, &FOLLOW_149_in_target_state_kw_id7071);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruletarget_state_kw_idEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return s;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             s= "#shistory";
        	             
        	        }


        	    }
        	    break;
        	case 6:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2484:4: '#final'
        	    {
        	         MATCHT(145, &FOLLOW_145_in_target_state_kw_id7080);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruletarget_state_kw_idEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return s;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             s= "#final";

        	            		needDefaultStateFinal.push_back(_CPM_->getContainerMachine()); 
        	        }


        	    }
        	    break;
        	case 7:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2488:4: '#terminal'
        	    {
        	         MATCHT(153, &FOLLOW_153_in_target_state_kw_id7089);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruletarget_state_kw_idEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return s;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             s= "#terminal";

        	            		needDefaultStateTerminal.push_back(_CPM_->getContainerMachine()); 
        	        }


        	    }
        	    break;
        	case 8:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2492:4: '#return'
        	    {
        	         MATCHT(148, &FOLLOW_148_in_target_state_kw_id7098);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruletarget_state_kw_idEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return s;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             s= "#return";

        	            		needDefaultStateReturn.push_back(_CPM_->getContainerMachine()); 
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruletarget_state_kw_idEx; /* Prevent compiler warnings */
    ruletarget_state_kw_idEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(85, target_state_kw_id_StartIndex); }

    return s;
}
/* $ANTLR end target_state_kw_id */

/**
 * $ANTLR start def_state_activity
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2498:1: def_state_activity[ sep::Machine * state ] : ( '@create' bs= block_statement | '@init' bs= block_statement | '@ienable' bs= block_statement | '@enable' bs= block_statement | '@idisable' bs= block_statement | '@disable' bs= block_statement | '@iabort' bs= block_statement | '@abort' bs= block_statement | '@irun' bs= block_statement | '@run' bs= block_statement | '@rtc' bs= block_statement | '@final' bs= block_statement );
 */
static void
def_state_activity(pfmlParser ctx, sep::Machine * state)
{
    ANTLR3_UINT32 def_state_activity_StartIndex;

    sep::BFCode bs;
    #undef	RETURN_TYPE_bs
    #define	RETURN_TYPE_bs sep::BFCode

    /* Initialize rule variables
     */
    def_state_activity_StartIndex = INDEX();



    	sep::BehavioralPart * theBehavior = state->getUniqBehaviorPart();

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(86)) )
    {
        {
        }



        return ;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2502:2: ( '@create' bs= block_statement | '@init' bs= block_statement | '@ienable' bs= block_statement | '@enable' bs= block_statement | '@idisable' bs= block_statement | '@disable' bs= block_statement | '@iabort' bs= block_statement | '@abort' bs= block_statement | '@irun' bs= block_statement | '@run' bs= block_statement | '@rtc' bs= block_statement | '@final' bs= block_statement )

            ANTLR3_UINT32 alt203;

            alt203=12;

            switch ( LA(1) )
            {
            case 177:
            	{
            		alt203=1;
            	}
                break;
            case 194:
            	{
            		alt203=2;
            	}
                break;
            case 191:
            	{
            		alt203=3;
            	}
                break;
            case 182:
            	{
            		alt203=4;
            	}
                break;
            case 190:
            	{
            		alt203=5;
            	}
                break;
            case 179:
            	{
            		alt203=6;
            	}
                break;
            case 189:
            	{
            		alt203=7;
            	}
                break;
            case 170:
            	{
            		alt203=8;
            	}
                break;
            case 199:
            	{
            		alt203=9;
            	}
                break;
            case 224:
            	{
            		alt203=10;
            	}
                break;
            case 223:
            	{
            		alt203=11;
            	}
                break;
            case 184:
            	{
            		alt203=12;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 203;
                EXCEPTION->state        = 0;


                goto ruledef_state_activityEx;

            }

            switch (alt203)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2502:4: '@create' bs= block_statement
        	    {
        	         MATCHT(177, &FOLLOW_177_in_def_state_activity7119);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_state_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_block_statement_in_def_state_activity7125);
        	        bs=block_statement(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_state_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             theBehavior->seqOnCreate(bs
        	            ); 
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2503:4: '@init' bs= block_statement
        	    {
        	         MATCHT(194, &FOLLOW_194_in_def_state_activity7133);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_state_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_block_statement_in_def_state_activity7141);
        	        bs=block_statement(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_state_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             theBehavior->seqOnInit(bs
        	            );   
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2505:4: '@ienable' bs= block_statement
        	    {
        	         MATCHT(191, &FOLLOW_191_in_def_state_activity7150);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_state_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_block_statement_in_def_state_activity7155);
        	        bs=block_statement(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_state_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             theBehavior->seqOnIEnable(bs
        	            ); 
        	        }


        	    }
        	    break;
        	case 4:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2506:4: '@enable' bs= block_statement
        	    {
        	         MATCHT(182, &FOLLOW_182_in_def_state_activity7163);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_state_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_block_statement_in_def_state_activity7169);
        	        bs=block_statement(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_state_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             theBehavior->seqOnEnable (bs
        	            ); 
        	        }


        	    }
        	    break;
        	case 5:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2508:4: '@idisable' bs= block_statement
        	    {
        	         MATCHT(190, &FOLLOW_190_in_def_state_activity7178);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_state_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_block_statement_in_def_state_activity7182);
        	        bs=block_statement(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_state_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             theBehavior->seqOnIDisable(bs
        	            ); 
        	        }


        	    }
        	    break;
        	case 6:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2509:4: '@disable' bs= block_statement
        	    {
        	         MATCHT(179, &FOLLOW_179_in_def_state_activity7190);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_state_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_block_statement_in_def_state_activity7195);
        	        bs=block_statement(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_state_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             theBehavior->seqOnDisable (bs
        	            ); 
        	        }


        	    }
        	    break;
        	case 7:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2511:4: '@iabort' bs= block_statement
        	    {
        	         MATCHT(189, &FOLLOW_189_in_def_state_activity7204);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_state_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_block_statement_in_def_state_activity7210);
        	        bs=block_statement(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_state_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             theBehavior->seqOnIAbort(bs
        	            ); 
        	        }


        	    }
        	    break;
        	case 8:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2512:4: '@abort' bs= block_statement
        	    {
        	         MATCHT(170, &FOLLOW_170_in_def_state_activity7218);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_state_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_block_statement_in_def_state_activity7225);
        	        bs=block_statement(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_state_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             theBehavior->seqOnAbort(bs
        	            ); 
        	        }


        	    }
        	    break;
        	case 9:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2514:4: '@irun' bs= block_statement
        	    {
        	         MATCHT(199, &FOLLOW_199_in_def_state_activity7234);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_state_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_block_statement_in_def_state_activity7242);
        	        bs=block_statement(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_state_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             theBehavior->seqOnIRun(bs
        	            ); 
        	        }


        	    }
        	    break;
        	case 10:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2515:4: '@run' bs= block_statement
        	    {
        	         MATCHT(224, &FOLLOW_224_in_def_state_activity7250);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_state_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_block_statement_in_def_state_activity7259);
        	        bs=block_statement(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_state_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             theBehavior->seqOnRun(bs
        	            ); 
        	        }


        	    }
        	    break;
        	case 11:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2516:4: '@rtc' bs= block_statement
        	    {
        	         MATCHT(223, &FOLLOW_223_in_def_state_activity7267);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_state_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_block_statement_in_def_state_activity7276);
        	        bs=block_statement(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_state_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             theBehavior->seqOnRtc(bs
        	            ); 
        	        }


        	    }
        	    break;
        	case 12:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2518:4: '@final' bs= block_statement
        	    {
        	         MATCHT(184, &FOLLOW_184_in_def_state_activity7285);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_state_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_block_statement_in_def_state_activity7292);
        	        bs=block_statement(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_state_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             theBehavior->seqOnFinal(bs
        	            ); 
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruledef_state_activityEx; /* Prevent compiler warnings */
    ruledef_state_activityEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(86, def_state_activity_StartIndex); }

    return ;
}
/* $ANTLR end def_state_activity */

/**
 * $ANTLR start section_header_import_parameter_property
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2526:1: section_header_import_parameter_property[ sep::Machine * container ] : ( ( def_body_machine_using_section_header_predicat )=> section_header[ container ] ( section_import[ container ] )? ( section_parameter[ container ] )? ( section_property[ container ] )* | ( def_body_machine_using_section_import_predicat )=> section_import[ container ] ( section_parameter[ container ] )? ( section_property[ container ] )* | ( def_body_machine_using_section_parameter_predicat )=> section_parameter[ container ] ( section_property[ container ] )* | ( def_body_machine_using_section_property_predicat )=> ( section_property[ container ] )+ | section_property_free_declaration[ container ] );
 */
static void
section_header_import_parameter_property(pfmlParser ctx, sep::Machine * container)
{
    ANTLR3_UINT32 section_header_import_parameter_property_StartIndex;

    /* Initialize rule variables
     */
    section_header_import_parameter_property_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(87)) )
    {
        {
        }



        return ;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2528:2: ( ( def_body_machine_using_section_header_predicat )=> section_header[ container ] ( section_import[ container ] )? ( section_parameter[ container ] )? ( section_property[ container ] )* | ( def_body_machine_using_section_import_predicat )=> section_import[ container ] ( section_parameter[ container ] )? ( section_property[ container ] )* | ( def_body_machine_using_section_parameter_predicat )=> section_parameter[ container ] ( section_property[ container ] )* | ( def_body_machine_using_section_property_predicat )=> ( section_property[ container ] )+ | section_property_free_declaration[ container ] )

            ANTLR3_UINT32 alt211;

            alt211=5;

            {
                int LA211_0 = LA(1);
                if ( (synpred366_fml(ctx)) && (LA211_0 == 188))
                {
                    alt211=1;
                }
                else if ( (synpred370_fml(ctx)) && (LA211_0 == 192))
                {
                    alt211=2;
                }
                else if ( (synpred373_fml(ctx)) && (((LA211_0 >= 209) && (LA211_0 <= 210))))
                {
                    alt211=3;
                }
                else if ( (synpred373_fml(ctx)) && (LA211_0 == 196))
                {
                    alt211=3;
                }
                else if ( (synpred373_fml(ctx)) && (LA211_0 == 195))
                {
                    alt211=3;
                }
                else if ( (synpred373_fml(ctx)) && (LA211_0 == 207))
                {
                    alt211=3;
                }
                else if ( (synpred373_fml(ctx)) && (((LA211_0 >= 219) && (LA211_0 <= 220))))
                {
                    alt211=3;
                }
                else if ( (synpred375_fml(ctx)) && (LA211_0 == 178 || LA211_0 == 213))
                {
                    alt211=4;
                }
                else if ( (synpred375_fml(ctx)) && (LA211_0 == 216))
                {
                    alt211=4;
                }
                else if ( (synpred375_fml(ctx)) && (LA211_0 == 214))
                {
                    alt211=4;
                }
                else if ( (synpred375_fml(ctx)) && (LA211_0 == 211))
                {
                    alt211=4;
                }
                else if ( (LA211_0 == EOF || LA211_0 == 243 || LA211_0 == 249 || LA211_0 == 253 || ((LA211_0 >= 257) && (LA211_0 <= 259)) || LA211_0 == 262 || LA211_0 == 276 || LA211_0 == 282 || LA211_0 == 298 || LA211_0 == 305 || LA211_0 == 318 || LA211_0 == 320 || LA211_0 == 341 || LA211_0 == 344 || LA211_0 == 349 || LA211_0 == 355 || LA211_0 == 361 || LA211_0 == 364 || LA211_0 == 374 || LA211_0 == 380 || LA211_0 == 388 || LA211_0 == 395 || LA211_0 == 398 || LA211_0 == 404 || LA211_0 == 406 || ((LA211_0 >= 410) && (LA211_0 <= 411)) || LA211_0 == 414))
                {
                    alt211=5;
                }
                else
                {
                    if (BACKTRACKING>0)
                    {
                        FAILEDFLAG = ANTLR3_TRUE;
                        return ;
                    }


                    CONSTRUCTEX();
                    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                    EXCEPTION->message      = (void *)"";
                    EXCEPTION->decisionNum  = 211;
                    EXCEPTION->state        = 0;


                    goto rulesection_header_import_parameter_propertyEx;

                }
            }
            switch (alt211)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2528:4: ( def_body_machine_using_section_header_predicat )=> section_header[ container ] ( section_import[ container ] )? ( section_parameter[ container ] )? ( section_property[ container ] )*
        	    {
        	        FOLLOWPUSH(FOLLOW_section_header_in_section_header_import_parameter_property7325);
        	        section_header(ctx, container);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesection_header_import_parameter_propertyEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2531:4: ( section_import[ container ] )?
        	        {
        	            int alt204=2;
        	            switch ( LA(1) )
        	            {
        	                case 192:
        	                	{
        	                		alt204=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt204)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2531:6: section_import[ container ]
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_section_import_in_section_header_import_parameter_property7334);
        	        	        section_import(ctx, container);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulesection_header_import_parameter_propertyEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2533:4: ( section_parameter[ container ] )?
        	        {
        	            int alt205=2;
        	            switch ( LA(1) )
        	            {
        	                case 195:
        	                case 196:
        	                case 207:
        	                case 209:
        	                case 210:
        	                case 219:
        	                case 220:
        	                	{
        	                		alt205=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt205)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2533:6: section_parameter[ container ]
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_section_parameter_in_section_header_import_parameter_property7346);
        	        	        section_parameter(ctx, container);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulesection_header_import_parameter_propertyEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	        if ( BACKTRACKING==0 )
        	        {
        	              sep::TemplateFactory::genProperty( container ); 
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2538:4: ( section_property[ container ] )*

        	        for (;;)
        	        {
        	            int alt206=2;
        	            switch ( LA(1) )
        	            {
        	            case 178:
        	            case 211:
        	            case 213:
        	            case 214:
        	            case 216:
        	            	{
        	            		alt206=1;
        	            	}
        	                break;

        	            }

        	            switch (alt206)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2538:6: section_property[ container ]
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_section_property_in_section_header_import_parameter_property7368);
        	        	        section_property(ctx, container);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulesection_header_import_parameter_propertyEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;

        	        	default:
        	        	    goto loop206;	/* break out of the loop */
        	        	    break;
        	            }
        	        }
        	        loop206: ; /* Jump out to here if this rule does not match */


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2540:4: ( def_body_machine_using_section_import_predicat )=> section_import[ container ] ( section_parameter[ container ] )? ( section_property[ container ] )*
        	    {
        	        FOLLOWPUSH(FOLLOW_section_import_in_section_header_import_parameter_property7389);
        	        section_import(ctx, container);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesection_header_import_parameter_propertyEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2543:4: ( section_parameter[ container ] )?
        	        {
        	            int alt207=2;
        	            switch ( LA(1) )
        	            {
        	                case 195:
        	                case 196:
        	                case 207:
        	                case 209:
        	                case 210:
        	                case 219:
        	                case 220:
        	                	{
        	                		alt207=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt207)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2543:6: section_parameter[ container ]
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_section_parameter_in_section_header_import_parameter_property7398);
        	        	        section_parameter(ctx, container);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulesection_header_import_parameter_propertyEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	        if ( BACKTRACKING==0 )
        	        {
        	              sep::TemplateFactory::genProperty( container ); 
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2548:4: ( section_property[ container ] )*

        	        for (;;)
        	        {
        	            int alt208=2;
        	            switch ( LA(1) )
        	            {
        	            case 178:
        	            case 211:
        	            case 213:
        	            case 214:
        	            case 216:
        	            	{
        	            		alt208=1;
        	            	}
        	                break;

        	            }

        	            switch (alt208)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2548:6: section_property[ container ]
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_section_property_in_section_header_import_parameter_property7420);
        	        	        section_property(ctx, container);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulesection_header_import_parameter_propertyEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;

        	        	default:
        	        	    goto loop208;	/* break out of the loop */
        	        	    break;
        	            }
        	        }
        	        loop208: ; /* Jump out to here if this rule does not match */


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2550:4: ( def_body_machine_using_section_parameter_predicat )=> section_parameter[ container ] ( section_property[ container ] )*
        	    {
        	        FOLLOWPUSH(FOLLOW_section_parameter_in_section_header_import_parameter_property7441);
        	        section_parameter(ctx, container);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesection_header_import_parameter_propertyEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	              sep::TemplateFactory::genProperty( container ); 
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2556:4: ( section_property[ container ] )*

        	        for (;;)
        	        {
        	            int alt209=2;
        	            switch ( LA(1) )
        	            {
        	            case 178:
        	            case 211:
        	            case 213:
        	            case 214:
        	            case 216:
        	            	{
        	            		alt209=1;
        	            	}
        	                break;

        	            }

        	            switch (alt209)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2556:6: section_property[ container ]
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_section_property_in_section_header_import_parameter_property7460);
        	        	        section_property(ctx, container);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulesection_header_import_parameter_propertyEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;

        	        	default:
        	        	    goto loop209;	/* break out of the loop */
        	        	    break;
        	            }
        	        }
        	        loop209: ; /* Jump out to here if this rule does not match */


        	    }
        	    break;
        	case 4:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2558:4: ( def_body_machine_using_section_property_predicat )=> ( section_property[ container ] )+
        	    {
        	        if ( BACKTRACKING==0 )
        	        {
        	              sep::TemplateFactory::genProperty( container ); 
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2562:4: ( section_property[ container ] )+
        	        {
        	            int cnt210=0;

        	            for (;;)
        	            {
        	                int alt210=2;
        	        	switch ( LA(1) )
        	        	{
        	        	case 178:
        	        	case 211:
        	        	case 213:
        	        	case 214:
        	        	case 216:
        	        		{
        	        			alt210=1;
        	        		}
        	        	    break;

        	        	}

        	        	switch (alt210)
        	        	{
        	        	    case 1:
        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2562:6: section_property[ container ]
        	        	        {
        	        	            FOLLOWPUSH(FOLLOW_section_property_in_section_header_import_parameter_property7493);
        	        	            section_property(ctx, container);

        	        	            FOLLOWPOP();
        	        	            if  (HASEXCEPTION())
        	        	            {
        	        	                goto rulesection_header_import_parameter_propertyEx;
        	        	            }
        	        	            if (HASFAILED())
        	        	            {
        	        	                return ;
        	        	            }


        	        	        }
        	        	        break;

        	        	    default:

        	        		if ( cnt210 >= 1 )
        	        		{
        	        		    goto loop210;
        	        		}
        	        		if (BACKTRACKING>0)
        	        		{
        	        		    FAILEDFLAG = ANTLR3_TRUE;
        	        		    return ;
        	        		}

        	        		/* mismatchedSetEx()
        	        		 */
        	        		CONSTRUCTEX();
        	        		EXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
        	        		EXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;


        	        		goto rulesection_header_import_parameter_propertyEx;
        	        	}
        	        	cnt210++;
        	            }
        	            loop210: ;	/* Jump to here if this rule does not match */
        	        }

        	    }
        	    break;
        	case 5:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2564:4: section_property_free_declaration[ container ]
        	    {
        	        if ( BACKTRACKING==0 )
        	        {
        	              sep::TemplateFactory::genProperty( container ); 
        	        }


        	        FOLLOWPUSH(FOLLOW_section_property_free_declaration_in_section_header_import_parameter_property7508);
        	        section_property_free_declaration(ctx, container);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesection_header_import_parameter_propertyEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto rulesection_header_import_parameter_propertyEx; /* Prevent compiler warnings */
    rulesection_header_import_parameter_propertyEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(87, section_header_import_parameter_property_StartIndex); }

    return ;
}
/* $ANTLR end section_header_import_parameter_property */

/**
 * $ANTLR start section_parameter
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2574:1: section_parameter[ sep::Machine * container ] : ( ( '@parameter:' | '@param:' ) ( property_declaration[ declProperty ,\n\t \t\t\tsep::Modifier::PROPERTY_INPUT_PARAMETER_MODIFIER ] )* | '@input:' ( property_declaration[ declProperty ,\n\t\t\t\tsep::Modifier::PROPERTY_INPUT_PARAMETER_MODIFIER ] )* | '@inout:' ( property_declaration[ declProperty ,\n\t\t\t\tsep::Modifier::PROPERTY_INOUT_PARAMETER_MODIFIER ] )* | '@output:' ( property_declaration[ declProperty ,\n\t\t\t\tsep::Modifier::PROPERTY_OUTPUT_PARAMETER_MODIFIER ] )* | ( '@returns:' | '@return:' ) ( property_declaration[ declProperty ,\n\t \t\t\tsep::Modifier::PROPERTY_RETURN_PARAMETER_MODIFIER ] )* );
 */
static void
section_parameter(pfmlParser ctx, sep::Machine * container)
{
    ANTLR3_UINT32 section_parameter_StartIndex;

    /* Initialize rule variables
     */
    section_parameter_StartIndex = INDEX();



    	sep::PropertyPart & declProperty = container->getPropertyPart();

    	SAVE_RULE_BEGIN_LOCATION;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(88)) )
    {
        {

            	SET_RULE_LOCATION(declProperty);

        }
        {
        }



        return ;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2583:2: ( ( '@parameter:' | '@param:' ) ( property_declaration[ declProperty ,\n\t \t\t\tsep::Modifier::PROPERTY_INPUT_PARAMETER_MODIFIER ] )* | '@input:' ( property_declaration[ declProperty ,\n\t\t\t\tsep::Modifier::PROPERTY_INPUT_PARAMETER_MODIFIER ] )* | '@inout:' ( property_declaration[ declProperty ,\n\t\t\t\tsep::Modifier::PROPERTY_INOUT_PARAMETER_MODIFIER ] )* | '@output:' ( property_declaration[ declProperty ,\n\t\t\t\tsep::Modifier::PROPERTY_OUTPUT_PARAMETER_MODIFIER ] )* | ( '@returns:' | '@return:' ) ( property_declaration[ declProperty ,\n\t \t\t\tsep::Modifier::PROPERTY_RETURN_PARAMETER_MODIFIER ] )* )

            ANTLR3_UINT32 alt217;

            alt217=5;

            switch ( LA(1) )
            {
            case 209:
            case 210:
            	{
            		alt217=1;
            	}
                break;
            case 196:
            	{
            		alt217=2;
            	}
                break;
            case 195:
            	{
            		alt217=3;
            	}
                break;
            case 207:
            	{
            		alt217=4;
            	}
                break;
            case 219:
            case 220:
            	{
            		alt217=5;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 217;
                EXCEPTION->state        = 0;


                goto rulesection_parameterEx;

            }

            switch (alt217)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2583:4: ( '@parameter:' | '@param:' ) ( property_declaration[ declProperty ,\n\t \t\t\tsep::Modifier::PROPERTY_INPUT_PARAMETER_MODIFIER ] )*
        	    {
        	        if ( ((LA(1) >= 209) && (LA(1) <= 210)) )
        	        {
        	            CONSUME();
        	            PERRORRECOVERY=ANTLR3_FALSE;
        	            FAILEDFLAG=ANTLR3_FALSE;

        	        }
        	        else
        	        {
        	            if (BACKTRACKING>0)
        	            {
        	                FAILEDFLAG = ANTLR3_TRUE;
        	                return ;
        	            }

        	            CONSTRUCTEX();
        	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
        	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
        	            EXCEPTION->expectingSet = NULL;

        	            goto rulesection_parameterEx;
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2584:4: ( property_declaration[ declProperty ,\n\t \t\t\tsep::Modifier::PROPERTY_INPUT_PARAMETER_MODIFIER ] )*

        	        for (;;)
        	        {
        	            int alt212=2;
        	            switch ( LA(1) )
        	            {
        	            case 243:
        	            case 249:
        	            case 253:
        	            case 257:
        	            case 258:
        	            case 259:
        	            case 262:
        	            case 276:
        	            case 282:
        	            case 298:
        	            case 305:
        	            case 318:
        	            case 320:
        	            case 341:
        	            case 344:
        	            case 349:
        	            case 355:
        	            case 361:
        	            case 364:
        	            case 374:
        	            case 380:
        	            case 388:
        	            case 395:
        	            case 398:
        	            case 404:
        	            case 406:
        	            case 410:
        	            case 411:
        	            case 414:
        	            	{
        	            		alt212=1;
        	            	}
        	                break;

        	            }

        	            switch (alt212)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2584:6: property_declaration[ declProperty ,\n\t \t\t\tsep::Modifier::PROPERTY_INPUT_PARAMETER_MODIFIER ]
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_property_declaration_in_section_parameter7553);
        	        	        property_declaration(ctx, declProperty, sep::Modifier::PROPERTY_INPUT_PARAMETER_MODIFIER);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulesection_parameterEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;

        	        	default:
        	        	    goto loop212;	/* break out of the loop */
        	        	    break;
        	            }
        	        }
        	        loop212: ; /* Jump out to here if this rule does not match */


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2588:4: '@input:' ( property_declaration[ declProperty ,\n\t\t\t\tsep::Modifier::PROPERTY_INPUT_PARAMETER_MODIFIER ] )*
        	    {
        	         MATCHT(196, &FOLLOW_196_in_section_parameter7566);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesection_parameterEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2588:15: ( property_declaration[ declProperty ,\n\t\t\t\tsep::Modifier::PROPERTY_INPUT_PARAMETER_MODIFIER ] )*

        	        for (;;)
        	        {
        	            int alt213=2;
        	            switch ( LA(1) )
        	            {
        	            case 243:
        	            case 249:
        	            case 253:
        	            case 257:
        	            case 258:
        	            case 259:
        	            case 262:
        	            case 276:
        	            case 282:
        	            case 298:
        	            case 305:
        	            case 318:
        	            case 320:
        	            case 341:
        	            case 344:
        	            case 349:
        	            case 355:
        	            case 361:
        	            case 364:
        	            case 374:
        	            case 380:
        	            case 388:
        	            case 395:
        	            case 398:
        	            case 404:
        	            case 406:
        	            case 410:
        	            case 411:
        	            case 414:
        	            	{
        	            		alt213=1;
        	            	}
        	                break;

        	            }

        	            switch (alt213)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2588:17: property_declaration[ declProperty ,\n\t\t\t\tsep::Modifier::PROPERTY_INPUT_PARAMETER_MODIFIER ]
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_property_declaration_in_section_parameter7571);
        	        	        property_declaration(ctx, declProperty, sep::Modifier::PROPERTY_INPUT_PARAMETER_MODIFIER);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulesection_parameterEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;

        	        	default:
        	        	    goto loop213;	/* break out of the loop */
        	        	    break;
        	            }
        	        }
        	        loop213: ; /* Jump out to here if this rule does not match */


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2592:4: '@inout:' ( property_declaration[ declProperty ,\n\t\t\t\tsep::Modifier::PROPERTY_INOUT_PARAMETER_MODIFIER ] )*
        	    {
        	         MATCHT(195, &FOLLOW_195_in_section_parameter7584);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesection_parameterEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2592:15: ( property_declaration[ declProperty ,\n\t\t\t\tsep::Modifier::PROPERTY_INOUT_PARAMETER_MODIFIER ] )*

        	        for (;;)
        	        {
        	            int alt214=2;
        	            switch ( LA(1) )
        	            {
        	            case 243:
        	            case 249:
        	            case 253:
        	            case 257:
        	            case 258:
        	            case 259:
        	            case 262:
        	            case 276:
        	            case 282:
        	            case 298:
        	            case 305:
        	            case 318:
        	            case 320:
        	            case 341:
        	            case 344:
        	            case 349:
        	            case 355:
        	            case 361:
        	            case 364:
        	            case 374:
        	            case 380:
        	            case 388:
        	            case 395:
        	            case 398:
        	            case 404:
        	            case 406:
        	            case 410:
        	            case 411:
        	            case 414:
        	            	{
        	            		alt214=1;
        	            	}
        	                break;

        	            }

        	            switch (alt214)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2592:17: property_declaration[ declProperty ,\n\t\t\t\tsep::Modifier::PROPERTY_INOUT_PARAMETER_MODIFIER ]
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_property_declaration_in_section_parameter7589);
        	        	        property_declaration(ctx, declProperty, sep::Modifier::PROPERTY_INOUT_PARAMETER_MODIFIER);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulesection_parameterEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;

        	        	default:
        	        	    goto loop214;	/* break out of the loop */
        	        	    break;
        	            }
        	        }
        	        loop214: ; /* Jump out to here if this rule does not match */


        	    }
        	    break;
        	case 4:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2596:4: '@output:' ( property_declaration[ declProperty ,\n\t\t\t\tsep::Modifier::PROPERTY_OUTPUT_PARAMETER_MODIFIER ] )*
        	    {
        	         MATCHT(207, &FOLLOW_207_in_section_parameter7602);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesection_parameterEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2596:15: ( property_declaration[ declProperty ,\n\t\t\t\tsep::Modifier::PROPERTY_OUTPUT_PARAMETER_MODIFIER ] )*

        	        for (;;)
        	        {
        	            int alt215=2;
        	            switch ( LA(1) )
        	            {
        	            case 243:
        	            case 249:
        	            case 253:
        	            case 257:
        	            case 258:
        	            case 259:
        	            case 262:
        	            case 276:
        	            case 282:
        	            case 298:
        	            case 305:
        	            case 318:
        	            case 320:
        	            case 341:
        	            case 344:
        	            case 349:
        	            case 355:
        	            case 361:
        	            case 364:
        	            case 374:
        	            case 380:
        	            case 388:
        	            case 395:
        	            case 398:
        	            case 404:
        	            case 406:
        	            case 410:
        	            case 411:
        	            case 414:
        	            	{
        	            		alt215=1;
        	            	}
        	                break;

        	            }

        	            switch (alt215)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2596:17: property_declaration[ declProperty ,\n\t\t\t\tsep::Modifier::PROPERTY_OUTPUT_PARAMETER_MODIFIER ]
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_property_declaration_in_section_parameter7606);
        	        	        property_declaration(ctx, declProperty, sep::Modifier::PROPERTY_OUTPUT_PARAMETER_MODIFIER);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulesection_parameterEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;

        	        	default:
        	        	    goto loop215;	/* break out of the loop */
        	        	    break;
        	            }
        	        }
        	        loop215: ; /* Jump out to here if this rule does not match */


        	    }
        	    break;
        	case 5:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2600:4: ( '@returns:' | '@return:' ) ( property_declaration[ declProperty ,\n\t \t\t\tsep::Modifier::PROPERTY_RETURN_PARAMETER_MODIFIER ] )*
        	    {
        	        if ( ((LA(1) >= 219) && (LA(1) <= 220)) )
        	        {
        	            CONSUME();
        	            PERRORRECOVERY=ANTLR3_FALSE;
        	            FAILEDFLAG=ANTLR3_FALSE;

        	        }
        	        else
        	        {
        	            if (BACKTRACKING>0)
        	            {
        	                FAILEDFLAG = ANTLR3_TRUE;
        	                return ;
        	            }

        	            CONSTRUCTEX();
        	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
        	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
        	            EXCEPTION->expectingSet = NULL;

        	            goto rulesection_parameterEx;
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2601:4: ( property_declaration[ declProperty ,\n\t \t\t\tsep::Modifier::PROPERTY_RETURN_PARAMETER_MODIFIER ] )*

        	        for (;;)
        	        {
        	            int alt216=2;
        	            switch ( LA(1) )
        	            {
        	            case 243:
        	            case 249:
        	            case 253:
        	            case 257:
        	            case 258:
        	            case 259:
        	            case 262:
        	            case 276:
        	            case 282:
        	            case 298:
        	            case 305:
        	            case 318:
        	            case 320:
        	            case 341:
        	            case 344:
        	            case 349:
        	            case 355:
        	            case 361:
        	            case 364:
        	            case 374:
        	            case 380:
        	            case 388:
        	            case 395:
        	            case 398:
        	            case 404:
        	            case 406:
        	            case 410:
        	            case 411:
        	            case 414:
        	            	{
        	            		alt216=1;
        	            	}
        	                break;

        	            }

        	            switch (alt216)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2601:6: property_declaration[ declProperty ,\n\t \t\t\tsep::Modifier::PROPERTY_RETURN_PARAMETER_MODIFIER ]
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_property_declaration_in_section_parameter7636);
        	        	        property_declaration(ctx, declProperty, sep::Modifier::PROPERTY_RETURN_PARAMETER_MODIFIER);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulesection_parameterEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;

        	        	default:
        	        	    goto loop216;	/* break out of the loop */
        	        	    break;
        	            }
        	        }
        	        loop216: ; /* Jump out to here if this rule does not match */


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto rulesection_parameterEx; /* Prevent compiler warnings */
    rulesection_parameterEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
            else
            {
                {

                    	SET_RULE_LOCATION(declProperty);

                }
            }


    if ( BACKTRACKING>0 ) { MEMOIZE(88, section_parameter_StartIndex); }

    return ;
}
/* $ANTLR end section_parameter */

/**
 * $ANTLR start section_property
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2611:1: section_property[ sep::Machine * container ] : ( ( '@property:' | '@declaration:' ) ( property_declaration[ declProperty ,\n\t \t\t\tsep::Modifier::PROPERTY_UNDEFINED_MODIFIER ] )* | '@public:' ( property_declaration[ declProperty ,\n\t \t\t\tsep::Modifier::PROPERTY_PUBLIC_MODIFIER ] )* | '@protected:' ( property_declaration[ declProperty ,\n\t \t\t\tsep::Modifier::PROPERTY_PROTECTED_MODIFIER ] )* | '@private:' ( property_declaration[ declProperty ,\n\t \t\t\tsep::Modifier::PROPERTY_PRIVATE_MODIFIER ] )* );
 */
static void
section_property(pfmlParser ctx, sep::Machine * container)
{
    ANTLR3_UINT32 section_property_StartIndex;

    /* Initialize rule variables
     */
    section_property_StartIndex = INDEX();



    	sep::PropertyPart & declProperty = container->getPropertyPart();

    	SAVE_RULE_BEGIN_LOCATION;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(89)) )
    {
        {

            	SET_RULE_LOCATION(declProperty);

        }
        {
        }



        return ;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2620:2: ( ( '@property:' | '@declaration:' ) ( property_declaration[ declProperty ,\n\t \t\t\tsep::Modifier::PROPERTY_UNDEFINED_MODIFIER ] )* | '@public:' ( property_declaration[ declProperty ,\n\t \t\t\tsep::Modifier::PROPERTY_PUBLIC_MODIFIER ] )* | '@protected:' ( property_declaration[ declProperty ,\n\t \t\t\tsep::Modifier::PROPERTY_PROTECTED_MODIFIER ] )* | '@private:' ( property_declaration[ declProperty ,\n\t \t\t\tsep::Modifier::PROPERTY_PRIVATE_MODIFIER ] )* )

            ANTLR3_UINT32 alt222;

            alt222=4;

            switch ( LA(1) )
            {
            case 178:
            case 213:
            	{
            		alt222=1;
            	}
                break;
            case 216:
            	{
            		alt222=2;
            	}
                break;
            case 214:
            	{
            		alt222=3;
            	}
                break;
            case 211:
            	{
            		alt222=4;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 222;
                EXCEPTION->state        = 0;


                goto rulesection_propertyEx;

            }

            switch (alt222)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2620:4: ( '@property:' | '@declaration:' ) ( property_declaration[ declProperty ,\n\t \t\t\tsep::Modifier::PROPERTY_UNDEFINED_MODIFIER ] )*
        	    {
        	        if ( LA(1) == 178 || LA(1) == 213 )
        	        {
        	            CONSUME();
        	            PERRORRECOVERY=ANTLR3_FALSE;
        	            FAILEDFLAG=ANTLR3_FALSE;

        	        }
        	        else
        	        {
        	            if (BACKTRACKING>0)
        	            {
        	                FAILEDFLAG = ANTLR3_TRUE;
        	                return ;
        	            }

        	            CONSTRUCTEX();
        	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
        	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
        	            EXCEPTION->expectingSet = NULL;

        	            goto rulesection_propertyEx;
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2621:4: ( property_declaration[ declProperty ,\n\t \t\t\tsep::Modifier::PROPERTY_UNDEFINED_MODIFIER ] )*

        	        for (;;)
        	        {
        	            int alt218=2;
        	            switch ( LA(1) )
        	            {
        	            case 243:
        	            case 249:
        	            case 253:
        	            case 257:
        	            case 258:
        	            case 259:
        	            case 262:
        	            case 276:
        	            case 282:
        	            case 298:
        	            case 305:
        	            case 318:
        	            case 320:
        	            case 341:
        	            case 344:
        	            case 349:
        	            case 355:
        	            case 361:
        	            case 364:
        	            case 374:
        	            case 380:
        	            case 388:
        	            case 395:
        	            case 398:
        	            case 404:
        	            case 406:
        	            case 410:
        	            case 411:
        	            case 414:
        	            	{
        	            		alt218=1;
        	            	}
        	                break;

        	            }

        	            switch (alt218)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2621:6: property_declaration[ declProperty ,\n\t \t\t\tsep::Modifier::PROPERTY_UNDEFINED_MODIFIER ]
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_property_declaration_in_section_property7686);
        	        	        property_declaration(ctx, declProperty, sep::Modifier::PROPERTY_UNDEFINED_MODIFIER);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulesection_propertyEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;

        	        	default:
        	        	    goto loop218;	/* break out of the loop */
        	        	    break;
        	            }
        	        }
        	        loop218: ; /* Jump out to here if this rule does not match */


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2625:4: '@public:' ( property_declaration[ declProperty ,\n\t \t\t\tsep::Modifier::PROPERTY_PUBLIC_MODIFIER ] )*
        	    {
        	         MATCHT(216, &FOLLOW_216_in_section_property7699);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesection_propertyEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2626:4: ( property_declaration[ declProperty ,\n\t \t\t\tsep::Modifier::PROPERTY_PUBLIC_MODIFIER ] )*

        	        for (;;)
        	        {
        	            int alt219=2;
        	            switch ( LA(1) )
        	            {
        	            case 243:
        	            case 249:
        	            case 253:
        	            case 257:
        	            case 258:
        	            case 259:
        	            case 262:
        	            case 276:
        	            case 282:
        	            case 298:
        	            case 305:
        	            case 318:
        	            case 320:
        	            case 341:
        	            case 344:
        	            case 349:
        	            case 355:
        	            case 361:
        	            case 364:
        	            case 374:
        	            case 380:
        	            case 388:
        	            case 395:
        	            case 398:
        	            case 404:
        	            case 406:
        	            case 410:
        	            case 411:
        	            case 414:
        	            	{
        	            		alt219=1;
        	            	}
        	                break;

        	            }

        	            switch (alt219)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2626:6: property_declaration[ declProperty ,\n\t \t\t\tsep::Modifier::PROPERTY_PUBLIC_MODIFIER ]
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_property_declaration_in_section_property7706);
        	        	        property_declaration(ctx, declProperty, sep::Modifier::PROPERTY_PUBLIC_MODIFIER);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulesection_propertyEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;

        	        	default:
        	        	    goto loop219;	/* break out of the loop */
        	        	    break;
        	            }
        	        }
        	        loop219: ; /* Jump out to here if this rule does not match */


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2630:4: '@protected:' ( property_declaration[ declProperty ,\n\t \t\t\tsep::Modifier::PROPERTY_PROTECTED_MODIFIER ] )*
        	    {
        	         MATCHT(214, &FOLLOW_214_in_section_property7719);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesection_propertyEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2631:4: ( property_declaration[ declProperty ,\n\t \t\t\tsep::Modifier::PROPERTY_PROTECTED_MODIFIER ] )*

        	        for (;;)
        	        {
        	            int alt220=2;
        	            switch ( LA(1) )
        	            {
        	            case 243:
        	            case 249:
        	            case 253:
        	            case 257:
        	            case 258:
        	            case 259:
        	            case 262:
        	            case 276:
        	            case 282:
        	            case 298:
        	            case 305:
        	            case 318:
        	            case 320:
        	            case 341:
        	            case 344:
        	            case 349:
        	            case 355:
        	            case 361:
        	            case 364:
        	            case 374:
        	            case 380:
        	            case 388:
        	            case 395:
        	            case 398:
        	            case 404:
        	            case 406:
        	            case 410:
        	            case 411:
        	            case 414:
        	            	{
        	            		alt220=1;
        	            	}
        	                break;

        	            }

        	            switch (alt220)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2631:6: property_declaration[ declProperty ,\n\t \t\t\tsep::Modifier::PROPERTY_PROTECTED_MODIFIER ]
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_property_declaration_in_section_property7726);
        	        	        property_declaration(ctx, declProperty, sep::Modifier::PROPERTY_PROTECTED_MODIFIER);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulesection_propertyEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;

        	        	default:
        	        	    goto loop220;	/* break out of the loop */
        	        	    break;
        	            }
        	        }
        	        loop220: ; /* Jump out to here if this rule does not match */


        	    }
        	    break;
        	case 4:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2635:4: '@private:' ( property_declaration[ declProperty ,\n\t \t\t\tsep::Modifier::PROPERTY_PRIVATE_MODIFIER ] )*
        	    {
        	         MATCHT(211, &FOLLOW_211_in_section_property7739);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesection_propertyEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2636:4: ( property_declaration[ declProperty ,\n\t \t\t\tsep::Modifier::PROPERTY_PRIVATE_MODIFIER ] )*

        	        for (;;)
        	        {
        	            int alt221=2;
        	            switch ( LA(1) )
        	            {
        	            case 243:
        	            case 249:
        	            case 253:
        	            case 257:
        	            case 258:
        	            case 259:
        	            case 262:
        	            case 276:
        	            case 282:
        	            case 298:
        	            case 305:
        	            case 318:
        	            case 320:
        	            case 341:
        	            case 344:
        	            case 349:
        	            case 355:
        	            case 361:
        	            case 364:
        	            case 374:
        	            case 380:
        	            case 388:
        	            case 395:
        	            case 398:
        	            case 404:
        	            case 406:
        	            case 410:
        	            case 411:
        	            case 414:
        	            	{
        	            		alt221=1;
        	            	}
        	                break;

        	            }

        	            switch (alt221)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2636:6: property_declaration[ declProperty ,\n\t \t\t\tsep::Modifier::PROPERTY_PRIVATE_MODIFIER ]
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_property_declaration_in_section_property7746);
        	        	        property_declaration(ctx, declProperty, sep::Modifier::PROPERTY_PRIVATE_MODIFIER);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulesection_propertyEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;

        	        	default:
        	        	    goto loop221;	/* break out of the loop */
        	        	    break;
        	            }
        	        }
        	        loop221: ; /* Jump out to here if this rule does not match */


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto rulesection_propertyEx; /* Prevent compiler warnings */
    rulesection_propertyEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
            else
            {
                {

                    	SET_RULE_LOCATION(declProperty);

                }
            }


    if ( BACKTRACKING>0 ) { MEMOIZE(89, section_property_StartIndex); }

    return ;
}
/* $ANTLR end section_property */

/**
 * $ANTLR start section_property_free_declaration
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2642:1: section_property_free_declaration[ sep::Machine * container ] : ( property_declaration[ declProperty ,\n\t \t\t\tsep::Modifier::PROPERTY_UNDEFINED_MODIFIER ] )* ;
 */
static void
section_property_free_declaration(pfmlParser ctx, sep::Machine * container)
{
    ANTLR3_UINT32 section_property_free_declaration_StartIndex;

    /* Initialize rule variables
     */
    section_property_free_declaration_StartIndex = INDEX();



    	sep::PropertyPart & declProperty = container->getPropertyPart();

    	SAVE_RULE_BEGIN_LOCATION;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(90)) )
    {
        {

            	SET_RULE_LOCATION(declProperty);

        }
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2651:2: ( ( property_declaration[ declProperty ,\n\t \t\t\tsep::Modifier::PROPERTY_UNDEFINED_MODIFIER ] )* )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2651:4: ( property_declaration[ declProperty ,\n\t \t\t\tsep::Modifier::PROPERTY_UNDEFINED_MODIFIER ] )*
        {
            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2651:4: ( property_declaration[ declProperty ,\n\t \t\t\tsep::Modifier::PROPERTY_UNDEFINED_MODIFIER ] )*

            for (;;)
            {
                int alt223=2;
                switch ( LA(1) )
                {
                case 243:
                case 249:
                case 253:
                case 257:
                case 258:
                case 259:
                case 262:
                case 276:
                case 282:
                case 298:
                case 305:
                case 318:
                case 320:
                case 341:
                case 344:
                case 349:
                case 355:
                case 361:
                case 364:
                case 374:
                case 380:
                case 388:
                case 395:
                case 398:
                case 404:
                case 406:
                case 410:
                case 411:
                case 414:
                	{
                		alt223=1;
                	}
                    break;

                }

                switch (alt223)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2651:6: property_declaration[ declProperty ,\n\t \t\t\tsep::Modifier::PROPERTY_UNDEFINED_MODIFIER ]
            	    {
            	        FOLLOWPUSH(FOLLOW_property_declaration_in_section_property_free_declaration7777);
            	        property_declaration(ctx, declProperty, sep::Modifier::PROPERTY_UNDEFINED_MODIFIER);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulesection_property_free_declarationEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

            	default:
            	    goto loop223;	/* break out of the loop */
            	    break;
                }
            }
            loop223: ; /* Jump out to here if this rule does not match */


        }

    }

    // This is where rules clean up and exit
    //
    goto rulesection_property_free_declarationEx; /* Prevent compiler warnings */
    rulesection_property_free_declarationEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
            else
            {
                {

                    	SET_RULE_LOCATION(declProperty);

                }
            }


    if ( BACKTRACKING>0 ) { MEMOIZE(90, section_property_free_declaration_StartIndex); }

    return ;
}
/* $ANTLR end section_property_free_declaration */

/**
 * $ANTLR start property_declaration
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2660:1: property_declaration[ sep::PropertyPart & declProperty , sep::Modifier mdfr ] : (m= modifier_declaration )? decl_property_element[ declProperty , mdfr ] ;
 */
static void
property_declaration(pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr)
{
    ANTLR3_UINT32 property_declaration_StartIndex;

    sep::Modifier m;
    #undef	RETURN_TYPE_m
    #define	RETURN_TYPE_m sep::Modifier

    /* Initialize rule variables
     */
    property_declaration_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(91)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2662:2: ( (m= modifier_declaration )? decl_property_element[ declProperty , mdfr ] )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2662:4: (m= modifier_declaration )? decl_property_element[ declProperty , mdfr ]
        {
            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2662:4: (m= modifier_declaration )?
            {
                int alt224=2;
                switch ( LA(1) )
                {
                    case 243:
                    case 282:
                    case 298:
                    case 305:
                    case 341:
                    case 349:
                    case 355:
                    case 361:
                    case 364:
                    case 380:
                    case 395:
                    case 406:
                    case 414:
                    	{
                    		alt224=1;
                    	}
                        break;
                }

                switch (alt224)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2662:6: m= modifier_declaration
            	    {
            	        FOLLOWPUSH(FOLLOW_modifier_declaration_in_property_declaration7806);
            	        m=modifier_declaration(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleproperty_declarationEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             mdfr.override_ifdef( m
            	             ); 
            	        }


            	    }
            	    break;

                }
            }

            FOLLOWPUSH(FOLLOW_decl_property_element_in_property_declaration7816);
            decl_property_element(ctx, declProperty, mdfr);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruleproperty_declarationEx;
            }
            if (HASFAILED())
            {
                return ;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruleproperty_declarationEx; /* Prevent compiler warnings */
    ruleproperty_declarationEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(91, property_declaration_StartIndex); }

    return ;
}
/* $ANTLR end property_declaration */

/**
 * $ANTLR start decl_property_element
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2666:1: decl_property_element[ sep::PropertyPart & declProperty , sep::Modifier mdfr ] : ( decl_variable[ declProperty , mdfr ] | decl_port[ declProperty , mdfr ] | decl_signal[ declProperty , mdfr ] | decl_buffer[ declProperty , mdfr ] | decl_channel[ declProperty , mdfr ] | def_type[ declProperty , mdfr ] | def_enum[ declProperty , mdfr ] | def_union[ declProperty , mdfr ] | def_choice[ declProperty , mdfr ] | def_struct[ declProperty , mdfr ] );
 */
static void
decl_property_element(pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr)
{
    ANTLR3_UINT32 decl_property_element_StartIndex;

    /* Initialize rule variables
     */
    decl_property_element_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(92)) )
    {
        {
        }



        return ;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2668:2: ( decl_variable[ declProperty , mdfr ] | decl_port[ declProperty , mdfr ] | decl_signal[ declProperty , mdfr ] | decl_buffer[ declProperty , mdfr ] | decl_channel[ declProperty , mdfr ] | def_type[ declProperty , mdfr ] | def_enum[ declProperty , mdfr ] | def_union[ declProperty , mdfr ] | def_choice[ declProperty , mdfr ] | def_struct[ declProperty , mdfr ] )

            ANTLR3_UINT32 alt225;

            alt225=10;

            switch ( LA(1) )
            {
            case 259:
            case 262:
            case 318:
            case 410:
            case 411:
            	{
            		alt225=1;
            	}
                break;
            case 344:
            	{
            		alt225=2;
            	}
                break;
            case 320:
            case 374:
            	{
            		alt225=3;
            	}
                break;
            case 249:
            	{
            		alt225=4;
            	}
                break;
            case 253:
            	{
            		alt225=5;
            	}
                break;
            case 398:
            	{
            		alt225=6;
            	}
                break;
            case 276:
            	{
            		alt225=7;
            	}
                break;
            case 404:
            	{
            		alt225=8;
            	}
                break;
            case 257:
            	{
            		alt225=9;
            	}
                break;
            case 258:
            case 388:
            	{
            		alt225=10;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 225;
                EXCEPTION->state        = 0;


                goto ruledecl_property_elementEx;

            }

            switch (alt225)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2668:4: decl_variable[ declProperty , mdfr ]
        	    {
        	        FOLLOWPUSH(FOLLOW_decl_variable_in_decl_property_element7831);
        	        decl_variable(ctx, declProperty, mdfr);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledecl_property_elementEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2670:4: decl_port[ declProperty , mdfr ]
        	    {
        	        FOLLOWPUSH(FOLLOW_decl_port_in_decl_property_element7838);
        	        decl_port(ctx, declProperty, mdfr);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledecl_property_elementEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2671:4: decl_signal[ declProperty , mdfr ]
        	    {
        	        FOLLOWPUSH(FOLLOW_decl_signal_in_decl_property_element7847);
        	        decl_signal(ctx, declProperty, mdfr);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledecl_property_elementEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 4:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2672:4: decl_buffer[ declProperty , mdfr ]
        	    {
        	        FOLLOWPUSH(FOLLOW_decl_buffer_in_decl_property_element7854);
        	        decl_buffer(ctx, declProperty, mdfr);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledecl_property_elementEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 5:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2673:4: decl_channel[ declProperty , mdfr ]
        	    {
        	        FOLLOWPUSH(FOLLOW_decl_channel_in_decl_property_element7861);
        	        decl_channel(ctx, declProperty, mdfr);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledecl_property_elementEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 6:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2675:4: def_type[ declProperty , mdfr ]
        	    {
        	        FOLLOWPUSH(FOLLOW_def_type_in_decl_property_element7868);
        	        def_type(ctx, declProperty, mdfr);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledecl_property_elementEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 7:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2676:4: def_enum[ declProperty , mdfr ]
        	    {
        	        FOLLOWPUSH(FOLLOW_def_enum_in_decl_property_element7876);
        	        def_enum(ctx, declProperty, mdfr);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledecl_property_elementEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 8:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2677:4: def_union[ declProperty , mdfr ]
        	    {
        	        FOLLOWPUSH(FOLLOW_def_union_in_decl_property_element7884);
        	        def_union(ctx, declProperty, mdfr);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledecl_property_elementEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 9:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2678:4: def_choice[ declProperty , mdfr ]
        	    {
        	        FOLLOWPUSH(FOLLOW_def_choice_in_decl_property_element7891);
        	        def_choice(ctx, declProperty, mdfr);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledecl_property_elementEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 10:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2679:4: def_struct[ declProperty , mdfr ]
        	    {
        	        FOLLOWPUSH(FOLLOW_def_struct_in_decl_property_element7897);
        	        def_struct(ctx, declProperty, mdfr);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledecl_property_elementEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruledecl_property_elementEx; /* Prevent compiler warnings */
    ruledecl_property_elementEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(92, decl_property_element_StartIndex); }

    return ;
}
/* $ANTLR end decl_property_element */

/**
 * $ANTLR start labelled_argument
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2693:1: labelled_argument returns [ std::string label, sep::BF arg ] : ( ( ID COLON )=>id= ID COLON e= expression |e= expression );
 */
static fmlParser_labelled_argument_return
labelled_argument(pfmlParser ctx)
{
    fmlParser_labelled_argument_return retval;

    ANTLR3_UINT32 labelled_argument_StartIndex;

    pANTLR3_COMMON_TOKEN    id;
    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    /* Initialize rule variables
     */
    labelled_argument_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(93)) )
    {
    	retval.start = 0;

        {
        }



        return retval;
    }

    id       = NULL;
    retval.start = LT(1); retval.stop = retval.start;


    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2695:2: ( ( ID COLON )=>id= ID COLON e= expression |e= expression )

            ANTLR3_UINT32 alt226;

            alt226=2;

            switch ( LA(1) )
            {
            case ID:
            	{
            		{
            		    int LA226_1 = LA(2);
            		    if ( (synpred407_fml(ctx)))
            		    {
            		        alt226=1;
            		    }
            		    else if ( (ANTLR3_TRUE))
            		    {
            		        alt226=2;
            		    }
            		    else
            		    {
            		        if (BACKTRACKING>0)
            		        {
            		            FAILEDFLAG = ANTLR3_TRUE;
            		            return retval;
            		        }


            		        CONSTRUCTEX();
            		        EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
            		        EXCEPTION->message      = (void *)"";
            		        EXCEPTION->decisionNum  = 226;
            		        EXCEPTION->state        = 1;


            		        goto rulelabelled_argumentEx;

            		    }
            		}
            	}
                break;
            case BNOT:
            case COLONx2:
            case CharLiteral:
            case DECR:
            case DOLLAR_LCURLY:
            case FloatLiteral:
            case INCR:
            case IntegerLiteral:
            case LBRACKET:
            case LBRACKET_BAR:
            case LCURLY:
            case LNOT:
            case LPAREN:
            case LPAREN_INVOKE:
            case MINUS:
            case OP_POP:
            case OP_TOP:
            case PERCENT_LCURLY:
            case PLUS:
            case RationalLiteral:
            case StringLiteral:
            case 158:
            case 159:
            case 160:
            case 161:
            case 162:
            case 237:
            case 256:
            case 265:
            case 277:
            case 280:
            case 294:
            case 313:
            case 330:
            case 331:
            case 332:
            case 343:
            case 347:
            case 372:
            case 397:
            	{
            		alt226=2;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return retval;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 226;
                EXCEPTION->state        = 0;


                goto rulelabelled_argumentEx;

            }

            switch (alt226)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2695:4: ( ID COLON )=>id= ID COLON e= expression
        	    {
        	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_labelled_argument7933);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulelabelled_argumentEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return retval;
        	        }


        	         MATCHT(COLON, &FOLLOW_COLON_in_labelled_argument7935);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulelabelled_argumentEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return retval;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             retval.label= STR((id->getText(id))->chars);
        	             
        	        }


        	        FOLLOWPUSH(FOLLOW_expression_in_labelled_argument7945);
        	        e=expression(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulelabelled_argumentEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return retval;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             retval.arg= 
        	            e
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2697:4: e= expression
        	    {
        	        FOLLOWPUSH(FOLLOW_expression_in_labelled_argument7955);
        	        e=expression(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulelabelled_argumentEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return retval;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             retval.arg= 
        	            e
        	            ;
        	             
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto rulelabelled_argumentEx; /* Prevent compiler warnings */
    rulelabelled_argumentEx: ;
    retval.stop = LT(-1);


            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(93, labelled_argument_StartIndex); }

    return retval;
}
/* $ANTLR end labelled_argument */

/**
 * $ANTLR start decl_instance_machine_params
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2700:1: decl_instance_machine_params[ sep::Machine * machine ] : LPAREN (lp= labelled_argument ( COMMA lp= labelled_argument )* )? RPAREN ;
 */
static void
decl_instance_machine_params(pfmlParser ctx, sep::Machine * machine)
{
    ANTLR3_UINT32 decl_instance_machine_params_StartIndex;

    fmlParser_labelled_argument_return lp;
    #undef	RETURN_TYPE_lp
    #define	RETURN_TYPE_lp fmlParser_labelled_argument_return

    /* Initialize rule variables
     */
    decl_instance_machine_params_StartIndex = INDEX();



    	sep::BFVector labelledParams(
    		( machine->getType().is< sep::Machine >() ) ? machine->getType().
    			to_ptr< sep::Machine >()->getVariableParametersCount() : 0 );

    	sep::BFList positionalParams;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(94)) )
    {
        {

            	if( labelledParams.nonempty() )
            	{
            		sep::ParserUtil::computeInstanceMachineParameter(
            				machine, labelledParams, positionalParams);
            	}

        }
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2715:2: ( LPAREN (lp= labelled_argument ( COMMA lp= labelled_argument )* )? RPAREN )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2715:4: LPAREN (lp= labelled_argument ( COMMA lp= labelled_argument )* )? RPAREN
        {
             MATCHT(LPAREN, &FOLLOW_LPAREN_in_decl_instance_machine_params7979);
            if  (HASEXCEPTION())
            {
                goto ruledecl_instance_machine_paramsEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2716:4: (lp= labelled_argument ( COMMA lp= labelled_argument )* )?
            {
                int alt228=2;
                switch ( LA(1) )
                {
                    case BNOT:
                    case COLONx2:
                    case CharLiteral:
                    case DECR:
                    case DOLLAR_LCURLY:
                    case FloatLiteral:
                    case ID:
                    case INCR:
                    case IntegerLiteral:
                    case LBRACKET:
                    case LBRACKET_BAR:
                    case LCURLY:
                    case LNOT:
                    case LPAREN:
                    case LPAREN_INVOKE:
                    case MINUS:
                    case OP_POP:
                    case OP_TOP:
                    case PERCENT_LCURLY:
                    case PLUS:
                    case RationalLiteral:
                    case StringLiteral:
                    case 158:
                    case 159:
                    case 160:
                    case 161:
                    case 162:
                    case 237:
                    case 256:
                    case 265:
                    case 277:
                    case 280:
                    case 294:
                    case 313:
                    case 330:
                    case 331:
                    case 332:
                    case 343:
                    case 347:
                    case 372:
                    case 397:
                    	{
                    		alt228=1;
                    	}
                        break;
                }

                switch (alt228)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2716:6: lp= labelled_argument ( COMMA lp= labelled_argument )*
            	    {
            	        FOLLOWPUSH(FOLLOW_labelled_argument_in_decl_instance_machine_params7988);
            	        lp=labelled_argument(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledecl_instance_machine_paramsEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {

            	            	    	sep::ParserUtil::appendInstanceMachineParameter(machine, lp.label
            	            ,
            	            					labelledParams, positionalParams, lp.arg
            	            );
            	            	    
            	        }


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2721:6: ( COMMA lp= labelled_argument )*

            	        for (;;)
            	        {
            	            int alt227=2;
            	            switch ( LA(1) )
            	            {
            	            case COMMA:
            	            	{
            	            		alt227=1;
            	            	}
            	                break;

            	            }

            	            switch (alt227)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2721:8: COMMA lp= labelled_argument
            	        	    {
            	        	         MATCHT(COMMA, &FOLLOW_COMMA_in_decl_instance_machine_params8004);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledecl_instance_machine_paramsEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	        FOLLOWPUSH(FOLLOW_labelled_argument_in_decl_instance_machine_params8013);
            	        	        lp=labelled_argument(ctx);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledecl_instance_machine_paramsEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {

            	        	            	    	sep::ParserUtil::appendInstanceMachineParameter(machine, lp.label
            	        	            ,
            	        	            					labelledParams, positionalParams, lp.arg
            	        	            );
            	        	            	    
            	        	        }


            	        	    }
            	        	    break;

            	        	default:
            	        	    goto loop227;	/* break out of the loop */
            	        	    break;
            	            }
            	        }
            	        loop227: ; /* Jump out to here if this rule does not match */


            	    }
            	    break;

                }
            }

             MATCHT(RPAREN, &FOLLOW_RPAREN_in_decl_instance_machine_params8039);
            if  (HASEXCEPTION())
            {
                goto ruledecl_instance_machine_paramsEx;
            }
            if (HASFAILED())
            {
                return ;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledecl_instance_machine_paramsEx; /* Prevent compiler warnings */
    ruledecl_instance_machine_paramsEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
            else
            {
                {

                    	if( labelledParams.nonempty() )
                    	{
                    		sep::ParserUtil::computeInstanceMachineParameter(
                    				machine, labelledParams, positionalParams);
                    	}

                }
            }


    if ( BACKTRACKING>0 ) { MEMOIZE(94, decl_instance_machine_params_StartIndex); }

    return ;
}
/* $ANTLR end decl_instance_machine_params */

/**
 * $ANTLR start decl_instance_machine_returns
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2733:1: decl_instance_machine_returns[ sep::Machine * machine ] : ( '-->' | 'returns:' ) ( LPAREN lp= labelled_argument ( COMMA lp= labelled_argument )* RPAREN |lp= labelled_argument ) ;
 */
static void
decl_instance_machine_returns(pfmlParser ctx, sep::Machine * machine)
{
    ANTLR3_UINT32 decl_instance_machine_returns_StartIndex;

    fmlParser_labelled_argument_return lp;
    #undef	RETURN_TYPE_lp
    #define	RETURN_TYPE_lp fmlParser_labelled_argument_return

    /* Initialize rule variables
     */
    decl_instance_machine_returns_StartIndex = INDEX();



    	sep::BFVector labelledReturns(
    		( machine->getType().is< sep::Machine >() ) ? machine->getType().
    			to_ptr< sep::Machine >()->getVariableParametersCount() : 0 );

    	sep::BFList positionalReturns;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(95)) )
    {
        {

            	if( labelledReturns.nonempty() )
            	{
            		sep::ParserUtil::computeInstanceMachineReturn(
            				machine, labelledReturns, positionalReturns);
            	}

        }
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2748:2: ( ( '-->' | 'returns:' ) ( LPAREN lp= labelled_argument ( COMMA lp= labelled_argument )* RPAREN |lp= labelled_argument ) )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2748:4: ( '-->' | 'returns:' ) ( LPAREN lp= labelled_argument ( COMMA lp= labelled_argument )* RPAREN |lp= labelled_argument )
        {
            if ( LA(1) == 163 || LA(1) == 365 )
            {
                CONSUME();
                PERRORRECOVERY=ANTLR3_FALSE;
                FAILEDFLAG=ANTLR3_FALSE;

            }
            else
            {
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
                EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
                EXCEPTION->expectingSet = NULL;

                goto ruledecl_instance_machine_returnsEx;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2749:4: ( LPAREN lp= labelled_argument ( COMMA lp= labelled_argument )* RPAREN |lp= labelled_argument )
            {
                int alt230=2;
                switch ( LA(1) )
                {
                case LPAREN:
                	{
                		{
                		    int LA230_1 = LA(2);
                		    if ( (synpred412_fml(ctx)))
                		    {
                		        alt230=1;
                		    }
                		    else if ( (ANTLR3_TRUE))
                		    {
                		        alt230=2;
                		    }
                		    else
                		    {
                		        if (BACKTRACKING>0)
                		        {
                		            FAILEDFLAG = ANTLR3_TRUE;
                		            return ;
                		        }


                		        CONSTRUCTEX();
                		        EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                		        EXCEPTION->message      = (void *)"";
                		        EXCEPTION->decisionNum  = 230;
                		        EXCEPTION->state        = 1;


                		        goto ruledecl_instance_machine_returnsEx;

                		    }
                		}
                	}
                    break;
                case BNOT:
                case COLONx2:
                case CharLiteral:
                case DECR:
                case DOLLAR_LCURLY:
                case FloatLiteral:
                case ID:
                case INCR:
                case IntegerLiteral:
                case LBRACKET:
                case LBRACKET_BAR:
                case LCURLY:
                case LNOT:
                case LPAREN_INVOKE:
                case MINUS:
                case OP_POP:
                case OP_TOP:
                case PERCENT_LCURLY:
                case PLUS:
                case RationalLiteral:
                case StringLiteral:
                case 158:
                case 159:
                case 160:
                case 161:
                case 162:
                case 237:
                case 256:
                case 265:
                case 277:
                case 280:
                case 294:
                case 313:
                case 330:
                case 331:
                case 332:
                case 343:
                case 347:
                case 372:
                case 397:
                	{
                		alt230=2;
                	}
                    break;

                default:
                    if (BACKTRACKING>0)
                    {
                        FAILEDFLAG = ANTLR3_TRUE;
                        return ;
                    }

                    CONSTRUCTEX();
                    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                    EXCEPTION->message      = (void *)"";
                    EXCEPTION->decisionNum  = 230;
                    EXCEPTION->state        = 0;


                    goto ruledecl_instance_machine_returnsEx;

                }

                switch (alt230)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2749:6: LPAREN lp= labelled_argument ( COMMA lp= labelled_argument )* RPAREN
            	    {
            	         MATCHT(LPAREN, &FOLLOW_LPAREN_in_decl_instance_machine_returns8076);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledecl_instance_machine_returnsEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        FOLLOWPUSH(FOLLOW_labelled_argument_in_decl_instance_machine_returns8085);
            	        lp=labelled_argument(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledecl_instance_machine_returnsEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {

            	            	    	sep::ParserUtil::appendInstanceMachineReturn(machine, lp.label
            	            ,
            	            					labelledReturns, positionalReturns, lp.arg
            	            );
            	            	    
            	        }


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2755:6: ( COMMA lp= labelled_argument )*

            	        for (;;)
            	        {
            	            int alt229=2;
            	            switch ( LA(1) )
            	            {
            	            case COMMA:
            	            	{
            	            		alt229=1;
            	            	}
            	                break;

            	            }

            	            switch (alt229)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2755:8: COMMA lp= labelled_argument
            	        	    {
            	        	         MATCHT(COMMA, &FOLLOW_COMMA_in_decl_instance_machine_returns8101);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledecl_instance_machine_returnsEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	        FOLLOWPUSH(FOLLOW_labelled_argument_in_decl_instance_machine_returns8112);
            	        	        lp=labelled_argument(ctx);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledecl_instance_machine_returnsEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {

            	        	            	    	sep::ParserUtil::appendInstanceMachineReturn(machine, lp.label
            	        	            ,
            	        	            					labelledReturns, positionalReturns, lp.arg
            	        	            );
            	        	            	      
            	        	        }


            	        	    }
            	        	    break;

            	        	default:
            	        	    goto loop229;	/* break out of the loop */
            	        	    break;
            	            }
            	        }
            	        loop229: ; /* Jump out to here if this rule does not match */


            	         MATCHT(RPAREN, &FOLLOW_RPAREN_in_decl_instance_machine_returns8136);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledecl_instance_machine_returnsEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2764:6: lp= labelled_argument
            	    {
            	        FOLLOWPUSH(FOLLOW_labelled_argument_in_decl_instance_machine_returns8146);
            	        lp=labelled_argument(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledecl_instance_machine_returnsEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {

            	            	    	sep::ParserUtil::appendInstanceMachineReturn(machine, lp.label
            	            ,
            	            					labelledReturns, positionalReturns, lp.arg
            	            );
            	            	    
            	        }


            	    }
            	    break;

                }
            }

        }

    }

    // This is where rules clean up and exit
    //
    goto ruledecl_instance_machine_returnsEx; /* Prevent compiler warnings */
    ruledecl_instance_machine_returnsEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
            else
            {
                {

                    	if( labelledReturns.nonempty() )
                    	{
                    		sep::ParserUtil::computeInstanceMachineReturn(
                    				machine, labelledReturns, positionalReturns);
                    	}

                }
            }


    if ( BACKTRACKING>0 ) { MEMOIZE(95, decl_instance_machine_returns_StartIndex); }

    return ;
}
/* $ANTLR end decl_instance_machine_returns */

/**
 * $ANTLR start activity_machine_param_return
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2774:1: activity_machine_param_return[ const sep::BF & argMachine , sep::BFCode & ac ] : LPAREN (lp= labelled_argument ( COMMA lp= labelled_argument )* )? RPAREN ( ( '-->' | 'returns:' ) ( LPAREN lp= labelled_argument ( COMMA lp= labelled_argument )* RPAREN |lp= labelled_argument ) )? ;
 */
static void
activity_machine_param_return(pfmlParser ctx, const sep::BF & argMachine, sep::BFCode & ac)
{
    ANTLR3_UINT32 activity_machine_param_return_StartIndex;

    fmlParser_labelled_argument_return lp;
    #undef	RETURN_TYPE_lp
    #define	RETURN_TYPE_lp fmlParser_labelled_argument_return

    /* Initialize rule variables
     */
    activity_machine_param_return_StartIndex = INDEX();



    	sep::Machine * machine = argMachine.is< sep::Machine >() ?
    			argMachine.to_ptr< sep::Machine >() : NULL;

    	sep::Routine * routine = NULL;

    	sep::avm_size_t paramCount = 0;
    	sep::avm_size_t returnCount = 0;
    	if( machine == NULL )
    	{
    		routine = NULL;
    	}
    	else if( machine->getSpecifier().isDesignInstanceStatic()
    			&& machine->getType().is< sep::Machine >() )
    	{
    		routine = &( machine->getType().to_ptr< sep::Machine >()->
    			getBehavior()->getActivity( ac->getAvmOpCode() ) );
    	}
    	else if( ac->isnotOpCode( sep::AVM_OPCODE_INVOKE_NEW ) )
    //	if( machine->isDesignPrototypeStatic() )
    	{
    		routine = &( machine->getBehavior()->
    				getActivity( ac->getAvmOpCode() ) );
    	}

    	if( routine != NULL )
    	{
    		paramCount  = routine->getParameters().size();
    		returnCount = routine->getReturns().size();
    	}


    	sep::BFVector labelledParams( paramCount );
    	sep::BFList positionalParams;

    	sep::BFVector labelledReturns( returnCount );
    	sep::BFList positionalReturns;

    	if( machine != NULL )
    	{
    		PUSH_CTX_CPM( machine );
    	}

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(96)) )
    {
        {

            	if( BACKTRACKING==0 )
            	{
            		sep::ParserUtil::computeActivityRoutineParamReturn(argMachine, routine, ac,
            			labelledParams , positionalParams, labelledReturns, positionalReturns);
            	}

            	if( machine != NULL )
            	{
            		POP_CTX;
            	}

        }
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2831:2: ( LPAREN (lp= labelled_argument ( COMMA lp= labelled_argument )* )? RPAREN ( ( '-->' | 'returns:' ) ( LPAREN lp= labelled_argument ( COMMA lp= labelled_argument )* RPAREN |lp= labelled_argument ) )? )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2831:4: LPAREN (lp= labelled_argument ( COMMA lp= labelled_argument )* )? RPAREN ( ( '-->' | 'returns:' ) ( LPAREN lp= labelled_argument ( COMMA lp= labelled_argument )* RPAREN |lp= labelled_argument ) )?
        {
             MATCHT(LPAREN, &FOLLOW_LPAREN_in_activity_machine_param_return8182);
            if  (HASEXCEPTION())
            {
                goto ruleactivity_machine_param_returnEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2832:4: (lp= labelled_argument ( COMMA lp= labelled_argument )* )?
            {
                int alt232=2;
                switch ( LA(1) )
                {
                    case BNOT:
                    case COLONx2:
                    case CharLiteral:
                    case DECR:
                    case DOLLAR_LCURLY:
                    case FloatLiteral:
                    case ID:
                    case INCR:
                    case IntegerLiteral:
                    case LBRACKET:
                    case LBRACKET_BAR:
                    case LCURLY:
                    case LNOT:
                    case LPAREN:
                    case LPAREN_INVOKE:
                    case MINUS:
                    case OP_POP:
                    case OP_TOP:
                    case PERCENT_LCURLY:
                    case PLUS:
                    case RationalLiteral:
                    case StringLiteral:
                    case 158:
                    case 159:
                    case 160:
                    case 161:
                    case 162:
                    case 237:
                    case 256:
                    case 265:
                    case 277:
                    case 280:
                    case 294:
                    case 313:
                    case 330:
                    case 331:
                    case 332:
                    case 343:
                    case 347:
                    case 372:
                    case 397:
                    	{
                    		alt232=1;
                    	}
                        break;
                }

                switch (alt232)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2832:6: lp= labelled_argument ( COMMA lp= labelled_argument )*
            	    {
            	        FOLLOWPUSH(FOLLOW_labelled_argument_in_activity_machine_param_return8193);
            	        lp=labelled_argument(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleactivity_machine_param_returnEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {

            	            	    	sep::ParserUtil::appendRoutineParameters(routine, lp.label
            	            ,
            	            					labelledParams, positionalParams, lp.arg
            	            );
            	            	    
            	        }


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2837:6: ( COMMA lp= labelled_argument )*

            	        for (;;)
            	        {
            	            int alt231=2;
            	            switch ( LA(1) )
            	            {
            	            case COMMA:
            	            	{
            	            		alt231=1;
            	            	}
            	                break;

            	            }

            	            switch (alt231)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2837:8: COMMA lp= labelled_argument
            	        	    {
            	        	         MATCHT(COMMA, &FOLLOW_COMMA_in_activity_machine_param_return8209);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruleactivity_machine_param_returnEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	        FOLLOWPUSH(FOLLOW_labelled_argument_in_activity_machine_param_return8218);
            	        	        lp=labelled_argument(ctx);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruleactivity_machine_param_returnEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {

            	        	            	    	sep::ParserUtil::appendRoutineParameters(routine, lp.label
            	        	            ,
            	        	            					labelledParams, positionalParams, lp.arg
            	        	            );
            	        	            	    
            	        	        }


            	        	    }
            	        	    break;

            	        	default:
            	        	    goto loop231;	/* break out of the loop */
            	        	    break;
            	            }
            	        }
            	        loop231: ; /* Jump out to here if this rule does not match */


            	    }
            	    break;

                }
            }

             MATCHT(RPAREN, &FOLLOW_RPAREN_in_activity_machine_param_return8244);
            if  (HASEXCEPTION())
            {
                goto ruleactivity_machine_param_returnEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2847:2: ( ( '-->' | 'returns:' ) ( LPAREN lp= labelled_argument ( COMMA lp= labelled_argument )* RPAREN |lp= labelled_argument ) )?
            {
                int alt235=2;
                switch ( LA(1) )
                {
                    case 163:
                    case 365:
                    	{
                    		alt235=1;
                    	}
                        break;
                }

                switch (alt235)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2847:4: ( '-->' | 'returns:' ) ( LPAREN lp= labelled_argument ( COMMA lp= labelled_argument )* RPAREN |lp= labelled_argument )
            	    {
            	        if ( LA(1) == 163 || LA(1) == 365 )
            	        {
            	            CONSUME();
            	            PERRORRECOVERY=ANTLR3_FALSE;
            	            FAILEDFLAG=ANTLR3_FALSE;

            	        }
            	        else
            	        {
            	            if (BACKTRACKING>0)
            	            {
            	                FAILEDFLAG = ANTLR3_TRUE;
            	                return ;
            	            }

            	            CONSTRUCTEX();
            	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
            	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
            	            EXCEPTION->expectingSet = NULL;

            	            goto ruleactivity_machine_param_returnEx;
            	        }


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2848:4: ( LPAREN lp= labelled_argument ( COMMA lp= labelled_argument )* RPAREN |lp= labelled_argument )
            	        {
            	            int alt234=2;
            	            switch ( LA(1) )
            	            {
            	            case LPAREN:
            	            	{
            	            		{
            	            		    int LA234_1 = LA(2);
            	            		    if ( (synpred417_fml(ctx)))
            	            		    {
            	            		        alt234=1;
            	            		    }
            	            		    else if ( (ANTLR3_TRUE))
            	            		    {
            	            		        alt234=2;
            	            		    }
            	            		    else
            	            		    {
            	            		        if (BACKTRACKING>0)
            	            		        {
            	            		            FAILEDFLAG = ANTLR3_TRUE;
            	            		            return ;
            	            		        }


            	            		        CONSTRUCTEX();
            	            		        EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
            	            		        EXCEPTION->message      = (void *)"";
            	            		        EXCEPTION->decisionNum  = 234;
            	            		        EXCEPTION->state        = 1;


            	            		        goto ruleactivity_machine_param_returnEx;

            	            		    }
            	            		}
            	            	}
            	                break;
            	            case BNOT:
            	            case COLONx2:
            	            case CharLiteral:
            	            case DECR:
            	            case DOLLAR_LCURLY:
            	            case FloatLiteral:
            	            case ID:
            	            case INCR:
            	            case IntegerLiteral:
            	            case LBRACKET:
            	            case LBRACKET_BAR:
            	            case LCURLY:
            	            case LNOT:
            	            case LPAREN_INVOKE:
            	            case MINUS:
            	            case OP_POP:
            	            case OP_TOP:
            	            case PERCENT_LCURLY:
            	            case PLUS:
            	            case RationalLiteral:
            	            case StringLiteral:
            	            case 158:
            	            case 159:
            	            case 160:
            	            case 161:
            	            case 162:
            	            case 237:
            	            case 256:
            	            case 265:
            	            case 277:
            	            case 280:
            	            case 294:
            	            case 313:
            	            case 330:
            	            case 331:
            	            case 332:
            	            case 343:
            	            case 347:
            	            case 372:
            	            case 397:
            	            	{
            	            		alt234=2;
            	            	}
            	                break;

            	            default:
            	                if (BACKTRACKING>0)
            	                {
            	                    FAILEDFLAG = ANTLR3_TRUE;
            	                    return ;
            	                }

            	                CONSTRUCTEX();
            	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
            	                EXCEPTION->message      = (void *)"";
            	                EXCEPTION->decisionNum  = 234;
            	                EXCEPTION->state        = 0;


            	                goto ruleactivity_machine_param_returnEx;

            	            }

            	            switch (alt234)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2848:6: LPAREN lp= labelled_argument ( COMMA lp= labelled_argument )* RPAREN
            	        	    {
            	        	         MATCHT(LPAREN, &FOLLOW_LPAREN_in_activity_machine_param_return8265);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruleactivity_machine_param_returnEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	        FOLLOWPUSH(FOLLOW_labelled_argument_in_activity_machine_param_return8274);
            	        	        lp=labelled_argument(ctx);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruleactivity_machine_param_returnEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {

            	        	            	    	sep::ParserUtil::appendRoutineReturns(routine, lp.label
            	        	            ,
            	        	            					labelledReturns, positionalReturns, lp.arg
            	        	            );
            	        	            	    
            	        	        }


            	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2854:6: ( COMMA lp= labelled_argument )*

            	        	        for (;;)
            	        	        {
            	        	            int alt233=2;
            	        	            switch ( LA(1) )
            	        	            {
            	        	            case COMMA:
            	        	            	{
            	        	            		alt233=1;
            	        	            	}
            	        	                break;

            	        	            }

            	        	            switch (alt233)
            	        	            {
            	        	        	case 1:
            	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2854:8: COMMA lp= labelled_argument
            	        	        	    {
            	        	        	         MATCHT(COMMA, &FOLLOW_COMMA_in_activity_machine_param_return8290);
            	        	        	        if  (HASEXCEPTION())
            	        	        	        {
            	        	        	            goto ruleactivity_machine_param_returnEx;
            	        	        	        }
            	        	        	        if (HASFAILED())
            	        	        	        {
            	        	        	            return ;
            	        	        	        }


            	        	        	        FOLLOWPUSH(FOLLOW_labelled_argument_in_activity_machine_param_return8301);
            	        	        	        lp=labelled_argument(ctx);

            	        	        	        FOLLOWPOP();
            	        	        	        if  (HASEXCEPTION())
            	        	        	        {
            	        	        	            goto ruleactivity_machine_param_returnEx;
            	        	        	        }
            	        	        	        if (HASFAILED())
            	        	        	        {
            	        	        	            return ;
            	        	        	        }


            	        	        	        if ( BACKTRACKING==0 )
            	        	        	        {

            	        	        	            	    	sep::ParserUtil::appendRoutineReturns(routine, lp.label
            	        	        	            ,
            	        	        	            					labelledReturns, positionalReturns, lp.arg
            	        	        	            );
            	        	        	            	      
            	        	        	        }


            	        	        	    }
            	        	        	    break;

            	        	        	default:
            	        	        	    goto loop233;	/* break out of the loop */
            	        	        	    break;
            	        	            }
            	        	        }
            	        	        loop233: ; /* Jump out to here if this rule does not match */


            	        	         MATCHT(RPAREN, &FOLLOW_RPAREN_in_activity_machine_param_return8325);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruleactivity_machine_param_returnEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	    }
            	        	    break;
            	        	case 2:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2863:6: lp= labelled_argument
            	        	    {
            	        	        FOLLOWPUSH(FOLLOW_labelled_argument_in_activity_machine_param_return8335);
            	        	        lp=labelled_argument(ctx);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruleactivity_machine_param_returnEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {

            	        	            	    	sep::ParserUtil::appendRoutineReturns(routine, lp.label
            	        	            ,
            	        	            					labelledReturns, positionalReturns, lp.arg
            	        	            );
            	        	            	    
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	    }
            	    break;

                }
            }

        }

    }

    // This is where rules clean up and exit
    //
    goto ruleactivity_machine_param_returnEx; /* Prevent compiler warnings */
    ruleactivity_machine_param_returnEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
            else
            {
                {

                    	if( BACKTRACKING==0 )
                    	{
                    		sep::ParserUtil::computeActivityRoutineParamReturn(argMachine, routine, ac,
                    			labelledParams , positionalParams, labelledReturns, positionalReturns);
                    	}

                    	if( machine != NULL )
                    	{
                    		POP_CTX;
                    	}

                }
            }


    if ( BACKTRACKING>0 ) { MEMOIZE(96, activity_machine_param_return_StartIndex); }

    return ;
}
/* $ANTLR end activity_machine_param_return */

/**
 * $ANTLR start decl_port
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2879:1: decl_port[ sep::PropertyPart & declProperty , sep::Modifier mdfr ] : 'port' decl_port_impl[ declProperty , mdfr, nature ] ;
 */
static void
decl_port(pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr)
{
    ANTLR3_UINT32 decl_port_StartIndex;

    /* Initialize rule variables
     */
    decl_port_StartIndex = INDEX();



    	sep::IComPoint::ENUM_IO_NATURE nature = sep::IComPoint::IO_UNDEFINED_NATURE;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(97)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2884:2: ( 'port' decl_port_impl[ declProperty , mdfr, nature ] )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2884:4: 'port' decl_port_impl[ declProperty , mdfr, nature ]
        {
             MATCHT(344, &FOLLOW_344_in_decl_port8376);
            if  (HASEXCEPTION())
            {
                goto ruledecl_portEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            if ( BACKTRACKING==0 )
            {
                 nature = sep::IComPoint::IO_PORT_NATURE; 
            }


            FOLLOWPUSH(FOLLOW_decl_port_impl_in_decl_port8386);
            decl_port_impl(ctx, declProperty, mdfr, nature);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruledecl_portEx;
            }
            if (HASFAILED())
            {
                return ;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledecl_portEx; /* Prevent compiler warnings */
    ruledecl_portEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(97, decl_port_StartIndex); }

    return ;
}
/* $ANTLR end decl_port */

/**
 * $ANTLR start decl_port_impl
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2889:1: decl_port_impl[ sep::PropertyPart & declProperty , sep::Modifier mdfr ,\n\t\tsep::IComPoint::ENUM_IO_NATURE nature ] : ( ( ID )=>id= ID ( type_param_com[ port ] )? SEMI | modifier_set_direction_strict_text[ mdfr ] (id= ID ( type_param_com[ port ] )? SEMI | LCURLY (id= ID ( type_param_com[ port ] )? SEMI )+ RCURLY ) | LCURLY ( ( ID )=>id= ID ( type_param_com[ port ] )? SEMI | modifier_set_direction_strict_text[ mdfr ] id= ID ( type_param_com[ port ] )? SEMI )+ RCURLY );
 */
static void
decl_port_impl(pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr, sep::IComPoint::ENUM_IO_NATURE nature)
{
    ANTLR3_UINT32 decl_port_impl_StartIndex;

    pANTLR3_COMMON_TOKEN    id;

    /* Initialize rule variables
     */
    decl_port_impl_StartIndex = INDEX();



    	sep::Port * port;
    	sep::BF TPort;
    	bool isaType = true;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(98)) )
    {
        {
        }



        return ;
    }

    id       = NULL;

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2897:2: ( ( ID )=>id= ID ( type_param_com[ port ] )? SEMI | modifier_set_direction_strict_text[ mdfr ] (id= ID ( type_param_com[ port ] )? SEMI | LCURLY (id= ID ( type_param_com[ port ] )? SEMI )+ RCURLY ) | LCURLY ( ( ID )=>id= ID ( type_param_com[ port ] )? SEMI | modifier_set_direction_strict_text[ mdfr ] id= ID ( type_param_com[ port ] )? SEMI )+ RCURLY )

            ANTLR3_UINT32 alt244;

            alt244=3;

            {
                int LA244_0 = LA(1);
                if ( (synpred419_fml(ctx)) && (LA244_0 == ID))
                {
                    alt244=1;
                }
                else if ( (LA244_0 == 298 || LA244_0 == 305 || LA244_0 == 341 || LA244_0 == 364))
                {
                    alt244=2;
                }
                else if ( (LA244_0 == LCURLY))
                {
                    alt244=3;
                }
                else
                {
                    if (BACKTRACKING>0)
                    {
                        FAILEDFLAG = ANTLR3_TRUE;
                        return ;
                    }


                    CONSTRUCTEX();
                    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                    EXCEPTION->message      = (void *)"";
                    EXCEPTION->decisionNum  = 244;
                    EXCEPTION->state        = 0;


                    goto ruledecl_port_implEx;

                }
            }
            switch (alt244)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2897:4: ( ID )=>id= ID ( type_param_com[ port ] )? SEMI
        	    {
        	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_decl_port_impl8416);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledecl_port_implEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {

        	            		declProperty.appendPort( sep::BF(
        	            				port = new sep::Port(declProperty,
        	            						STR((id->getText(id))->chars), nature,
        	            						mdfr.setDirectionInoutElse() ) ) );
        	            	  
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2904:4: ( type_param_com[ port ] )?
        	        {
        	            int alt236=2;
        	            switch ( LA(1) )
        	            {
        	                case LPAREN:
        	                	{
        	                		alt236=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt236)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2904:6: type_param_com[ port ]
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_type_param_com_in_decl_port_impl8428);
        	        	        type_param_com(ctx, port);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledecl_port_implEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	         MATCHT(SEMI, &FOLLOW_SEMI_in_decl_port_impl8435);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledecl_port_implEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2906:4: modifier_set_direction_strict_text[ mdfr ] (id= ID ( type_param_com[ port ] )? SEMI | LCURLY (id= ID ( type_param_com[ port ] )? SEMI )+ RCURLY )
        	    {
        	        FOLLOWPUSH(FOLLOW_modifier_set_direction_strict_text_in_decl_port_impl8441);
        	        modifier_set_direction_strict_text(ctx, mdfr);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledecl_port_implEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2907:4: (id= ID ( type_param_com[ port ] )? SEMI | LCURLY (id= ID ( type_param_com[ port ] )? SEMI )+ RCURLY )
        	        {
        	            int alt240=2;
        	            switch ( LA(1) )
        	            {
        	            case ID:
        	            	{
        	            		alt240=1;
        	            	}
        	                break;
        	            case LCURLY:
        	            	{
        	            		alt240=2;
        	            	}
        	                break;

        	            default:
        	                if (BACKTRACKING>0)
        	                {
        	                    FAILEDFLAG = ANTLR3_TRUE;
        	                    return ;
        	                }

        	                CONSTRUCTEX();
        	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
        	                EXCEPTION->message      = (void *)"";
        	                EXCEPTION->decisionNum  = 240;
        	                EXCEPTION->state        = 0;


        	                goto ruledecl_port_implEx;

        	            }

        	            switch (alt240)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2907:6: id= ID ( type_param_com[ port ] )? SEMI
        	        	    {
        	        	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_decl_port_impl8451);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledecl_port_implEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {

        	        	            			declProperty.appendPort( sep::BF(
        	        	            		  			port = new sep::Port(declProperty,
        	        	            		  					STR((id->getText(id))->chars), nature, mdfr ) ) );
        	        	            		
        	        	        }


        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2913:3: ( type_param_com[ port ] )?
        	        	        {
        	        	            int alt237=2;
        	        	            switch ( LA(1) )
        	        	            {
        	        	                case LPAREN:
        	        	                	{
        	        	                		alt237=1;
        	        	                	}
        	        	                    break;
        	        	            }

        	        	            switch (alt237)
        	        	            {
        	        	        	case 1:
        	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2913:5: type_param_com[ port ]
        	        	        	    {
        	        	        	        FOLLOWPUSH(FOLLOW_type_param_com_in_decl_port_impl8461);
        	        	        	        type_param_com(ctx, port);

        	        	        	        FOLLOWPOP();
        	        	        	        if  (HASEXCEPTION())
        	        	        	        {
        	        	        	            goto ruledecl_port_implEx;
        	        	        	        }
        	        	        	        if (HASFAILED())
        	        	        	        {
        	        	        	            return ;
        	        	        	        }


        	        	        	    }
        	        	        	    break;

        	        	            }
        	        	        }

        	        	         MATCHT(SEMI, &FOLLOW_SEMI_in_decl_port_impl8468);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledecl_port_implEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;
        	        	case 2:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2915:6: LCURLY (id= ID ( type_param_com[ port ] )? SEMI )+ RCURLY
        	        	    {
        	        	         MATCHT(LCURLY, &FOLLOW_LCURLY_in_decl_port_impl8476);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledecl_port_implEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2916:5: (id= ID ( type_param_com[ port ] )? SEMI )+
        	        	        {
        	        	            int cnt239=0;

        	        	            for (;;)
        	        	            {
        	        	                int alt239=2;
        	        	        	switch ( LA(1) )
        	        	        	{
        	        	        	case ID:
        	        	        		{
        	        	        			alt239=1;
        	        	        		}
        	        	        	    break;

        	        	        	}

        	        	        	switch (alt239)
        	        	        	{
        	        	        	    case 1:
        	        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2916:7: id= ID ( type_param_com[ port ] )? SEMI
        	        	        	        {
        	        	        	            id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_decl_port_impl8486);
        	        	        	            if  (HASEXCEPTION())
        	        	        	            {
        	        	        	                goto ruledecl_port_implEx;
        	        	        	            }
        	        	        	            if (HASFAILED())
        	        	        	            {
        	        	        	                return ;
        	        	        	            }


        	        	        	            if ( BACKTRACKING==0 )
        	        	        	            {

        	        	        	                	    	declProperty.appendPort( sep::BF(
        	        	        	                	    			port = new sep::Port(declProperty,
        	        	        	                	    					STR((id->getText(id))->chars), nature, mdfr) ) );
        	        	        	                	      
        	        	        	            }


        	        	        	            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2922:8: ( type_param_com[ port ] )?
        	        	        	            {
        	        	        	                int alt238=2;
        	        	        	                switch ( LA(1) )
        	        	        	                {
        	        	        	                    case LPAREN:
        	        	        	                    	{
        	        	        	                    		alt238=1;
        	        	        	                    	}
        	        	        	                        break;
        	        	        	                }

        	        	        	                switch (alt238)
        	        	        	                {
        	        	        	            	case 1:
        	        	        	            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2922:10: type_param_com[ port ]
        	        	        	            	    {
        	        	        	            	        FOLLOWPUSH(FOLLOW_type_param_com_in_decl_port_impl8506);
        	        	        	            	        type_param_com(ctx, port);

        	        	        	            	        FOLLOWPOP();
        	        	        	            	        if  (HASEXCEPTION())
        	        	        	            	        {
        	        	        	            	            goto ruledecl_port_implEx;
        	        	        	            	        }
        	        	        	            	        if (HASFAILED())
        	        	        	            	        {
        	        	        	            	            return ;
        	        	        	            	        }


        	        	        	            	    }
        	        	        	            	    break;

        	        	        	                }
        	        	        	            }

        	        	        	             MATCHT(SEMI, &FOLLOW_SEMI_in_decl_port_impl8513);
        	        	        	            if  (HASEXCEPTION())
        	        	        	            {
        	        	        	                goto ruledecl_port_implEx;
        	        	        	            }
        	        	        	            if (HASFAILED())
        	        	        	            {
        	        	        	                return ;
        	        	        	            }


        	        	        	        }
        	        	        	        break;

        	        	        	    default:

        	        	        		if ( cnt239 >= 1 )
        	        	        		{
        	        	        		    goto loop239;
        	        	        		}
        	        	        		if (BACKTRACKING>0)
        	        	        		{
        	        	        		    FAILEDFLAG = ANTLR3_TRUE;
        	        	        		    return ;
        	        	        		}

        	        	        		/* mismatchedSetEx()
        	        	        		 */
        	        	        		CONSTRUCTEX();
        	        	        		EXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
        	        	        		EXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;


        	        	        		goto ruledecl_port_implEx;
        	        	        	}
        	        	        	cnt239++;
        	        	            }
        	        	            loop239: ;	/* Jump to here if this rule does not match */
        	        	        }

        	        	         MATCHT(RCURLY, &FOLLOW_RCURLY_in_decl_port_impl8523);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledecl_port_implEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2926:4: LCURLY ( ( ID )=>id= ID ( type_param_com[ port ] )? SEMI | modifier_set_direction_strict_text[ mdfr ] id= ID ( type_param_com[ port ] )? SEMI )+ RCURLY
        	    {
        	         MATCHT(LCURLY, &FOLLOW_LCURLY_in_decl_port_impl8533);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledecl_port_implEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2927:4: ( ( ID )=>id= ID ( type_param_com[ port ] )? SEMI | modifier_set_direction_strict_text[ mdfr ] id= ID ( type_param_com[ port ] )? SEMI )+
        	        {
        	            int cnt243=0;

        	            for (;;)
        	            {
        	                int alt243=3;
        	        	{
        	        	   /* dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState)
        	        	    */
        	        	    int LA243_0 = LA(1);
        	        	    if ( (synpred426_fml(ctx)) && (LA243_0 == ID))
        	        	    {
        	        	        alt243=1;
        	        	    }
        	        	    else if ( (LA243_0 == 298 || LA243_0 == 305 || LA243_0 == 341 || LA243_0 == 364))
        	        	    {
        	        	        alt243=2;
        	        	    }

        	        	}
        	        	switch (alt243)
        	        	{
        	        	    case 1:
        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2927:6: ( ID )=>id= ID ( type_param_com[ port ] )? SEMI
        	        	        {
        	        	            id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_decl_port_impl8551);
        	        	            if  (HASEXCEPTION())
        	        	            {
        	        	                goto ruledecl_port_implEx;
        	        	            }
        	        	            if (HASFAILED())
        	        	            {
        	        	                return ;
        	        	            }


        	        	            if ( BACKTRACKING==0 )
        	        	            {

        	        	                			declProperty.appendPort( sep::BF(
        	        	                	    			port = new sep::Port(declProperty,
        	        	                			    			STR((id->getText(id))->chars), nature,
        	        	                			    			mdfr.setDirectionInoutElse() ) ) );
        	        	                	  		port->setModifier( mdfr );
        	        	                	    
        	        	            }


        	        	            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2935:6: ( type_param_com[ port ] )?
        	        	            {
        	        	                int alt241=2;
        	        	                switch ( LA(1) )
        	        	                {
        	        	                    case LPAREN:
        	        	                    	{
        	        	                    		alt241=1;
        	        	                    	}
        	        	                        break;
        	        	                }

        	        	                switch (alt241)
        	        	                {
        	        	            	case 1:
        	        	            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2935:8: type_param_com[ port ]
        	        	            	    {
        	        	            	        FOLLOWPUSH(FOLLOW_type_param_com_in_decl_port_impl8567);
        	        	            	        type_param_com(ctx, port);

        	        	            	        FOLLOWPOP();
        	        	            	        if  (HASEXCEPTION())
        	        	            	        {
        	        	            	            goto ruledecl_port_implEx;
        	        	            	        }
        	        	            	        if (HASFAILED())
        	        	            	        {
        	        	            	            return ;
        	        	            	        }


        	        	            	    }
        	        	            	    break;

        	        	                }
        	        	            }

        	        	             MATCHT(SEMI, &FOLLOW_SEMI_in_decl_port_impl8574);
        	        	            if  (HASEXCEPTION())
        	        	            {
        	        	                goto ruledecl_port_implEx;
        	        	            }
        	        	            if (HASFAILED())
        	        	            {
        	        	                return ;
        	        	            }


        	        	        }
        	        	        break;
        	        	    case 2:
        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2937:6: modifier_set_direction_strict_text[ mdfr ] id= ID ( type_param_com[ port ] )? SEMI
        	        	        {
        	        	            FOLLOWPUSH(FOLLOW_modifier_set_direction_strict_text_in_decl_port_impl8582);
        	        	            modifier_set_direction_strict_text(ctx, mdfr);

        	        	            FOLLOWPOP();
        	        	            if  (HASEXCEPTION())
        	        	            {
        	        	                goto ruledecl_port_implEx;
        	        	            }
        	        	            if (HASFAILED())
        	        	            {
        	        	                return ;
        	        	            }


        	        	            id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_decl_port_impl8587);
        	        	            if  (HASEXCEPTION())
        	        	            {
        	        	                goto ruledecl_port_implEx;
        	        	            }
        	        	            if (HASFAILED())
        	        	            {
        	        	                return ;
        	        	            }


        	        	            if ( BACKTRACKING==0 )
        	        	            {

        	        	                	    	declProperty.appendPort( sep::BF(
        	        	                	    			port = new sep::Port(declProperty,
        	        	                	    					STR((id->getText(id))->chars), nature, mdfr) ) );
        	        	                	    
        	        	            }


        	        	            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2943:6: ( type_param_com[ port ] )?
        	        	            {
        	        	                int alt242=2;
        	        	                switch ( LA(1) )
        	        	                {
        	        	                    case LPAREN:
        	        	                    	{
        	        	                    		alt242=1;
        	        	                    	}
        	        	                        break;
        	        	                }

        	        	                switch (alt242)
        	        	                {
        	        	            	case 1:
        	        	            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2943:8: type_param_com[ port ]
        	        	            	    {
        	        	            	        FOLLOWPUSH(FOLLOW_type_param_com_in_decl_port_impl8603);
        	        	            	        type_param_com(ctx, port);

        	        	            	        FOLLOWPOP();
        	        	            	        if  (HASEXCEPTION())
        	        	            	        {
        	        	            	            goto ruledecl_port_implEx;
        	        	            	        }
        	        	            	        if (HASFAILED())
        	        	            	        {
        	        	            	            return ;
        	        	            	        }


        	        	            	    }
        	        	            	    break;

        	        	                }
        	        	            }

        	        	             MATCHT(SEMI, &FOLLOW_SEMI_in_decl_port_impl8610);
        	        	            if  (HASEXCEPTION())
        	        	            {
        	        	                goto ruledecl_port_implEx;
        	        	            }
        	        	            if (HASFAILED())
        	        	            {
        	        	                return ;
        	        	            }


        	        	        }
        	        	        break;

        	        	    default:

        	        		if ( cnt243 >= 1 )
        	        		{
        	        		    goto loop243;
        	        		}
        	        		if (BACKTRACKING>0)
        	        		{
        	        		    FAILEDFLAG = ANTLR3_TRUE;
        	        		    return ;
        	        		}

        	        		/* mismatchedSetEx()
        	        		 */
        	        		CONSTRUCTEX();
        	        		EXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
        	        		EXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;


        	        		goto ruledecl_port_implEx;
        	        	}
        	        	cnt243++;
        	            }
        	            loop243: ;	/* Jump to here if this rule does not match */
        	        }

        	         MATCHT(RCURLY, &FOLLOW_RCURLY_in_decl_port_impl8621);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledecl_port_implEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruledecl_port_implEx; /* Prevent compiler warnings */
    ruledecl_port_implEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(98, decl_port_impl_StartIndex); }

    return ;
}
/* $ANTLR end decl_port_impl */

/**
 * $ANTLR start decl_signal
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2953:1: decl_signal[ sep::PropertyPart & declProperty , sep::Modifier mdfr ] : ( 'signal' | 'message' ) decl_signal_impl[ declProperty , mdfr, nature ] ;
 */
static void
decl_signal(pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr)
{
    ANTLR3_UINT32 decl_signal_StartIndex;

    /* Initialize rule variables
     */
    decl_signal_StartIndex = INDEX();



    	sep::IComPoint::ENUM_IO_NATURE nature = sep::IComPoint::IO_UNDEFINED_NATURE;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(99)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2958:2: ( ( 'signal' | 'message' ) decl_signal_impl[ declProperty , mdfr, nature ] )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2958:4: ( 'signal' | 'message' ) decl_signal_impl[ declProperty , mdfr, nature ]
        {
            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2958:4: ( 'signal' | 'message' )
            {
                int alt245=2;
                switch ( LA(1) )
                {
                case 374:
                	{
                		alt245=1;
                	}
                    break;
                case 320:
                	{
                		alt245=2;
                	}
                    break;

                default:
                    if (BACKTRACKING>0)
                    {
                        FAILEDFLAG = ANTLR3_TRUE;
                        return ;
                    }

                    CONSTRUCTEX();
                    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                    EXCEPTION->message      = (void *)"";
                    EXCEPTION->decisionNum  = 245;
                    EXCEPTION->state        = 0;


                    goto ruledecl_signalEx;

                }

                switch (alt245)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2958:6: 'signal'
            	    {
            	         MATCHT(374, &FOLLOW_374_in_decl_signal8646);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledecl_signalEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             nature = sep::IComPoint::IO_SIGNAL_NATURE;  
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2959:6: 'message'
            	    {
            	         MATCHT(320, &FOLLOW_320_in_decl_signal8656);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledecl_signalEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             nature = sep::IComPoint::IO_MESSAGE_NATURE; 
            	        }


            	    }
            	    break;

                }
            }

            FOLLOWPUSH(FOLLOW_decl_signal_impl_in_decl_signal8668);
            decl_signal_impl(ctx, declProperty, mdfr, nature);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruledecl_signalEx;
            }
            if (HASFAILED())
            {
                return ;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledecl_signalEx; /* Prevent compiler warnings */
    ruledecl_signalEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(99, decl_signal_StartIndex); }

    return ;
}
/* $ANTLR end decl_signal */

/**
 * $ANTLR start decl_signal_impl
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2964:1: decl_signal_impl[ sep::PropertyPart & declProperty , sep::Modifier mdfr ,\n\t\tsep::IComPoint::ENUM_IO_NATURE nature ] : ( ( ID )=>id= ID ( type_param_com[ signal ] )? SEMI | modifier_set_direction_strict_text[ mdfr ] (id= ID ( type_param_com[ signal ] )? SEMI | LCURLY (id= ID ( type_param_com[ signal ] )? SEMI )+ RCURLY ) | LCURLY ( ( ID )=>id= ID ( type_param_com[ signal ] )? SEMI | modifier_set_direction_strict_text[ mdfr ] id= ID ( type_param_com[ signal ] )? SEMI )+ RCURLY );
 */
static void
decl_signal_impl(pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr, sep::IComPoint::ENUM_IO_NATURE nature)
{
    ANTLR3_UINT32 decl_signal_impl_StartIndex;

    pANTLR3_COMMON_TOKEN    id;

    /* Initialize rule variables
     */
    decl_signal_impl_StartIndex = INDEX();



    	sep::Port * signal;
    	sep::BF TPort;
    	bool isaType = true;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(100)) )
    {
        {
        }



        return ;
    }

    id       = NULL;

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2972:2: ( ( ID )=>id= ID ( type_param_com[ signal ] )? SEMI | modifier_set_direction_strict_text[ mdfr ] (id= ID ( type_param_com[ signal ] )? SEMI | LCURLY (id= ID ( type_param_com[ signal ] )? SEMI )+ RCURLY ) | LCURLY ( ( ID )=>id= ID ( type_param_com[ signal ] )? SEMI | modifier_set_direction_strict_text[ mdfr ] id= ID ( type_param_com[ signal ] )? SEMI )+ RCURLY )

            ANTLR3_UINT32 alt254;

            alt254=3;

            {
                int LA254_0 = LA(1);
                if ( (synpred431_fml(ctx)) && (LA254_0 == ID))
                {
                    alt254=1;
                }
                else if ( (LA254_0 == 298 || LA254_0 == 305 || LA254_0 == 341 || LA254_0 == 364))
                {
                    alt254=2;
                }
                else if ( (LA254_0 == LCURLY))
                {
                    alt254=3;
                }
                else
                {
                    if (BACKTRACKING>0)
                    {
                        FAILEDFLAG = ANTLR3_TRUE;
                        return ;
                    }


                    CONSTRUCTEX();
                    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                    EXCEPTION->message      = (void *)"";
                    EXCEPTION->decisionNum  = 254;
                    EXCEPTION->state        = 0;


                    goto ruledecl_signal_implEx;

                }
            }
            switch (alt254)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2972:4: ( ID )=>id= ID ( type_param_com[ signal ] )? SEMI
        	    {
        	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_decl_signal_impl8698);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledecl_signal_implEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {

        	            		declProperty.appendSignal( sep::BF(
        	            				signal = new sep::Signal(declProperty,
        	            						STR((id->getText(id))->chars), nature,
        	            						mdfr.setDirectionInoutElse() ) ) );
        	            	  
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2979:4: ( type_param_com[ signal ] )?
        	        {
        	            int alt246=2;
        	            switch ( LA(1) )
        	            {
        	                case LPAREN:
        	                	{
        	                		alt246=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt246)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2979:6: type_param_com[ signal ]
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_type_param_com_in_decl_signal_impl8710);
        	        	        type_param_com(ctx, signal);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledecl_signal_implEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	         MATCHT(SEMI, &FOLLOW_SEMI_in_decl_signal_impl8717);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledecl_signal_implEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2981:4: modifier_set_direction_strict_text[ mdfr ] (id= ID ( type_param_com[ signal ] )? SEMI | LCURLY (id= ID ( type_param_com[ signal ] )? SEMI )+ RCURLY )
        	    {
        	        FOLLOWPUSH(FOLLOW_modifier_set_direction_strict_text_in_decl_signal_impl8723);
        	        modifier_set_direction_strict_text(ctx, mdfr);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledecl_signal_implEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2982:4: (id= ID ( type_param_com[ signal ] )? SEMI | LCURLY (id= ID ( type_param_com[ signal ] )? SEMI )+ RCURLY )
        	        {
        	            int alt250=2;
        	            switch ( LA(1) )
        	            {
        	            case ID:
        	            	{
        	            		alt250=1;
        	            	}
        	                break;
        	            case LCURLY:
        	            	{
        	            		alt250=2;
        	            	}
        	                break;

        	            default:
        	                if (BACKTRACKING>0)
        	                {
        	                    FAILEDFLAG = ANTLR3_TRUE;
        	                    return ;
        	                }

        	                CONSTRUCTEX();
        	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
        	                EXCEPTION->message      = (void *)"";
        	                EXCEPTION->decisionNum  = 250;
        	                EXCEPTION->state        = 0;


        	                goto ruledecl_signal_implEx;

        	            }

        	            switch (alt250)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2982:6: id= ID ( type_param_com[ signal ] )? SEMI
        	        	    {
        	        	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_decl_signal_impl8733);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledecl_signal_implEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {

        	        	            			declProperty.appendSignal( sep::BF(
        	        	            		  			signal = new sep::Signal(declProperty,
        	        	            		  					STR((id->getText(id))->chars), nature, mdfr ) ) );
        	        	            		
        	        	        }


        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2988:3: ( type_param_com[ signal ] )?
        	        	        {
        	        	            int alt247=2;
        	        	            switch ( LA(1) )
        	        	            {
        	        	                case LPAREN:
        	        	                	{
        	        	                		alt247=1;
        	        	                	}
        	        	                    break;
        	        	            }

        	        	            switch (alt247)
        	        	            {
        	        	        	case 1:
        	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2988:5: type_param_com[ signal ]
        	        	        	    {
        	        	        	        FOLLOWPUSH(FOLLOW_type_param_com_in_decl_signal_impl8743);
        	        	        	        type_param_com(ctx, signal);

        	        	        	        FOLLOWPOP();
        	        	        	        if  (HASEXCEPTION())
        	        	        	        {
        	        	        	            goto ruledecl_signal_implEx;
        	        	        	        }
        	        	        	        if (HASFAILED())
        	        	        	        {
        	        	        	            return ;
        	        	        	        }


        	        	        	    }
        	        	        	    break;

        	        	            }
        	        	        }

        	        	         MATCHT(SEMI, &FOLLOW_SEMI_in_decl_signal_impl8750);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledecl_signal_implEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;
        	        	case 2:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2990:6: LCURLY (id= ID ( type_param_com[ signal ] )? SEMI )+ RCURLY
        	        	    {
        	        	         MATCHT(LCURLY, &FOLLOW_LCURLY_in_decl_signal_impl8758);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledecl_signal_implEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2991:5: (id= ID ( type_param_com[ signal ] )? SEMI )+
        	        	        {
        	        	            int cnt249=0;

        	        	            for (;;)
        	        	            {
        	        	                int alt249=2;
        	        	        	switch ( LA(1) )
        	        	        	{
        	        	        	case ID:
        	        	        		{
        	        	        			alt249=1;
        	        	        		}
        	        	        	    break;

        	        	        	}

        	        	        	switch (alt249)
        	        	        	{
        	        	        	    case 1:
        	        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2991:7: id= ID ( type_param_com[ signal ] )? SEMI
        	        	        	        {
        	        	        	            id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_decl_signal_impl8768);
        	        	        	            if  (HASEXCEPTION())
        	        	        	            {
        	        	        	                goto ruledecl_signal_implEx;
        	        	        	            }
        	        	        	            if (HASFAILED())
        	        	        	            {
        	        	        	                return ;
        	        	        	            }


        	        	        	            if ( BACKTRACKING==0 )
        	        	        	            {

        	        	        	                	    	declProperty.appendSignal( sep::BF(
        	        	        	                	    			signal = new sep::Signal(declProperty,
        	        	        	                	    					STR((id->getText(id))->chars), nature, mdfr) ) );
        	        	        	                	      
        	        	        	            }


        	        	        	            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2997:8: ( type_param_com[ signal ] )?
        	        	        	            {
        	        	        	                int alt248=2;
        	        	        	                switch ( LA(1) )
        	        	        	                {
        	        	        	                    case LPAREN:
        	        	        	                    	{
        	        	        	                    		alt248=1;
        	        	        	                    	}
        	        	        	                        break;
        	        	        	                }

        	        	        	                switch (alt248)
        	        	        	                {
        	        	        	            	case 1:
        	        	        	            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2997:10: type_param_com[ signal ]
        	        	        	            	    {
        	        	        	            	        FOLLOWPUSH(FOLLOW_type_param_com_in_decl_signal_impl8788);
        	        	        	            	        type_param_com(ctx, signal);

        	        	        	            	        FOLLOWPOP();
        	        	        	            	        if  (HASEXCEPTION())
        	        	        	            	        {
        	        	        	            	            goto ruledecl_signal_implEx;
        	        	        	            	        }
        	        	        	            	        if (HASFAILED())
        	        	        	            	        {
        	        	        	            	            return ;
        	        	        	            	        }


        	        	        	            	    }
        	        	        	            	    break;

        	        	        	                }
        	        	        	            }

        	        	        	             MATCHT(SEMI, &FOLLOW_SEMI_in_decl_signal_impl8795);
        	        	        	            if  (HASEXCEPTION())
        	        	        	            {
        	        	        	                goto ruledecl_signal_implEx;
        	        	        	            }
        	        	        	            if (HASFAILED())
        	        	        	            {
        	        	        	                return ;
        	        	        	            }


        	        	        	        }
        	        	        	        break;

        	        	        	    default:

        	        	        		if ( cnt249 >= 1 )
        	        	        		{
        	        	        		    goto loop249;
        	        	        		}
        	        	        		if (BACKTRACKING>0)
        	        	        		{
        	        	        		    FAILEDFLAG = ANTLR3_TRUE;
        	        	        		    return ;
        	        	        		}

        	        	        		/* mismatchedSetEx()
        	        	        		 */
        	        	        		CONSTRUCTEX();
        	        	        		EXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
        	        	        		EXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;


        	        	        		goto ruledecl_signal_implEx;
        	        	        	}
        	        	        	cnt249++;
        	        	            }
        	        	            loop249: ;	/* Jump to here if this rule does not match */
        	        	        }

        	        	         MATCHT(RCURLY, &FOLLOW_RCURLY_in_decl_signal_impl8805);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledecl_signal_implEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3001:4: LCURLY ( ( ID )=>id= ID ( type_param_com[ signal ] )? SEMI | modifier_set_direction_strict_text[ mdfr ] id= ID ( type_param_com[ signal ] )? SEMI )+ RCURLY
        	    {
        	         MATCHT(LCURLY, &FOLLOW_LCURLY_in_decl_signal_impl8815);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledecl_signal_implEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3002:4: ( ( ID )=>id= ID ( type_param_com[ signal ] )? SEMI | modifier_set_direction_strict_text[ mdfr ] id= ID ( type_param_com[ signal ] )? SEMI )+
        	        {
        	            int cnt253=0;

        	            for (;;)
        	            {
        	                int alt253=3;
        	        	{
        	        	   /* dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState)
        	        	    */
        	        	    int LA253_0 = LA(1);
        	        	    if ( (synpred438_fml(ctx)) && (LA253_0 == ID))
        	        	    {
        	        	        alt253=1;
        	        	    }
        	        	    else if ( (LA253_0 == 298 || LA253_0 == 305 || LA253_0 == 341 || LA253_0 == 364))
        	        	    {
        	        	        alt253=2;
        	        	    }

        	        	}
        	        	switch (alt253)
        	        	{
        	        	    case 1:
        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3002:6: ( ID )=>id= ID ( type_param_com[ signal ] )? SEMI
        	        	        {
        	        	            id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_decl_signal_impl8833);
        	        	            if  (HASEXCEPTION())
        	        	            {
        	        	                goto ruledecl_signal_implEx;
        	        	            }
        	        	            if (HASFAILED())
        	        	            {
        	        	                return ;
        	        	            }


        	        	            if ( BACKTRACKING==0 )
        	        	            {

        	        	                			declProperty.appendSignal( sep::BF(
        	        	                	    			signal = new sep::Signal(declProperty,
        	        	                			    			STR((id->getText(id))->chars), nature,
        	        	                			    			mdfr.setDirectionInoutElse() ) ) );
        	        	                	  		signal->setModifier( mdfr );
        	        	                	    
        	        	            }


        	        	            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3010:6: ( type_param_com[ signal ] )?
        	        	            {
        	        	                int alt251=2;
        	        	                switch ( LA(1) )
        	        	                {
        	        	                    case LPAREN:
        	        	                    	{
        	        	                    		alt251=1;
        	        	                    	}
        	        	                        break;
        	        	                }

        	        	                switch (alt251)
        	        	                {
        	        	            	case 1:
        	        	            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3010:8: type_param_com[ signal ]
        	        	            	    {
        	        	            	        FOLLOWPUSH(FOLLOW_type_param_com_in_decl_signal_impl8849);
        	        	            	        type_param_com(ctx, signal);

        	        	            	        FOLLOWPOP();
        	        	            	        if  (HASEXCEPTION())
        	        	            	        {
        	        	            	            goto ruledecl_signal_implEx;
        	        	            	        }
        	        	            	        if (HASFAILED())
        	        	            	        {
        	        	            	            return ;
        	        	            	        }


        	        	            	    }
        	        	            	    break;

        	        	                }
        	        	            }

        	        	             MATCHT(SEMI, &FOLLOW_SEMI_in_decl_signal_impl8856);
        	        	            if  (HASEXCEPTION())
        	        	            {
        	        	                goto ruledecl_signal_implEx;
        	        	            }
        	        	            if (HASFAILED())
        	        	            {
        	        	                return ;
        	        	            }


        	        	        }
        	        	        break;
        	        	    case 2:
        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3012:6: modifier_set_direction_strict_text[ mdfr ] id= ID ( type_param_com[ signal ] )? SEMI
        	        	        {
        	        	            FOLLOWPUSH(FOLLOW_modifier_set_direction_strict_text_in_decl_signal_impl8864);
        	        	            modifier_set_direction_strict_text(ctx, mdfr);

        	        	            FOLLOWPOP();
        	        	            if  (HASEXCEPTION())
        	        	            {
        	        	                goto ruledecl_signal_implEx;
        	        	            }
        	        	            if (HASFAILED())
        	        	            {
        	        	                return ;
        	        	            }


        	        	            id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_decl_signal_impl8869);
        	        	            if  (HASEXCEPTION())
        	        	            {
        	        	                goto ruledecl_signal_implEx;
        	        	            }
        	        	            if (HASFAILED())
        	        	            {
        	        	                return ;
        	        	            }


        	        	            if ( BACKTRACKING==0 )
        	        	            {

        	        	                	    	declProperty.appendSignal( sep::BF(
        	        	                	    			signal = new sep::Signal(declProperty,
        	        	                	    					STR((id->getText(id))->chars), nature, mdfr) ) );
        	        	                	    
        	        	            }


        	        	            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3018:6: ( type_param_com[ signal ] )?
        	        	            {
        	        	                int alt252=2;
        	        	                switch ( LA(1) )
        	        	                {
        	        	                    case LPAREN:
        	        	                    	{
        	        	                    		alt252=1;
        	        	                    	}
        	        	                        break;
        	        	                }

        	        	                switch (alt252)
        	        	                {
        	        	            	case 1:
        	        	            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3018:8: type_param_com[ signal ]
        	        	            	    {
        	        	            	        FOLLOWPUSH(FOLLOW_type_param_com_in_decl_signal_impl8885);
        	        	            	        type_param_com(ctx, signal);

        	        	            	        FOLLOWPOP();
        	        	            	        if  (HASEXCEPTION())
        	        	            	        {
        	        	            	            goto ruledecl_signal_implEx;
        	        	            	        }
        	        	            	        if (HASFAILED())
        	        	            	        {
        	        	            	            return ;
        	        	            	        }


        	        	            	    }
        	        	            	    break;

        	        	                }
        	        	            }

        	        	             MATCHT(SEMI, &FOLLOW_SEMI_in_decl_signal_impl8892);
        	        	            if  (HASEXCEPTION())
        	        	            {
        	        	                goto ruledecl_signal_implEx;
        	        	            }
        	        	            if (HASFAILED())
        	        	            {
        	        	                return ;
        	        	            }


        	        	        }
        	        	        break;

        	        	    default:

        	        		if ( cnt253 >= 1 )
        	        		{
        	        		    goto loop253;
        	        		}
        	        		if (BACKTRACKING>0)
        	        		{
        	        		    FAILEDFLAG = ANTLR3_TRUE;
        	        		    return ;
        	        		}

        	        		/* mismatchedSetEx()
        	        		 */
        	        		CONSTRUCTEX();
        	        		EXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
        	        		EXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;


        	        		goto ruledecl_signal_implEx;
        	        	}
        	        	cnt253++;
        	            }
        	            loop253: ;	/* Jump to here if this rule does not match */
        	        }

        	         MATCHT(RCURLY, &FOLLOW_RCURLY_in_decl_signal_impl8903);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledecl_signal_implEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruledecl_signal_implEx; /* Prevent compiler warnings */
    ruledecl_signal_implEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(100, decl_signal_impl_StartIndex); }

    return ;
}
/* $ANTLR end decl_signal_impl */

/**
 * $ANTLR start type_param_com
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3028:1: type_param_com[ sep::Port * port ] : LPAREN param_com_atom[ port , offset] ( COMMA param_com_atom[ port , ++offset ] )* RPAREN ;
 */
static void
type_param_com(pfmlParser ctx, sep::Port * port)
{
    ANTLR3_UINT32 type_param_com_StartIndex;

    /* Initialize rule variables
     */
    type_param_com_StartIndex = INDEX();



    	sep::avm_offset_t offset = 0;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(101)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3032:2: ( LPAREN param_com_atom[ port , offset] ( COMMA param_com_atom[ port , ++offset ] )* RPAREN )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3032:4: LPAREN param_com_atom[ port , offset] ( COMMA param_com_atom[ port , ++offset ] )* RPAREN
        {
             MATCHT(LPAREN, &FOLLOW_LPAREN_in_type_param_com8925);
            if  (HASEXCEPTION())
            {
                goto ruletype_param_comEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            FOLLOWPUSH(FOLLOW_param_com_atom_in_type_param_com8932);
            param_com_atom(ctx, port, offset);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruletype_param_comEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3034:6: ( COMMA param_com_atom[ port , ++offset ] )*

            for (;;)
            {
                int alt255=2;
                switch ( LA(1) )
                {
                case COMMA:
                	{
                		alt255=1;
                	}
                    break;

                }

                switch (alt255)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3034:8: COMMA param_com_atom[ port , ++offset ]
            	    {
            	         MATCHT(COMMA, &FOLLOW_COMMA_in_type_param_com8942);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruletype_param_comEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        FOLLOWPUSH(FOLLOW_param_com_atom_in_type_param_com8944);
            	        param_com_atom(ctx, port, ++offset);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruletype_param_comEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

            	default:
            	    goto loop255;	/* break out of the loop */
            	    break;
                }
            }
            loop255: ; /* Jump out to here if this rule does not match */


             MATCHT(RPAREN, &FOLLOW_RPAREN_in_type_param_com8953);
            if  (HASEXCEPTION())
            {
                goto ruletype_param_comEx;
            }
            if (HASFAILED())
            {
                return ;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruletype_param_comEx; /* Prevent compiler warnings */
    ruletype_param_comEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(101, type_param_com_StartIndex); }

    return ;
}
/* $ANTLR end type_param_com */

/**
 * $ANTLR start param_com_atom
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3038:1: param_com_atom[ sep::Port * port , sep::avm_offset_t offset ] : (tv= type_var (id= ID (iv= initial_value )? )? | 'bind:' ( ( type_var COLON )=>tv= type_var COLON e= expression |vid= qualifiedNameID ) );
 */
static void
param_com_atom(pfmlParser ctx, sep::Port * port, sep::avm_offset_t offset)
{
    ANTLR3_UINT32 param_com_atom_StartIndex;

    pANTLR3_COMMON_TOKEN    id;
    sep::BF tv;
    #undef	RETURN_TYPE_tv
    #define	RETURN_TYPE_tv sep::BF

    sep::BF iv;
    #undef	RETURN_TYPE_iv
    #define	RETURN_TYPE_iv sep::BF

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    fmlParser_qualifiedNameID_return vid;
    #undef	RETURN_TYPE_vid
    #define	RETURN_TYPE_vid fmlParser_qualifiedNameID_return

    /* Initialize rule variables
     */
    param_com_atom_StartIndex = INDEX();



    	sep::Variable * variable;
    	sep::BF paramT = sep::TypeManager::UNIVERSAL;
    	std::string paramID;
    	sep::BF value;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(102)) )
    {
        {
        }



        return ;
    }

    id       = NULL;

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3046:2: (tv= type_var (id= ID (iv= initial_value )? )? | 'bind:' ( ( type_var COLON )=>tv= type_var COLON e= expression |vid= qualifiedNameID ) )

            ANTLR3_UINT32 alt259;

            alt259=2;

            switch ( LA(1) )
            {
            case ID:
            case 241:
            case 242:
            case 245:
            case 246:
            case 249:
            case 254:
            case 255:
            case 259:
            case 261:
            case 264:
            case 270:
            case 271:
            case 281:
            case 283:
            case 309:
            case 310:
            case 311:
            case 315:
            case 316:
            case 317:
            case 320:
            case 325:
            case 326:
            case 329:
            case 333:
            case 344:
            case 345:
            case 346:
            case 357:
            case 358:
            case 360:
            case 370:
            case 373:
            case 374:
            case 387:
            case 392:
            case 399:
            case 400:
            case 401:
            case 402:
            case 405:
            case 407:
            case 408:
            case 409:
            case 412:
            	{
            		alt259=1;
            	}
                break;
            case 244:
            	{
            		alt259=2;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 259;
                EXCEPTION->state        = 0;


                goto ruleparam_com_atomEx;

            }

            switch (alt259)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3046:4: tv= type_var (id= ID (iv= initial_value )? )?
        	    {
        	        FOLLOWPUSH(FOLLOW_type_var_in_param_com_atom8973);
        	        tv=type_var(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleparam_com_atomEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             paramT = tv
        	            ; 
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3047:4: (id= ID (iv= initial_value )? )?
        	        {
        	            int alt257=2;
        	            switch ( LA(1) )
        	            {
        	                case ID:
        	                	{
        	                		alt257=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt257)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3047:6: id= ID (iv= initial_value )?
        	        	    {
        	        	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_param_com_atom8984);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruleparam_com_atomEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             paramID = STR((id->getText(id))->chars); 
        	        	        }


        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3048:6: (iv= initial_value )?
        	        	        {
        	        	            int alt256=2;
        	        	            switch ( LA(1) )
        	        	            {
        	        	                case ASSIGN:
        	        	                case LPAREN:
        	        	                	{
        	        	                		alt256=1;
        	        	                	}
        	        	                    break;
        	        	            }

        	        	            switch (alt256)
        	        	            {
        	        	        	case 1:
        	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3048:8: iv= initial_value
        	        	        	    {
        	        	        	        FOLLOWPUSH(FOLLOW_initial_value_in_param_com_atom9001);
        	        	        	        iv=initial_value(ctx);

        	        	        	        FOLLOWPOP();
        	        	        	        if  (HASEXCEPTION())
        	        	        	        {
        	        	        	            goto ruleparam_com_atomEx;
        	        	        	        }
        	        	        	        if (HASFAILED())
        	        	        	        {
        	        	        	            return ;
        	        	        	        }


        	        	        	        if ( BACKTRACKING==0 )
        	        	        	        {
        	        	        	             value = iv
        	        	        	            ; 
        	        	        	        }


        	        	        	    }
        	        	        	    break;

        	        	            }
        	        	        }

        	        	    }
        	        	    break;

        	            }
        	        }

        	        if ( BACKTRACKING==0 )
        	        {

        	            		port->saveParameter( variable = new sep::Variable(port,
        	            				sep::Modifier::PROPERTY_PARAMETER_MODIFIER,
        	            				paramT, paramID, value) );
        	            	
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3056:4: 'bind:' ( ( type_var COLON )=>tv= type_var COLON e= expression |vid= qualifiedNameID )
        	    {
        	         MATCHT(244, &FOLLOW_244_in_param_com_atom9022);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleparam_com_atomEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3057:4: ( ( type_var COLON )=>tv= type_var COLON e= expression |vid= qualifiedNameID )
        	        {
        	            int alt258=2;
        	            {
        	                int LA258_0 = LA(1);
        	                if ( (synpred446_fml(ctx)) && (((LA258_0 >= 245) && (LA258_0 <= 246))))
        	                {
        	                    alt258=1;
        	                }
        	                else if ( (synpred446_fml(ctx)) && (((LA258_0 >= 309) && (LA258_0 <= 310))))
        	                {
        	                    alt258=1;
        	                }
        	                else if ( (synpred446_fml(ctx)) && (((LA258_0 >= 401) && (LA258_0 <= 402))))
        	                {
        	                    alt258=1;
        	                }
        	                else if ( (synpred446_fml(ctx)) && (((LA258_0 >= 345) && (LA258_0 <= 346))))
        	                {
        	                    alt258=1;
        	                }
        	                else if ( (synpred446_fml(ctx)) && (((LA258_0 >= 357) && (LA258_0 <= 358))))
        	                {
        	                    alt258=1;
        	                }
        	                else if ( (synpred446_fml(ctx)) && (((LA258_0 >= 407) && (LA258_0 <= 408))))
        	                {
        	                    alt258=1;
        	                }
        	                else if ( (synpred446_fml(ctx)) && (LA258_0 == 283))
        	                {
        	                    alt258=1;
        	                }
        	                else if ( (synpred446_fml(ctx)) && (LA258_0 == 400))
        	                {
        	                    alt258=1;
        	                }
        	                else if ( (synpred446_fml(ctx)) && (LA258_0 == 270))
        	                {
        	                    alt258=1;
        	                }
        	                else if ( (synpred446_fml(ctx)) && (LA258_0 == 399))
        	                {
        	                    alt258=1;
        	                }
        	                else if ( (synpred446_fml(ctx)) && (LA258_0 == 360))
        	                {
        	                    alt258=1;
        	                }
        	                else if ( (synpred446_fml(ctx)) && (LA258_0 == 409))
        	                {
        	                    alt258=1;
        	                }
        	                else if ( (synpred446_fml(ctx)) && (LA258_0 == 259))
        	                {
        	                    alt258=1;
        	                }
        	                else if ( (synpred446_fml(ctx)) && (LA258_0 == 392))
        	                {
        	                    alt258=1;
        	                }
        	                else if ( (synpred446_fml(ctx)) && (LA258_0 == 264))
        	                {
        	                    alt258=1;
        	                }
        	                else if ( (synpred446_fml(ctx)) && (LA258_0 == 271))
        	                {
        	                    alt258=1;
        	                }
        	                else if ( (synpred446_fml(ctx)) && (LA258_0 == 254))
        	                {
        	                    alt258=1;
        	                }
        	                else if ( (synpred446_fml(ctx)) && (LA258_0 == 255))
        	                {
        	                    alt258=1;
        	                }
        	                else if ( (synpred446_fml(ctx)) && (LA258_0 == 387))
        	                {
        	                    alt258=1;
        	                }
        	                else if ( (synpred446_fml(ctx)) && (LA258_0 == 333))
        	                {
        	                    alt258=1;
        	                }
        	                else if ( (synpred446_fml(ctx)) && (LA258_0 == 242))
        	                {
        	                    alt258=1;
        	                }
        	                else if ( (synpred446_fml(ctx)) && (LA258_0 == 344))
        	                {
        	                    alt258=1;
        	                }
        	                else if ( (synpred446_fml(ctx)) && (LA258_0 == 249))
        	                {
        	                    alt258=1;
        	                }
        	                else if ( (synpred446_fml(ctx)) && (LA258_0 == 320))
        	                {
        	                    alt258=1;
        	                }
        	                else if ( (synpred446_fml(ctx)) && (LA258_0 == 374))
        	                {
        	                    alt258=1;
        	                }
        	                else if ( (synpred446_fml(ctx)) && (LA258_0 == 261))
        	                {
        	                    alt258=1;
        	                }
        	                else if ( (synpred446_fml(ctx)) && (LA258_0 == 317))
        	                {
        	                    alt258=1;
        	                }
        	                else if ( (synpred446_fml(ctx)) && (LA258_0 == 405))
        	                {
        	                    alt258=1;
        	                }
        	                else if ( (LA258_0 == ID))
        	                {
        	                    {
        	                        int LA258_29 = LA(2);
        	                        if ( (synpred446_fml(ctx)))
        	                        {
        	                            alt258=1;
        	                        }
        	                        else if ( (ANTLR3_TRUE))
        	                        {
        	                            alt258=2;
        	                        }
        	                        else
        	                        {
        	                            if (BACKTRACKING>0)
        	                            {
        	                                FAILEDFLAG = ANTLR3_TRUE;
        	                                return ;
        	                            }


        	                            CONSTRUCTEX();
        	                            EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
        	                            EXCEPTION->message      = (void *)"";
        	                            EXCEPTION->decisionNum  = 258;
        	                            EXCEPTION->state        = 29;


        	                            goto ruleparam_com_atomEx;

        	                        }
        	                    }
        	                }
        	                else if ( (synpred446_fml(ctx)) && (LA258_0 == 241))
        	                {
        	                    alt258=1;
        	                }
        	                else if ( (synpred446_fml(ctx)) && (LA258_0 == 412))
        	                {
        	                    alt258=1;
        	                }
        	                else if ( (synpred446_fml(ctx)) && (LA258_0 == 370))
        	                {
        	                    alt258=1;
        	                }
        	                else if ( (synpred446_fml(ctx)) && (LA258_0 == 316))
        	                {
        	                    alt258=1;
        	                }
        	                else if ( (synpred446_fml(ctx)) && (LA258_0 == 281))
        	                {
        	                    alt258=1;
        	                }
        	                else if ( (synpred446_fml(ctx)) && (LA258_0 == 315))
        	                {
        	                    alt258=1;
        	                }
        	                else if ( (synpred446_fml(ctx)) && (LA258_0 == 325))
        	                {
        	                    alt258=1;
        	                }
        	                else if ( (synpred446_fml(ctx)) && (LA258_0 == 326))
        	                {
        	                    alt258=1;
        	                }
        	                else if ( (synpred446_fml(ctx)) && (LA258_0 == 373))
        	                {
        	                    alt258=1;
        	                }
        	                else if ( (synpred446_fml(ctx)) && (LA258_0 == 329))
        	                {
        	                    alt258=1;
        	                }
        	                else if ( (synpred446_fml(ctx)) && (LA258_0 == 311))
        	                {
        	                    alt258=1;
        	                }
        	                else
        	                {
        	                    if (BACKTRACKING>0)
        	                    {
        	                        FAILEDFLAG = ANTLR3_TRUE;
        	                        return ;
        	                    }


        	                    CONSTRUCTEX();
        	                    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
        	                    EXCEPTION->message      = (void *)"";
        	                    EXCEPTION->decisionNum  = 258;
        	                    EXCEPTION->state        = 0;


        	                    goto ruleparam_com_atomEx;

        	                }
        	            }
        	            switch (alt258)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3057:6: ( type_var COLON )=>tv= type_var COLON e= expression
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_type_var_in_param_com_atom9042);
        	        	        tv=type_var(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruleparam_com_atomEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	         MATCHT(COLON, &FOLLOW_COLON_in_param_com_atom9044);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruleparam_com_atomEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             paramT = tv
        	        	            ; 
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_expression_in_param_com_atom9056);
        	        	        e=expression(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruleparam_com_atomEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             value = e
        	        	            ; 
        	        	        }


        	        	    }
        	        	    break;
        	        	case 2:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3059:6: vid= qualifiedNameID
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_qualifiedNameID_in_param_com_atom9067);
        	        	        vid=qualifiedNameID(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruleparam_com_atomEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {

        	        	            	  	value = sep::ParserUtil::getVariable(vid.s
        	        	            , vid.nb
        	        	            );
        	        	            	  	if( value.valid() )
        	        	            	  	{ paramT = value.to_ptr< sep::Variable >()->getType(); }
        	        	            	  
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	        if ( BACKTRACKING==0 )
        	        {

        	            		paramID = sep::OSS() << '#' << offset;
        	            		port->saveParameter( variable = new sep::Variable(port,
        	            				sep::Modifier::PROPERTY_PARAMETER_BIND_MODIFIER,
        	            				paramT, paramID, value) );
        	            		variable->setOffset( offset );
        	            	
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruleparam_com_atomEx; /* Prevent compiler warnings */
    ruleparam_com_atomEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(102, param_com_atom_StartIndex); }

    return ;
}
/* $ANTLR end param_com_atom */

/**
 * $ANTLR start decl_buffer
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3079:1: decl_buffer[ sep::PropertyPart & declProperty , sep::Modifier mdfr ] : 'buffer' decl_buffer_impl[ declProperty , mdfr ] ;
 */
static void
decl_buffer(pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr)
{
    ANTLR3_UINT32 decl_buffer_StartIndex;

    /* Initialize rule variables
     */
    decl_buffer_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(103)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3081:2: ( 'buffer' decl_buffer_impl[ declProperty , mdfr ] )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3081:4: 'buffer' decl_buffer_impl[ declProperty , mdfr ]
        {
             MATCHT(249, &FOLLOW_249_in_decl_buffer9098);
            if  (HASEXCEPTION())
            {
                goto ruledecl_bufferEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            FOLLOWPUSH(FOLLOW_decl_buffer_impl_in_decl_buffer9101);
            decl_buffer_impl(ctx, declProperty, mdfr);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruledecl_bufferEx;
            }
            if (HASFAILED())
            {
                return ;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledecl_bufferEx; /* Prevent compiler warnings */
    ruledecl_bufferEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(103, decl_buffer_StartIndex); }

    return ;
}
/* $ANTLR end decl_buffer */

/**
 * $ANTLR start decl_buffer_impl
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3084:1: decl_buffer_impl[ sep::PropertyPart & declProperty , sep::Modifier mdfr ] : (db= def_buffer id= ID ( initial_buffer_contents[ buffer ] )? SEMI | LCURLY (db= def_buffer id= ID )+ RCURLY );
 */
static void
decl_buffer_impl(pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr)
{
    ANTLR3_UINT32 decl_buffer_impl_StartIndex;

    pANTLR3_COMMON_TOKEN    id;
    fmlParser_def_buffer_return db;
    #undef	RETURN_TYPE_db
    #define	RETURN_TYPE_db fmlParser_def_buffer_return

    /* Initialize rule variables
     */
    decl_buffer_impl_StartIndex = INDEX();



    	sep::Buffer * buffer;

    	sep::BF TBuffer;
    	bool isaType = true;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(104)) )
    {
        {
        }



        return ;
    }

    id       = NULL;

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3092:2: (db= def_buffer id= ID ( initial_buffer_contents[ buffer ] )? SEMI | LCURLY (db= def_buffer id= ID )+ RCURLY )

            ANTLR3_UINT32 alt262;

            alt262=2;

            switch ( LA(1) )
            {
            case 281:
            case 315:
            case 325:
            case 326:
            case 329:
            case 356:
            case 370:
            case 373:
            case 412:
            	{
            		alt262=1;
            	}
                break;
            case LCURLY:
            	{
            		alt262=2;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 262;
                EXCEPTION->state        = 0;


                goto ruledecl_buffer_implEx;

            }

            switch (alt262)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3092:4: db= def_buffer id= ID ( initial_buffer_contents[ buffer ] )? SEMI
        	    {
        	        FOLLOWPUSH(FOLLOW_def_buffer_in_decl_buffer_impl9122);
        	        db=def_buffer(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledecl_buffer_implEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_decl_buffer_impl9127);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledecl_buffer_implEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {

        	            		declProperty.appendBuffer( sep::BF(
        	            				buffer = new sep::Buffer( declProperty,
        	            						STR((id->getText(id))->chars), 
        	            db.kind
        	            , db.size
        	            )) );
        	            	  	buffer->setModifier( mdfr );
        	            	
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3099:4: ( initial_buffer_contents[ buffer ] )?
        	        {
        	            int alt260=2;
        	            switch ( LA(1) )
        	            {
        	                case ASSIGN:
        	                	{
        	                		alt260=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt260)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3099:6: initial_buffer_contents[ buffer ]
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_initial_buffer_contents_in_decl_buffer_impl9137);
        	        	        initial_buffer_contents(ctx, buffer);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledecl_buffer_implEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	         MATCHT(SEMI, &FOLLOW_SEMI_in_decl_buffer_impl9144);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledecl_buffer_implEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3101:4: LCURLY (db= def_buffer id= ID )+ RCURLY
        	    {
        	         MATCHT(LCURLY, &FOLLOW_LCURLY_in_decl_buffer_impl9150);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledecl_buffer_implEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3102:4: (db= def_buffer id= ID )+
        	        {
        	            int cnt261=0;

        	            for (;;)
        	            {
        	                int alt261=2;
        	        	switch ( LA(1) )
        	        	{
        	        	case 281:
        	        	case 315:
        	        	case 325:
        	        	case 326:
        	        	case 329:
        	        	case 356:
        	        	case 370:
        	        	case 373:
        	        	case 412:
        	        		{
        	        			alt261=1;
        	        		}
        	        	    break;

        	        	}

        	        	switch (alt261)
        	        	{
        	        	    case 1:
        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3103:6: db= def_buffer id= ID
        	        	        {
        	        	            FOLLOWPUSH(FOLLOW_def_buffer_in_decl_buffer_impl9164);
        	        	            db=def_buffer(ctx);

        	        	            FOLLOWPOP();
        	        	            if  (HASEXCEPTION())
        	        	            {
        	        	                goto ruledecl_buffer_implEx;
        	        	            }
        	        	            if (HASFAILED())
        	        	            {
        	        	                return ;
        	        	            }


        	        	            id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_decl_buffer_impl9169);
        	        	            if  (HASEXCEPTION())
        	        	            {
        	        	                goto ruledecl_buffer_implEx;
        	        	            }
        	        	            if (HASFAILED())
        	        	            {
        	        	                return ;
        	        	            }


        	        	            if ( BACKTRACKING==0 )
        	        	            {

        	        	                	  		declProperty.appendBuffer( sep::BF(
        	        	                	  				buffer = new sep::Buffer(declProperty,
        	        	                	  						STR((id->getText(id))->chars), 
        	        	                db.kind
        	        	                , db.size
        	        	                )) );
        	        	                	  		buffer->setModifier( mdfr );
        	        	                	    
        	        	            }


        	        	        }
        	        	        break;

        	        	    default:

        	        		if ( cnt261 >= 1 )
        	        		{
        	        		    goto loop261;
        	        		}
        	        		if (BACKTRACKING>0)
        	        		{
        	        		    FAILEDFLAG = ANTLR3_TRUE;
        	        		    return ;
        	        		}

        	        		/* mismatchedSetEx()
        	        		 */
        	        		CONSTRUCTEX();
        	        		EXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
        	        		EXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;


        	        		goto ruledecl_buffer_implEx;
        	        	}
        	        	cnt261++;
        	            }
        	            loop261: ;	/* Jump to here if this rule does not match */
        	        }

        	         MATCHT(RCURLY, &FOLLOW_RCURLY_in_decl_buffer_impl9187);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledecl_buffer_implEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruledecl_buffer_implEx; /* Prevent compiler warnings */
    ruledecl_buffer_implEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(104, decl_buffer_impl_StartIndex); }

    return ;
}
/* $ANTLR end decl_buffer_impl */

/**
 * $ANTLR start def_buffer
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3115:1: def_buffer returns [ sep::avm_type_specifier_kind_t kind , int size = -1 ] : (pb= policy_buffer ( LT_ (n= integer_constant | STAR ) GT )? | 'ram' );
 */
static fmlParser_def_buffer_return
def_buffer(pfmlParser ctx)
{
    fmlParser_def_buffer_return retval;

    ANTLR3_UINT32 def_buffer_StartIndex;

    sep::avm_type_specifier_kind_t pb;
    #undef	RETURN_TYPE_pb
    #define	RETURN_TYPE_pb sep::avm_type_specifier_kind_t

    sep::avm_size_t n;
    #undef	RETURN_TYPE_n
    #define	RETURN_TYPE_n sep::avm_size_t

    /* Initialize rule variables
     */
    retval.size =  -1;

    def_buffer_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(105)) )
    {
    	retval.start = 0;

        {
        }



        return retval;
    }

    retval.start = LT(1); retval.stop = retval.start;


    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3117:2: (pb= policy_buffer ( LT_ (n= integer_constant | STAR ) GT )? | 'ram' )

            ANTLR3_UINT32 alt265;

            alt265=2;

            switch ( LA(1) )
            {
            case 281:
            case 315:
            case 325:
            case 326:
            case 329:
            case 370:
            case 373:
            case 412:
            	{
            		alt265=1;
            	}
                break;
            case 356:
            	{
            		alt265=2;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return retval;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 265;
                EXCEPTION->state        = 0;


                goto ruledef_bufferEx;

            }

            switch (alt265)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3117:4: pb= policy_buffer ( LT_ (n= integer_constant | STAR ) GT )?
        	    {
        	        FOLLOWPUSH(FOLLOW_policy_buffer_in_def_buffer9205);
        	        pb=policy_buffer(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_bufferEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return retval;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             retval.kind= 
        	            pb
        	            ;
        	             
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3118:4: ( LT_ (n= integer_constant | STAR ) GT )?
        	        {
        	            int alt264=2;
        	            switch ( LA(1) )
        	            {
        	                case LT_:
        	                	{
        	                		alt264=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt264)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3118:6: LT_ (n= integer_constant | STAR ) GT
        	        	    {
        	        	         MATCHT(LT_, &FOLLOW_LT__in_def_buffer9215);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_bufferEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return retval;
        	        	        }


        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3119:6: (n= integer_constant | STAR )
        	        	        {
        	        	            int alt263=2;
        	        	            switch ( LA(1) )
        	        	            {
        	        	            case ID:
        	        	            case IntegerLiteral:
        	        	            	{
        	        	            		alt263=1;
        	        	            	}
        	        	                break;
        	        	            case STAR:
        	        	            	{
        	        	            		alt263=2;
        	        	            	}
        	        	                break;

        	        	            default:
        	        	                if (BACKTRACKING>0)
        	        	                {
        	        	                    FAILEDFLAG = ANTLR3_TRUE;
        	        	                    return retval;
        	        	                }

        	        	                CONSTRUCTEX();
        	        	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
        	        	                EXCEPTION->message      = (void *)"";
        	        	                EXCEPTION->decisionNum  = 263;
        	        	                EXCEPTION->state        = 0;


        	        	                goto ruledef_bufferEx;

        	        	            }

        	        	            switch (alt263)
        	        	            {
        	        	        	case 1:
        	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3119:8: n= integer_constant
        	        	        	    {
        	        	        	        FOLLOWPUSH(FOLLOW_integer_constant_in_def_buffer9226);
        	        	        	        n=integer_constant(ctx);

        	        	        	        FOLLOWPOP();
        	        	        	        if  (HASEXCEPTION())
        	        	        	        {
        	        	        	            goto ruledef_bufferEx;
        	        	        	        }
        	        	        	        if (HASFAILED())
        	        	        	        {
        	        	        	            return retval;
        	        	        	        }


        	        	        	        if ( BACKTRACKING==0 )
        	        	        	        {
        	        	        	             retval.size= 
        	        	        	            n
        	        	        	            ;
        	        	        	             
        	        	        	        }


        	        	        	    }
        	        	        	    break;
        	        	        	case 2:
        	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3120:8: STAR
        	        	        	    {
        	        	        	         MATCHT(STAR, &FOLLOW_STAR_in_def_buffer9238);
        	        	        	        if  (HASEXCEPTION())
        	        	        	        {
        	        	        	            goto ruledef_bufferEx;
        	        	        	        }
        	        	        	        if (HASFAILED())
        	        	        	        {
        	        	        	            return retval;
        	        	        	        }


        	        	        	        if ( BACKTRACKING==0 )
        	        	        	        {
        	        	        	             retval.size= -1;
        	        	        	             
        	        	        	        }


        	        	        	    }
        	        	        	    break;

        	        	            }
        	        	        }

        	        	         MATCHT(GT, &FOLLOW_GT_in_def_buffer9267);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_bufferEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return retval;
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3124:4: 'ram'
        	    {
        	         MATCHT(356, &FOLLOW_356_in_def_buffer9276);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_bufferEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return retval;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             retval.kind= sep::TYPE_RAM_SPECIFIER;
        	             retval.size= 1;
        	             
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruledef_bufferEx; /* Prevent compiler warnings */
    ruledef_bufferEx: ;
    retval.stop = LT(-1);


            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(105, def_buffer_StartIndex); }

    return retval;
}
/* $ANTLR end def_buffer */

/**
 * $ANTLR start policy_buffer
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3128:1: policy_buffer returns [ sep::avm_type_specifier_kind_t kind ] : ( 'fifo' | 'lifo' | 'multififo' | 'multilifo' | 'set' | 'multiset' | 'vector' | 'rvector' );
 */
static sep::avm_type_specifier_kind_t
policy_buffer(pfmlParser ctx)
{
    sep::avm_type_specifier_kind_t kind;

    ANTLR3_UINT32 policy_buffer_StartIndex;

    /* Initialize rule variables
     */
    policy_buffer_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(106)) )
    {
        {
        }



        return kind;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3130:2: ( 'fifo' | 'lifo' | 'multififo' | 'multilifo' | 'set' | 'multiset' | 'vector' | 'rvector' )

            ANTLR3_UINT32 alt266;

            alt266=8;

            switch ( LA(1) )
            {
            case 281:
            	{
            		alt266=1;
            	}
                break;
            case 315:
            	{
            		alt266=2;
            	}
                break;
            case 325:
            	{
            		alt266=3;
            	}
                break;
            case 326:
            	{
            		alt266=4;
            	}
                break;
            case 373:
            	{
            		alt266=5;
            	}
                break;
            case 329:
            	{
            		alt266=6;
            	}
                break;
            case 412:
            	{
            		alt266=7;
            	}
                break;
            case 370:
            	{
            		alt266=8;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return kind;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 266;
                EXCEPTION->state        = 0;


                goto rulepolicy_bufferEx;

            }

            switch (alt266)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3130:4: 'fifo'
        	    {
        	         MATCHT(281, &FOLLOW_281_in_policy_buffer9295);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulepolicy_bufferEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return kind;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             kind= sep::TYPE_FIFO_SPECIFIER;
        	                       
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3131:4: 'lifo'
        	    {
        	         MATCHT(315, &FOLLOW_315_in_policy_buffer9307);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulepolicy_bufferEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return kind;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             kind= sep::TYPE_LIFO_SPECIFIER;
        	                       
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3132:4: 'multififo'
        	    {
        	         MATCHT(325, &FOLLOW_325_in_policy_buffer9319);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulepolicy_bufferEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return kind;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             kind= sep::TYPE_MULTI_FIFO_SPECIFIER;
        	                 
        	        }


        	    }
        	    break;
        	case 4:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3133:4: 'multilifo'
        	    {
        	         MATCHT(326, &FOLLOW_326_in_policy_buffer9326);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulepolicy_bufferEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return kind;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             kind= sep::TYPE_MULTI_LIFO_SPECIFIER;
        	                 
        	        }


        	    }
        	    break;
        	case 5:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3134:4: 'set'
        	    {
        	         MATCHT(373, &FOLLOW_373_in_policy_buffer9333);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulepolicy_bufferEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return kind;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             kind= sep::TYPE_SET_SPECIFIER;
        	                        
        	        }


        	    }
        	    break;
        	case 6:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3135:4: 'multiset'
        	    {
        	         MATCHT(329, &FOLLOW_329_in_policy_buffer9346);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulepolicy_bufferEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return kind;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             kind= sep::TYPE_MULTISET_SPECIFIER;
        	                   
        	        }


        	    }
        	    break;
        	case 7:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3136:4: 'vector'
        	    {
        	         MATCHT(412, &FOLLOW_412_in_policy_buffer9354);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulepolicy_bufferEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return kind;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             kind= sep::TYPE_VECTOR_SPECIFIER;
        	                     
        	        }


        	    }
        	    break;
        	case 8:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3137:4: 'rvector'
        	    {
        	         MATCHT(370, &FOLLOW_370_in_policy_buffer9364);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulepolicy_bufferEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return kind;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             kind= sep::TYPE_REVERSE_VECTOR_SPECIFIER;
        	             
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto rulepolicy_bufferEx; /* Prevent compiler warnings */
    rulepolicy_bufferEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(106, policy_buffer_StartIndex); }

    return kind;
}
/* $ANTLR end policy_buffer */

/**
 * $ANTLR start ref_buffer
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3140:1: ref_buffer[ sep::Machine * machine ] returns [ sep::BF buf ] : id= qualifiedNameID ;
 */
static sep::BF
ref_buffer(pfmlParser ctx, sep::Machine * machine)
{
    sep::BF buf;

    ANTLR3_UINT32 ref_buffer_StartIndex;

    fmlParser_qualifiedNameID_return id;
    #undef	RETURN_TYPE_id
    #define	RETURN_TYPE_id fmlParser_qualifiedNameID_return

    /* Initialize rule variables
     */
    ref_buffer_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(107)) )
    {
        {
        }



        return buf;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3142:2: (id= qualifiedNameID )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3142:4: id= qualifiedNameID
        {
            FOLLOWPUSH(FOLLOW_qualifiedNameID_in_ref_buffer9386);
            id=qualifiedNameID(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruleref_bufferEx;
            }
            if (HASFAILED())
            {
                return buf;
            }


            if ( BACKTRACKING==0 )
            {
                 buf= sep::ParserUtil::getBuffer(machine, 
                id.s
                , id.nb
                );
                 
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruleref_bufferEx; /* Prevent compiler warnings */
    ruleref_bufferEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(107, ref_buffer_StartIndex); }

    return buf;
}
/* $ANTLR end ref_buffer */

/**
 * $ANTLR start initial_buffer_contents
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3147:1: initial_buffer_contents[ const sep::Buffer * buffer ] : ASSIGN LBRACKET mid= qualifiedNameID ( COMMA mid= qualifiedNameID )* RBRACKET ;
 */
static void
initial_buffer_contents(pfmlParser ctx, const sep::Buffer * buffer)
{
    ANTLR3_UINT32 initial_buffer_contents_StartIndex;

    fmlParser_qualifiedNameID_return mid;
    #undef	RETURN_TYPE_mid
    #define	RETURN_TYPE_mid fmlParser_qualifiedNameID_return

    /* Initialize rule variables
     */
    initial_buffer_contents_StartIndex = INDEX();



    	sep::BF msg;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(108)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3151:2: ( ASSIGN LBRACKET mid= qualifiedNameID ( COMMA mid= qualifiedNameID )* RBRACKET )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3151:4: ASSIGN LBRACKET mid= qualifiedNameID ( COMMA mid= qualifiedNameID )* RBRACKET
        {
             MATCHT(ASSIGN, &FOLLOW_ASSIGN_in_initial_buffer_contents9406);
            if  (HASEXCEPTION())
            {
                goto ruleinitial_buffer_contentsEx;
            }
            if (HASFAILED())
            {
                return ;
            }


             MATCHT(LBRACKET, &FOLLOW_LBRACKET_in_initial_buffer_contents9408);
            if  (HASEXCEPTION())
            {
                goto ruleinitial_buffer_contentsEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            FOLLOWPUSH(FOLLOW_qualifiedNameID_in_initial_buffer_contents9417);
            mid=qualifiedNameID(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruleinitial_buffer_contentsEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            if ( BACKTRACKING==0 )
            {
                /* msg = sep::ParserUtil::getMessage(mid.s
                , mid.nb
                );
                	    	buffer->appendMessage(msg); */
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3155:4: ( COMMA mid= qualifiedNameID )*

            for (;;)
            {
                int alt267=2;
                switch ( LA(1) )
                {
                case COMMA:
                	{
                		alt267=1;
                	}
                    break;

                }

                switch (alt267)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3155:6: COMMA mid= qualifiedNameID
            	    {
            	         MATCHT(COMMA, &FOLLOW_COMMA_in_initial_buffer_contents9431);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleinitial_buffer_contentsEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        FOLLOWPUSH(FOLLOW_qualifiedNameID_in_initial_buffer_contents9435);
            	        mid=qualifiedNameID(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleinitial_buffer_contentsEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

            	default:
            	    goto loop267;	/* break out of the loop */
            	    break;
                }
            }
            loop267: ; /* Jump out to here if this rule does not match */


             MATCHT(RBRACKET, &FOLLOW_RBRACKET_in_initial_buffer_contents9446);
            if  (HASEXCEPTION())
            {
                goto ruleinitial_buffer_contentsEx;
            }
            if (HASFAILED())
            {
                return ;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruleinitial_buffer_contentsEx; /* Prevent compiler warnings */
    ruleinitial_buffer_contentsEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(108, initial_buffer_contents_StartIndex); }

    return ;
}
/* $ANTLR end initial_buffer_contents */

/**
 * $ANTLR start decl_channel
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3165:1: decl_channel[ sep::PropertyPart & declProperty , sep::Modifier mdfr ] : 'channel' decl_channel_port[ declProperty , mdfr ] ;
 */
static void
decl_channel(pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr)
{
    ANTLR3_UINT32 decl_channel_StartIndex;

    /* Initialize rule variables
     */
    decl_channel_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(109)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3167:2: ( 'channel' decl_channel_port[ declProperty , mdfr ] )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3167:4: 'channel' decl_channel_port[ declProperty , mdfr ]
        {
             MATCHT(253, &FOLLOW_253_in_decl_channel9465);
            if  (HASEXCEPTION())
            {
                goto ruledecl_channelEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            FOLLOWPUSH(FOLLOW_decl_channel_port_in_decl_channel9468);
            decl_channel_port(ctx, declProperty, mdfr);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruledecl_channelEx;
            }
            if (HASFAILED())
            {
                return ;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledecl_channelEx; /* Prevent compiler warnings */
    ruledecl_channelEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(109, decl_channel_StartIndex); }

    return ;
}
/* $ANTLR end decl_channel */

/**
 * $ANTLR start decl_channel_port
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3174:1: decl_channel_port[ sep::PropertyPart & declProperty , sep::Modifier mdfr ] : ( LT_ com_protocol[ declProperty.getContainer()->as< sep::Machine >(), aChannel ] ( COMMA com_cast[ aChannel ] )? GT )? ( modifier_set_direction_strict_text[ aChannel->getwModifier() ] )? id= ID LCURLY (m= modifier_direction uid= qualifiedNameID SEMI | decl_port[ *(aChannel->getContents()) ,\n\t \t\t\t\t\tsep::Modifier::PROPERTY_PUBLIC_MODIFIER ] | decl_signal[ *(aChannel->getContents()) ,\n\t \t\t\t\t\tsep::Modifier::PROPERTY_PUBLIC_MODIFIER ] )+ RCURLY ;
 */
static void
decl_channel_port(pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr)
{
    ANTLR3_UINT32 decl_channel_port_StartIndex;

    pANTLR3_COMMON_TOKEN    id;
    sep::Modifier m;
    #undef	RETURN_TYPE_m
    #define	RETURN_TYPE_m sep::Modifier

    fmlParser_qualifiedNameID_return uid;
    #undef	RETURN_TYPE_uid
    #define	RETURN_TYPE_uid fmlParser_qualifiedNameID_return

    /* Initialize rule variables
     */
    decl_channel_port_StartIndex = INDEX();



    	sep::Channel * aChannel;

      	declProperty.appendChannel( sep::BF( aChannel =
      			new sep::Channel( declProperty,
      					"#channel#", mdfr.setDirectionInoutElse() ) ));


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(110)) )
    {
        {
        }



        return ;
    }

    id       = NULL;

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3184:2: ( ( LT_ com_protocol[ declProperty.getContainer()->as< sep::Machine >(), aChannel ] ( COMMA com_cast[ aChannel ] )? GT )? ( modifier_set_direction_strict_text[ aChannel->getwModifier() ] )? id= ID LCURLY (m= modifier_direction uid= qualifiedNameID SEMI | decl_port[ *(aChannel->getContents()) ,\n\t \t\t\t\t\tsep::Modifier::PROPERTY_PUBLIC_MODIFIER ] | decl_signal[ *(aChannel->getContents()) ,\n\t \t\t\t\t\tsep::Modifier::PROPERTY_PUBLIC_MODIFIER ] )+ RCURLY )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3184:4: ( LT_ com_protocol[ declProperty.getContainer()->as< sep::Machine >(), aChannel ] ( COMMA com_cast[ aChannel ] )? GT )? ( modifier_set_direction_strict_text[ aChannel->getwModifier() ] )? id= ID LCURLY (m= modifier_direction uid= qualifiedNameID SEMI | decl_port[ *(aChannel->getContents()) ,\n\t \t\t\t\t\tsep::Modifier::PROPERTY_PUBLIC_MODIFIER ] | decl_signal[ *(aChannel->getContents()) ,\n\t \t\t\t\t\tsep::Modifier::PROPERTY_PUBLIC_MODIFIER ] )+ RCURLY
        {
            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3184:4: ( LT_ com_protocol[ declProperty.getContainer()->as< sep::Machine >(), aChannel ] ( COMMA com_cast[ aChannel ] )? GT )?
            {
                int alt269=2;
                switch ( LA(1) )
                {
                    case LT_:
                    	{
                    		alt269=1;
                    	}
                        break;
                }

                switch (alt269)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3184:6: LT_ com_protocol[ declProperty.getContainer()->as< sep::Machine >(), aChannel ] ( COMMA com_cast[ aChannel ] )? GT
            	    {
            	         MATCHT(LT_, &FOLLOW_LT__in_decl_channel_port9491);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledecl_channel_portEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        FOLLOWPUSH(FOLLOW_com_protocol_in_decl_channel_port9498);
            	        com_protocol(ctx, declProperty.getContainer()->as< sep::Machine >(), aChannel);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledecl_channel_portEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3186:6: ( COMMA com_cast[ aChannel ] )?
            	        {
            	            int alt268=2;
            	            switch ( LA(1) )
            	            {
            	                case COMMA:
            	                	{
            	                		alt268=1;
            	                	}
            	                    break;
            	            }

            	            switch (alt268)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3186:8: COMMA com_cast[ aChannel ]
            	        	    {
            	        	         MATCHT(COMMA, &FOLLOW_COMMA_in_decl_channel_port9508);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledecl_channel_portEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	        FOLLOWPUSH(FOLLOW_com_cast_in_decl_channel_port9510);
            	        	        com_cast(ctx, aChannel);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledecl_channel_portEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	         MATCHT(GT, &FOLLOW_GT_in_decl_channel_port9521);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledecl_channel_portEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3190:4: ( modifier_set_direction_strict_text[ aChannel->getwModifier() ] )?
            {
                int alt270=2;
                switch ( LA(1) )
                {
                    case 298:
                    case 305:
                    case 341:
                    case 364:
                    	{
                    		alt270=1;
                    	}
                        break;
                }

                switch (alt270)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3190:6: modifier_set_direction_strict_text[ aChannel->getwModifier() ]
            	    {
            	        FOLLOWPUSH(FOLLOW_modifier_set_direction_strict_text_in_decl_channel_port9535);
            	        modifier_set_direction_strict_text(ctx, aChannel->getwModifier());

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledecl_channel_portEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

                }
            }

            id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_decl_channel_port9547);
            if  (HASEXCEPTION())
            {
                goto ruledecl_channel_portEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            if ( BACKTRACKING==0 )
            {
                 aChannel->fullyUpdateAllNameID( STR((id->getText(id))->chars) ); 
            }


             MATCHT(LCURLY, &FOLLOW_LCURLY_in_decl_channel_port9556);
            if  (HASEXCEPTION())
            {
                goto ruledecl_channel_portEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3194:4: (m= modifier_direction uid= qualifiedNameID SEMI | decl_port[ *(aChannel->getContents()) ,\n\t \t\t\t\t\tsep::Modifier::PROPERTY_PUBLIC_MODIFIER ] | decl_signal[ *(aChannel->getContents()) ,\n\t \t\t\t\t\tsep::Modifier::PROPERTY_PUBLIC_MODIFIER ] )+
            {
                int cnt271=0;

                for (;;)
                {
                    int alt271=4;
            	switch ( LA(1) )
            	{
            	case ASSIGN_REF:
            	case LTE:
            	case 164:
            	case 166:
            	case 295:
            	case 298:
            	case 305:
            	case 335:
            	case 341:
            	case 364:
            		{
            			alt271=1;
            		}
            	    break;
            	case 344:
            		{
            			alt271=2;
            		}
            	    break;
            	case 320:
            	case 374:
            		{
            			alt271=3;
            		}
            	    break;

            	}

            	switch (alt271)
            	{
            	    case 1:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3195:6: m= modifier_direction uid= qualifiedNameID SEMI
            	        {
            	            FOLLOWPUSH(FOLLOW_modifier_direction_in_decl_channel_port9570);
            	            m=modifier_direction(ctx);

            	            FOLLOWPOP();
            	            if  (HASEXCEPTION())
            	            {
            	                goto ruledecl_channel_portEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return ;
            	            }


            	            FOLLOWPUSH(FOLLOW_qualifiedNameID_in_decl_channel_port9575);
            	            uid=qualifiedNameID(ctx);

            	            FOLLOWPOP();
            	            if  (HASEXCEPTION())
            	            {
            	                goto ruledecl_channel_portEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return ;
            	            }


            	             MATCHT(SEMI, &FOLLOW_SEMI_in_decl_channel_port9577);
            	            if  (HASEXCEPTION())
            	            {
            	                goto ruledecl_channel_portEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return ;
            	            }


            	            if ( BACKTRACKING==0 )
            	            {

            	                	    	sep::BF comSignal = sep::ParserUtil::getComSignal(uid.s
            	                , uid.nb
            	                );
            	                	  		if( comSignal.valid() )
            	                	  		{
            	                	  			aChannel->appendSignal(m
            	                , comSignal);
            	                	  		}
            	                	    
            	            }


            	        }
            	        break;
            	    case 2:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3204:6: decl_port[ *(aChannel->getContents()) ,\n\t \t\t\t\t\tsep::Modifier::PROPERTY_PUBLIC_MODIFIER ]
            	        {
            	            FOLLOWPUSH(FOLLOW_decl_port_in_decl_channel_port9592);
            	            decl_port(ctx, *(aChannel->getContents()), sep::Modifier::PROPERTY_PUBLIC_MODIFIER);

            	            FOLLOWPOP();
            	            if  (HASEXCEPTION())
            	            {
            	                goto ruledecl_channel_portEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return ;
            	            }


            	        }
            	        break;
            	    case 3:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3207:6: decl_signal[ *(aChannel->getContents()) ,\n\t \t\t\t\t\tsep::Modifier::PROPERTY_PUBLIC_MODIFIER ]
            	        {
            	            FOLLOWPUSH(FOLLOW_decl_signal_in_decl_channel_port9609);
            	            decl_signal(ctx, *(aChannel->getContents()), sep::Modifier::PROPERTY_PUBLIC_MODIFIER);

            	            FOLLOWPOP();
            	            if  (HASEXCEPTION())
            	            {
            	                goto ruledecl_channel_portEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return ;
            	            }


            	        }
            	        break;

            	    default:

            		if ( cnt271 >= 1 )
            		{
            		    goto loop271;
            		}
            		if (BACKTRACKING>0)
            		{
            		    FAILEDFLAG = ANTLR3_TRUE;
            		    return ;
            		}

            		/* mismatchedSetEx()
            		 */
            		CONSTRUCTEX();
            		EXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
            		EXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;


            		goto ruledecl_channel_portEx;
            	}
            	cnt271++;
                }
                loop271: ;	/* Jump to here if this rule does not match */
            }

             MATCHT(RCURLY, &FOLLOW_RCURLY_in_decl_channel_port9621);
            if  (HASEXCEPTION())
            {
                goto ruledecl_channel_portEx;
            }
            if (HASFAILED())
            {
                return ;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledecl_channel_portEx; /* Prevent compiler warnings */
    ruledecl_channel_portEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(110, decl_channel_port_StartIndex); }

    return ;
}
/* $ANTLR end decl_channel_port */

/**
 * $ANTLR start decl_channel_var
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3214:1: decl_channel_var[ sep::PropertyPart & declProperty , sep::Modifier mdfr ] : (tv= type_var id= ID (iv= initial_value )? ( SEMI | on_write_var_routine_def[ var ] ) | LCURLY (tv= type_var id= ID (iv= initial_value )? ( SEMI | on_write_var_routine_def[ var ] ) )+ RCURLY );
 */
static void
decl_channel_var(pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr)
{
    ANTLR3_UINT32 decl_channel_var_StartIndex;

    pANTLR3_COMMON_TOKEN    id;
    sep::BF tv;
    #undef	RETURN_TYPE_tv
    #define	RETURN_TYPE_tv sep::BF

    sep::BF iv;
    #undef	RETURN_TYPE_iv
    #define	RETURN_TYPE_iv sep::BF

    /* Initialize rule variables
     */
    decl_channel_var_StartIndex = INDEX();



    	sep::Variable * var;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(111)) )
    {
        {
        }



        return ;
    }

    id       = NULL;

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3219:2: (tv= type_var id= ID (iv= initial_value )? ( SEMI | on_write_var_routine_def[ var ] ) | LCURLY (tv= type_var id= ID (iv= initial_value )? ( SEMI | on_write_var_routine_def[ var ] ) )+ RCURLY )

            ANTLR3_UINT32 alt277;

            alt277=2;

            switch ( LA(1) )
            {
            case ID:
            case 241:
            case 242:
            case 245:
            case 246:
            case 249:
            case 254:
            case 255:
            case 259:
            case 261:
            case 264:
            case 270:
            case 271:
            case 281:
            case 283:
            case 309:
            case 310:
            case 311:
            case 315:
            case 316:
            case 317:
            case 320:
            case 325:
            case 326:
            case 329:
            case 333:
            case 344:
            case 345:
            case 346:
            case 357:
            case 358:
            case 360:
            case 370:
            case 373:
            case 374:
            case 387:
            case 392:
            case 399:
            case 400:
            case 401:
            case 402:
            case 405:
            case 407:
            case 408:
            case 409:
            case 412:
            	{
            		alt277=1;
            	}
                break;
            case LCURLY:
            	{
            		alt277=2;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 277;
                EXCEPTION->state        = 0;


                goto ruledecl_channel_varEx;

            }

            switch (alt277)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3219:4: tv= type_var id= ID (iv= initial_value )? ( SEMI | on_write_var_routine_def[ var ] )
        	    {
        	        FOLLOWPUSH(FOLLOW_type_var_in_decl_channel_var9642);
        	        tv=type_var(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledecl_channel_varEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_decl_channel_var9647);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledecl_channel_varEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {

        	            	  	declProperty.saveOwnedVariable( var = new sep::Variable(
        	            	  			declProperty, mdfr, tv
        	            , STR((id->getText(id))->chars)) );
        	            	  
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3224:4: (iv= initial_value )?
        	        {
        	            int alt272=2;
        	            switch ( LA(1) )
        	            {
        	                case ASSIGN:
        	                case LPAREN:
        	                	{
        	                		alt272=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt272)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3224:6: iv= initial_value
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_initial_value_in_decl_channel_var9661);
        	        	        iv=initial_value(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledecl_channel_varEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             var->setValue(iv
        	        	            ); 
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3225:4: ( SEMI | on_write_var_routine_def[ var ] )
        	        {
        	            int alt273=2;
        	            switch ( LA(1) )
        	            {
        	            case SEMI:
        	            	{
        	            		alt273=1;
        	            	}
        	                break;
        	            case LCURLY:
        	            	{
        	            		alt273=2;
        	            	}
        	                break;

        	            default:
        	                if (BACKTRACKING>0)
        	                {
        	                    FAILEDFLAG = ANTLR3_TRUE;
        	                    return ;
        	                }

        	                CONSTRUCTEX();
        	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
        	                EXCEPTION->message      = (void *)"";
        	                EXCEPTION->decisionNum  = 273;
        	                EXCEPTION->state        = 0;


        	                goto ruledecl_channel_varEx;

        	            }

        	            switch (alt273)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3225:6: SEMI
        	        	    {
        	        	         MATCHT(SEMI, &FOLLOW_SEMI_in_decl_channel_var9674);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledecl_channel_varEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;
        	        	case 2:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3225:15: on_write_var_routine_def[ var ]
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_on_write_var_routine_def_in_decl_channel_var9680);
        	        	        on_write_var_routine_def(ctx, var);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledecl_channel_varEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3227:4: LCURLY (tv= type_var id= ID (iv= initial_value )? ( SEMI | on_write_var_routine_def[ var ] ) )+ RCURLY
        	    {
        	         MATCHT(LCURLY, &FOLLOW_LCURLY_in_decl_channel_var9689);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledecl_channel_varEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3227:11: (tv= type_var id= ID (iv= initial_value )? ( SEMI | on_write_var_routine_def[ var ] ) )+
        	        {
        	            int cnt276=0;

        	            for (;;)
        	            {
        	                int alt276=2;
        	        	switch ( LA(1) )
        	        	{
        	        	case ID:
        	        	case 241:
        	        	case 242:
        	        	case 245:
        	        	case 246:
        	        	case 249:
        	        	case 254:
        	        	case 255:
        	        	case 259:
        	        	case 261:
        	        	case 264:
        	        	case 270:
        	        	case 271:
        	        	case 281:
        	        	case 283:
        	        	case 309:
        	        	case 310:
        	        	case 311:
        	        	case 315:
        	        	case 316:
        	        	case 317:
        	        	case 320:
        	        	case 325:
        	        	case 326:
        	        	case 329:
        	        	case 333:
        	        	case 344:
        	        	case 345:
        	        	case 346:
        	        	case 357:
        	        	case 358:
        	        	case 360:
        	        	case 370:
        	        	case 373:
        	        	case 374:
        	        	case 387:
        	        	case 392:
        	        	case 399:
        	        	case 400:
        	        	case 401:
        	        	case 402:
        	        	case 405:
        	        	case 407:
        	        	case 408:
        	        	case 409:
        	        	case 412:
        	        		{
        	        			alt276=1;
        	        		}
        	        	    break;

        	        	}

        	        	switch (alt276)
        	        	{
        	        	    case 1:
        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3228:4: tv= type_var id= ID (iv= initial_value )? ( SEMI | on_write_var_routine_def[ var ] )
        	        	        {
        	        	            FOLLOWPUSH(FOLLOW_type_var_in_decl_channel_var9698);
        	        	            tv=type_var(ctx);

        	        	            FOLLOWPOP();
        	        	            if  (HASEXCEPTION())
        	        	            {
        	        	                goto ruledecl_channel_varEx;
        	        	            }
        	        	            if (HASFAILED())
        	        	            {
        	        	                return ;
        	        	            }


        	        	            id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_decl_channel_var9703);
        	        	            if  (HASEXCEPTION())
        	        	            {
        	        	                goto ruledecl_channel_varEx;
        	        	            }
        	        	            if (HASFAILED())
        	        	            {
        	        	                return ;
        	        	            }


        	        	            if ( BACKTRACKING==0 )
        	        	            {

        	        	                	  	declProperty.saveOwnedVariable( var = new sep::Variable(
        	        	                	  			declProperty, mdfr, tv
        	        	                , STR((id->getText(id))->chars)) );
        	        	                	  
        	        	            }


        	        	            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3233:4: (iv= initial_value )?
        	        	            {
        	        	                int alt274=2;
        	        	                switch ( LA(1) )
        	        	                {
        	        	                    case ASSIGN:
        	        	                    case LPAREN:
        	        	                    	{
        	        	                    		alt274=1;
        	        	                    	}
        	        	                        break;
        	        	                }

        	        	                switch (alt274)
        	        	                {
        	        	            	case 1:
        	        	            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3233:6: iv= initial_value
        	        	            	    {
        	        	            	        FOLLOWPUSH(FOLLOW_initial_value_in_decl_channel_var9717);
        	        	            	        iv=initial_value(ctx);

        	        	            	        FOLLOWPOP();
        	        	            	        if  (HASEXCEPTION())
        	        	            	        {
        	        	            	            goto ruledecl_channel_varEx;
        	        	            	        }
        	        	            	        if (HASFAILED())
        	        	            	        {
        	        	            	            return ;
        	        	            	        }


        	        	            	        if ( BACKTRACKING==0 )
        	        	            	        {
        	        	            	             var->setValue(iv
        	        	            	            ); 
        	        	            	        }


        	        	            	    }
        	        	            	    break;

        	        	                }
        	        	            }

        	        	            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3234:4: ( SEMI | on_write_var_routine_def[ var ] )
        	        	            {
        	        	                int alt275=2;
        	        	                switch ( LA(1) )
        	        	                {
        	        	                case SEMI:
        	        	                	{
        	        	                		alt275=1;
        	        	                	}
        	        	                    break;
        	        	                case LCURLY:
        	        	                	{
        	        	                		alt275=2;
        	        	                	}
        	        	                    break;

        	        	                default:
        	        	                    if (BACKTRACKING>0)
        	        	                    {
        	        	                        FAILEDFLAG = ANTLR3_TRUE;
        	        	                        return ;
        	        	                    }

        	        	                    CONSTRUCTEX();
        	        	                    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
        	        	                    EXCEPTION->message      = (void *)"";
        	        	                    EXCEPTION->decisionNum  = 275;
        	        	                    EXCEPTION->state        = 0;


        	        	                    goto ruledecl_channel_varEx;

        	        	                }

        	        	                switch (alt275)
        	        	                {
        	        	            	case 1:
        	        	            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3234:6: SEMI
        	        	            	    {
        	        	            	         MATCHT(SEMI, &FOLLOW_SEMI_in_decl_channel_var9730);
        	        	            	        if  (HASEXCEPTION())
        	        	            	        {
        	        	            	            goto ruledecl_channel_varEx;
        	        	            	        }
        	        	            	        if (HASFAILED())
        	        	            	        {
        	        	            	            return ;
        	        	            	        }


        	        	            	    }
        	        	            	    break;
        	        	            	case 2:
        	        	            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3234:15: on_write_var_routine_def[ var ]
        	        	            	    {
        	        	            	        FOLLOWPUSH(FOLLOW_on_write_var_routine_def_in_decl_channel_var9736);
        	        	            	        on_write_var_routine_def(ctx, var);

        	        	            	        FOLLOWPOP();
        	        	            	        if  (HASEXCEPTION())
        	        	            	        {
        	        	            	            goto ruledecl_channel_varEx;
        	        	            	        }
        	        	            	        if (HASFAILED())
        	        	            	        {
        	        	            	            return ;
        	        	            	        }


        	        	            	    }
        	        	            	    break;

        	        	                }
        	        	            }

        	        	        }
        	        	        break;

        	        	    default:

        	        		if ( cnt276 >= 1 )
        	        		{
        	        		    goto loop276;
        	        		}
        	        		if (BACKTRACKING>0)
        	        		{
        	        		    FAILEDFLAG = ANTLR3_TRUE;
        	        		    return ;
        	        		}

        	        		/* mismatchedSetEx()
        	        		 */
        	        		CONSTRUCTEX();
        	        		EXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
        	        		EXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;


        	        		goto ruledecl_channel_varEx;
        	        	}
        	        	cnt276++;
        	            }
        	            loop276: ;	/* Jump to here if this rule does not match */
        	        }

        	         MATCHT(RCURLY, &FOLLOW_RCURLY_in_decl_channel_var9748);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledecl_channel_varEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruledecl_channel_varEx; /* Prevent compiler warnings */
    ruledecl_channel_varEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(111, decl_channel_var_StartIndex); }

    return ;
}
/* $ANTLR end decl_channel_var */

/**
 * $ANTLR start decl_variable
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3243:1: decl_variable[ sep::PropertyPart & declProperty , sep::Modifier mdfr ] : ( ( 'var' | 'val' | ( 'const' | 'macro' )+ ( 'var' )? ) decl_variable_impl[ declProperty , mdfr ] | decl_variable_time_clock_impl[ declProperty , mdfr ] );
 */
static void
decl_variable(pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr)
{
    ANTLR3_UINT32 decl_variable_StartIndex;

    /* Initialize rule variables
     */
    decl_variable_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(112)) )
    {
        {
        }



        return ;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3245:2: ( ( 'var' | 'val' | ( 'const' | 'macro' )+ ( 'var' )? ) decl_variable_impl[ declProperty , mdfr ] | decl_variable_time_clock_impl[ declProperty , mdfr ] )

            ANTLR3_UINT32 alt281;

            alt281=2;

            switch ( LA(1) )
            {
            case 262:
            case 318:
            case 410:
            case 411:
            	{
            		alt281=1;
            	}
                break;
            case 259:
            	{
            		alt281=2;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 281;
                EXCEPTION->state        = 0;


                goto ruledecl_variableEx;

            }

            switch (alt281)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3245:4: ( 'var' | 'val' | ( 'const' | 'macro' )+ ( 'var' )? ) decl_variable_impl[ declProperty , mdfr ]
        	    {
        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3245:4: ( 'var' | 'val' | ( 'const' | 'macro' )+ ( 'var' )? )
        	        {
        	            int alt280=3;
        	            switch ( LA(1) )
        	            {
        	            case 411:
        	            	{
        	            		alt280=1;
        	            	}
        	                break;
        	            case 410:
        	            	{
        	            		alt280=2;
        	            	}
        	                break;
        	            case 262:
        	            case 318:
        	            	{
        	            		alt280=3;
        	            	}
        	                break;

        	            default:
        	                if (BACKTRACKING>0)
        	                {
        	                    FAILEDFLAG = ANTLR3_TRUE;
        	                    return ;
        	                }

        	                CONSTRUCTEX();
        	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
        	                EXCEPTION->message      = (void *)"";
        	                EXCEPTION->decisionNum  = 280;
        	                EXCEPTION->state        = 0;


        	                goto ruledecl_variableEx;

        	            }

        	            switch (alt280)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3245:6: 'var'
        	        	    {
        	        	         MATCHT(411, &FOLLOW_411_in_decl_variable9769);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledecl_variableEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	              mdfr.setNatureVariable(); 
        	        	        }


        	        	    }
        	        	    break;
        	        	case 2:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3246:6: 'val'
        	        	    {
        	        	         MATCHT(410, &FOLLOW_410_in_decl_variable9783);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledecl_variableEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	              mdfr.setFeatureConst();   
        	        	        }


        	        	    }
        	        	    break;
        	        	case 3:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3247:6: ( 'const' | 'macro' )+ ( 'var' )?
        	        	    {
        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3247:6: ( 'const' | 'macro' )+
        	        	        {
        	        	            int cnt278=0;

        	        	            for (;;)
        	        	            {
        	        	                int alt278=3;
        	        	        	switch ( LA(1) )
        	        	        	{
        	        	        	case 262:
        	        	        		{
        	        	        			alt278=1;
        	        	        		}
        	        	        	    break;
        	        	        	case 318:
        	        	        		{
        	        	        			alt278=2;
        	        	        		}
        	        	        	    break;

        	        	        	}

        	        	        	switch (alt278)
        	        	        	{
        	        	        	    case 1:
        	        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3247:8: 'const'
        	        	        	        {
        	        	        	             MATCHT(262, &FOLLOW_262_in_decl_variable9799);
        	        	        	            if  (HASEXCEPTION())
        	        	        	            {
        	        	        	                goto ruledecl_variableEx;
        	        	        	            }
        	        	        	            if (HASFAILED())
        	        	        	            {
        	        	        	                return ;
        	        	        	            }


        	        	        	            if ( BACKTRACKING==0 )
        	        	        	            {
        	        	        	                  mdfr.setFeatureConst();   
        	        	        	            }


        	        	        	        }
        	        	        	        break;
        	        	        	    case 2:
        	        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3248:8: 'macro'
        	        	        	        {
        	        	        	             MATCHT(318, &FOLLOW_318_in_decl_variable9811);
        	        	        	            if  (HASEXCEPTION())
        	        	        	            {
        	        	        	                goto ruledecl_variableEx;
        	        	        	            }
        	        	        	            if (HASFAILED())
        	        	        	            {
        	        	        	                return ;
        	        	        	            }


        	        	        	            if ( BACKTRACKING==0 )
        	        	        	            {
        	        	        	                  mdfr.setNatureMacro();    
        	        	        	            }


        	        	        	        }
        	        	        	        break;

        	        	        	    default:

        	        	        		if ( cnt278 >= 1 )
        	        	        		{
        	        	        		    goto loop278;
        	        	        		}
        	        	        		if (BACKTRACKING>0)
        	        	        		{
        	        	        		    FAILEDFLAG = ANTLR3_TRUE;
        	        	        		    return ;
        	        	        		}

        	        	        		/* mismatchedSetEx()
        	        	        		 */
        	        	        		CONSTRUCTEX();
        	        	        		EXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
        	        	        		EXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;


        	        	        		goto ruledecl_variableEx;
        	        	        	}
        	        	        	cnt278++;
        	        	            }
        	        	            loop278: ;	/* Jump to here if this rule does not match */
        	        	        }

        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3250:6: ( 'var' )?
        	        	        {
        	        	            int alt279=2;
        	        	            switch ( LA(1) )
        	        	            {
        	        	                case 411:
        	        	                	{
        	        	                		alt279=1;
        	        	                	}
        	        	                    break;
        	        	            }

        	        	            switch (alt279)
        	        	            {
        	        	        	case 1:
        	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3250:8: 'var'
        	        	        	    {
        	        	        	         MATCHT(411, &FOLLOW_411_in_decl_variable9831);
        	        	        	        if  (HASEXCEPTION())
        	        	        	        {
        	        	        	            goto ruledecl_variableEx;
        	        	        	        }
        	        	        	        if (HASFAILED())
        	        	        	        {
        	        	        	            return ;
        	        	        	        }


        	        	        	    }
        	        	        	    break;

        	        	            }
        	        	        }

        	        	    }
        	        	    break;

        	            }
        	        }

        	        FOLLOWPUSH(FOLLOW_decl_variable_impl_in_decl_variable9844);
        	        decl_variable_impl(ctx, declProperty, mdfr);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledecl_variableEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3254:4: decl_variable_time_clock_impl[ declProperty , mdfr ]
        	    {
        	        FOLLOWPUSH(FOLLOW_decl_variable_time_clock_impl_in_decl_variable9851);
        	        decl_variable_time_clock_impl(ctx, declProperty, mdfr);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledecl_variableEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruledecl_variableEx; /* Prevent compiler warnings */
    ruledecl_variableEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(112, decl_variable_StartIndex); }

    return ;
}
/* $ANTLR end decl_variable */

/**
 * $ANTLR start decl_variable_time_clock_impl
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3258:1: decl_variable_time_clock_impl[ sep::PropertyPart & declProperty , sep::Modifier mdfr ] : ctv= time_clock_type decl_typed_variable_atom_impl[ declProperty , mdfr , $ctv.bts ] ;
 */
static void
decl_variable_time_clock_impl(pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr)
{
    ANTLR3_UINT32 decl_variable_time_clock_impl_StartIndex;

    sep::TypeSpecifier ctv;
    #undef	RETURN_TYPE_ctv
    #define	RETURN_TYPE_ctv sep::TypeSpecifier

    /* Initialize rule variables
     */
    decl_variable_time_clock_impl_StartIndex = INDEX();



    	mdfr.override_ifdef( sep::Modifier::PROPERTY_PUBLIC_VOLATILE_MODIFIER );

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(113)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3263:2: (ctv= time_clock_type decl_typed_variable_atom_impl[ declProperty , mdfr , $ctv.bts ] )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3263:4: ctv= time_clock_type decl_typed_variable_atom_impl[ declProperty , mdfr , $ctv.bts ]
        {
            FOLLOWPUSH(FOLLOW_time_clock_type_in_decl_variable_time_clock_impl9873);
            ctv=time_clock_type(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruledecl_variable_time_clock_implEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            FOLLOWPUSH(FOLLOW_decl_typed_variable_atom_impl_in_decl_variable_time_clock_impl9878);
            decl_typed_variable_atom_impl(ctx, declProperty, mdfr, 
            ctv
            );

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruledecl_variable_time_clock_implEx;
            }
            if (HASFAILED())
            {
                return ;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledecl_variable_time_clock_implEx; /* Prevent compiler warnings */
    ruledecl_variable_time_clock_implEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(113, decl_variable_time_clock_impl_StartIndex); }

    return ;
}
/* $ANTLR end decl_variable_time_clock_impl */

/**
 * $ANTLR start decl_variable_impl
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3268:1: decl_variable_impl[ sep::PropertyPart & declProperty , sep::Modifier mdfr ] : ( decl_variable_atom_impl[ declProperty , mdfr ] | LCURLY ( decl_variable_atom_impl[ declProperty , mdfr ] )+ RCURLY );
 */
static void
decl_variable_impl(pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr)
{
    ANTLR3_UINT32 decl_variable_impl_StartIndex;

    /* Initialize rule variables
     */
    decl_variable_impl_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(114)) )
    {
        {
        }



        return ;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3270:2: ( decl_variable_atom_impl[ declProperty , mdfr ] | LCURLY ( decl_variable_atom_impl[ declProperty , mdfr ] )+ RCURLY )

            ANTLR3_UINT32 alt283;

            alt283=2;

            switch ( LA(1) )
            {
            case ID:
            case 241:
            case 242:
            case 245:
            case 246:
            case 249:
            case 254:
            case 255:
            case 259:
            case 261:
            case 264:
            case 270:
            case 271:
            case 281:
            case 283:
            case 309:
            case 310:
            case 311:
            case 315:
            case 316:
            case 317:
            case 320:
            case 325:
            case 326:
            case 329:
            case 333:
            case 344:
            case 345:
            case 346:
            case 357:
            case 358:
            case 360:
            case 370:
            case 373:
            case 374:
            case 387:
            case 392:
            case 399:
            case 400:
            case 401:
            case 402:
            case 405:
            case 407:
            case 408:
            case 409:
            case 412:
            	{
            		alt283=1;
            	}
                break;
            case LCURLY:
            	{
            		alt283=2;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 283;
                EXCEPTION->state        = 0;


                goto ruledecl_variable_implEx;

            }

            switch (alt283)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3270:4: decl_variable_atom_impl[ declProperty , mdfr ]
        	    {
        	        FOLLOWPUSH(FOLLOW_decl_variable_atom_impl_in_decl_variable_impl9894);
        	        decl_variable_atom_impl(ctx, declProperty, mdfr);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledecl_variable_implEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3272:4: LCURLY ( decl_variable_atom_impl[ declProperty , mdfr ] )+ RCURLY
        	    {
        	         MATCHT(LCURLY, &FOLLOW_LCURLY_in_decl_variable_impl9901);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledecl_variable_implEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3273:4: ( decl_variable_atom_impl[ declProperty , mdfr ] )+
        	        {
        	            int cnt282=0;

        	            for (;;)
        	            {
        	                int alt282=2;
        	        	switch ( LA(1) )
        	        	{
        	        	case ID:
        	        	case 241:
        	        	case 242:
        	        	case 245:
        	        	case 246:
        	        	case 249:
        	        	case 254:
        	        	case 255:
        	        	case 259:
        	        	case 261:
        	        	case 264:
        	        	case 270:
        	        	case 271:
        	        	case 281:
        	        	case 283:
        	        	case 309:
        	        	case 310:
        	        	case 311:
        	        	case 315:
        	        	case 316:
        	        	case 317:
        	        	case 320:
        	        	case 325:
        	        	case 326:
        	        	case 329:
        	        	case 333:
        	        	case 344:
        	        	case 345:
        	        	case 346:
        	        	case 357:
        	        	case 358:
        	        	case 360:
        	        	case 370:
        	        	case 373:
        	        	case 374:
        	        	case 387:
        	        	case 392:
        	        	case 399:
        	        	case 400:
        	        	case 401:
        	        	case 402:
        	        	case 405:
        	        	case 407:
        	        	case 408:
        	        	case 409:
        	        	case 412:
        	        		{
        	        			alt282=1;
        	        		}
        	        	    break;

        	        	}

        	        	switch (alt282)
        	        	{
        	        	    case 1:
        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3273:6: decl_variable_atom_impl[ declProperty , mdfr ]
        	        	        {
        	        	            FOLLOWPUSH(FOLLOW_decl_variable_atom_impl_in_decl_variable_impl9908);
        	        	            decl_variable_atom_impl(ctx, declProperty, mdfr);

        	        	            FOLLOWPOP();
        	        	            if  (HASEXCEPTION())
        	        	            {
        	        	                goto ruledecl_variable_implEx;
        	        	            }
        	        	            if (HASFAILED())
        	        	            {
        	        	                return ;
        	        	            }


        	        	        }
        	        	        break;

        	        	    default:

        	        		if ( cnt282 >= 1 )
        	        		{
        	        		    goto loop282;
        	        		}
        	        		if (BACKTRACKING>0)
        	        		{
        	        		    FAILEDFLAG = ANTLR3_TRUE;
        	        		    return ;
        	        		}

        	        		/* mismatchedSetEx()
        	        		 */
        	        		CONSTRUCTEX();
        	        		EXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
        	        		EXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;


        	        		goto ruledecl_variable_implEx;
        	        	}
        	        	cnt282++;
        	            }
        	            loop282: ;	/* Jump to here if this rule does not match */
        	        }

        	         MATCHT(RCURLY, &FOLLOW_RCURLY_in_decl_variable_impl9917);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledecl_variable_implEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruledecl_variable_implEx; /* Prevent compiler warnings */
    ruledecl_variable_implEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(114, decl_variable_impl_StartIndex); }

    return ;
}
/* $ANTLR end decl_variable_impl */

/**
 * $ANTLR start decl_variable_atom_impl
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3277:1: decl_variable_atom_impl[ sep::PropertyPart & declProperty , sep::Modifier mdfr ] : tv= type_var decl_typed_variable_atom_impl[ declProperty , mdfr , $tv.type ] ;
 */
static void
decl_variable_atom_impl(pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr)
{
    ANTLR3_UINT32 decl_variable_atom_impl_StartIndex;

    sep::BF tv;
    #undef	RETURN_TYPE_tv
    #define	RETURN_TYPE_tv sep::BF

    /* Initialize rule variables
     */
    decl_variable_atom_impl_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(115)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3279:2: (tv= type_var decl_typed_variable_atom_impl[ declProperty , mdfr , $tv.type ] )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3279:4: tv= type_var decl_typed_variable_atom_impl[ declProperty , mdfr , $tv.type ]
        {
            FOLLOWPUSH(FOLLOW_type_var_in_decl_variable_atom_impl9933);
            tv=type_var(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruledecl_variable_atom_implEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            FOLLOWPUSH(FOLLOW_decl_typed_variable_atom_impl_in_decl_variable_atom_impl9938);
            decl_typed_variable_atom_impl(ctx, declProperty, mdfr, 
            tv
            );

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruledecl_variable_atom_implEx;
            }
            if (HASFAILED())
            {
                return ;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledecl_variable_atom_implEx; /* Prevent compiler warnings */
    ruledecl_variable_atom_implEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(115, decl_variable_atom_impl_StartIndex); }

    return ;
}
/* $ANTLR end decl_variable_atom_impl */

/**
 * $ANTLR start decl_typed_variable_atom_impl
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3283:1: decl_typed_variable_atom_impl[ sep::PropertyPart & declProperty ,\n\t\tsep::Modifier mdfr , const sep::BF & type ] : id= ID ( StringLiteral )? (iv= initial_value )? ( SEMI | on_write_var_routine_def[ var ] ) ;
 */
static void
decl_typed_variable_atom_impl(pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr, const sep::BF & type)
{
    ANTLR3_UINT32 decl_typed_variable_atom_impl_StartIndex;

    pANTLR3_COMMON_TOKEN    id;
    pANTLR3_COMMON_TOKEN    StringLiteral9;
    sep::BF iv;
    #undef	RETURN_TYPE_iv
    #define	RETURN_TYPE_iv sep::BF

    /* Initialize rule variables
     */
    decl_typed_variable_atom_impl_StartIndex = INDEX();



    	sep::Variable * var;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(116)) )
    {
        {
        }



        return ;
    }

    id       = NULL;
    StringLiteral9       = NULL;

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3289:2: (id= ID ( StringLiteral )? (iv= initial_value )? ( SEMI | on_write_var_routine_def[ var ] ) )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3289:4: id= ID ( StringLiteral )? (iv= initial_value )? ( SEMI | on_write_var_routine_def[ var ] )
        {
            id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_decl_typed_variable_atom_impl9959);
            if  (HASEXCEPTION())
            {
                goto ruledecl_typed_variable_atom_implEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            if ( BACKTRACKING==0 )
            {

                	  	declProperty.saveOwnedVariable( var = new sep::Variable(
                	  			declProperty, mdfr, type, STR((id->getText(id))->chars)) );
                	  
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3295:4: ( StringLiteral )?
            {
                int alt284=2;
                switch ( LA(1) )
                {
                    case StringLiteral:
                    	{
                    		alt284=1;
                    	}
                        break;
                }

                switch (alt284)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3295:6: StringLiteral
            	    {
            	        StringLiteral9 = (pANTLR3_COMMON_TOKEN) MATCHT(StringLiteral, &FOLLOW_StringLiteral_in_decl_typed_variable_atom_impl9972);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledecl_typed_variable_atom_implEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             var->setUnrestrictedName(STR((StringLiteral9->getText(StringLiteral9))->chars)); 
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3299:4: (iv= initial_value )?
            {
                int alt285=2;
                switch ( LA(1) )
                {
                    case ASSIGN:
                    case LPAREN:
                    	{
                    		alt285=1;
                    	}
                        break;
                }

                switch (alt285)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3299:6: iv= initial_value
            	    {
            	        FOLLOWPUSH(FOLLOW_initial_value_in_decl_typed_variable_atom_impl9993);
            	        iv=initial_value(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledecl_typed_variable_atom_implEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             var->setValue(iv
            	            ); 
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3300:4: ( SEMI | on_write_var_routine_def[ var ] )
            {
                int alt286=2;
                switch ( LA(1) )
                {
                case SEMI:
                	{
                		alt286=1;
                	}
                    break;
                case LCURLY:
                	{
                		alt286=2;
                	}
                    break;

                default:
                    if (BACKTRACKING>0)
                    {
                        FAILEDFLAG = ANTLR3_TRUE;
                        return ;
                    }

                    CONSTRUCTEX();
                    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                    EXCEPTION->message      = (void *)"";
                    EXCEPTION->decisionNum  = 286;
                    EXCEPTION->state        = 0;


                    goto ruledecl_typed_variable_atom_implEx;

                }

                switch (alt286)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3300:6: SEMI
            	    {
            	         MATCHT(SEMI, &FOLLOW_SEMI_in_decl_typed_variable_atom_impl10006);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledecl_typed_variable_atom_implEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3300:15: on_write_var_routine_def[ var ]
            	    {
            	        FOLLOWPUSH(FOLLOW_on_write_var_routine_def_in_decl_typed_variable_atom_impl10012);
            	        on_write_var_routine_def(ctx, var);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledecl_typed_variable_atom_implEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

                }
            }

        }

    }

    // This is where rules clean up and exit
    //
    goto ruledecl_typed_variable_atom_implEx; /* Prevent compiler warnings */
    ruledecl_typed_variable_atom_implEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(116, decl_typed_variable_atom_impl_StartIndex); }

    return ;
}
/* $ANTLR end decl_typed_variable_atom_impl */

/**
 * $ANTLR start initial_value
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3304:1: initial_value returns [ sep::BF bf ] : ( ASSIGN e= expression | LPAREN e= expression RPAREN );
 */
static sep::BF
initial_value(pfmlParser ctx)
{
    sep::BF bf;

    ANTLR3_UINT32 initial_value_StartIndex;

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    /* Initialize rule variables
     */
    initial_value_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(117)) )
    {
        {
        }



        return bf;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3306:2: ( ASSIGN e= expression | LPAREN e= expression RPAREN )

            ANTLR3_UINT32 alt287;

            alt287=2;

            switch ( LA(1) )
            {
            case ASSIGN:
            	{
            		alt287=1;
            	}
                break;
            case LPAREN:
            	{
            		alt287=2;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return bf;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 287;
                EXCEPTION->state        = 0;


                goto ruleinitial_valueEx;

            }

            switch (alt287)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3306:4: ASSIGN e= expression
        	    {
        	         MATCHT(ASSIGN, &FOLLOW_ASSIGN_in_initial_value10031);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleinitial_valueEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        FOLLOWPUSH(FOLLOW_expression_in_initial_value10036);
        	        e=expression(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleinitial_valueEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= 
        	            e
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3307:4: LPAREN e= expression RPAREN
        	    {
        	         MATCHT(LPAREN, &FOLLOW_LPAREN_in_initial_value10052);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleinitial_valueEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        FOLLOWPUSH(FOLLOW_expression_in_initial_value10057);
        	        e=expression(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleinitial_valueEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	         MATCHT(RPAREN, &FOLLOW_RPAREN_in_initial_value10060);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleinitial_valueEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= 
        	            e
        	            ;
        	             
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruleinitial_valueEx; /* Prevent compiler warnings */
    ruleinitial_valueEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(117, initial_value_StartIndex); }

    return bf;
}
/* $ANTLR end initial_value */

/**
 * $ANTLR start type_var
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3311:1: type_var returns [ sep::BF type ] : (btv= base_type_var (dta= def_type_array[ type , \"\" ] )? |dtc= def_type_container[ \"\" ] |dti= def_type_interval[ \"\" ] );
 */
static sep::BF
type_var(pfmlParser ctx)
{
    sep::BF type;

    ANTLR3_UINT32 type_var_StartIndex;

    sep::BF btv;
    #undef	RETURN_TYPE_btv
    #define	RETURN_TYPE_btv sep::BF

    sep::BF dta;
    #undef	RETURN_TYPE_dta
    #define	RETURN_TYPE_dta sep::BF

    sep::BF dtc;
    #undef	RETURN_TYPE_dtc
    #define	RETURN_TYPE_dtc sep::BF

    sep::BF dti;
    #undef	RETURN_TYPE_dti
    #define	RETURN_TYPE_dti sep::BF

    /* Initialize rule variables
     */
    type_var_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(118)) )
    {
        {
        }



        return type;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3313:2: (btv= base_type_var (dta= def_type_array[ type , \"\" ] )? |dtc= def_type_container[ \"\" ] |dti= def_type_interval[ \"\" ] )

            ANTLR3_UINT32 alt289;

            alt289=3;

            switch ( LA(1) )
            {
            case ID:
            case 242:
            case 245:
            case 246:
            case 249:
            case 254:
            case 255:
            case 259:
            case 261:
            case 264:
            case 270:
            case 271:
            case 283:
            case 309:
            case 310:
            case 317:
            case 320:
            case 333:
            case 344:
            case 345:
            case 346:
            case 357:
            case 358:
            case 360:
            case 374:
            case 387:
            case 392:
            case 399:
            case 400:
            case 401:
            case 402:
            case 405:
            case 407:
            case 408:
            case 409:
            	{
            		alt289=1;
            	}
                break;
            case 241:
            case 281:
            case 315:
            case 316:
            case 325:
            case 326:
            case 329:
            case 370:
            case 373:
            case 412:
            	{
            		alt289=2;
            	}
                break;
            case 311:
            	{
            		alt289=3;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return type;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 289;
                EXCEPTION->state        = 0;


                goto ruletype_varEx;

            }

            switch (alt289)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3313:4: btv= base_type_var (dta= def_type_array[ type , \"\" ] )?
        	    {
        	        FOLLOWPUSH(FOLLOW_base_type_var_in_type_var10081);
        	        btv=base_type_var(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruletype_varEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return type;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             type= 
        	            btv
        	            ;
        	             
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3314:4: (dta= def_type_array[ type , \"\" ] )?
        	        {
        	            int alt288=2;
        	            switch ( LA(1) )
        	            {
        	                case LBRACKET:
        	                	{
        	                		alt288=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt288)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3314:6: dta= def_type_array[ type , \"\" ]
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_def_type_array_in_type_var10109);
        	        	        dta=def_type_array(ctx, type, "");

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruletype_varEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return type;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             type= 
        	        	            dta
        	        	            ;
        	        	             
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3316:4: dtc= def_type_container[ \"\" ]
        	    {
        	        FOLLOWPUSH(FOLLOW_def_type_container_in_type_var10124);
        	        dtc=def_type_container(ctx, "");

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruletype_varEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return type;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             type= 
        	            dtc
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3318:4: dti= def_type_interval[ \"\" ]
        	    {
        	        FOLLOWPUSH(FOLLOW_def_type_interval_in_type_var10141);
        	        dti=def_type_interval(ctx, "");

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruletype_varEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return type;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             type= 
        	            dti
        	            ;
        	             
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruletype_varEx; /* Prevent compiler warnings */
    ruletype_varEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(118, type_var_StartIndex); }

    return type;
}
/* $ANTLR end type_var */

/**
 * $ANTLR start def_type_array
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3322:1: def_type_array[ sep::BF baseT , const std::string & tid ] returns [ sep::BF type ] : (dta= def_type_array_size )+ ;
 */
static sep::BF
def_type_array(pfmlParser ctx, sep::BF baseT, const std::string & tid)
{
    sep::BF type;

    ANTLR3_UINT32 def_type_array_StartIndex;

    int dta;
    #undef	RETURN_TYPE_dta
    #define	RETURN_TYPE_dta int

    /* Initialize rule variables
     */
    def_type_array_StartIndex = INDEX();



    	sep::ListOfInt listOfSize;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(119)) )
    {
        {
        }



        return type;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3328:2: ( (dta= def_type_array_size )+ )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3328:4: (dta= def_type_array_size )+
        {
            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3328:4: (dta= def_type_array_size )+
            {
                int cnt290=0;

                for (;;)
                {
                    int alt290=2;
            	switch ( LA(1) )
            	{
            	case LBRACKET:
            		{
            			alt290=1;
            		}
            	    break;

            	}

            	switch (alt290)
            	{
            	    case 1:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3328:6: dta= def_type_array_size
            	        {
            	            FOLLOWPUSH(FOLLOW_def_type_array_size_in_def_type_array10178);
            	            dta=def_type_array_size(ctx);

            	            FOLLOWPOP();
            	            if  (HASEXCEPTION())
            	            {
            	                goto ruledef_type_arrayEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return type;
            	            }


            	            if ( BACKTRACKING==0 )
            	            {
            	                 listOfSize.push_back(dta
            	                ); 
            	            }


            	        }
            	        break;

            	    default:

            		if ( cnt290 >= 1 )
            		{
            		    goto loop290;
            		}
            		if (BACKTRACKING>0)
            		{
            		    FAILEDFLAG = ANTLR3_TRUE;
            		    return type;
            		}

            		/* mismatchedSetEx()
            		 */
            		CONSTRUCTEX();
            		EXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
            		EXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;


            		goto ruledef_type_arrayEx;
            	}
            	cnt290++;
                }
                loop290: ;	/* Jump to here if this rule does not match */
            }

            if ( BACKTRACKING==0 )
            {

                		int szT = listOfSize.front();
                		listOfSize.pop_front();

                		while( listOfSize.nonempty() )
                		{
                			baseT = sep::BF( sep::DataType::newContainer(_CPM_,
                					sep::DataType::strContainerId(sep::TYPE_ARRAY_SPECIFIER,
                							baseT, listOfSize.back()),
                					sep::TYPE_ARRAY_SPECIFIER, baseT, listOfSize.back()) );
                			listOfSize.pop_back();
                		}
                		type = sep::BF( sep::DataType::newContainer(_CPM_,
                				sep::DataType::strContainerId(
                						tid, sep::TYPE_ARRAY_SPECIFIER, baseT, szT),
                				sep::TYPE_ARRAY_SPECIFIER, baseT, szT) );
                	
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_type_arrayEx; /* Prevent compiler warnings */
    ruledef_type_arrayEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(119, def_type_array_StartIndex); }

    return type;
}
/* $ANTLR end def_type_array */

/**
 * $ANTLR start def_type_array_size
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3348:1: def_type_array_size returns [ int size ] : LBRACKET (sz= IntegerLiteral |id= qualifiedNameID ) RBRACKET ;
 */
static int
def_type_array_size(pfmlParser ctx)
{
    int size;

    ANTLR3_UINT32 def_type_array_size_StartIndex;

    pANTLR3_COMMON_TOKEN    sz;
    fmlParser_qualifiedNameID_return id;
    #undef	RETURN_TYPE_id
    #define	RETURN_TYPE_id fmlParser_qualifiedNameID_return

    /* Initialize rule variables
     */
    def_type_array_size_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(120)) )
    {
        {
        }



        return size;
    }

    sz       = NULL;

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3350:2: ( LBRACKET (sz= IntegerLiteral |id= qualifiedNameID ) RBRACKET )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3350:4: LBRACKET (sz= IntegerLiteral |id= qualifiedNameID ) RBRACKET
        {
             MATCHT(LBRACKET, &FOLLOW_LBRACKET_in_def_type_array_size10202);
            if  (HASEXCEPTION())
            {
                goto ruledef_type_array_sizeEx;
            }
            if (HASFAILED())
            {
                return size;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3351:6: (sz= IntegerLiteral |id= qualifiedNameID )
            {
                int alt291=2;
                switch ( LA(1) )
                {
                case IntegerLiteral:
                	{
                		alt291=1;
                	}
                    break;
                case ID:
                	{
                		alt291=2;
                	}
                    break;

                default:
                    if (BACKTRACKING>0)
                    {
                        FAILEDFLAG = ANTLR3_TRUE;
                        return size;
                    }

                    CONSTRUCTEX();
                    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                    EXCEPTION->message      = (void *)"";
                    EXCEPTION->decisionNum  = 291;
                    EXCEPTION->state        = 0;


                    goto ruledef_type_array_sizeEx;

                }

                switch (alt291)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3351:8: sz= IntegerLiteral
            	    {
            	        sz = (pANTLR3_COMMON_TOKEN) MATCHT(IntegerLiteral, &FOLLOW_IntegerLiteral_in_def_type_array_size10213);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_type_array_sizeEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return size;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             size = NUM_INT((sz->getText(sz))->chars); 
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3354:5: id= qualifiedNameID
            	    {
            	        FOLLOWPUSH(FOLLOW_qualifiedNameID_in_def_type_array_size10228);
            	        id=qualifiedNameID(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_type_array_sizeEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return size;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {

            	            			const sep::BF & constVar =
            	            					sep::ParserUtil::getConstant(id.s
            	            , id.nb
            	            );
            	            			if( constVar.valid() &&
            	            				constVar.to_ptr< sep::Variable >()->hasValue() &&
            	            				constVar.to_ptr< sep::Variable >()->getValue().isInteger() )
            	            			{
            	            				size = constVar.to_ptr< sep::Variable >()->getValue().toInteger();
            	            			}
            	            			else
            	            			{
            	            				sep::BF aType = sep::ParserUtil::getDataType(id.s
            	            , id.nb
            	            );

            	            				if( aType.valid() && aType.is< sep::DataType >() )
            	            				{
            	            					if( aType.to_ptr< sep::DataType >()->isTypedInterval() )
            	            					{
            	            						size = aType.to_ptr< sep::DataType >()->getIntervalLength();

            	            						if( size < 0 )
            	            						{
            	            							sep::ParserUtil::avm_syntax_error(
            	            								"def_type_array_size(...)" )
            	            									<< "unexpected << interval: " << id.s

            	            									<< " >> as size (i.e. " << size
            	            									<< ") in an array typedef"
            	            									<< sep::ParserUtil::SYNTAX_ERROR_EOL;

            	            							size = 0;
            	            						}
            	            					}
            	            					else if( aType.to_ptr< sep::DataType >()->isTypedEnum() )
            	            					{
            	            						size = aType.to_ptr< sep::DataType >()->getEnumSize();

            	            						if( size == 0 )
            	            						{
            	            							sep::ParserUtil::avm_syntax_error(
            	            								"def_type_array_size(...)" )
            	            									<< "unexpected << enum: " << id.s

            	            									<< " >> as size in an array typedef"
            	            									<< sep::ParserUtil::SYNTAX_ERROR_EOL;
            	            						}
            	            					}
            	            					else
            	            					{
            	            						size = 0;

            	            						sep::ParserUtil::avm_syntax_error(
            	            							"def_type_array_size(...)" )
            	            								<< "unexpected << [Qualified]NameID: " << id.s

            	            								<< " >> as size in an array typedef"
            	            								<< sep::ParserUtil::SYNTAX_ERROR_EOL;
            	            					}
            	            				}
            	            				else
            	            				{
            	            					size = 0;

            	            					sep::ParserUtil::avm_syntax_error(
            	            						"def_type_array_size(...)" )
            	            							<< "unexpected << [Qualified]NameID: " << id.s

            	            							<< " >> as size in an array typedef"
            	            							<< sep::ParserUtil::SYNTAX_ERROR_EOL;
            	            				}
            	            			}
            	            		
            	        }


            	    }
            	    break;

                }
            }

             MATCHT(RBRACKET, &FOLLOW_RBRACKET_in_def_type_array_size10241);
            if  (HASEXCEPTION())
            {
                goto ruledef_type_array_sizeEx;
            }
            if (HASFAILED())
            {
                return size;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_type_array_sizeEx; /* Prevent compiler warnings */
    ruledef_type_array_sizeEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(120, def_type_array_size_StartIndex); }

    return size;
}
/* $ANTLR end def_type_array_size */

/**
 * $ANTLR start def_type_container
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3427:1: def_type_container[ const std::string & tid ] returns [ sep::BF type ] : sb= specifier_buffer ( LT_ ( (btv= base_type_var ( COMMA ( 'size:' )? (sz= integer_constant | STAR ) )? ) | ( 'size:' )? sz= integer_constant ) GT )? ;
 */
static sep::BF
def_type_container(pfmlParser ctx, const std::string & tid)
{
    sep::BF type;

    ANTLR3_UINT32 def_type_container_StartIndex;

    sep::avm_type_specifier_kind_t sb;
    #undef	RETURN_TYPE_sb
    #define	RETURN_TYPE_sb sep::avm_type_specifier_kind_t

    sep::BF btv;
    #undef	RETURN_TYPE_btv
    #define	RETURN_TYPE_btv sep::BF

    sep::avm_size_t sz;
    #undef	RETURN_TYPE_sz
    #define	RETURN_TYPE_sz sep::avm_size_t

    /* Initialize rule variables
     */
    def_type_container_StartIndex = INDEX();



    	sep::BF baseT = sep::TypeManager::UNIVERSAL;
    	int szT = -1;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(121)) )
    {
        {
        }



        return type;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3433:3: (sb= specifier_buffer ( LT_ ( (btv= base_type_var ( COMMA ( 'size:' )? (sz= integer_constant | STAR ) )? ) | ( 'size:' )? sz= integer_constant ) GT )? )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3433:5: sb= specifier_buffer ( LT_ ( (btv= base_type_var ( COMMA ( 'size:' )? (sz= integer_constant | STAR ) )? ) | ( 'size:' )? sz= integer_constant ) GT )?
        {
            FOLLOWPUSH(FOLLOW_specifier_buffer_in_def_type_container10266);
            sb=specifier_buffer(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruledef_type_containerEx;
            }
            if (HASFAILED())
            {
                return type;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3434:5: ( LT_ ( (btv= base_type_var ( COMMA ( 'size:' )? (sz= integer_constant | STAR ) )? ) | ( 'size:' )? sz= integer_constant ) GT )?
            {
                int alt297=2;
                switch ( LA(1) )
                {
                    case LT_:
                    	{
                    		alt297=1;
                    	}
                        break;
                }

                switch (alt297)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3434:7: LT_ ( (btv= base_type_var ( COMMA ( 'size:' )? (sz= integer_constant | STAR ) )? ) | ( 'size:' )? sz= integer_constant ) GT
            	    {
            	         MATCHT(LT_, &FOLLOW_LT__in_def_type_container10274);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_type_containerEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return type;
            	        }


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3435:6: ( (btv= base_type_var ( COMMA ( 'size:' )? (sz= integer_constant | STAR ) )? ) | ( 'size:' )? sz= integer_constant )
            	        {
            	            int alt296=2;
            	            switch ( LA(1) )
            	            {
            	            case ID:
            	            	{
            	            		{
            	            		    int LA296_1 = LA(2);
            	            		    if ( (synpred493_fml(ctx)))
            	            		    {
            	            		        alt296=1;
            	            		    }
            	            		    else if ( (ANTLR3_TRUE))
            	            		    {
            	            		        alt296=2;
            	            		    }
            	            		    else
            	            		    {
            	            		        if (BACKTRACKING>0)
            	            		        {
            	            		            FAILEDFLAG = ANTLR3_TRUE;
            	            		            return type;
            	            		        }


            	            		        CONSTRUCTEX();
            	            		        EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
            	            		        EXCEPTION->message      = (void *)"";
            	            		        EXCEPTION->decisionNum  = 296;
            	            		        EXCEPTION->state        = 1;


            	            		        goto ruledef_type_containerEx;

            	            		    }
            	            		}
            	            	}
            	                break;
            	            case 242:
            	            case 245:
            	            case 246:
            	            case 249:
            	            case 254:
            	            case 255:
            	            case 259:
            	            case 261:
            	            case 264:
            	            case 270:
            	            case 271:
            	            case 283:
            	            case 309:
            	            case 310:
            	            case 317:
            	            case 320:
            	            case 333:
            	            case 344:
            	            case 345:
            	            case 346:
            	            case 357:
            	            case 358:
            	            case 360:
            	            case 374:
            	            case 387:
            	            case 392:
            	            case 399:
            	            case 400:
            	            case 401:
            	            case 402:
            	            case 405:
            	            case 407:
            	            case 408:
            	            case 409:
            	            	{
            	            		alt296=1;
            	            	}
            	                break;
            	            case IntegerLiteral:
            	            case 375:
            	            	{
            	            		alt296=2;
            	            	}
            	                break;

            	            default:
            	                if (BACKTRACKING>0)
            	                {
            	                    FAILEDFLAG = ANTLR3_TRUE;
            	                    return type;
            	                }

            	                CONSTRUCTEX();
            	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
            	                EXCEPTION->message      = (void *)"";
            	                EXCEPTION->decisionNum  = 296;
            	                EXCEPTION->state        = 0;


            	                goto ruledef_type_containerEx;

            	            }

            	            switch (alt296)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3435:8: (btv= base_type_var ( COMMA ( 'size:' )? (sz= integer_constant | STAR ) )? )
            	        	    {
            	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3435:8: (btv= base_type_var ( COMMA ( 'size:' )? (sz= integer_constant | STAR ) )? )
            	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3435:10: btv= base_type_var ( COMMA ( 'size:' )? (sz= integer_constant | STAR ) )?
            	        	        {
            	        	            FOLLOWPUSH(FOLLOW_base_type_var_in_def_type_container10287);
            	        	            btv=base_type_var(ctx);

            	        	            FOLLOWPOP();
            	        	            if  (HASEXCEPTION())
            	        	            {
            	        	                goto ruledef_type_containerEx;
            	        	            }
            	        	            if (HASFAILED())
            	        	            {
            	        	                return type;
            	        	            }


            	        	            if ( BACKTRACKING==0 )
            	        	            {
            	        	                 baseT = btv
            	        	                ; 
            	        	            }


            	        	            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3436:10: ( COMMA ( 'size:' )? (sz= integer_constant | STAR ) )?
            	        	            {
            	        	                int alt294=2;
            	        	                switch ( LA(1) )
            	        	                {
            	        	                    case COMMA:
            	        	                    	{
            	        	                    		alt294=1;
            	        	                    	}
            	        	                        break;
            	        	                }

            	        	                switch (alt294)
            	        	                {
            	        	            	case 1:
            	        	            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3436:12: COMMA ( 'size:' )? (sz= integer_constant | STAR )
            	        	            	    {
            	        	            	         MATCHT(COMMA, &FOLLOW_COMMA_in_def_type_container10303);
            	        	            	        if  (HASEXCEPTION())
            	        	            	        {
            	        	            	            goto ruledef_type_containerEx;
            	        	            	        }
            	        	            	        if (HASFAILED())
            	        	            	        {
            	        	            	            return type;
            	        	            	        }


            	        	            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3436:19: ( 'size:' )?
            	        	            	        {
            	        	            	            int alt292=2;
            	        	            	            switch ( LA(1) )
            	        	            	            {
            	        	            	                case 375:
            	        	            	                	{
            	        	            	                		alt292=1;
            	        	            	                	}
            	        	            	                    break;
            	        	            	            }

            	        	            	            switch (alt292)
            	        	            	            {
            	        	            	        	case 1:
            	        	            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3436:21: 'size:'
            	        	            	        	    {
            	        	            	        	         MATCHT(375, &FOLLOW_375_in_def_type_container10308);
            	        	            	        	        if  (HASEXCEPTION())
            	        	            	        	        {
            	        	            	        	            goto ruledef_type_containerEx;
            	        	            	        	        }
            	        	            	        	        if (HASFAILED())
            	        	            	        	        {
            	        	            	        	            return type;
            	        	            	        	        }


            	        	            	        	    }
            	        	            	        	    break;

            	        	            	            }
            	        	            	        }

            	        	            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3437:12: (sz= integer_constant | STAR )
            	        	            	        {
            	        	            	            int alt293=2;
            	        	            	            switch ( LA(1) )
            	        	            	            {
            	        	            	            case ID:
            	        	            	            case IntegerLiteral:
            	        	            	            	{
            	        	            	            		alt293=1;
            	        	            	            	}
            	        	            	                break;
            	        	            	            case STAR:
            	        	            	            	{
            	        	            	            		alt293=2;
            	        	            	            	}
            	        	            	                break;

            	        	            	            default:
            	        	            	                if (BACKTRACKING>0)
            	        	            	                {
            	        	            	                    FAILEDFLAG = ANTLR3_TRUE;
            	        	            	                    return type;
            	        	            	                }

            	        	            	                CONSTRUCTEX();
            	        	            	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
            	        	            	                EXCEPTION->message      = (void *)"";
            	        	            	                EXCEPTION->decisionNum  = 293;
            	        	            	                EXCEPTION->state        = 0;


            	        	            	                goto ruledef_type_containerEx;

            	        	            	            }

            	        	            	            switch (alt293)
            	        	            	            {
            	        	            	        	case 1:
            	        	            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3437:14: sz= integer_constant
            	        	            	        	    {
            	        	            	        	        FOLLOWPUSH(FOLLOW_integer_constant_in_def_type_container10328);
            	        	            	        	        sz=integer_constant(ctx);

            	        	            	        	        FOLLOWPOP();
            	        	            	        	        if  (HASEXCEPTION())
            	        	            	        	        {
            	        	            	        	            goto ruledef_type_containerEx;
            	        	            	        	        }
            	        	            	        	        if (HASFAILED())
            	        	            	        	        {
            	        	            	        	            return type;
            	        	            	        	        }


            	        	            	        	        if ( BACKTRACKING==0 )
            	        	            	        	        {
            	        	            	        	             szT = sz
            	        	            	        	            ; 
            	        	            	        	        }


            	        	            	        	    }
            	        	            	        	    break;
            	        	            	        	case 2:
            	        	            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3438:14: STAR
            	        	            	        	    {
            	        	            	        	         MATCHT(STAR, &FOLLOW_STAR_in_def_type_container10345);
            	        	            	        	        if  (HASEXCEPTION())
            	        	            	        	        {
            	        	            	        	            goto ruledef_type_containerEx;
            	        	            	        	        }
            	        	            	        	        if (HASFAILED())
            	        	            	        	        {
            	        	            	        	            return type;
            	        	            	        	        }


            	        	            	        	        if ( BACKTRACKING==0 )
            	        	            	        	        {
            	        	            	        	             szT = -1; 
            	        	            	        	        }


            	        	            	        	    }
            	        	            	        	    break;

            	        	            	            }
            	        	            	        }

            	        	            	    }
            	        	            	    break;

            	        	                }
            	        	            }

            	        	        }


            	        	    }
            	        	    break;
            	        	case 2:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3442:8: ( 'size:' )? sz= integer_constant
            	        	    {
            	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3442:8: ( 'size:' )?
            	        	        {
            	        	            int alt295=2;
            	        	            switch ( LA(1) )
            	        	            {
            	        	                case 375:
            	        	                	{
            	        	                		alt295=1;
            	        	                	}
            	        	                    break;
            	        	            }

            	        	            switch (alt295)
            	        	            {
            	        	        	case 1:
            	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3442:10: 'size:'
            	        	        	    {
            	        	        	         MATCHT(375, &FOLLOW_375_in_def_type_container10407);
            	        	        	        if  (HASEXCEPTION())
            	        	        	        {
            	        	        	            goto ruledef_type_containerEx;
            	        	        	        }
            	        	        	        if (HASFAILED())
            	        	        	        {
            	        	        	            return type;
            	        	        	        }


            	        	        	    }
            	        	        	    break;

            	        	            }
            	        	        }

            	        	        FOLLOWPUSH(FOLLOW_integer_constant_in_def_type_container10414);
            	        	        sz=integer_constant(ctx);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledef_type_containerEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return type;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             szT = sz
            	        	            ; 
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	         MATCHT(GT, &FOLLOW_GT_in_def_type_container10431);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_type_containerEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return type;
            	        }


            	    }
            	    break;

                }
            }

            if ( BACKTRACKING==0 )
            {

                		type= sep::BF( sep::DataType::newContainer(_CPM_,
                				sep::DataType::strContainerId(tid, 
                sb
                , baseT, szT),
                				sb
                , baseT, szT) );

                	
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_type_containerEx; /* Prevent compiler warnings */
    ruledef_type_containerEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(121, def_type_container_StartIndex); }

    return type;
}
/* $ANTLR end def_type_container */

/**
 * $ANTLR start specifier_buffer
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3454:1: specifier_buffer returns [ sep::avm_type_specifier_kind_t kind ] : ( 'array' | 'vector' | 'rvector' | 'list' | 'fifo' | 'lifo' | 'multififo' | 'multilifo' | 'set' | 'multiset' );
 */
static sep::avm_type_specifier_kind_t
specifier_buffer(pfmlParser ctx)
{
    sep::avm_type_specifier_kind_t kind;

    ANTLR3_UINT32 specifier_buffer_StartIndex;

    /* Initialize rule variables
     */
    specifier_buffer_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(122)) )
    {
        {
        }



        return kind;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3456:2: ( 'array' | 'vector' | 'rvector' | 'list' | 'fifo' | 'lifo' | 'multififo' | 'multilifo' | 'set' | 'multiset' )

            ANTLR3_UINT32 alt298;

            alt298=10;

            switch ( LA(1) )
            {
            case 241:
            	{
            		alt298=1;
            	}
                break;
            case 412:
            	{
            		alt298=2;
            	}
                break;
            case 370:
            	{
            		alt298=3;
            	}
                break;
            case 316:
            	{
            		alt298=4;
            	}
                break;
            case 281:
            	{
            		alt298=5;
            	}
                break;
            case 315:
            	{
            		alt298=6;
            	}
                break;
            case 325:
            	{
            		alt298=7;
            	}
                break;
            case 326:
            	{
            		alt298=8;
            	}
                break;
            case 373:
            	{
            		alt298=9;
            	}
                break;
            case 329:
            	{
            		alt298=10;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return kind;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 298;
                EXCEPTION->state        = 0;


                goto rulespecifier_bufferEx;

            }

            switch (alt298)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3456:4: 'array'
        	    {
        	         MATCHT(241, &FOLLOW_241_in_specifier_buffer10456);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulespecifier_bufferEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return kind;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             kind= sep::TYPE_ARRAY_SPECIFIER;
        	                      
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3457:4: 'vector'
        	    {
        	         MATCHT(412, &FOLLOW_412_in_specifier_buffer10467);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulespecifier_bufferEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return kind;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             kind= sep::TYPE_VECTOR_SPECIFIER;
        	                     
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3458:4: 'rvector'
        	    {
        	         MATCHT(370, &FOLLOW_370_in_specifier_buffer10477);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulespecifier_bufferEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return kind;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             kind= sep::TYPE_REVERSE_VECTOR_SPECIFIER;
        	             
        	        }


        	    }
        	    break;
        	case 4:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3459:4: 'list'
        	    {
        	         MATCHT(316, &FOLLOW_316_in_specifier_buffer10486);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulespecifier_bufferEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return kind;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             kind= sep::TYPE_LIST_SPECIFIER;
        	                       
        	        }


        	    }
        	    break;
        	case 5:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3460:4: 'fifo'
        	    {
        	         MATCHT(281, &FOLLOW_281_in_specifier_buffer10498);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulespecifier_bufferEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return kind;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             kind= sep::TYPE_FIFO_SPECIFIER;
        	                       
        	        }


        	    }
        	    break;
        	case 6:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3461:4: 'lifo'
        	    {
        	         MATCHT(315, &FOLLOW_315_in_specifier_buffer10510);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulespecifier_bufferEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return kind;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             kind= sep::TYPE_LIFO_SPECIFIER;
        	                       
        	        }


        	    }
        	    break;
        	case 7:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3462:4: 'multififo'
        	    {
        	         MATCHT(325, &FOLLOW_325_in_specifier_buffer10522);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulespecifier_bufferEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return kind;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             kind= sep::TYPE_MULTI_FIFO_SPECIFIER;
        	                 
        	        }


        	    }
        	    break;
        	case 8:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3463:4: 'multilifo'
        	    {
        	         MATCHT(326, &FOLLOW_326_in_specifier_buffer10529);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulespecifier_bufferEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return kind;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             kind= sep::TYPE_MULTI_LIFO_SPECIFIER;
        	                 
        	        }


        	    }
        	    break;
        	case 9:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3464:4: 'set'
        	    {
        	         MATCHT(373, &FOLLOW_373_in_specifier_buffer10536);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulespecifier_bufferEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return kind;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             kind= sep::TYPE_SET_SPECIFIER;
        	                        
        	        }


        	    }
        	    break;
        	case 10:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3465:4: 'multiset'
        	    {
        	         MATCHT(329, &FOLLOW_329_in_specifier_buffer10549);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulespecifier_bufferEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return kind;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             kind= sep::TYPE_MULTISET_SPECIFIER;
        	                   
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto rulespecifier_bufferEx; /* Prevent compiler warnings */
    rulespecifier_bufferEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(122, specifier_buffer_StartIndex); }

    return kind;
}
/* $ANTLR end specifier_buffer */

/**
 * $ANTLR start def_type_interval
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3469:1: def_type_interval[ const std::string & tid ] returns [ sep::BF type ] : 'interval' LT_ (pt= primitive_type )? (ll= LBRACKET |ll= RBRACKET |ll= LPAREN ) min= expression COMMA max= expression (rr= LBRACKET |rr= RBRACKET |rr= RPAREN ) GT ;
 */
static sep::BF
def_type_interval(pfmlParser ctx, const std::string & tid)
{
    sep::BF type;

    ANTLR3_UINT32 def_type_interval_StartIndex;

    pANTLR3_COMMON_TOKEN    ll;
    pANTLR3_COMMON_TOKEN    rr;
    sep::TypeSpecifier pt;
    #undef	RETURN_TYPE_pt
    #define	RETURN_TYPE_pt sep::TypeSpecifier

    sep::BF min;
    #undef	RETURN_TYPE_min
    #define	RETURN_TYPE_min sep::BF

    sep::BF max;
    #undef	RETURN_TYPE_max
    #define	RETURN_TYPE_max sep::BF

    /* Initialize rule variables
     */
    def_type_interval_StartIndex = INDEX();



    	sep::BF baseT = sep::TypeManager::INTEGER;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(123)) )
    {
        {
        }



        return type;
    }

    ll       = NULL;
    rr       = NULL;

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3474:2: ( 'interval' LT_ (pt= primitive_type )? (ll= LBRACKET |ll= RBRACKET |ll= LPAREN ) min= expression COMMA max= expression (rr= LBRACKET |rr= RBRACKET |rr= RPAREN ) GT )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3474:4: 'interval' LT_ (pt= primitive_type )? (ll= LBRACKET |ll= RBRACKET |ll= LPAREN ) min= expression COMMA max= expression (rr= LBRACKET |rr= RBRACKET |rr= RPAREN ) GT
        {
             MATCHT(311, &FOLLOW_311_in_def_type_interval10574);
            if  (HASEXCEPTION())
            {
                goto ruledef_type_intervalEx;
            }
            if (HASFAILED())
            {
                return type;
            }


            if ( BACKTRACKING==0 )
            {
                 type= sep::TypeManager::INTEGER;
                 
            }


             MATCHT(LT_, &FOLLOW_LT__in_def_type_interval10582);
            if  (HASEXCEPTION())
            {
                goto ruledef_type_intervalEx;
            }
            if (HASFAILED())
            {
                return type;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3476:6: (pt= primitive_type )?
            {
                int alt299=2;
                switch ( LA(1) )
                {
                    case 242:
                    case 245:
                    case 246:
                    case 249:
                    case 254:
                    case 255:
                    case 259:
                    case 261:
                    case 264:
                    case 270:
                    case 271:
                    case 283:
                    case 309:
                    case 310:
                    case 317:
                    case 320:
                    case 333:
                    case 344:
                    case 345:
                    case 346:
                    case 357:
                    case 358:
                    case 360:
                    case 374:
                    case 387:
                    case 392:
                    case 399:
                    case 400:
                    case 401:
                    case 402:
                    case 405:
                    case 407:
                    case 408:
                    case 409:
                    	{
                    		alt299=1;
                    	}
                        break;
                }

                switch (alt299)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3476:8: pt= primitive_type
            	    {
            	        FOLLOWPUSH(FOLLOW_primitive_type_in_def_type_interval10593);
            	        pt=primitive_type(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_type_intervalEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return type;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             baseT = pt
            	            ; 
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3477:6: (ll= LBRACKET |ll= RBRACKET |ll= LPAREN )
            {
                int alt300=3;
                switch ( LA(1) )
                {
                case LBRACKET:
                	{
                		alt300=1;
                	}
                    break;
                case RBRACKET:
                	{
                		alt300=2;
                	}
                    break;
                case LPAREN:
                	{
                		alt300=3;
                	}
                    break;

                default:
                    if (BACKTRACKING>0)
                    {
                        FAILEDFLAG = ANTLR3_TRUE;
                        return type;
                    }

                    CONSTRUCTEX();
                    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                    EXCEPTION->message      = (void *)"";
                    EXCEPTION->decisionNum  = 300;
                    EXCEPTION->state        = 0;


                    goto ruledef_type_intervalEx;

                }

                switch (alt300)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3477:7: ll= LBRACKET
            	    {
            	        ll = (pANTLR3_COMMON_TOKEN) MATCHT(LBRACKET, &FOLLOW_LBRACKET_in_def_type_interval10608);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_type_intervalEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return type;
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3477:21: ll= RBRACKET
            	    {
            	        ll = (pANTLR3_COMMON_TOKEN) MATCHT(RBRACKET, &FOLLOW_RBRACKET_in_def_type_interval10614);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_type_intervalEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return type;
            	        }


            	    }
            	    break;
            	case 3:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3477:35: ll= LPAREN
            	    {
            	        ll = (pANTLR3_COMMON_TOKEN) MATCHT(LPAREN, &FOLLOW_LPAREN_in_def_type_interval10620);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_type_intervalEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return type;
            	        }


            	    }
            	    break;

                }
            }

            FOLLOWPUSH(FOLLOW_expression_in_def_type_interval10630);
            min=expression(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruledef_type_intervalEx;
            }
            if (HASFAILED())
            {
                return type;
            }


             MATCHT(COMMA, &FOLLOW_COMMA_in_def_type_interval10632);
            if  (HASEXCEPTION())
            {
                goto ruledef_type_intervalEx;
            }
            if (HASFAILED())
            {
                return type;
            }


            FOLLOWPUSH(FOLLOW_expression_in_def_type_interval10637);
            max=expression(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruledef_type_intervalEx;
            }
            if (HASFAILED())
            {
                return type;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3479:6: (rr= LBRACKET |rr= RBRACKET |rr= RPAREN )
            {
                int alt301=3;
                switch ( LA(1) )
                {
                case LBRACKET:
                	{
                		alt301=1;
                	}
                    break;
                case RBRACKET:
                	{
                		alt301=2;
                	}
                    break;
                case RPAREN:
                	{
                		alt301=3;
                	}
                    break;

                default:
                    if (BACKTRACKING>0)
                    {
                        FAILEDFLAG = ANTLR3_TRUE;
                        return type;
                    }

                    CONSTRUCTEX();
                    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                    EXCEPTION->message      = (void *)"";
                    EXCEPTION->decisionNum  = 301;
                    EXCEPTION->state        = 0;


                    goto ruledef_type_intervalEx;

                }

                switch (alt301)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3479:7: rr= LBRACKET
            	    {
            	        rr = (pANTLR3_COMMON_TOKEN) MATCHT(LBRACKET, &FOLLOW_LBRACKET_in_def_type_interval10647);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_type_intervalEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return type;
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3479:21: rr= RBRACKET
            	    {
            	        rr = (pANTLR3_COMMON_TOKEN) MATCHT(RBRACKET, &FOLLOW_RBRACKET_in_def_type_interval10653);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_type_intervalEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return type;
            	        }


            	    }
            	    break;
            	case 3:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3479:35: rr= RPAREN
            	    {
            	        rr = (pANTLR3_COMMON_TOKEN) MATCHT(RPAREN, &FOLLOW_RPAREN_in_def_type_interval10659);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_type_intervalEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return type;
            	        }


            	    }
            	    break;

                }
            }

             MATCHT(GT, &FOLLOW_GT_in_def_type_interval10665);
            if  (HASEXCEPTION())
            {
                goto ruledef_type_intervalEx;
            }
            if (HASFAILED())
            {
                return type;
            }


            if ( BACKTRACKING==0 )
            {

                		type= sep::BF( sep::DataType::newInterval(_CPM_, tid, baseT,
                			sep::IIntervalKind::computeKind(CHAR(ll), CHAR(rr)),
                			
                min
                , max
                ) );

                	
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_type_intervalEx; /* Prevent compiler warnings */
    ruledef_type_intervalEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(123, def_type_interval_StartIndex); }

    return type;
}
/* $ANTLR end def_type_interval */

/**
 * $ANTLR start base_type_var
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3489:1: base_type_var returns [ sep::BF type ] : (pt= primitive_type |id= qualifiedNameID );
 */
static sep::BF
base_type_var(pfmlParser ctx)
{
    sep::BF type;

    ANTLR3_UINT32 base_type_var_StartIndex;

    sep::TypeSpecifier pt;
    #undef	RETURN_TYPE_pt
    #define	RETURN_TYPE_pt sep::TypeSpecifier

    fmlParser_qualifiedNameID_return id;
    #undef	RETURN_TYPE_id
    #define	RETURN_TYPE_id fmlParser_qualifiedNameID_return

    /* Initialize rule variables
     */
    base_type_var_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(124)) )
    {
        {
        }



        return type;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3491:2: (pt= primitive_type |id= qualifiedNameID )

            ANTLR3_UINT32 alt302;

            alt302=2;

            switch ( LA(1) )
            {
            case 242:
            case 245:
            case 246:
            case 249:
            case 254:
            case 255:
            case 259:
            case 261:
            case 264:
            case 270:
            case 271:
            case 283:
            case 309:
            case 310:
            case 317:
            case 320:
            case 333:
            case 344:
            case 345:
            case 346:
            case 357:
            case 358:
            case 360:
            case 374:
            case 387:
            case 392:
            case 399:
            case 400:
            case 401:
            case 402:
            case 405:
            case 407:
            case 408:
            case 409:
            	{
            		alt302=1;
            	}
                break;
            case ID:
            	{
            		alt302=2;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return type;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 302;
                EXCEPTION->state        = 0;


                goto rulebase_type_varEx;

            }

            switch (alt302)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3491:4: pt= primitive_type
        	    {
        	        FOLLOWPUSH(FOLLOW_primitive_type_in_base_type_var10686);
        	        pt=primitive_type(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulebase_type_varEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return type;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             type= 
        	            pt
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3493:4: id= qualifiedNameID
        	    {
        	        FOLLOWPUSH(FOLLOW_qualifiedNameID_in_base_type_var10696);
        	        id=qualifiedNameID(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulebase_type_varEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return type;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             type= sep::ParserUtil::getDataType(
        	            id.s
        	            , id.nb
        	            );
        	             
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto rulebase_type_varEx; /* Prevent compiler warnings */
    rulebase_type_varEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(124, base_type_var_StartIndex); }

    return type;
}
/* $ANTLR end base_type_var */

/**
 * $ANTLR start primitive_type
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3498:1: primitive_type returns [ sep::TypeSpecifier bts ] : ( ( 'boolean' | 'bool' ) | ( 'integer' | 'int' ) (bfs= bit_field_size )? | ( 'uinteger' | 'uint' ) (bfs= bit_field_size )? | ( 'pos_integer' | 'pos_int' ) (bfs= bit_field_size )? | ( ( 'rational' | 'rat' ) | ( 'urational' | 'urat' ) | 'float' | 'ufloat' | 'double' | 'udouble' | 'real' | 'ureal' ) (bfs= bit_field_size )? |ct= time_clock_type |tt= time_type | 'char' (bfs= bit_field_size )? | 'character' (bfs= bit_field_size )? | 'string' (sfs= string_field_size )? | 'operator' | 'avmcode' | 'port' | 'buffer' | 'message' | 'signal' | 'connector' | 'machine' ( LT_ id= qualifiedNameID GT )? | 'universal' );
 */
static sep::TypeSpecifier
primitive_type(pfmlParser ctx)
{
    sep::TypeSpecifier bts;

    ANTLR3_UINT32 primitive_type_StartIndex;

    int bfs;
    #undef	RETURN_TYPE_bfs
    #define	RETURN_TYPE_bfs int

    sep::TypeSpecifier ct;
    #undef	RETURN_TYPE_ct
    #define	RETURN_TYPE_ct sep::TypeSpecifier

    sep::TypeSpecifier tt;
    #undef	RETURN_TYPE_tt
    #define	RETURN_TYPE_tt sep::TypeSpecifier

    fmlParser_string_field_size_return sfs;
    #undef	RETURN_TYPE_sfs
    #define	RETURN_TYPE_sfs fmlParser_string_field_size_return

    fmlParser_qualifiedNameID_return id;
    #undef	RETURN_TYPE_id
    #define	RETURN_TYPE_id fmlParser_qualifiedNameID_return

    /* Initialize rule variables
     */
    primitive_type_StartIndex = INDEX();



    	sep::avm_size_t arity = 1;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(125)) )
    {
        {
        }



        return bts;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3503:2: ( ( 'boolean' | 'bool' ) | ( 'integer' | 'int' ) (bfs= bit_field_size )? | ( 'uinteger' | 'uint' ) (bfs= bit_field_size )? | ( 'pos_integer' | 'pos_int' ) (bfs= bit_field_size )? | ( ( 'rational' | 'rat' ) | ( 'urational' | 'urat' ) | 'float' | 'ufloat' | 'double' | 'udouble' | 'real' | 'ureal' ) (bfs= bit_field_size )? |ct= time_clock_type |tt= time_type | 'char' (bfs= bit_field_size )? | 'character' (bfs= bit_field_size )? | 'string' (sfs= string_field_size )? | 'operator' | 'avmcode' | 'port' | 'buffer' | 'message' | 'signal' | 'connector' | 'machine' ( LT_ id= qualifiedNameID GT )? | 'universal' )

            ANTLR3_UINT32 alt312;

            alt312=19;

            switch ( LA(1) )
            {
            case 245:
            case 246:
            	{
            		alt312=1;
            	}
                break;
            case 309:
            case 310:
            	{
            		alt312=2;
            	}
                break;
            case 401:
            case 402:
            	{
            		alt312=3;
            	}
                break;
            case 345:
            case 346:
            	{
            		alt312=4;
            	}
                break;
            case 270:
            case 283:
            case 357:
            case 358:
            case 360:
            case 399:
            case 400:
            case 407:
            case 408:
            case 409:
            	{
            		alt312=5;
            	}
                break;
            case 259:
            	{
            		alt312=6;
            	}
                break;
            case 264:
            case 271:
            case 392:
            	{
            		alt312=7;
            	}
                break;
            case 254:
            	{
            		alt312=8;
            	}
                break;
            case 255:
            	{
            		alt312=9;
            	}
                break;
            case 387:
            	{
            		alt312=10;
            	}
                break;
            case 333:
            	{
            		alt312=11;
            	}
                break;
            case 242:
            	{
            		alt312=12;
            	}
                break;
            case 344:
            	{
            		alt312=13;
            	}
                break;
            case 249:
            	{
            		alt312=14;
            	}
                break;
            case 320:
            	{
            		alt312=15;
            	}
                break;
            case 374:
            	{
            		alt312=16;
            	}
                break;
            case 261:
            	{
            		alt312=17;
            	}
                break;
            case 317:
            	{
            		alt312=18;
            	}
                break;
            case 405:
            	{
            		alt312=19;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return bts;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 312;
                EXCEPTION->state        = 0;


                goto ruleprimitive_typeEx;

            }

            switch (alt312)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3503:4: ( 'boolean' | 'bool' )
        	    {
        	        if ( ((LA(1) >= 245) && (LA(1) <= 246)) )
        	        {
        	            CONSUME();
        	            PERRORRECOVERY=ANTLR3_FALSE;
        	            FAILEDFLAG=ANTLR3_FALSE;

        	        }
        	        else
        	        {
        	            if (BACKTRACKING>0)
        	            {
        	                FAILEDFLAG = ANTLR3_TRUE;
        	                return bts;
        	            }

        	            CONSTRUCTEX();
        	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
        	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
        	            EXCEPTION->expectingSet = NULL;

        	            goto ruleprimitive_typeEx;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bts= sep::TypeManager::BOOLEAN;
        	             
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3505:4: ( 'integer' | 'int' ) (bfs= bit_field_size )?
        	    {
        	        if ( ((LA(1) >= 309) && (LA(1) <= 310)) )
        	        {
        	            CONSUME();
        	            PERRORRECOVERY=ANTLR3_FALSE;
        	            FAILEDFLAG=ANTLR3_FALSE;

        	        }
        	        else
        	        {
        	            if (BACKTRACKING>0)
        	            {
        	                FAILEDFLAG = ANTLR3_TRUE;
        	                return bts;
        	            }

        	            CONSTRUCTEX();
        	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
        	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
        	            EXCEPTION->expectingSet = NULL;

        	            goto ruleprimitive_typeEx;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bts= sep::TypeManager::INTEGER;
        	             
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3506:4: (bfs= bit_field_size )?
        	        {
        	            int alt303=2;
        	            switch ( LA(1) )
        	            {
        	                case COLON:
        	                	{
        	                		{
        	                		    int LA303_1 = LA(2);
        	                		    if ( (synpred514_fml(ctx)))
        	                		    {
        	                		        alt303=1;
        	                		    }
        	                		}
        	                	}
        	                    break;
        	                case LT_:
        	                	{
        	                		alt303=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt303)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3506:6: bfs= bit_field_size
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_bit_field_size_in_primitive_type10755);
        	        	        bfs=bit_field_size(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruleprimitive_typeEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return bts;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             bts= sep::TypeManager::getTypeInteger( 
        	        	            bfs
        	        	             );
        	        	             
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3510:4: ( 'uinteger' | 'uint' ) (bfs= bit_field_size )?
        	    {
        	        if ( ((LA(1) >= 401) && (LA(1) <= 402)) )
        	        {
        	            CONSUME();
        	            PERRORRECOVERY=ANTLR3_FALSE;
        	            FAILEDFLAG=ANTLR3_FALSE;

        	        }
        	        else
        	        {
        	            if (BACKTRACKING>0)
        	            {
        	                FAILEDFLAG = ANTLR3_TRUE;
        	                return bts;
        	            }

        	            CONSTRUCTEX();
        	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
        	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
        	            EXCEPTION->expectingSet = NULL;

        	            goto ruleprimitive_typeEx;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bts= sep::TypeManager::UINTEGER;
        	             
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3511:4: (bfs= bit_field_size )?
        	        {
        	            int alt304=2;
        	            switch ( LA(1) )
        	            {
        	                case COLON:
        	                	{
        	                		{
        	                		    int LA304_1 = LA(2);
        	                		    if ( (synpred517_fml(ctx)))
        	                		    {
        	                		        alt304=1;
        	                		    }
        	                		}
        	                	}
        	                    break;
        	                case LT_:
        	                	{
        	                		alt304=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt304)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3511:6: bfs= bit_field_size
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_bit_field_size_in_primitive_type10794);
        	        	        bfs=bit_field_size(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruleprimitive_typeEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return bts;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             bts= sep::TypeManager::getTypeUInteger( 
        	        	            bfs
        	        	             );
        	        	             
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	    }
        	    break;
        	case 4:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3515:4: ( 'pos_integer' | 'pos_int' ) (bfs= bit_field_size )?
        	    {
        	        if ( ((LA(1) >= 345) && (LA(1) <= 346)) )
        	        {
        	            CONSUME();
        	            PERRORRECOVERY=ANTLR3_FALSE;
        	            FAILEDFLAG=ANTLR3_FALSE;

        	        }
        	        else
        	        {
        	            if (BACKTRACKING>0)
        	            {
        	                FAILEDFLAG = ANTLR3_TRUE;
        	                return bts;
        	            }

        	            CONSTRUCTEX();
        	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
        	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
        	            EXCEPTION->expectingSet = NULL;

        	            goto ruleprimitive_typeEx;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bts= sep::TypeManager::POS_INTEGER;
        	             
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3516:4: (bfs= bit_field_size )?
        	        {
        	            int alt305=2;
        	            switch ( LA(1) )
        	            {
        	                case COLON:
        	                	{
        	                		{
        	                		    int LA305_1 = LA(2);
        	                		    if ( (synpred520_fml(ctx)))
        	                		    {
        	                		        alt305=1;
        	                		    }
        	                		}
        	                	}
        	                    break;
        	                case LT_:
        	                	{
        	                		alt305=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt305)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3516:6: bfs= bit_field_size
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_bit_field_size_in_primitive_type10831);
        	        	        bfs=bit_field_size(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruleprimitive_typeEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return bts;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             bts= sep::TypeManager::getTypePosInteger( 
        	        	            bfs
        	        	             );
        	        	             
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	    }
        	    break;
        	case 5:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3521:4: ( ( 'rational' | 'rat' ) | ( 'urational' | 'urat' ) | 'float' | 'ufloat' | 'double' | 'udouble' | 'real' | 'ureal' ) (bfs= bit_field_size )?
        	    {
        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3521:4: ( ( 'rational' | 'rat' ) | ( 'urational' | 'urat' ) | 'float' | 'ufloat' | 'double' | 'udouble' | 'real' | 'ureal' )
        	        {
        	            int alt306=8;
        	            switch ( LA(1) )
        	            {
        	            case 357:
        	            case 358:
        	            	{
        	            		alt306=1;
        	            	}
        	                break;
        	            case 407:
        	            case 408:
        	            	{
        	            		alt306=2;
        	            	}
        	                break;
        	            case 283:
        	            	{
        	            		alt306=3;
        	            	}
        	                break;
        	            case 400:
        	            	{
        	            		alt306=4;
        	            	}
        	                break;
        	            case 270:
        	            	{
        	            		alt306=5;
        	            	}
        	                break;
        	            case 399:
        	            	{
        	            		alt306=6;
        	            	}
        	                break;
        	            case 360:
        	            	{
        	            		alt306=7;
        	            	}
        	                break;
        	            case 409:
        	            	{
        	            		alt306=8;
        	            	}
        	                break;

        	            default:
        	                if (BACKTRACKING>0)
        	                {
        	                    FAILEDFLAG = ANTLR3_TRUE;
        	                    return bts;
        	                }

        	                CONSTRUCTEX();
        	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
        	                EXCEPTION->message      = (void *)"";
        	                EXCEPTION->decisionNum  = 306;
        	                EXCEPTION->state        = 0;


        	                goto ruleprimitive_typeEx;

        	            }

        	            switch (alt306)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3521:6: ( 'rational' | 'rat' )
        	        	    {
        	        	        if ( ((LA(1) >= 357) && (LA(1) <= 358)) )
        	        	        {
        	        	            CONSUME();
        	        	            PERRORRECOVERY=ANTLR3_FALSE;
        	        	            FAILEDFLAG=ANTLR3_FALSE;

        	        	        }
        	        	        else
        	        	        {
        	        	            if (BACKTRACKING>0)
        	        	            {
        	        	                FAILEDFLAG = ANTLR3_TRUE;
        	        	                return bts;
        	        	            }

        	        	            CONSTRUCTEX();
        	        	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
        	        	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
        	        	            EXCEPTION->expectingSet = NULL;

        	        	            goto ruleprimitive_typeEx;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             bts= sep::TypeManager::RATIONAL;
        	        	             
        	        	        }


        	        	    }
        	        	    break;
        	        	case 2:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3522:6: ( 'urational' | 'urat' )
        	        	    {
        	        	        if ( ((LA(1) >= 407) && (LA(1) <= 408)) )
        	        	        {
        	        	            CONSUME();
        	        	            PERRORRECOVERY=ANTLR3_FALSE;
        	        	            FAILEDFLAG=ANTLR3_FALSE;

        	        	        }
        	        	        else
        	        	        {
        	        	            if (BACKTRACKING>0)
        	        	            {
        	        	                FAILEDFLAG = ANTLR3_TRUE;
        	        	                return bts;
        	        	            }

        	        	            CONSTRUCTEX();
        	        	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
        	        	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
        	        	            EXCEPTION->expectingSet = NULL;

        	        	            goto ruleprimitive_typeEx;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             bts= sep::TypeManager::URATIONAL;
        	        	             
        	        	        }


        	        	    }
        	        	    break;
        	        	case 3:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3524:6: 'float'
        	        	    {
        	        	         MATCHT(283, &FOLLOW_283_in_primitive_type10890);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruleprimitive_typeEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return bts;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             bts= sep::TypeManager::FLOAT;
        	        	             
        	        	        }


        	        	    }
        	        	    break;
        	        	case 4:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3525:6: 'ufloat'
        	        	    {
        	        	         MATCHT(400, &FOLLOW_400_in_primitive_type10902);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruleprimitive_typeEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return bts;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             bts= sep::TypeManager::UFLOAT;
        	        	             
        	        	        }


        	        	    }
        	        	    break;
        	        	case 5:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3527:6: 'double'
        	        	    {
        	        	         MATCHT(270, &FOLLOW_270_in_primitive_type10914);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruleprimitive_typeEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return bts;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             bts= sep::TypeManager::DOUBLE;
        	        	             
        	        	        }


        	        	    }
        	        	    break;
        	        	case 6:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3528:6: 'udouble'
        	        	    {
        	        	         MATCHT(399, &FOLLOW_399_in_primitive_type10925);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruleprimitive_typeEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return bts;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             bts= sep::TypeManager::UDOUBLE;
        	        	             
        	        	        }


        	        	    }
        	        	    break;
        	        	case 7:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3530:6: 'real'
        	        	    {
        	        	         MATCHT(360, &FOLLOW_360_in_primitive_type10936);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruleprimitive_typeEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return bts;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             bts= sep::TypeManager::REAL;
        	        	             
        	        	        }


        	        	    }
        	        	    break;
        	        	case 8:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3531:6: 'ureal'
        	        	    {
        	        	         MATCHT(409, &FOLLOW_409_in_primitive_type10949);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruleprimitive_typeEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return bts;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             bts= sep::TypeManager::UREAL;
        	        	             
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3533:4: (bfs= bit_field_size )?
        	        {
        	            int alt307=2;
        	            switch ( LA(1) )
        	            {
        	                case COLON:
        	                	{
        	                		{
        	                		    int LA307_1 = LA(2);
        	                		    if ( (synpred531_fml(ctx)))
        	                		    {
        	                		        alt307=1;
        	                		    }
        	                		}
        	                	}
        	                    break;
        	                case LT_:
        	                	{
        	                		alt307=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt307)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3533:6: bfs= bit_field_size
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_bit_field_size_in_primitive_type10968);
        	        	        bfs=bit_field_size(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruleprimitive_typeEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return bts;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {

        	        	            	  	bts= sep::TypeManager::newNumericTypeSpecifier(
        	        	            	  			
        	        	            bts
        	        	            , bfs
        	        	            , sep::ExpressionConstant::INTEGER_ZERO);

        	        	            	  
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	    }
        	    break;
        	case 6:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3541:4: ct= time_clock_type
        	    {
        	        FOLLOWPUSH(FOLLOW_time_clock_type_in_primitive_type10988);
        	        ct=time_clock_type(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleprimitive_typeEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bts;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bts= 
        	            ct
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 7:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3543:4: tt= time_type
        	    {
        	        FOLLOWPUSH(FOLLOW_time_type_in_primitive_type10998);
        	        tt=time_type(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleprimitive_typeEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bts;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bts= 
        	            tt
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 8:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3545:4: 'char' (bfs= bit_field_size )?
        	    {
        	         MATCHT(254, &FOLLOW_254_in_primitive_type11006);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleprimitive_typeEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bts;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bts= sep::TypeManager::CHAR;
        	             
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3546:4: (bfs= bit_field_size )?
        	        {
        	            int alt308=2;
        	            switch ( LA(1) )
        	            {
        	                case COLON:
        	                	{
        	                		{
        	                		    int LA308_1 = LA(2);
        	                		    if ( (synpred535_fml(ctx)))
        	                		    {
        	                		        alt308=1;
        	                		    }
        	                		}
        	                	}
        	                    break;
        	                case LT_:
        	                	{
        	                		alt308=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt308)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3546:6: bfs= bit_field_size
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_bit_field_size_in_primitive_type11020);
        	        	        bfs=bit_field_size(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruleprimitive_typeEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return bts;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             bts= sep::TypeManager::newCharacter( "char", 
        	        	            bfs
        	        	             );
        	        	             
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	    }
        	    break;
        	case 9:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3550:4: 'character' (bfs= bit_field_size )?
        	    {
        	         MATCHT(255, &FOLLOW_255_in_primitive_type11037);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleprimitive_typeEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bts;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bts= sep::TypeManager::CHARACTER;
        	             
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3551:4: (bfs= bit_field_size )?
        	        {
        	            int alt309=2;
        	            switch ( LA(1) )
        	            {
        	                case COLON:
        	                	{
        	                		{
        	                		    int LA309_1 = LA(2);
        	                		    if ( (synpred537_fml(ctx)))
        	                		    {
        	                		        alt309=1;
        	                		    }
        	                		}
        	                	}
        	                    break;
        	                case LT_:
        	                	{
        	                		alt309=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt309)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3551:6: bfs= bit_field_size
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_bit_field_size_in_primitive_type11051);
        	        	        bfs=bit_field_size(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruleprimitive_typeEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return bts;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             bts= sep::TypeManager::newCharacter( "character", 
        	        	            bfs
        	        	             );
        	        	             
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	    }
        	    break;
        	case 10:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3555:4: 'string' (sfs= string_field_size )?
        	    {
        	         MATCHT(387, &FOLLOW_387_in_primitive_type11068);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleprimitive_typeEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bts;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bts= sep::TypeManager::STRING;
        	             
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3556:4: (sfs= string_field_size )?
        	        {
        	            int alt310=2;
        	            switch ( LA(1) )
        	            {
        	                case COLON:
        	                	{
        	                		{
        	                		    int LA310_1 = LA(2);
        	                		    if ( (synpred539_fml(ctx)))
        	                		    {
        	                		        alt310=1;
        	                		    }
        	                		}
        	                	}
        	                    break;
        	                case LT_:
        	                	{
        	                		alt310=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt310)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3556:6: sfs= string_field_size
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_string_field_size_in_primitive_type11080);
        	        	        sfs=string_field_size(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruleprimitive_typeEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return bts;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             bts= sep::TypeManager::newString( 
        	        	            sfs.min
        	        	             , sfs.max
        	        	             );
        	        	             
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	    }
        	    break;
        	case 11:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3561:4: 'operator'
        	    {
        	         MATCHT(333, &FOLLOW_333_in_primitive_type11098);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleprimitive_typeEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bts;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bts= sep::TypeManager::OPERATOR;
        	               
        	        }


        	    }
        	    break;
        	case 12:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3562:4: 'avmcode'
        	    {
        	         MATCHT(242, &FOLLOW_242_in_primitive_type11107);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleprimitive_typeEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bts;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bts= sep::TypeManager::AVMCODE;
        	                
        	        }


        	    }
        	    break;
        	case 13:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3564:4: 'port'
        	    {
        	         MATCHT(344, &FOLLOW_344_in_primitive_type11118);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleprimitive_typeEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bts;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bts= sep::TypeManager::PORT;
        	                   
        	        }


        	    }
        	    break;
        	case 14:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3565:4: 'buffer'
        	    {
        	         MATCHT(249, &FOLLOW_249_in_primitive_type11131);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleprimitive_typeEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bts;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bts= sep::TypeManager::BUFFER;
        	                 
        	        }


        	    }
        	    break;
        	case 15:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3566:4: 'message'
        	    {
        	         MATCHT(320, &FOLLOW_320_in_primitive_type11142);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleprimitive_typeEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bts;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bts= sep::TypeManager::MESSAGE;
        	                
        	        }


        	    }
        	    break;
        	case 16:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3567:4: 'signal'
        	    {
        	         MATCHT(374, &FOLLOW_374_in_primitive_type11152);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleprimitive_typeEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bts;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bts= sep::TypeManager::SIGNAL;
        	                 
        	        }


        	    }
        	    break;
        	case 17:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3568:4: 'connector'
        	    {
        	         MATCHT(261, &FOLLOW_261_in_primitive_type11163);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleprimitive_typeEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bts;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bts= sep::TypeManager::CONNECTOR;
        	             
        	        }


        	    }
        	    break;
        	case 18:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3570:4: 'machine' ( LT_ id= qualifiedNameID GT )?
        	    {
        	         MATCHT(317, &FOLLOW_317_in_primitive_type11172);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleprimitive_typeEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bts;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bts= sep::TypeManager::MACHINE;
        	                
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3571:4: ( LT_ id= qualifiedNameID GT )?
        	        {
        	            int alt311=2;
        	            switch ( LA(1) )
        	            {
        	                case LT_:
        	                	{
        	                		alt311=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt311)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3571:6: LT_ id= qualifiedNameID GT
        	        	    {
        	        	         MATCHT(LT_, &FOLLOW_LT__in_primitive_type11184);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruleprimitive_typeEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return bts;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_qualifiedNameID_in_primitive_type11189);
        	        	        id=qualifiedNameID(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruleprimitive_typeEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return bts;
        	        	        }


        	        	         MATCHT(GT, &FOLLOW_GT_in_primitive_type11192);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruleprimitive_typeEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return bts;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {

        	        	            	  	sep::BF machineT =
        	        	            	  			sep::ParserUtil::getExecutableMachine(id.s
        	        	            , id.nb
        	        	            );
        	        	            	  
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	    }
        	    break;
        	case 19:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3578:4: 'universal'
        	    {
        	         MATCHT(405, &FOLLOW_405_in_primitive_type11209);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleprimitive_typeEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bts;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bts= sep::TypeManager::UNIVERSAL;
        	             
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruleprimitive_typeEx; /* Prevent compiler warnings */
    ruleprimitive_typeEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(125, primitive_type_StartIndex); }

    return bts;
}
/* $ANTLR end primitive_type */

/**
 * $ANTLR start bit_field_size
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3582:1: bit_field_size returns [ int size ] : ( COLON n= integer_constant | LT_ ( 'size:' )? n= integer_constant GT );
 */
static int
bit_field_size(pfmlParser ctx)
{
    int size;

    ANTLR3_UINT32 bit_field_size_StartIndex;

    sep::avm_size_t n;
    #undef	RETURN_TYPE_n
    #define	RETURN_TYPE_n sep::avm_size_t

    /* Initialize rule variables
     */
    bit_field_size_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(126)) )
    {
        {
        }



        return size;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3584:2: ( COLON n= integer_constant | LT_ ( 'size:' )? n= integer_constant GT )

            ANTLR3_UINT32 alt314;

            alt314=2;

            switch ( LA(1) )
            {
            case COLON:
            	{
            		alt314=1;
            	}
                break;
            case LT_:
            	{
            		alt314=2;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return size;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 314;
                EXCEPTION->state        = 0;


                goto rulebit_field_sizeEx;

            }

            switch (alt314)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3584:4: COLON n= integer_constant
        	    {
        	         MATCHT(COLON, &FOLLOW_COLON_in_bit_field_size11228);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulebit_field_sizeEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return size;
        	        }


        	        FOLLOWPUSH(FOLLOW_integer_constant_in_bit_field_size11233);
        	        n=integer_constant(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulebit_field_sizeEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return size;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             size = n
        	            ; 
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3585:4: LT_ ( 'size:' )? n= integer_constant GT
        	    {
        	         MATCHT(LT_, &FOLLOW_LT__in_bit_field_size11257);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulebit_field_sizeEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return size;
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3585:9: ( 'size:' )?
        	        {
        	            int alt313=2;
        	            switch ( LA(1) )
        	            {
        	                case 375:
        	                	{
        	                		alt313=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt313)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3585:11: 'size:'
        	        	    {
        	        	         MATCHT(375, &FOLLOW_375_in_bit_field_size11262);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulebit_field_sizeEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return size;
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	        FOLLOWPUSH(FOLLOW_integer_constant_in_bit_field_size11270);
        	        n=integer_constant(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulebit_field_sizeEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return size;
        	        }


        	         MATCHT(GT, &FOLLOW_GT_in_bit_field_size11273);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulebit_field_sizeEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return size;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             size = n
        	            ; 
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto rulebit_field_sizeEx; /* Prevent compiler warnings */
    rulebit_field_sizeEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(126, bit_field_size_StartIndex); }

    return size;
}
/* $ANTLR end bit_field_size */

/**
 * $ANTLR start string_field_size
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3589:1: string_field_size returns [ int min=0 , int max=-1 ] : ( COLON rc= range_constant | LT_ ( 'size:' )? rc= range_constant GT );
 */
static fmlParser_string_field_size_return
string_field_size(pfmlParser ctx)
{
    fmlParser_string_field_size_return retval;

    ANTLR3_UINT32 string_field_size_StartIndex;

    fmlParser_range_constant_return rc;
    #undef	RETURN_TYPE_rc
    #define	RETURN_TYPE_rc fmlParser_range_constant_return

    /* Initialize rule variables
     */
    retval.min = 0;
    retval.max = -1;

    string_field_size_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(127)) )
    {
    	retval.start = 0;

        {
        }



        return retval;
    }

    retval.start = LT(1); retval.stop = retval.start;


    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3591:2: ( COLON rc= range_constant | LT_ ( 'size:' )? rc= range_constant GT )

            ANTLR3_UINT32 alt316;

            alt316=2;

            switch ( LA(1) )
            {
            case COLON:
            	{
            		alt316=1;
            	}
                break;
            case LT_:
            	{
            		alt316=2;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return retval;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 316;
                EXCEPTION->state        = 0;


                goto rulestring_field_sizeEx;

            }

            switch (alt316)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3591:4: COLON rc= range_constant
        	    {
        	         MATCHT(COLON, &FOLLOW_COLON_in_string_field_size11292);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestring_field_sizeEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return retval;
        	        }


        	        FOLLOWPUSH(FOLLOW_range_constant_in_string_field_size11296);
        	        rc=range_constant(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestring_field_sizeEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return retval;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             retval.min= 
        	            rc.min
        	            ;
        	             retval.max= 
        	            rc.max
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3594:4: LT_ ( 'size:' )? rc= range_constant GT
        	    {
        	         MATCHT(LT_, &FOLLOW_LT__in_string_field_size11307);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestring_field_sizeEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return retval;
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3594:9: ( 'size:' )?
        	        {
        	            int alt315=2;
        	            switch ( LA(1) )
        	            {
        	                case 375:
        	                	{
        	                		alt315=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt315)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3594:11: 'size:'
        	        	    {
        	        	         MATCHT(375, &FOLLOW_375_in_string_field_size11312);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestring_field_sizeEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return retval;
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	        FOLLOWPUSH(FOLLOW_range_constant_in_string_field_size11320);
        	        rc=range_constant(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestring_field_sizeEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return retval;
        	        }


        	         MATCHT(GT, &FOLLOW_GT_in_string_field_size11323);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestring_field_sizeEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return retval;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             retval.min= 
        	            rc.min
        	            ;
        	             retval.max= 
        	            rc.max
        	            ;
        	             
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto rulestring_field_sizeEx; /* Prevent compiler warnings */
    rulestring_field_sizeEx: ;
    retval.stop = LT(-1);


            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(127, string_field_size_StartIndex); }

    return retval;
}
/* $ANTLR end string_field_size */

/**
 * $ANTLR start range_constant
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3598:1: range_constant returns [ int min=0 , int max=-1 ] : n= integer_constant ( ( COMMA | DOTDOT ) n= integer_constant )? ;
 */
static fmlParser_range_constant_return
range_constant(pfmlParser ctx)
{
    fmlParser_range_constant_return retval;

    ANTLR3_UINT32 range_constant_StartIndex;

    sep::avm_size_t n;
    #undef	RETURN_TYPE_n
    #define	RETURN_TYPE_n sep::avm_size_t

    /* Initialize rule variables
     */
    retval.min = 0;
    retval.max = -1;

    range_constant_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(128)) )
    {
    	retval.start = 0;

        {
        }



        return retval;
    }

    retval.start = LT(1); retval.stop = retval.start;


    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3600:2: (n= integer_constant ( ( COMMA | DOTDOT ) n= integer_constant )? )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3600:4: n= integer_constant ( ( COMMA | DOTDOT ) n= integer_constant )?
        {
            FOLLOWPUSH(FOLLOW_integer_constant_in_range_constant11345);
            n=integer_constant(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto rulerange_constantEx;
            }
            if (HASFAILED())
            {
                return retval;
            }


            if ( BACKTRACKING==0 )
            {
                 retval.max= 
                n
                ;
                 
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3601:4: ( ( COMMA | DOTDOT ) n= integer_constant )?
            {
                int alt317=2;
                switch ( LA(1) )
                {
                    case COMMA:
                    	{
                    		{
                    		    int LA317_1 = LA(2);
                    		    if ( (synpred555_fml(ctx)))
                    		    {
                    		        alt317=1;
                    		    }
                    		}
                    	}
                        break;
                    case DOTDOT:
                    	{
                    		alt317=1;
                    	}
                        break;
                }

                switch (alt317)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3601:6: ( COMMA | DOTDOT ) n= integer_constant
            	    {
            	        if ( LA(1) == COMMA || LA(1) == DOTDOT )
            	        {
            	            CONSUME();
            	            PERRORRECOVERY=ANTLR3_FALSE;
            	            FAILEDFLAG=ANTLR3_FALSE;

            	        }
            	        else
            	        {
            	            if (BACKTRACKING>0)
            	            {
            	                FAILEDFLAG = ANTLR3_TRUE;
            	                return retval;
            	            }

            	            CONSTRUCTEX();
            	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
            	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
            	            EXCEPTION->expectingSet = NULL;

            	            goto rulerange_constantEx;
            	        }


            	        FOLLOWPUSH(FOLLOW_integer_constant_in_range_constant11374);
            	        n=integer_constant(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulerange_constantEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return retval;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             retval.min= 
            	            retval.max
            	            ;
            	             retval.max= 
            	            n
            	            ;
            	             
            	        }


            	    }
            	    break;

                }
            }

        }

    }

    // This is where rules clean up and exit
    //
    goto rulerange_constantEx; /* Prevent compiler warnings */
    rulerange_constantEx: ;
    retval.stop = LT(-1);


            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(128, range_constant_StartIndex); }

    return retval;
}
/* $ANTLR end range_constant */

/**
 * $ANTLR start on_write_var_routine_def
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3606:1: on_write_var_routine_def[ sep::Variable * var ] : LCURLY ( var_routine_def[ var ] )+ RCURLY ;
 */
static void
on_write_var_routine_def(pfmlParser ctx, sep::Variable * var)
{
    ANTLR3_UINT32 on_write_var_routine_def_StartIndex;

    /* Initialize rule variables
     */
    on_write_var_routine_def_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(129)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3607:2: ( LCURLY ( var_routine_def[ var ] )+ RCURLY )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3607:4: LCURLY ( var_routine_def[ var ] )+ RCURLY
        {
             MATCHT(LCURLY, &FOLLOW_LCURLY_in_on_write_var_routine_def11396);
            if  (HASEXCEPTION())
            {
                goto ruleon_write_var_routine_defEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3607:12: ( var_routine_def[ var ] )+
            {
                int cnt318=0;

                for (;;)
                {
                    int alt318=2;
            	switch ( LA(1) )
            	{
            	case 205:
            		{
            			alt318=1;
            		}
            	    break;

            	}

            	switch (alt318)
            	{
            	    case 1:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3607:14: var_routine_def[ var ]
            	        {
            	            FOLLOWPUSH(FOLLOW_var_routine_def_in_on_write_var_routine_def11401);
            	            var_routine_def(ctx, var);

            	            FOLLOWPOP();
            	            if  (HASEXCEPTION())
            	            {
            	                goto ruleon_write_var_routine_defEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return ;
            	            }


            	        }
            	        break;

            	    default:

            		if ( cnt318 >= 1 )
            		{
            		    goto loop318;
            		}
            		if (BACKTRACKING>0)
            		{
            		    FAILEDFLAG = ANTLR3_TRUE;
            		    return ;
            		}

            		/* mismatchedSetEx()
            		 */
            		CONSTRUCTEX();
            		EXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
            		EXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;


            		goto ruleon_write_var_routine_defEx;
            	}
            	cnt318++;
                }
                loop318: ;	/* Jump to here if this rule does not match */
            }

             MATCHT(RCURLY, &FOLLOW_RCURLY_in_on_write_var_routine_def11407);
            if  (HASEXCEPTION())
            {
                goto ruleon_write_var_routine_defEx;
            }
            if (HASFAILED())
            {
                return ;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruleon_write_var_routine_defEx; /* Prevent compiler warnings */
    ruleon_write_var_routine_defEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(129, on_write_var_routine_def_StartIndex); }

    return ;
}
/* $ANTLR end on_write_var_routine_def */

/**
 * $ANTLR start var_routine_def
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3611:1: var_routine_def[ sep::Variable * var ] : '@on_write' ( routine_single_param[*onWriteRoutine, var->getType()] )? (bs= block_statement | '|=>' ce= conditionalExpression SEMI ) ;
 */
static void
var_routine_def(pfmlParser ctx, sep::Variable * var)
{
    ANTLR3_UINT32 var_routine_def_StartIndex;

    sep::BFCode bs;
    #undef	RETURN_TYPE_bs
    #define	RETURN_TYPE_bs sep::BFCode

    sep::BF ce;
    #undef	RETURN_TYPE_ce
    #define	RETURN_TYPE_ce sep::BF

    /* Initialize rule variables
     */
    var_routine_def_StartIndex = INDEX();



    	sep::Routine * onWriteRoutine = NULL;

    	sep::BehavioralPart * aBehavioralpart = var->getUniqContainerOfRoutines();

    	SAVE_RULE_BEGIN_LOCATION;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(130)) )
    {
        {

            	SET_RULE_LOCATION( onWriteRoutine );

        }
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3622:2: ( '@on_write' ( routine_single_param[*onWriteRoutine, var->getType()] )? (bs= block_statement | '|=>' ce= conditionalExpression SEMI ) )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3622:4: '@on_write' ( routine_single_param[*onWriteRoutine, var->getType()] )? (bs= block_statement | '|=>' ce= conditionalExpression SEMI )
        {
             MATCHT(205, &FOLLOW_205_in_var_routine_def11429);
            if  (HASEXCEPTION())
            {
                goto rulevar_routine_defEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            if ( BACKTRACKING==0 )
            {

                	  	onWriteRoutine = new sep::Routine(var, "on_write");
                	  	var->setOnWriteRoutine(onWriteRoutine);
                	  	if( aBehavioralpart != NULL )
                	  	{
                	  		aBehavioralpart->saveAnonymousInnerRoutine(onWriteRoutine);
                	  	}
                	  
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3631:4: ( routine_single_param[*onWriteRoutine, var->getType()] )?
            {
                int alt319=2;
                switch ( LA(1) )
                {
                    case LPAREN:
                    	{
                    		alt319=1;
                    	}
                        break;
                }

                switch (alt319)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3631:6: routine_single_param[*onWriteRoutine, var->getType()]
            	    {
            	        FOLLOWPUSH(FOLLOW_routine_single_param_in_var_routine_def11441);
            	        routine_single_param(ctx, *onWriteRoutine, var->getType());

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulevar_routine_defEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3632:4: (bs= block_statement | '|=>' ce= conditionalExpression SEMI )
            {
                int alt320=2;
                switch ( LA(1) )
                {
                case LCURLY:
                	{
                		alt320=1;
                	}
                    break;
                case 417:
                	{
                		alt320=2;
                	}
                    break;

                default:
                    if (BACKTRACKING>0)
                    {
                        FAILEDFLAG = ANTLR3_TRUE;
                        return ;
                    }

                    CONSTRUCTEX();
                    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                    EXCEPTION->message      = (void *)"";
                    EXCEPTION->decisionNum  = 320;
                    EXCEPTION->state        = 0;


                    goto rulevar_routine_defEx;

                }

                switch (alt320)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3632:6: bs= block_statement
            	    {
            	        FOLLOWPUSH(FOLLOW_block_statement_in_var_routine_def11454);
            	        bs=block_statement(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulevar_routine_defEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             onWriteRoutine->setCode(bs
            	            ); 
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3633:6: '|=>' ce= conditionalExpression SEMI
            	    {
            	         MATCHT(417, &FOLLOW_417_in_var_routine_def11464);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulevar_routine_defEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        FOLLOWPUSH(FOLLOW_conditionalExpression_in_var_routine_def11468);
            	        ce=conditionalExpression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulevar_routine_defEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	         MATCHT(SEMI, &FOLLOW_SEMI_in_var_routine_def11470);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulevar_routine_defEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             onWriteRoutine->setCode( NEW_STMT1(OP(GUARD), ce
            	            ) ); 
            	        }


            	    }
            	    break;

                }
            }

        }

    }

    // This is where rules clean up and exit
    //
    goto rulevar_routine_defEx; /* Prevent compiler warnings */
    rulevar_routine_defEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
            else
            {
                {

                    	SET_RULE_LOCATION( onWriteRoutine );

                }
            }


    if ( BACKTRACKING>0 ) { MEMOIZE(130, var_routine_def_StartIndex); }

    return ;
}
/* $ANTLR end var_routine_def */

/**
 * $ANTLR start routine_single_param
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3638:1: routine_single_param[ sep::Routine & routine , const sep::BF & dftType ] : LPAREN ( ( type_var ID )=>tv= type_var id= ID |id= ID ) (iv= initial_value )? RPAREN ;
 */
static void
routine_single_param(pfmlParser ctx, sep::Routine & routine, const sep::BF & dftType)
{
    ANTLR3_UINT32 routine_single_param_StartIndex;

    pANTLR3_COMMON_TOKEN    id;
    sep::BF tv;
    #undef	RETURN_TYPE_tv
    #define	RETURN_TYPE_tv sep::BF

    sep::BF iv;
    #undef	RETURN_TYPE_iv
    #define	RETURN_TYPE_iv sep::BF

    /* Initialize rule variables
     */
    routine_single_param_StartIndex = INDEX();



    	sep::BF paramT = dftType;
    	sep::BF value;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(131)) )
    {
        {
        }



        return ;
    }

    id       = NULL;

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3644:2: ( LPAREN ( ( type_var ID )=>tv= type_var id= ID |id= ID ) (iv= initial_value )? RPAREN )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3644:4: LPAREN ( ( type_var ID )=>tv= type_var id= ID |id= ID ) (iv= initial_value )? RPAREN
        {
             MATCHT(LPAREN, &FOLLOW_LPAREN_in_routine_single_param11498);
            if  (HASEXCEPTION())
            {
                goto ruleroutine_single_paramEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3645:4: ( ( type_var ID )=>tv= type_var id= ID |id= ID )
            {
                int alt321=2;
                {
                    int LA321_0 = LA(1);
                    if ( (synpred559_fml(ctx)) && (((LA321_0 >= 245) && (LA321_0 <= 246))))
                    {
                        alt321=1;
                    }
                    else if ( (synpred559_fml(ctx)) && (((LA321_0 >= 309) && (LA321_0 <= 310))))
                    {
                        alt321=1;
                    }
                    else if ( (synpred559_fml(ctx)) && (((LA321_0 >= 401) && (LA321_0 <= 402))))
                    {
                        alt321=1;
                    }
                    else if ( (synpred559_fml(ctx)) && (((LA321_0 >= 345) && (LA321_0 <= 346))))
                    {
                        alt321=1;
                    }
                    else if ( (synpred559_fml(ctx)) && (((LA321_0 >= 357) && (LA321_0 <= 358))))
                    {
                        alt321=1;
                    }
                    else if ( (synpred559_fml(ctx)) && (((LA321_0 >= 407) && (LA321_0 <= 408))))
                    {
                        alt321=1;
                    }
                    else if ( (synpred559_fml(ctx)) && (LA321_0 == 283))
                    {
                        alt321=1;
                    }
                    else if ( (synpred559_fml(ctx)) && (LA321_0 == 400))
                    {
                        alt321=1;
                    }
                    else if ( (synpred559_fml(ctx)) && (LA321_0 == 270))
                    {
                        alt321=1;
                    }
                    else if ( (synpred559_fml(ctx)) && (LA321_0 == 399))
                    {
                        alt321=1;
                    }
                    else if ( (synpred559_fml(ctx)) && (LA321_0 == 360))
                    {
                        alt321=1;
                    }
                    else if ( (synpred559_fml(ctx)) && (LA321_0 == 409))
                    {
                        alt321=1;
                    }
                    else if ( (synpred559_fml(ctx)) && (LA321_0 == 259))
                    {
                        alt321=1;
                    }
                    else if ( (synpred559_fml(ctx)) && (LA321_0 == 392))
                    {
                        alt321=1;
                    }
                    else if ( (synpred559_fml(ctx)) && (LA321_0 == 264))
                    {
                        alt321=1;
                    }
                    else if ( (synpred559_fml(ctx)) && (LA321_0 == 271))
                    {
                        alt321=1;
                    }
                    else if ( (synpred559_fml(ctx)) && (LA321_0 == 254))
                    {
                        alt321=1;
                    }
                    else if ( (synpred559_fml(ctx)) && (LA321_0 == 255))
                    {
                        alt321=1;
                    }
                    else if ( (synpred559_fml(ctx)) && (LA321_0 == 387))
                    {
                        alt321=1;
                    }
                    else if ( (synpred559_fml(ctx)) && (LA321_0 == 333))
                    {
                        alt321=1;
                    }
                    else if ( (synpred559_fml(ctx)) && (LA321_0 == 242))
                    {
                        alt321=1;
                    }
                    else if ( (synpred559_fml(ctx)) && (LA321_0 == 344))
                    {
                        alt321=1;
                    }
                    else if ( (synpred559_fml(ctx)) && (LA321_0 == 249))
                    {
                        alt321=1;
                    }
                    else if ( (synpred559_fml(ctx)) && (LA321_0 == 320))
                    {
                        alt321=1;
                    }
                    else if ( (synpred559_fml(ctx)) && (LA321_0 == 374))
                    {
                        alt321=1;
                    }
                    else if ( (synpred559_fml(ctx)) && (LA321_0 == 261))
                    {
                        alt321=1;
                    }
                    else if ( (synpred559_fml(ctx)) && (LA321_0 == 317))
                    {
                        alt321=1;
                    }
                    else if ( (synpred559_fml(ctx)) && (LA321_0 == 405))
                    {
                        alt321=1;
                    }
                    else if ( (LA321_0 == ID))
                    {
                        {
                            int LA321_29 = LA(2);
                            if ( (synpred559_fml(ctx)))
                            {
                                alt321=1;
                            }
                            else if ( (ANTLR3_TRUE))
                            {
                                alt321=2;
                            }
                            else
                            {
                                if (BACKTRACKING>0)
                                {
                                    FAILEDFLAG = ANTLR3_TRUE;
                                    return ;
                                }


                                CONSTRUCTEX();
                                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                                EXCEPTION->message      = (void *)"";
                                EXCEPTION->decisionNum  = 321;
                                EXCEPTION->state        = 29;


                                goto ruleroutine_single_paramEx;

                            }
                        }
                    }
                    else if ( (synpred559_fml(ctx)) && (LA321_0 == 241))
                    {
                        alt321=1;
                    }
                    else if ( (synpred559_fml(ctx)) && (LA321_0 == 412))
                    {
                        alt321=1;
                    }
                    else if ( (synpred559_fml(ctx)) && (LA321_0 == 370))
                    {
                        alt321=1;
                    }
                    else if ( (synpred559_fml(ctx)) && (LA321_0 == 316))
                    {
                        alt321=1;
                    }
                    else if ( (synpred559_fml(ctx)) && (LA321_0 == 281))
                    {
                        alt321=1;
                    }
                    else if ( (synpred559_fml(ctx)) && (LA321_0 == 315))
                    {
                        alt321=1;
                    }
                    else if ( (synpred559_fml(ctx)) && (LA321_0 == 325))
                    {
                        alt321=1;
                    }
                    else if ( (synpred559_fml(ctx)) && (LA321_0 == 326))
                    {
                        alt321=1;
                    }
                    else if ( (synpred559_fml(ctx)) && (LA321_0 == 373))
                    {
                        alt321=1;
                    }
                    else if ( (synpred559_fml(ctx)) && (LA321_0 == 329))
                    {
                        alt321=1;
                    }
                    else if ( (synpred559_fml(ctx)) && (LA321_0 == 311))
                    {
                        alt321=1;
                    }
                    else
                    {
                        if (BACKTRACKING>0)
                        {
                            FAILEDFLAG = ANTLR3_TRUE;
                            return ;
                        }


                        CONSTRUCTEX();
                        EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                        EXCEPTION->message      = (void *)"";
                        EXCEPTION->decisionNum  = 321;
                        EXCEPTION->state        = 0;


                        goto ruleroutine_single_paramEx;

                    }
                }
                switch (alt321)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3645:6: ( type_var ID )=>tv= type_var id= ID
            	    {
            	        FOLLOWPUSH(FOLLOW_type_var_in_routine_single_param11517);
            	        tv=type_var(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleroutine_single_paramEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             paramT = tv
            	            ; 
            	        }


            	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_routine_single_param11524);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleroutine_single_paramEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3646:6: id= ID
            	    {
            	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_routine_single_param11533);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleroutine_single_paramEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3648:4: (iv= initial_value )?
            {
                int alt322=2;
                switch ( LA(1) )
                {
                    case ASSIGN:
                    case LPAREN:
                    	{
                    		alt322=1;
                    	}
                        break;
                }

                switch (alt322)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3648:6: iv= initial_value
            	    {
            	        FOLLOWPUSH(FOLLOW_initial_value_in_routine_single_param11547);
            	        iv=initial_value(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleroutine_single_paramEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             value = iv
            	            ; 
            	        }


            	    }
            	    break;

                }
            }

            if ( BACKTRACKING==0 )
            {

                	  	sep::Variable * variable;
                	  	routine.saveParameter( variable = new sep::Variable( &routine,
                	  			sep::Modifier::PROPERTY_INPUT_PARAMETER_MODIFIER,
                	  			paramT, STR((id->getText(id))->chars), value) );
                	  
            }


             MATCHT(RPAREN, &FOLLOW_RPAREN_in_routine_single_param11563);
            if  (HASEXCEPTION())
            {
                goto ruleroutine_single_paramEx;
            }
            if (HASFAILED())
            {
                return ;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruleroutine_single_paramEx; /* Prevent compiler warnings */
    ruleroutine_single_paramEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(131, routine_single_param_StartIndex); }

    return ;
}
/* $ANTLR end routine_single_param */

/**
 * $ANTLR start def_enum
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3659:1: def_enum[ sep::PropertyPart & declProperty , sep::Modifier mdfr ] : 'enum' id= ID def_enum_impl[declProperty, mdfr, STR($id.text->chars)] ;
 */
static void
def_enum(pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr)
{
    ANTLR3_UINT32 def_enum_StartIndex;

    pANTLR3_COMMON_TOKEN    id;

    /* Initialize rule variables
     */
    def_enum_StartIndex = INDEX();



    	sep::Variable * var = NULL;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(132)) )
    {
        {
        }



        return ;
    }

    id       = NULL;

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3664:2: ( 'enum' id= ID def_enum_impl[declProperty, mdfr, STR($id.text->chars)] )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3664:4: 'enum' id= ID def_enum_impl[declProperty, mdfr, STR($id.text->chars)]
        {
             MATCHT(276, &FOLLOW_276_in_def_enum11582);
            if  (HASEXCEPTION())
            {
                goto ruledef_enumEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_def_enum11587);
            if  (HASEXCEPTION())
            {
                goto ruledef_enumEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            FOLLOWPUSH(FOLLOW_def_enum_impl_in_def_enum11592);
            def_enum_impl(ctx, declProperty, mdfr, STR((id->getText(id))->chars));

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruledef_enumEx;
            }
            if (HASFAILED())
            {
                return ;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_enumEx; /* Prevent compiler warnings */
    ruledef_enumEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(132, def_enum_StartIndex); }

    return ;
}
/* $ANTLR end def_enum */

/**
 * $ANTLR start def_enum_impl
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3668:1: def_enum_impl[ sep::PropertyPart & declProperty ,\n\t\tsep::Modifier mdfr , const std::string & tid ] : LCURLY id= ID ( ASSIGN e= expression )? ( COMMA id= ID ( ASSIGN e= expression )? )* RCURLY ;
 */
static void
def_enum_impl(pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr, const std::string & tid)
{
    ANTLR3_UINT32 def_enum_impl_StartIndex;

    pANTLR3_COMMON_TOKEN    id;
    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    /* Initialize rule variables
     */
    def_enum_impl_StartIndex = INDEX();



    	sep::Variable * var = NULL;
    	sep::DataType * enumT;

    	sep::BF td( enumT = sep::DataType::newEnum(declProperty, tid) );
    	enumT->setModifier( mdfr );
    	declProperty.appendDataType( td );

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(133)) )
    {
        {
        }



        return ;
    }

    id       = NULL;

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3679:2: ( LCURLY id= ID ( ASSIGN e= expression )? ( COMMA id= ID ( ASSIGN e= expression )? )* RCURLY )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3679:4: LCURLY id= ID ( ASSIGN e= expression )? ( COMMA id= ID ( ASSIGN e= expression )? )* RCURLY
        {
             MATCHT(LCURLY, &FOLLOW_LCURLY_in_def_enum_impl11611);
            if  (HASEXCEPTION())
            {
                goto ruledef_enum_implEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_def_enum_impl11620);
            if  (HASEXCEPTION())
            {
                goto ruledef_enum_implEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            if ( BACKTRACKING==0 )
            {

                	    	enumT->saveVariable( var = new sep::Variable( enumT,
                	    			sep::Modifier::PROPERTY_UNDEFINED_MODIFIER,
                	    			sep::TypeManager::INTEGER, STR((id->getText(id))->chars) ) );
                	    
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3686:9: ( ASSIGN e= expression )?
            {
                int alt323=2;
                switch ( LA(1) )
                {
                    case ASSIGN:
                    	{
                    		alt323=1;
                    	}
                        break;
                }

                switch (alt323)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3686:11: ASSIGN e= expression
            	    {
            	         MATCHT(ASSIGN, &FOLLOW_ASSIGN_in_def_enum_impl11639);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_enum_implEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_def_enum_impl11643);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_enum_implEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             var->setValue(e
            	            ); 
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3688:6: ( COMMA id= ID ( ASSIGN e= expression )? )*

            for (;;)
            {
                int alt325=2;
                switch ( LA(1) )
                {
                case COMMA:
                	{
                		alt325=1;
                	}
                    break;

                }

                switch (alt325)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3688:8: COMMA id= ID ( ASSIGN e= expression )?
            	    {
            	         MATCHT(COMMA, &FOLLOW_COMMA_in_def_enum_impl11659);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_enum_implEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_def_enum_impl11663);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_enum_implEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {

            	            	    	enumT->saveVariable( var = new sep::Variable( enumT,
            	            	    			sep::Modifier::PROPERTY_UNDEFINED_MODIFIER,
            	            	    			sep::TypeManager::INTEGER, STR((id->getText(id))->chars) ) );
            	            	    
            	        }


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3694:9: ( ASSIGN e= expression )?
            	        {
            	            int alt324=2;
            	            switch ( LA(1) )
            	            {
            	                case ASSIGN:
            	                	{
            	                		alt324=1;
            	                	}
            	                    break;
            	            }

            	            switch (alt324)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3694:11: ASSIGN e= expression
            	        	    {
            	        	         MATCHT(ASSIGN, &FOLLOW_ASSIGN_in_def_enum_impl11682);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledef_enum_implEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	        FOLLOWPUSH(FOLLOW_expression_in_def_enum_impl11686);
            	        	        e=expression(ctx);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledef_enum_implEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             var->setValue(e
            	        	            ); 
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	    }
            	    break;

            	default:
            	    goto loop325;	/* break out of the loop */
            	    break;
                }
            }
            loop325: ; /* Jump out to here if this rule does not match */


             MATCHT(RCURLY, &FOLLOW_RCURLY_in_def_enum_impl11707);
            if  (HASEXCEPTION())
            {
                goto ruledef_enum_implEx;
            }
            if (HASFAILED())
            {
                return ;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_enum_implEx; /* Prevent compiler warnings */
    ruledef_enum_implEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(133, def_enum_impl_StartIndex); }

    return ;
}
/* $ANTLR end def_enum_impl */

/**
 * $ANTLR start def_struct
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3703:1: def_struct[ sep::PropertyPart & declProperty , sep::Modifier mdfr ] : ( 'struct' | 'class' ) id= ID def_class_structure_impl[declProperty, mdfr, STR($id.text->chars)] ;
 */
static void
def_struct(pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr)
{
    ANTLR3_UINT32 def_struct_StartIndex;

    pANTLR3_COMMON_TOKEN    id;

    /* Initialize rule variables
     */
    def_struct_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(134)) )
    {
        {
        }



        return ;
    }

    id       = NULL;

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3705:2: ( ( 'struct' | 'class' ) id= ID def_class_structure_impl[declProperty, mdfr, STR($id.text->chars)] )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3705:4: ( 'struct' | 'class' ) id= ID def_class_structure_impl[declProperty, mdfr, STR($id.text->chars)]
        {
            if ( LA(1) == 258 || LA(1) == 388 )
            {
                CONSUME();
                PERRORRECOVERY=ANTLR3_FALSE;
                FAILEDFLAG=ANTLR3_FALSE;

            }
            else
            {
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
                EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
                EXCEPTION->expectingSet = NULL;

                goto ruledef_structEx;
            }


            id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_def_struct11735);
            if  (HASEXCEPTION())
            {
                goto ruledef_structEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            FOLLOWPUSH(FOLLOW_def_class_structure_impl_in_def_struct11740);
            def_class_structure_impl(ctx, declProperty, mdfr, STR((id->getText(id))->chars));

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruledef_structEx;
            }
            if (HASFAILED())
            {
                return ;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_structEx; /* Prevent compiler warnings */
    ruledef_structEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(134, def_struct_StartIndex); }

    return ;
}
/* $ANTLR end def_struct */

/**
 * $ANTLR start def_class_structure_impl
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3709:1: def_class_structure_impl[ sep::PropertyPart & declProperty ,\n\t\tsep::Modifier mdfr , const std::string & tid ] : LCURLY ( (m= modifier_declaration )? ( decl_variable[ *(structT->getPropertyPart()) , mdfr ] | def_method[ declProperty ] ) )+ RCURLY ;
 */
static void
def_class_structure_impl(pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr, const std::string & tid)
{
    ANTLR3_UINT32 def_class_structure_impl_StartIndex;

    sep::Modifier m;
    #undef	RETURN_TYPE_m
    #define	RETURN_TYPE_m sep::Modifier

    /* Initialize rule variables
     */
    def_class_structure_impl_StartIndex = INDEX();



    	sep::DataType * structT;

    	sep::BF td( structT = sep::DataType::newStructure(declProperty, tid) );
    	structT->setModifier( mdfr );
    	declProperty.appendDataType( td );

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(135)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3719:2: ( LCURLY ( (m= modifier_declaration )? ( decl_variable[ *(structT->getPropertyPart()) , mdfr ] | def_method[ declProperty ] ) )+ RCURLY )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3719:4: LCURLY ( (m= modifier_declaration )? ( decl_variable[ *(structT->getPropertyPart()) , mdfr ] | def_method[ declProperty ] ) )+ RCURLY
        {
             MATCHT(LCURLY, &FOLLOW_LCURLY_in_def_class_structure_impl11759);
            if  (HASEXCEPTION())
            {
                goto ruledef_class_structure_implEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3720:3: ( (m= modifier_declaration )? ( decl_variable[ *(structT->getPropertyPart()) , mdfr ] | def_method[ declProperty ] ) )+
            {
                int cnt328=0;

                for (;;)
                {
                    int alt328=2;
            	switch ( LA(1) )
            	{
            	case 243:
            	case 259:
            	case 262:
            	case 282:
            	case 288:
            	case 298:
            	case 305:
            	case 318:
            	case 341:
            	case 349:
            	case 355:
            	case 361:
            	case 364:
            	case 380:
            	case 395:
            	case 406:
            	case 410:
            	case 411:
            	case 414:
            		{
            			alt328=1;
            		}
            	    break;

            	}

            	switch (alt328)
            	{
            	    case 1:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3720:5: (m= modifier_declaration )? ( decl_variable[ *(structT->getPropertyPart()) , mdfr ] | def_method[ declProperty ] )
            	        {
            	            if ( BACKTRACKING==0 )
            	            {
            	                 mdfr = sep::Modifier::PROPERTY_UNDEFINED_MODIFIER; 
            	            }


            	            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3722:4: (m= modifier_declaration )?
            	            {
            	                int alt326=2;
            	                switch ( LA(1) )
            	                {
            	                    case 243:
            	                    case 282:
            	                    case 298:
            	                    case 305:
            	                    case 341:
            	                    case 349:
            	                    case 355:
            	                    case 361:
            	                    case 364:
            	                    case 380:
            	                    case 395:
            	                    case 406:
            	                    case 414:
            	                    	{
            	                    		alt326=1;
            	                    	}
            	                        break;
            	                }

            	                switch (alt326)
            	                {
            	            	case 1:
            	            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3722:6: m= modifier_declaration
            	            	    {
            	            	        FOLLOWPUSH(FOLLOW_modifier_declaration_in_def_class_structure_impl11775);
            	            	        m=modifier_declaration(ctx);

            	            	        FOLLOWPOP();
            	            	        if  (HASEXCEPTION())
            	            	        {
            	            	            goto ruledef_class_structure_implEx;
            	            	        }
            	            	        if (HASFAILED())
            	            	        {
            	            	            return ;
            	            	        }


            	            	        if ( BACKTRACKING==0 )
            	            	        {
            	            	             mdfr = m
            	            	            ; 
            	            	        }


            	            	    }
            	            	    break;

            	                }
            	            }

            	            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3724:7: ( decl_variable[ *(structT->getPropertyPart()) , mdfr ] | def_method[ declProperty ] )
            	            {
            	                int alt327=2;
            	                switch ( LA(1) )
            	                {
            	                case 259:
            	                case 262:
            	                case 318:
            	                case 410:
            	                case 411:
            	                	{
            	                		alt327=1;
            	                	}
            	                    break;
            	                case 288:
            	                	{
            	                		alt327=2;
            	                	}
            	                    break;

            	                default:
            	                    if (BACKTRACKING>0)
            	                    {
            	                        FAILEDFLAG = ANTLR3_TRUE;
            	                        return ;
            	                    }

            	                    CONSTRUCTEX();
            	                    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
            	                    EXCEPTION->message      = (void *)"";
            	                    EXCEPTION->decisionNum  = 327;
            	                    EXCEPTION->state        = 0;


            	                    goto ruledef_class_structure_implEx;

            	                }

            	                switch (alt327)
            	                {
            	            	case 1:
            	            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3724:9: decl_variable[ *(structT->getPropertyPart()) , mdfr ]
            	            	    {
            	            	        FOLLOWPUSH(FOLLOW_decl_variable_in_def_class_structure_impl11792);
            	            	        decl_variable(ctx, *(structT->getPropertyPart()), mdfr);

            	            	        FOLLOWPOP();
            	            	        if  (HASEXCEPTION())
            	            	        {
            	            	            goto ruledef_class_structure_implEx;
            	            	        }
            	            	        if (HASFAILED())
            	            	        {
            	            	            return ;
            	            	        }


            	            	    }
            	            	    break;
            	            	case 2:
            	            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3725:9: def_method[ declProperty ]
            	            	    {
            	            	        FOLLOWPUSH(FOLLOW_def_method_in_def_class_structure_impl11803);
            	            	        def_method(ctx, declProperty);

            	            	        FOLLOWPOP();
            	            	        if  (HASEXCEPTION())
            	            	        {
            	            	            goto ruledef_class_structure_implEx;
            	            	        }
            	            	        if (HASFAILED())
            	            	        {
            	            	            return ;
            	            	        }


            	            	    }
            	            	    break;

            	                }
            	            }

            	        }
            	        break;

            	    default:

            		if ( cnt328 >= 1 )
            		{
            		    goto loop328;
            		}
            		if (BACKTRACKING>0)
            		{
            		    FAILEDFLAG = ANTLR3_TRUE;
            		    return ;
            		}

            		/* mismatchedSetEx()
            		 */
            		CONSTRUCTEX();
            		EXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
            		EXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;


            		goto ruledef_class_structure_implEx;
            	}
            	cnt328++;
                }
                loop328: ;	/* Jump to here if this rule does not match */
            }

             MATCHT(RCURLY, &FOLLOW_RCURLY_in_def_class_structure_impl11825);
            if  (HASEXCEPTION())
            {
                goto ruledef_class_structure_implEx;
            }
            if (HASFAILED())
            {
                return ;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_class_structure_implEx; /* Prevent compiler warnings */
    ruledef_class_structure_implEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(135, def_class_structure_impl_StartIndex); }

    return ;
}
/* $ANTLR end def_class_structure_impl */

/**
 * $ANTLR start def_choice
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3732:1: def_choice[ sep::PropertyPart & declProperty , sep::Modifier mdfr ] : 'choice' id= ID def_choice_impl[declProperty, mdfr, STR($id.text->chars)] ;
 */
static void
def_choice(pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr)
{
    ANTLR3_UINT32 def_choice_StartIndex;

    pANTLR3_COMMON_TOKEN    id;

    /* Initialize rule variables
     */
    def_choice_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(136)) )
    {
        {
        }



        return ;
    }

    id       = NULL;

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3734:2: ( 'choice' id= ID def_choice_impl[declProperty, mdfr, STR($id.text->chars)] )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3734:4: 'choice' id= ID def_choice_impl[declProperty, mdfr, STR($id.text->chars)]
        {
             MATCHT(257, &FOLLOW_257_in_def_choice11840);
            if  (HASEXCEPTION())
            {
                goto ruledef_choiceEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_def_choice11845);
            if  (HASEXCEPTION())
            {
                goto ruledef_choiceEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            FOLLOWPUSH(FOLLOW_def_choice_impl_in_def_choice11850);
            def_choice_impl(ctx, declProperty, mdfr, STR((id->getText(id))->chars));

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruledef_choiceEx;
            }
            if (HASFAILED())
            {
                return ;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_choiceEx; /* Prevent compiler warnings */
    ruledef_choiceEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(136, def_choice_StartIndex); }

    return ;
}
/* $ANTLR end def_choice */

/**
 * $ANTLR start def_choice_impl
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3738:1: def_choice_impl[ sep::PropertyPart & declProperty ,\n\t\tsep::Modifier mdfr , const std::string & tid ] : LCURLY ( (m= modifier_declaration )? ( decl_variable[ *(choiceT->getPropertyPart()) , mdfr ] | def_method[ declProperty ] ) )+ RCURLY ;
 */
static void
def_choice_impl(pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr, const std::string & tid)
{
    ANTLR3_UINT32 def_choice_impl_StartIndex;

    sep::Modifier m;
    #undef	RETURN_TYPE_m
    #define	RETURN_TYPE_m sep::Modifier

    /* Initialize rule variables
     */
    def_choice_impl_StartIndex = INDEX();



    	sep::DataType * choiceT;

    	sep::BF td( choiceT = sep::DataType::newChoice(declProperty, tid) );
    	choiceT->setModifier( mdfr );
    	declProperty.appendDataType( td );

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(137)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3748:2: ( LCURLY ( (m= modifier_declaration )? ( decl_variable[ *(choiceT->getPropertyPart()) , mdfr ] | def_method[ declProperty ] ) )+ RCURLY )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3748:4: LCURLY ( (m= modifier_declaration )? ( decl_variable[ *(choiceT->getPropertyPart()) , mdfr ] | def_method[ declProperty ] ) )+ RCURLY
        {
             MATCHT(LCURLY, &FOLLOW_LCURLY_in_def_choice_impl11869);
            if  (HASEXCEPTION())
            {
                goto ruledef_choice_implEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3749:3: ( (m= modifier_declaration )? ( decl_variable[ *(choiceT->getPropertyPart()) , mdfr ] | def_method[ declProperty ] ) )+
            {
                int cnt331=0;

                for (;;)
                {
                    int alt331=2;
            	switch ( LA(1) )
            	{
            	case 243:
            	case 259:
            	case 262:
            	case 282:
            	case 288:
            	case 298:
            	case 305:
            	case 318:
            	case 341:
            	case 349:
            	case 355:
            	case 361:
            	case 364:
            	case 380:
            	case 395:
            	case 406:
            	case 410:
            	case 411:
            	case 414:
            		{
            			alt331=1;
            		}
            	    break;

            	}

            	switch (alt331)
            	{
            	    case 1:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3749:5: (m= modifier_declaration )? ( decl_variable[ *(choiceT->getPropertyPart()) , mdfr ] | def_method[ declProperty ] )
            	        {
            	            if ( BACKTRACKING==0 )
            	            {
            	                 mdfr = sep::Modifier::PROPERTY_UNDEFINED_MODIFIER; 
            	            }


            	            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3751:4: (m= modifier_declaration )?
            	            {
            	                int alt329=2;
            	                switch ( LA(1) )
            	                {
            	                    case 243:
            	                    case 282:
            	                    case 298:
            	                    case 305:
            	                    case 341:
            	                    case 349:
            	                    case 355:
            	                    case 361:
            	                    case 364:
            	                    case 380:
            	                    case 395:
            	                    case 406:
            	                    case 414:
            	                    	{
            	                    		alt329=1;
            	                    	}
            	                        break;
            	                }

            	                switch (alt329)
            	                {
            	            	case 1:
            	            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3751:6: m= modifier_declaration
            	            	    {
            	            	        FOLLOWPUSH(FOLLOW_modifier_declaration_in_def_choice_impl11885);
            	            	        m=modifier_declaration(ctx);

            	            	        FOLLOWPOP();
            	            	        if  (HASEXCEPTION())
            	            	        {
            	            	            goto ruledef_choice_implEx;
            	            	        }
            	            	        if (HASFAILED())
            	            	        {
            	            	            return ;
            	            	        }


            	            	        if ( BACKTRACKING==0 )
            	            	        {
            	            	             mdfr = m
            	            	            ; 
            	            	        }


            	            	    }
            	            	    break;

            	                }
            	            }

            	            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3753:7: ( decl_variable[ *(choiceT->getPropertyPart()) , mdfr ] | def_method[ declProperty ] )
            	            {
            	                int alt330=2;
            	                switch ( LA(1) )
            	                {
            	                case 259:
            	                case 262:
            	                case 318:
            	                case 410:
            	                case 411:
            	                	{
            	                		alt330=1;
            	                	}
            	                    break;
            	                case 288:
            	                	{
            	                		alt330=2;
            	                	}
            	                    break;

            	                default:
            	                    if (BACKTRACKING>0)
            	                    {
            	                        FAILEDFLAG = ANTLR3_TRUE;
            	                        return ;
            	                    }

            	                    CONSTRUCTEX();
            	                    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
            	                    EXCEPTION->message      = (void *)"";
            	                    EXCEPTION->decisionNum  = 330;
            	                    EXCEPTION->state        = 0;


            	                    goto ruledef_choice_implEx;

            	                }

            	                switch (alt330)
            	                {
            	            	case 1:
            	            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3753:9: decl_variable[ *(choiceT->getPropertyPart()) , mdfr ]
            	            	    {
            	            	        FOLLOWPUSH(FOLLOW_decl_variable_in_def_choice_impl11902);
            	            	        decl_variable(ctx, *(choiceT->getPropertyPart()), mdfr);

            	            	        FOLLOWPOP();
            	            	        if  (HASEXCEPTION())
            	            	        {
            	            	            goto ruledef_choice_implEx;
            	            	        }
            	            	        if (HASFAILED())
            	            	        {
            	            	            return ;
            	            	        }


            	            	    }
            	            	    break;
            	            	case 2:
            	            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3754:9: def_method[ declProperty ]
            	            	    {
            	            	        FOLLOWPUSH(FOLLOW_def_method_in_def_choice_impl11913);
            	            	        def_method(ctx, declProperty);

            	            	        FOLLOWPOP();
            	            	        if  (HASEXCEPTION())
            	            	        {
            	            	            goto ruledef_choice_implEx;
            	            	        }
            	            	        if (HASFAILED())
            	            	        {
            	            	            return ;
            	            	        }


            	            	    }
            	            	    break;

            	                }
            	            }

            	        }
            	        break;

            	    default:

            		if ( cnt331 >= 1 )
            		{
            		    goto loop331;
            		}
            		if (BACKTRACKING>0)
            		{
            		    FAILEDFLAG = ANTLR3_TRUE;
            		    return ;
            		}

            		/* mismatchedSetEx()
            		 */
            		CONSTRUCTEX();
            		EXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
            		EXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;


            		goto ruledef_choice_implEx;
            	}
            	cnt331++;
                }
                loop331: ;	/* Jump to here if this rule does not match */
            }

             MATCHT(RCURLY, &FOLLOW_RCURLY_in_def_choice_impl11935);
            if  (HASEXCEPTION())
            {
                goto ruledef_choice_implEx;
            }
            if (HASFAILED())
            {
                return ;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_choice_implEx; /* Prevent compiler warnings */
    ruledef_choice_implEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(137, def_choice_impl_StartIndex); }

    return ;
}
/* $ANTLR end def_choice_impl */

/**
 * $ANTLR start def_union
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3761:1: def_union[ sep::PropertyPart & declProperty , sep::Modifier mdfr ] : 'union' id= ID def_union_impl[declProperty , mdfr, STR($id.text->chars)] ;
 */
static void
def_union(pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr)
{
    ANTLR3_UINT32 def_union_StartIndex;

    pANTLR3_COMMON_TOKEN    id;

    /* Initialize rule variables
     */
    def_union_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(138)) )
    {
        {
        }



        return ;
    }

    id       = NULL;

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3763:2: ( 'union' id= ID def_union_impl[declProperty , mdfr, STR($id.text->chars)] )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3763:4: 'union' id= ID def_union_impl[declProperty , mdfr, STR($id.text->chars)]
        {
             MATCHT(404, &FOLLOW_404_in_def_union11950);
            if  (HASEXCEPTION())
            {
                goto ruledef_unionEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_def_union11955);
            if  (HASEXCEPTION())
            {
                goto ruledef_unionEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            FOLLOWPUSH(FOLLOW_def_union_impl_in_def_union11960);
            def_union_impl(ctx, declProperty, mdfr, STR((id->getText(id))->chars));

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruledef_unionEx;
            }
            if (HASFAILED())
            {
                return ;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_unionEx; /* Prevent compiler warnings */
    ruledef_unionEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(138, def_union_StartIndex); }

    return ;
}
/* $ANTLR end def_union */

/**
 * $ANTLR start def_union_impl
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3768:1: def_union_impl[ sep::PropertyPart & declProperty ,\n\t\tsep::Modifier mdfr , const std::string & tid ] : LCURLY ( (m= modifier_declaration )? decl_variable[ *(unionT->getPropertyPart()) , mdfr ] )+ RCURLY ;
 */
static void
def_union_impl(pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr, const std::string & tid)
{
    ANTLR3_UINT32 def_union_impl_StartIndex;

    sep::Modifier m;
    #undef	RETURN_TYPE_m
    #define	RETURN_TYPE_m sep::Modifier

    /* Initialize rule variables
     */
    def_union_impl_StartIndex = INDEX();



    	sep::DataType * unionT;

    	sep::BF td(	unionT = sep::DataType::newUnion(declProperty, tid) );
    	unionT->setModifier( mdfr );
    	declProperty.appendDataType( td );

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(139)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3778:2: ( LCURLY ( (m= modifier_declaration )? decl_variable[ *(unionT->getPropertyPart()) , mdfr ] )+ RCURLY )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3778:4: LCURLY ( (m= modifier_declaration )? decl_variable[ *(unionT->getPropertyPart()) , mdfr ] )+ RCURLY
        {
             MATCHT(LCURLY, &FOLLOW_LCURLY_in_def_union_impl11980);
            if  (HASEXCEPTION())
            {
                goto ruledef_union_implEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3779:3: ( (m= modifier_declaration )? decl_variable[ *(unionT->getPropertyPart()) , mdfr ] )+
            {
                int cnt333=0;

                for (;;)
                {
                    int alt333=2;
            	switch ( LA(1) )
            	{
            	case 243:
            	case 259:
            	case 262:
            	case 282:
            	case 298:
            	case 305:
            	case 318:
            	case 341:
            	case 349:
            	case 355:
            	case 361:
            	case 364:
            	case 380:
            	case 395:
            	case 406:
            	case 410:
            	case 411:
            	case 414:
            		{
            			alt333=1;
            		}
            	    break;

            	}

            	switch (alt333)
            	{
            	    case 1:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3779:5: (m= modifier_declaration )? decl_variable[ *(unionT->getPropertyPart()) , mdfr ]
            	        {
            	            if ( BACKTRACKING==0 )
            	            {
            	                 mdfr = sep::Modifier::PROPERTY_UNDEFINED_MODIFIER; 
            	            }


            	            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3781:4: (m= modifier_declaration )?
            	            {
            	                int alt332=2;
            	                switch ( LA(1) )
            	                {
            	                    case 243:
            	                    case 282:
            	                    case 298:
            	                    case 305:
            	                    case 341:
            	                    case 349:
            	                    case 355:
            	                    case 361:
            	                    case 364:
            	                    case 380:
            	                    case 395:
            	                    case 406:
            	                    case 414:
            	                    	{
            	                    		alt332=1;
            	                    	}
            	                        break;
            	                }

            	                switch (alt332)
            	                {
            	            	case 1:
            	            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3781:6: m= modifier_declaration
            	            	    {
            	            	        FOLLOWPUSH(FOLLOW_modifier_declaration_in_def_union_impl11996);
            	            	        m=modifier_declaration(ctx);

            	            	        FOLLOWPOP();
            	            	        if  (HASEXCEPTION())
            	            	        {
            	            	            goto ruledef_union_implEx;
            	            	        }
            	            	        if (HASFAILED())
            	            	        {
            	            	            return ;
            	            	        }


            	            	        if ( BACKTRACKING==0 )
            	            	        {
            	            	             mdfr = m
            	            	            ; 
            	            	        }


            	            	    }
            	            	    break;

            	                }
            	            }

            	            FOLLOWPUSH(FOLLOW_decl_variable_in_def_union_impl12011);
            	            decl_variable(ctx, *(unionT->getPropertyPart()), mdfr);

            	            FOLLOWPOP();
            	            if  (HASEXCEPTION())
            	            {
            	                goto ruledef_union_implEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return ;
            	            }


            	        }
            	        break;

            	    default:

            		if ( cnt333 >= 1 )
            		{
            		    goto loop333;
            		}
            		if (BACKTRACKING>0)
            		{
            		    FAILEDFLAG = ANTLR3_TRUE;
            		    return ;
            		}

            		/* mismatchedSetEx()
            		 */
            		CONSTRUCTEX();
            		EXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
            		EXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;


            		goto ruledef_union_implEx;
            	}
            	cnt333++;
                }
                loop333: ;	/* Jump to here if this rule does not match */
            }

             MATCHT(RCURLY, &FOLLOW_RCURLY_in_def_union_impl12025);
            if  (HASEXCEPTION())
            {
                goto ruledef_union_implEx;
            }
            if (HASFAILED())
            {
                return ;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_union_implEx; /* Prevent compiler warnings */
    ruledef_union_implEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(139, def_union_impl_StartIndex); }

    return ;
}
/* $ANTLR end def_union_impl */

/**
 * $ANTLR start def_method
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3789:1: def_method[ sep::PropertyPart & declProperty ] : 'fun' ID LPAREN ( decl_parameters )? RPAREN ( type_var )? ;
 */
static void
def_method(pfmlParser ctx, sep::PropertyPart & declProperty)
{
    ANTLR3_UINT32 def_method_StartIndex;

    /* Initialize rule variables
     */
    def_method_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(140)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3790:2: ( 'fun' ID LPAREN ( decl_parameters )? RPAREN ( type_var )? )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3790:4: 'fun' ID LPAREN ( decl_parameters )? RPAREN ( type_var )?
        {
             MATCHT(288, &FOLLOW_288_in_def_method12038);
            if  (HASEXCEPTION())
            {
                goto ruledef_methodEx;
            }
            if (HASFAILED())
            {
                return ;
            }


             MATCHT(ID, &FOLLOW_ID_in_def_method12041);
            if  (HASEXCEPTION())
            {
                goto ruledef_methodEx;
            }
            if (HASFAILED())
            {
                return ;
            }


             MATCHT(LPAREN, &FOLLOW_LPAREN_in_def_method12044);
            if  (HASEXCEPTION())
            {
                goto ruledef_methodEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3790:23: ( decl_parameters )?
            {
                int alt334=2;
                switch ( LA(1) )
                {
                    case ID:
                    case 241:
                    case 242:
                    case 245:
                    case 246:
                    case 249:
                    case 254:
                    case 255:
                    case 259:
                    case 261:
                    case 264:
                    case 270:
                    case 271:
                    case 281:
                    case 283:
                    case 309:
                    case 310:
                    case 311:
                    case 315:
                    case 316:
                    case 317:
                    case 320:
                    case 325:
                    case 326:
                    case 329:
                    case 333:
                    case 344:
                    case 345:
                    case 346:
                    case 357:
                    case 358:
                    case 360:
                    case 370:
                    case 373:
                    case 374:
                    case 387:
                    case 392:
                    case 399:
                    case 400:
                    case 401:
                    case 402:
                    case 405:
                    case 407:
                    case 408:
                    case 409:
                    case 412:
                    	{
                    		alt334=1;
                    	}
                        break;
                }

                switch (alt334)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3790:23: decl_parameters
            	    {
            	        FOLLOWPUSH(FOLLOW_decl_parameters_in_def_method12047);
            	        decl_parameters(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_methodEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

                }
            }

             MATCHT(RPAREN, &FOLLOW_RPAREN_in_def_method12052);
            if  (HASEXCEPTION())
            {
                goto ruledef_methodEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3790:50: ( type_var )?
            {
                int alt335=2;
                switch ( LA(1) )
                {
                    case 259:
                    	{
                    		{
                    		    int LA335_1 = LA(2);
                    		    if ( (synpred574_fml(ctx)))
                    		    {
                    		        alt335=1;
                    		    }
                    		}
                    	}
                        break;
                    case ID:
                    case 241:
                    case 242:
                    case 245:
                    case 246:
                    case 249:
                    case 254:
                    case 255:
                    case 261:
                    case 264:
                    case 270:
                    case 271:
                    case 281:
                    case 283:
                    case 309:
                    case 310:
                    case 311:
                    case 315:
                    case 316:
                    case 317:
                    case 320:
                    case 325:
                    case 326:
                    case 329:
                    case 333:
                    case 344:
                    case 345:
                    case 346:
                    case 357:
                    case 358:
                    case 360:
                    case 370:
                    case 373:
                    case 374:
                    case 387:
                    case 392:
                    case 399:
                    case 400:
                    case 401:
                    case 402:
                    case 405:
                    case 407:
                    case 408:
                    case 409:
                    case 412:
                    	{
                    		alt335=1;
                    	}
                        break;
                }

                switch (alt335)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3790:52: type_var
            	    {
            	        FOLLOWPUSH(FOLLOW_type_var_in_def_method12057);
            	        type_var(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_methodEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

                }
            }

        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_methodEx; /* Prevent compiler warnings */
    ruledef_methodEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(140, def_method_StartIndex); }

    return ;
}
/* $ANTLR end def_method */

/**
 * $ANTLR start decl_parameters
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3793:1: decl_parameters : type_var ID ( COMMA type_var ID )* ;
 */
static void
decl_parameters(pfmlParser ctx)
{
    ANTLR3_UINT32 decl_parameters_StartIndex;

    /* Initialize rule variables
     */
    decl_parameters_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(141)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3794:2: ( type_var ID ( COMMA type_var ID )* )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3794:4: type_var ID ( COMMA type_var ID )*
        {
            FOLLOWPUSH(FOLLOW_type_var_in_decl_parameters12071);
            type_var(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruledecl_parametersEx;
            }
            if (HASFAILED())
            {
                return ;
            }


             MATCHT(ID, &FOLLOW_ID_in_decl_parameters12073);
            if  (HASEXCEPTION())
            {
                goto ruledecl_parametersEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3794:16: ( COMMA type_var ID )*

            for (;;)
            {
                int alt336=2;
                switch ( LA(1) )
                {
                case COMMA:
                	{
                		alt336=1;
                	}
                    break;

                }

                switch (alt336)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3794:18: COMMA type_var ID
            	    {
            	         MATCHT(COMMA, &FOLLOW_COMMA_in_decl_parameters12077);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledecl_parametersEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        FOLLOWPUSH(FOLLOW_type_var_in_decl_parameters12079);
            	        type_var(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledecl_parametersEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	         MATCHT(ID, &FOLLOW_ID_in_decl_parameters12081);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledecl_parametersEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

            	default:
            	    goto loop336;	/* break out of the loop */
            	    break;
                }
            }
            loop336: ; /* Jump out to here if this rule does not match */


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledecl_parametersEx; /* Prevent compiler warnings */
    ruledecl_parametersEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(141, decl_parameters_StartIndex); }

    return ;
}
/* $ANTLR end decl_parameters */

/**
 * $ANTLR start def_type
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3798:1: def_type[ sep::PropertyPart & declProperty , sep::Modifier mdfr ] : 'type' def_type_impl[ declProperty , mdfr ] ;
 */
static void
def_type(pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr)
{
    ANTLR3_UINT32 def_type_StartIndex;

    /* Initialize rule variables
     */
    def_type_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(142)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3800:2: ( 'type' def_type_impl[ declProperty , mdfr ] )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3800:4: 'type' def_type_impl[ declProperty , mdfr ]
        {
             MATCHT(398, &FOLLOW_398_in_def_type12099);
            if  (HASEXCEPTION())
            {
                goto ruledef_typeEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            FOLLOWPUSH(FOLLOW_def_type_impl_in_def_type12102);
            def_type_impl(ctx, declProperty, mdfr);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruledef_typeEx;
            }
            if (HASFAILED())
            {
                return ;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_typeEx; /* Prevent compiler warnings */
    ruledef_typeEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(142, def_type_StartIndex); }

    return ;
}
/* $ANTLR end def_type */

/**
 * $ANTLR start def_type_impl
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3803:1: def_type_impl[ sep::PropertyPart & declProperty , sep::Modifier mdfr ] : ( def_type_atom_impl[ declProperty , mdfr ] | LCURLY ( def_type_atom_impl[ declProperty , mdfr ] )+ RCURLY );
 */
static void
def_type_impl(pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr)
{
    ANTLR3_UINT32 def_type_impl_StartIndex;

    /* Initialize rule variables
     */
    def_type_impl_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(143)) )
    {
        {
        }



        return ;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3805:2: ( def_type_atom_impl[ declProperty , mdfr ] | LCURLY ( def_type_atom_impl[ declProperty , mdfr ] )+ RCURLY )

            ANTLR3_UINT32 alt338;

            alt338=2;

            switch ( LA(1) )
            {
            case ID:
            case 257:
            case 258:
            case 276:
            case 388:
            case 404:
            	{
            		alt338=1;
            	}
                break;
            case LCURLY:
            	{
            		alt338=2;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 338;
                EXCEPTION->state        = 0;


                goto ruledef_type_implEx;

            }

            switch (alt338)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3805:4: def_type_atom_impl[ declProperty , mdfr ]
        	    {
        	        FOLLOWPUSH(FOLLOW_def_type_atom_impl_in_def_type_impl12117);
        	        def_type_atom_impl(ctx, declProperty, mdfr);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_type_implEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3807:4: LCURLY ( def_type_atom_impl[ declProperty , mdfr ] )+ RCURLY
        	    {
        	         MATCHT(LCURLY, &FOLLOW_LCURLY_in_def_type_impl12124);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_type_implEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3808:4: ( def_type_atom_impl[ declProperty , mdfr ] )+
        	        {
        	            int cnt337=0;

        	            for (;;)
        	            {
        	                int alt337=2;
        	        	switch ( LA(1) )
        	        	{
        	        	case ID:
        	        	case 257:
        	        	case 258:
        	        	case 276:
        	        	case 388:
        	        	case 404:
        	        		{
        	        			alt337=1;
        	        		}
        	        	    break;

        	        	}

        	        	switch (alt337)
        	        	{
        	        	    case 1:
        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3808:6: def_type_atom_impl[ declProperty , mdfr ]
        	        	        {
        	        	            FOLLOWPUSH(FOLLOW_def_type_atom_impl_in_def_type_impl12131);
        	        	            def_type_atom_impl(ctx, declProperty, mdfr);

        	        	            FOLLOWPOP();
        	        	            if  (HASEXCEPTION())
        	        	            {
        	        	                goto ruledef_type_implEx;
        	        	            }
        	        	            if (HASFAILED())
        	        	            {
        	        	                return ;
        	        	            }


        	        	        }
        	        	        break;

        	        	    default:

        	        		if ( cnt337 >= 1 )
        	        		{
        	        		    goto loop337;
        	        		}
        	        		if (BACKTRACKING>0)
        	        		{
        	        		    FAILEDFLAG = ANTLR3_TRUE;
        	        		    return ;
        	        		}

        	        		/* mismatchedSetEx()
        	        		 */
        	        		CONSTRUCTEX();
        	        		EXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
        	        		EXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;


        	        		goto ruledef_type_implEx;
        	        	}
        	        	cnt337++;
        	            }
        	            loop337: ;	/* Jump to here if this rule does not match */
        	        }

        	         MATCHT(RCURLY, &FOLLOW_RCURLY_in_def_type_impl12140);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_type_implEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruledef_type_implEx; /* Prevent compiler warnings */
    ruledef_type_implEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(143, def_type_impl_StartIndex); }

    return ;
}
/* $ANTLR end def_type_impl */

/**
 * $ANTLR start def_type_atom_impl
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3813:1: def_type_atom_impl[ sep::PropertyPart & declProperty , sep::Modifier mdfr ] : (id= ID (btv= base_type_var (dta= def_type_array[ type , STR($id.text->chars) ] )? ( def_typedef_constraint[ aliasT ] | SEMI )? |dtc= def_type_container[ STR($id.text->chars) ] ( def_typedef_constraint[ aliasT ] | SEMI )? |dti= def_type_interval[ STR($id.text->chars) ] SEMI | 'enum' def_enum_impl[declProperty, mdfr, STR($id.text->chars)] | 'union' def_union_impl[declProperty, mdfr, STR($id.text->chars)] | 'choice' def_choice_impl[declProperty, mdfr, STR($id.text->chars)] | ( 'struct' | 'class' ) def_class_structure_impl[declProperty, mdfr, STR($id.text->chars)] ) | def_enum[ declProperty , mdfr ] | def_union[ declProperty , mdfr ] | def_choice[ declProperty , mdfr ] | def_struct[ declProperty , mdfr ] );
 */
static void
def_type_atom_impl(pfmlParser ctx, sep::PropertyPart & declProperty, sep::Modifier mdfr)
{
    ANTLR3_UINT32 def_type_atom_impl_StartIndex;

    pANTLR3_COMMON_TOKEN    id;
    sep::BF btv;
    #undef	RETURN_TYPE_btv
    #define	RETURN_TYPE_btv sep::BF

    sep::BF dta;
    #undef	RETURN_TYPE_dta
    #define	RETURN_TYPE_dta sep::BF

    sep::BF dtc;
    #undef	RETURN_TYPE_dtc
    #define	RETURN_TYPE_dtc sep::BF

    sep::BF dti;
    #undef	RETURN_TYPE_dti
    #define	RETURN_TYPE_dti sep::BF

    /* Initialize rule variables
     */
    def_type_atom_impl_StartIndex = INDEX();



    	sep::DataType * aliasT;
    	sep::BF type;
    	bool isTypedArray = false;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(144)) )
    {
        {
        }



        return ;
    }

    id       = NULL;

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3820:2: (id= ID (btv= base_type_var (dta= def_type_array[ type , STR($id.text->chars) ] )? ( def_typedef_constraint[ aliasT ] | SEMI )? |dtc= def_type_container[ STR($id.text->chars) ] ( def_typedef_constraint[ aliasT ] | SEMI )? |dti= def_type_interval[ STR($id.text->chars) ] SEMI | 'enum' def_enum_impl[declProperty, mdfr, STR($id.text->chars)] | 'union' def_union_impl[declProperty, mdfr, STR($id.text->chars)] | 'choice' def_choice_impl[declProperty, mdfr, STR($id.text->chars)] | ( 'struct' | 'class' ) def_class_structure_impl[declProperty, mdfr, STR($id.text->chars)] ) | def_enum[ declProperty , mdfr ] | def_union[ declProperty , mdfr ] | def_choice[ declProperty , mdfr ] | def_struct[ declProperty , mdfr ] )

            ANTLR3_UINT32 alt343;

            alt343=5;

            switch ( LA(1) )
            {
            case ID:
            	{
            		alt343=1;
            	}
                break;
            case 276:
            	{
            		alt343=2;
            	}
                break;
            case 404:
            	{
            		alt343=3;
            	}
                break;
            case 257:
            	{
            		alt343=4;
            	}
                break;
            case 258:
            case 388:
            	{
            		alt343=5;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 343;
                EXCEPTION->state        = 0;


                goto ruledef_type_atom_implEx;

            }

            switch (alt343)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3820:4: id= ID (btv= base_type_var (dta= def_type_array[ type , STR($id.text->chars) ] )? ( def_typedef_constraint[ aliasT ] | SEMI )? |dtc= def_type_container[ STR($id.text->chars) ] ( def_typedef_constraint[ aliasT ] | SEMI )? |dti= def_type_interval[ STR($id.text->chars) ] SEMI | 'enum' def_enum_impl[declProperty, mdfr, STR($id.text->chars)] | 'union' def_union_impl[declProperty, mdfr, STR($id.text->chars)] | 'choice' def_choice_impl[declProperty, mdfr, STR($id.text->chars)] | ( 'struct' | 'class' ) def_class_structure_impl[declProperty, mdfr, STR($id.text->chars)] )
        	    {
        	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_def_type_atom_impl12161);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_type_atom_implEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3821:4: (btv= base_type_var (dta= def_type_array[ type , STR($id.text->chars) ] )? ( def_typedef_constraint[ aliasT ] | SEMI )? |dtc= def_type_container[ STR($id.text->chars) ] ( def_typedef_constraint[ aliasT ] | SEMI )? |dti= def_type_interval[ STR($id.text->chars) ] SEMI | 'enum' def_enum_impl[declProperty, mdfr, STR($id.text->chars)] | 'union' def_union_impl[declProperty, mdfr, STR($id.text->chars)] | 'choice' def_choice_impl[declProperty, mdfr, STR($id.text->chars)] | ( 'struct' | 'class' ) def_class_structure_impl[declProperty, mdfr, STR($id.text->chars)] )
        	        {
        	            int alt342=7;
        	            switch ( LA(1) )
        	            {
        	            case ID:
        	            case 242:
        	            case 245:
        	            case 246:
        	            case 249:
        	            case 254:
        	            case 255:
        	            case 259:
        	            case 261:
        	            case 264:
        	            case 270:
        	            case 271:
        	            case 283:
        	            case 309:
        	            case 310:
        	            case 317:
        	            case 320:
        	            case 333:
        	            case 344:
        	            case 345:
        	            case 346:
        	            case 357:
        	            case 358:
        	            case 360:
        	            case 374:
        	            case 387:
        	            case 392:
        	            case 399:
        	            case 400:
        	            case 401:
        	            case 402:
        	            case 405:
        	            case 407:
        	            case 408:
        	            case 409:
        	            	{
        	            		alt342=1;
        	            	}
        	                break;
        	            case 241:
        	            case 281:
        	            case 315:
        	            case 316:
        	            case 325:
        	            case 326:
        	            case 329:
        	            case 370:
        	            case 373:
        	            case 412:
        	            	{
        	            		alt342=2;
        	            	}
        	                break;
        	            case 311:
        	            	{
        	            		alt342=3;
        	            	}
        	                break;
        	            case 276:
        	            	{
        	            		alt342=4;
        	            	}
        	                break;
        	            case 404:
        	            	{
        	            		alt342=5;
        	            	}
        	                break;
        	            case 257:
        	            	{
        	            		alt342=6;
        	            	}
        	                break;
        	            case 258:
        	            case 388:
        	            	{
        	            		alt342=7;
        	            	}
        	                break;

        	            default:
        	                if (BACKTRACKING>0)
        	                {
        	                    FAILEDFLAG = ANTLR3_TRUE;
        	                    return ;
        	                }

        	                CONSTRUCTEX();
        	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
        	                EXCEPTION->message      = (void *)"";
        	                EXCEPTION->decisionNum  = 342;
        	                EXCEPTION->state        = 0;


        	                goto ruledef_type_atom_implEx;

        	            }

        	            switch (alt342)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3821:6: btv= base_type_var (dta= def_type_array[ type , STR($id.text->chars) ] )? ( def_typedef_constraint[ aliasT ] | SEMI )?
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_base_type_var_in_def_type_atom_impl12170);
        	        	        btv=base_type_var(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_type_atom_implEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             type = btv
        	        	            ; 
        	        	        }


        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3822:6: (dta= def_type_array[ type , STR($id.text->chars) ] )?
        	        	        {
        	        	            int alt339=2;
        	        	            switch ( LA(1) )
        	        	            {
        	        	                case LBRACKET:
        	        	                	{
        	        	                		alt339=1;
        	        	                	}
        	        	                    break;
        	        	            }

        	        	            switch (alt339)
        	        	            {
        	        	        	case 1:
        	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3822:8: dta= def_type_array[ type , STR($id.text->chars) ]
        	        	        	    {
        	        	        	        FOLLOWPUSH(FOLLOW_def_type_array_in_def_type_atom_impl12185);
        	        	        	        dta=def_type_array(ctx, type, STR((id->getText(id))->chars));

        	        	        	        FOLLOWPOP();
        	        	        	        if  (HASEXCEPTION())
        	        	        	        {
        	        	        	            goto ruledef_type_atom_implEx;
        	        	        	        }
        	        	        	        if (HASFAILED())
        	        	        	        {
        	        	        	            return ;
        	        	        	        }


        	        	        	        if ( BACKTRACKING==0 )
        	        	        	        {
        	        	        	             type = dta
        	        	        	            ; isTypedArray = true; 
        	        	        	        }


        	        	        	    }
        	        	        	    break;

        	        	            }
        	        	        }

        	        	        if ( BACKTRACKING==0 )
        	        	        {

        	        	            	    	if( isTypedArray )
        	        	            	    	{
        	        	            	    		aliasT = type.to_ptr< sep::DataType >();
        	        	            	  			aliasT->setModifier( mdfr );
        	        	            	    		declProperty.appendDataType( type );
        	        	            	    	}
        	        	            	    	else
        	        	            	    	{
        	        	            				sep::BF td( aliasT = sep::DataType::newAlias(
        	        	            					declProperty, STR((id->getText(id))->chars), type) );
        	        	            				aliasT->setModifier( mdfr  );
        	        	            				declProperty.appendDataType( td );
        	        	            	    	}
        	        	            	    
        	        	        }


        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3840:9: ( def_typedef_constraint[ aliasT ] | SEMI )?
        	        	        {
        	        	            int alt340=3;
        	        	            switch ( LA(1) )
        	        	            {
        	        	                case LCURLY:
        	        	                	{
        	        	                		alt340=1;
        	        	                	}
        	        	                    break;
        	        	                case SEMI:
        	        	                	{
        	        	                		alt340=2;
        	        	                	}
        	        	                    break;
        	        	            }

        	        	            switch (alt340)
        	        	            {
        	        	        	case 1:
        	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3840:11: def_typedef_constraint[ aliasT ]
        	        	        	    {
        	        	        	        FOLLOWPUSH(FOLLOW_def_typedef_constraint_in_def_type_atom_impl12222);
        	        	        	        def_typedef_constraint(ctx, aliasT);

        	        	        	        FOLLOWPOP();
        	        	        	        if  (HASEXCEPTION())
        	        	        	        {
        	        	        	            goto ruledef_type_atom_implEx;
        	        	        	        }
        	        	        	        if (HASFAILED())
        	        	        	        {
        	        	        	            return ;
        	        	        	        }


        	        	        	    }
        	        	        	    break;
        	        	        	case 2:
        	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3840:46: SEMI
        	        	        	    {
        	        	        	         MATCHT(SEMI, &FOLLOW_SEMI_in_def_type_atom_impl12227);
        	        	        	        if  (HASEXCEPTION())
        	        	        	        {
        	        	        	            goto ruledef_type_atom_implEx;
        	        	        	        }
        	        	        	        if (HASFAILED())
        	        	        	        {
        	        	        	            return ;
        	        	        	        }


        	        	        	    }
        	        	        	    break;

        	        	            }
        	        	        }

        	        	    }
        	        	    break;
        	        	case 2:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3842:6: dtc= def_type_container[ STR($id.text->chars) ] ( def_typedef_constraint[ aliasT ] | SEMI )?
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_def_type_container_in_def_type_atom_impl12240);
        	        	        dtc=def_type_container(ctx, STR((id->getText(id))->chars));

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_type_atom_implEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {

        	        	            	    aliasT = dtc
        	        	            .to_ptr< sep::DataType >();
        	        	            	  	aliasT->setModifier( mdfr );
        	        	            	  	declProperty.appendDataType( dtc
        	        	             );
        	        	            	  
        	        	        }


        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3848:4: ( def_typedef_constraint[ aliasT ] | SEMI )?
        	        	        {
        	        	            int alt341=3;
        	        	            switch ( LA(1) )
        	        	            {
        	        	                case LCURLY:
        	        	                	{
        	        	                		alt341=1;
        	        	                	}
        	        	                    break;
        	        	                case SEMI:
        	        	                	{
        	        	                		alt341=2;
        	        	                	}
        	        	                    break;
        	        	            }

        	        	            switch (alt341)
        	        	            {
        	        	        	case 1:
        	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3848:6: def_typedef_constraint[ aliasT ]
        	        	        	    {
        	        	        	        FOLLOWPUSH(FOLLOW_def_typedef_constraint_in_def_type_atom_impl12253);
        	        	        	        def_typedef_constraint(ctx, aliasT);

        	        	        	        FOLLOWPOP();
        	        	        	        if  (HASEXCEPTION())
        	        	        	        {
        	        	        	            goto ruledef_type_atom_implEx;
        	        	        	        }
        	        	        	        if (HASFAILED())
        	        	        	        {
        	        	        	            return ;
        	        	        	        }


        	        	        	    }
        	        	        	    break;
        	        	        	case 2:
        	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3848:41: SEMI
        	        	        	    {
        	        	        	         MATCHT(SEMI, &FOLLOW_SEMI_in_def_type_atom_impl12258);
        	        	        	        if  (HASEXCEPTION())
        	        	        	        {
        	        	        	            goto ruledef_type_atom_implEx;
        	        	        	        }
        	        	        	        if (HASFAILED())
        	        	        	        {
        	        	        	            return ;
        	        	        	        }


        	        	        	    }
        	        	        	    break;

        	        	            }
        	        	        }

        	        	    }
        	        	    break;
        	        	case 3:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3850:6: dti= def_type_interval[ STR($id.text->chars) ] SEMI
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_def_type_interval_in_def_type_atom_impl12271);
        	        	        dti=def_type_interval(ctx, STR((id->getText(id))->chars));

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_type_atom_implEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	         MATCHT(SEMI, &FOLLOW_SEMI_in_def_type_atom_impl12274);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_type_atom_implEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {

        	        	            	    aliasT = dti
        	        	            .to_ptr< sep::DataType >();
        	        	            	  	aliasT->setModifier( mdfr );
        	        	            	  	declProperty.appendDataType( dti
        	        	             );
        	        	            	  
        	        	        }


        	        	    }
        	        	    break;
        	        	case 4:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3857:6: 'enum' def_enum_impl[declProperty, mdfr, STR($id.text->chars)]
        	        	    {
        	        	         MATCHT(276, &FOLLOW_276_in_def_type_atom_impl12287);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_type_atom_implEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_def_enum_impl_in_def_type_atom_impl12294);
        	        	        def_enum_impl(ctx, declProperty, mdfr, STR((id->getText(id))->chars));

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_type_atom_implEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;
        	        	case 5:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3860:6: 'union' def_union_impl[declProperty, mdfr, STR($id.text->chars)]
        	        	    {
        	        	         MATCHT(404, &FOLLOW_404_in_def_type_atom_impl12303);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_type_atom_implEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_def_union_impl_in_def_type_atom_impl12310);
        	        	        def_union_impl(ctx, declProperty, mdfr, STR((id->getText(id))->chars));

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_type_atom_implEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;
        	        	case 6:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3863:6: 'choice' def_choice_impl[declProperty, mdfr, STR($id.text->chars)]
        	        	    {
        	        	         MATCHT(257, &FOLLOW_257_in_def_type_atom_impl12319);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_type_atom_implEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_def_choice_impl_in_def_type_atom_impl12326);
        	        	        def_choice_impl(ctx, declProperty, mdfr, STR((id->getText(id))->chars));

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_type_atom_implEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;
        	        	case 7:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3866:6: ( 'struct' | 'class' ) def_class_structure_impl[declProperty, mdfr, STR($id.text->chars)]
        	        	    {
        	        	        if ( LA(1) == 258 || LA(1) == 388 )
        	        	        {
        	        	            CONSUME();
        	        	            PERRORRECOVERY=ANTLR3_FALSE;
        	        	            FAILEDFLAG=ANTLR3_FALSE;

        	        	        }
        	        	        else
        	        	        {
        	        	            if (BACKTRACKING>0)
        	        	            {
        	        	                FAILEDFLAG = ANTLR3_TRUE;
        	        	                return ;
        	        	            }

        	        	            CONSTRUCTEX();
        	        	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
        	        	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
        	        	            EXCEPTION->expectingSet = NULL;

        	        	            goto ruledef_type_atom_implEx;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_def_class_structure_impl_in_def_type_atom_impl12350);
        	        	        def_class_structure_impl(ctx, declProperty, mdfr, STR((id->getText(id))->chars));

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_type_atom_implEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3870:4: def_enum[ declProperty , mdfr ]
        	    {
        	        FOLLOWPUSH(FOLLOW_def_enum_in_def_type_atom_impl12362);
        	        def_enum(ctx, declProperty, mdfr);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_type_atom_implEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3871:4: def_union[ declProperty , mdfr ]
        	    {
        	        FOLLOWPUSH(FOLLOW_def_union_in_def_type_atom_impl12370);
        	        def_union(ctx, declProperty, mdfr);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_type_atom_implEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 4:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3872:4: def_choice[ declProperty , mdfr ]
        	    {
        	        FOLLOWPUSH(FOLLOW_def_choice_in_def_type_atom_impl12377);
        	        def_choice(ctx, declProperty, mdfr);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_type_atom_implEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 5:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3873:4: def_struct[ declProperty , mdfr ]
        	    {
        	        FOLLOWPUSH(FOLLOW_def_struct_in_def_type_atom_impl12383);
        	        def_struct(ctx, declProperty, mdfr);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_type_atom_implEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruledef_type_atom_implEx; /* Prevent compiler warnings */
    ruledef_type_atom_implEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(144, def_type_atom_impl_StartIndex); }

    return ;
}
/* $ANTLR end def_type_atom_impl */

/**
 * $ANTLR start def_typedef_constraint
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3877:1: def_typedef_constraint[ sep::DataType * aliasT ] : LCURLY '@constraint' ( routine_single_param[*onConstraintRoutine, aliasT->getTypeSpecifier()] )? (bs= block_statement | '|=>' ce= conditionalExpression SEMI ) RCURLY ;
 */
static void
def_typedef_constraint(pfmlParser ctx, sep::DataType * aliasT)
{
    ANTLR3_UINT32 def_typedef_constraint_StartIndex;

    sep::BFCode bs;
    #undef	RETURN_TYPE_bs
    #define	RETURN_TYPE_bs sep::BFCode

    sep::BF ce;
    #undef	RETURN_TYPE_ce
    #define	RETURN_TYPE_ce sep::BF

    /* Initialize rule variables
     */
    def_typedef_constraint_StartIndex = INDEX();



    	sep::Routine * onConstraintRoutine = NULL;

    	sep::BehavioralPart * aBehavioralpart = aliasT->getUniqBehaviorPart();

    	SAVE_RULE_BEGIN_LOCATION;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(145)) )
    {
        {

            	SET_RULE_LOCATION( onConstraintRoutine );

        }
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3888:2: ( LCURLY '@constraint' ( routine_single_param[*onConstraintRoutine, aliasT->getTypeSpecifier()] )? (bs= block_statement | '|=>' ce= conditionalExpression SEMI ) RCURLY )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3888:4: LCURLY '@constraint' ( routine_single_param[*onConstraintRoutine, aliasT->getTypeSpecifier()] )? (bs= block_statement | '|=>' ce= conditionalExpression SEMI ) RCURLY
        {
             MATCHT(LCURLY, &FOLLOW_LCURLY_in_def_typedef_constraint12405);
            if  (HASEXCEPTION())
            {
                goto ruledef_typedef_constraintEx;
            }
            if (HASFAILED())
            {
                return ;
            }


             MATCHT(176, &FOLLOW_176_in_def_typedef_constraint12409);
            if  (HASEXCEPTION())
            {
                goto ruledef_typedef_constraintEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            if ( BACKTRACKING==0 )
            {

                	    	onConstraintRoutine = new sep::Routine(aliasT, "constraint");
                	    	aliasT->setConstraintRoutine(onConstraintRoutine);
                	    	aBehavioralpart->saveAnonymousInnerRoutine(onConstraintRoutine);
                	    
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3895:6: ( routine_single_param[*onConstraintRoutine, aliasT->getTypeSpecifier()] )?
            {
                int alt344=2;
                switch ( LA(1) )
                {
                    case LPAREN:
                    	{
                    		alt344=1;
                    	}
                        break;
                }

                switch (alt344)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3895:8: routine_single_param[*onConstraintRoutine, aliasT->getTypeSpecifier()]
            	    {
            	        FOLLOWPUSH(FOLLOW_routine_single_param_in_def_typedef_constraint12425);
            	        routine_single_param(ctx, *onConstraintRoutine, aliasT->getTypeSpecifier());

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_typedef_constraintEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3896:6: (bs= block_statement | '|=>' ce= conditionalExpression SEMI )
            {
                int alt345=2;
                switch ( LA(1) )
                {
                case LCURLY:
                	{
                		alt345=1;
                	}
                    break;
                case 417:
                	{
                		alt345=2;
                	}
                    break;

                default:
                    if (BACKTRACKING>0)
                    {
                        FAILEDFLAG = ANTLR3_TRUE;
                        return ;
                    }

                    CONSTRUCTEX();
                    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                    EXCEPTION->message      = (void *)"";
                    EXCEPTION->decisionNum  = 345;
                    EXCEPTION->state        = 0;


                    goto ruledef_typedef_constraintEx;

                }

                switch (alt345)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3896:8: bs= block_statement
            	    {
            	        FOLLOWPUSH(FOLLOW_block_statement_in_def_typedef_constraint12440);
            	        bs=block_statement(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_typedef_constraintEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             onConstraintRoutine->setCode( bs
            	             ); 
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3897:8: '|=>' ce= conditionalExpression SEMI
            	    {
            	         MATCHT(417, &FOLLOW_417_in_def_typedef_constraint12452);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_typedef_constraintEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        FOLLOWPUSH(FOLLOW_conditionalExpression_in_def_typedef_constraint12456);
            	        ce=conditionalExpression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_typedef_constraintEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	         MATCHT(SEMI, &FOLLOW_SEMI_in_def_typedef_constraint12458);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_typedef_constraintEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             onConstraintRoutine->setCode( NEW_STMT1(OP(GUARD), ce
            	            ) ); 
            	        }


            	    }
            	    break;

                }
            }

             MATCHT(RCURLY, &FOLLOW_RCURLY_in_def_typedef_constraint12479);
            if  (HASEXCEPTION())
            {
                goto ruledef_typedef_constraintEx;
            }
            if (HASFAILED())
            {
                return ;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_typedef_constraintEx; /* Prevent compiler warnings */
    ruledef_typedef_constraintEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
            else
            {
                {

                    	SET_RULE_LOCATION( onConstraintRoutine );

                }
            }


    if ( BACKTRACKING>0 ) { MEMOIZE(145, def_typedef_constraint_StartIndex); }

    return ;
}
/* $ANTLR end def_typedef_constraint */

/**
 * $ANTLR start time_type
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3908:1: time_type returns [ sep::TypeSpecifier bts ] : ( 'time' | 'ctime' | 'dtime' ) ( LT_ pt= time_type_domain ( COMMA sz= integer_constant )? GT |pt= time_type_domain )? ;
 */
static sep::TypeSpecifier
time_type(pfmlParser ctx)
{
    sep::TypeSpecifier bts;

    ANTLR3_UINT32 time_type_StartIndex;

    sep::TypeSpecifier pt;
    #undef	RETURN_TYPE_pt
    #define	RETURN_TYPE_pt sep::TypeSpecifier

    sep::avm_size_t sz;
    #undef	RETURN_TYPE_sz
    #define	RETURN_TYPE_sz sep::avm_size_t

    /* Initialize rule variables
     */
    time_type_StartIndex = INDEX();



    	int szT = 1;
    	sep::avm_type_specifier_kind_t tsk = sep::TYPE_TIME_SPECIFIER;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(146)) )
    {
        {
        }



        return bts;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3914:2: ( ( 'time' | 'ctime' | 'dtime' ) ( LT_ pt= time_type_domain ( COMMA sz= integer_constant )? GT |pt= time_type_domain )? )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3914:4: ( 'time' | 'ctime' | 'dtime' ) ( LT_ pt= time_type_domain ( COMMA sz= integer_constant )? GT |pt= time_type_domain )?
        {
            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3914:4: ( 'time' | 'ctime' | 'dtime' )
            {
                int alt346=3;
                switch ( LA(1) )
                {
                case 392:
                	{
                		alt346=1;
                	}
                    break;
                case 264:
                	{
                		alt346=2;
                	}
                    break;
                case 271:
                	{
                		alt346=3;
                	}
                    break;

                default:
                    if (BACKTRACKING>0)
                    {
                        FAILEDFLAG = ANTLR3_TRUE;
                        return bts;
                    }

                    CONSTRUCTEX();
                    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                    EXCEPTION->message      = (void *)"";
                    EXCEPTION->decisionNum  = 346;
                    EXCEPTION->state        = 0;


                    goto ruletime_typeEx;

                }

                switch (alt346)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3914:6: 'time'
            	    {
            	         MATCHT(392, &FOLLOW_392_in_time_type12505);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruletime_typeEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bts;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bts= sep::TypeManager::TIME;
            	                        
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3915:6: 'ctime'
            	    {
            	         MATCHT(264, &FOLLOW_264_in_time_type12516);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruletime_typeEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bts;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bts= sep::TypeManager::CONTINUOUS_TIME;
            	             
            	        }


            	    }
            	    break;
            	case 3:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3916:6: 'dtime'
            	    {
            	         MATCHT(271, &FOLLOW_271_in_time_type12526);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruletime_typeEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bts;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bts= sep::TypeManager::DISCRETE_TIME;
            	               
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3918:4: ( LT_ pt= time_type_domain ( COMMA sz= integer_constant )? GT |pt= time_type_domain )?
            {
                int alt348=3;
                switch ( LA(1) )
                {
                    case LT_:
                    	{
                    		alt348=1;
                    	}
                        break;
                    case 270:
                    case 283:
                    case 309:
                    case 310:
                    case 357:
                    case 358:
                    case 360:
                    case 399:
                    case 400:
                    case 401:
                    case 402:
                    case 407:
                    case 408:
                    case 409:
                    	{
                    		alt348=2;
                    	}
                        break;
                }

                switch (alt348)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3918:6: LT_ pt= time_type_domain ( COMMA sz= integer_constant )? GT
            	    {
            	         MATCHT(LT_, &FOLLOW_LT__in_time_type12541);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruletime_typeEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bts;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             tsk = bts
            	            .getTypeSpecifierKind(); 
            	        }


            	        FOLLOWPUSH(FOLLOW_time_type_domain_in_time_type12557);
            	        pt=time_type_domain(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruletime_typeEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bts;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bts= 
            	            pt
            	            ;
            	             
            	        }


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3920:6: ( COMMA sz= integer_constant )?
            	        {
            	            int alt347=2;
            	            switch ( LA(1) )
            	            {
            	                case COMMA:
            	                	{
            	                		alt347=1;
            	                	}
            	                    break;
            	            }

            	            switch (alt347)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3920:8: COMMA sz= integer_constant
            	        	    {
            	        	         MATCHT(COMMA, &FOLLOW_COMMA_in_time_type12578);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruletime_typeEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return bts;
            	        	        }


            	        	        FOLLOWPUSH(FOLLOW_integer_constant_in_time_type12583);
            	        	        sz=integer_constant(ctx);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruletime_typeEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return bts;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             szT = sz
            	        	            ; 
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	         MATCHT(GT, &FOLLOW_GT_in_time_type12595);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruletime_typeEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bts;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bts= sep::TypeManager::newClockTime(tsk, 
            	            bts
            	            , szT);
            	             
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3924:6: pt= time_type_domain
            	    {
            	        FOLLOWPUSH(FOLLOW_time_type_domain_in_time_type12611);
            	        pt=time_type_domain(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruletime_typeEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bts;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bts= sep::TypeManager::newClockTime(tsk, 
            	            pt
            	            , szT);
            	             
            	        }


            	    }
            	    break;

                }
            }

        }

    }

    // This is where rules clean up and exit
    //
    goto ruletime_typeEx; /* Prevent compiler warnings */
    ruletime_typeEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(146, time_type_StartIndex); }

    return bts;
}
/* $ANTLR end time_type */

/**
 * $ANTLR start time_clock_type
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3930:1: time_clock_type returns [ sep::TypeSpecifier bts ] : 'clock' ( LT_ ( 'time' | 'ctime' | 'dtime' |pt= time_type_domain ) ( COMMA sz= integer_constant )? GT | ( 'time' | 'ctime' | 'dtime' |pt= time_type_domain ) ( COMMA sz= integer_constant )? )? ;
 */
static sep::TypeSpecifier
time_clock_type(pfmlParser ctx)
{
    sep::TypeSpecifier bts;

    ANTLR3_UINT32 time_clock_type_StartIndex;

    sep::TypeSpecifier pt;
    #undef	RETURN_TYPE_pt
    #define	RETURN_TYPE_pt sep::TypeSpecifier

    sep::avm_size_t sz;
    #undef	RETURN_TYPE_sz
    #define	RETURN_TYPE_sz sep::avm_size_t

    /* Initialize rule variables
     */
    time_clock_type_StartIndex = INDEX();



    	int szT = 1;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(147)) )
    {
        {
        }



        return bts;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3935:2: ( 'clock' ( LT_ ( 'time' | 'ctime' | 'dtime' |pt= time_type_domain ) ( COMMA sz= integer_constant )? GT | ( 'time' | 'ctime' | 'dtime' |pt= time_type_domain ) ( COMMA sz= integer_constant )? )? )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3935:4: 'clock' ( LT_ ( 'time' | 'ctime' | 'dtime' |pt= time_type_domain ) ( COMMA sz= integer_constant )? GT | ( 'time' | 'ctime' | 'dtime' |pt= time_type_domain ) ( COMMA sz= integer_constant )? )?
        {
             MATCHT(259, &FOLLOW_259_in_time_clock_type12642);
            if  (HASEXCEPTION())
            {
                goto ruletime_clock_typeEx;
            }
            if (HASFAILED())
            {
                return bts;
            }


            if ( BACKTRACKING==0 )
            {
                 bts= sep::TypeManager::CLOCK;
                    
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3936:4: ( LT_ ( 'time' | 'ctime' | 'dtime' |pt= time_type_domain ) ( COMMA sz= integer_constant )? GT | ( 'time' | 'ctime' | 'dtime' |pt= time_type_domain ) ( COMMA sz= integer_constant )? )?
            {
                int alt353=3;
                switch ( LA(1) )
                {
                    case LT_:
                    	{
                    		alt353=1;
                    	}
                        break;
                    case 264:
                    case 270:
                    case 271:
                    case 283:
                    case 309:
                    case 310:
                    case 357:
                    case 358:
                    case 360:
                    case 392:
                    case 399:
                    case 400:
                    case 401:
                    case 402:
                    case 407:
                    case 408:
                    case 409:
                    	{
                    		alt353=2;
                    	}
                        break;
                }

                switch (alt353)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3936:6: LT_ ( 'time' | 'ctime' | 'dtime' |pt= time_type_domain ) ( COMMA sz= integer_constant )? GT
            	    {
            	         MATCHT(LT_, &FOLLOW_LT__in_time_clock_type12652);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruletime_clock_typeEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bts;
            	        }


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3937:3: ( 'time' | 'ctime' | 'dtime' |pt= time_type_domain )
            	        {
            	            int alt349=4;
            	            switch ( LA(1) )
            	            {
            	            case 392:
            	            	{
            	            		alt349=1;
            	            	}
            	                break;
            	            case 264:
            	            	{
            	            		alt349=2;
            	            	}
            	                break;
            	            case 271:
            	            	{
            	            		alt349=3;
            	            	}
            	                break;
            	            case 270:
            	            case 283:
            	            case 309:
            	            case 310:
            	            case 357:
            	            case 358:
            	            case 360:
            	            case 399:
            	            case 400:
            	            case 401:
            	            case 402:
            	            case 407:
            	            case 408:
            	            case 409:
            	            	{
            	            		alt349=4;
            	            	}
            	                break;

            	            default:
            	                if (BACKTRACKING>0)
            	                {
            	                    FAILEDFLAG = ANTLR3_TRUE;
            	                    return bts;
            	                }

            	                CONSTRUCTEX();
            	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
            	                EXCEPTION->message      = (void *)"";
            	                EXCEPTION->decisionNum  = 349;
            	                EXCEPTION->state        = 0;


            	                goto ruletime_clock_typeEx;

            	            }

            	            switch (alt349)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3937:5: 'time'
            	        	    {
            	        	         MATCHT(392, &FOLLOW_392_in_time_clock_type12658);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruletime_clock_typeEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return bts;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             bts= sep::TypeManager::TIME;
            	        	                        
            	        	        }


            	        	    }
            	        	    break;
            	        	case 2:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3938:5: 'ctime'
            	        	    {
            	        	         MATCHT(264, &FOLLOW_264_in_time_clock_type12668);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruletime_clock_typeEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return bts;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             bts= sep::TypeManager::CONTINUOUS_TIME;
            	        	             
            	        	        }


            	        	    }
            	        	    break;
            	        	case 3:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3939:5: 'dtime'
            	        	    {
            	        	         MATCHT(271, &FOLLOW_271_in_time_clock_type12677);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruletime_clock_typeEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return bts;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             bts= sep::TypeManager::DISCRETE_TIME;
            	        	               
            	        	        }


            	        	    }
            	        	    break;
            	        	case 4:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3940:5: pt= time_type_domain
            	        	    {
            	        	        FOLLOWPUSH(FOLLOW_time_type_domain_in_time_clock_type12688);
            	        	        pt=time_type_domain(ctx);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruletime_clock_typeEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return bts;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             bts= 
            	        	            pt
            	        	            ;
            	        	               
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3942:3: ( COMMA sz= integer_constant )?
            	        {
            	            int alt350=2;
            	            switch ( LA(1) )
            	            {
            	                case COMMA:
            	                	{
            	                		alt350=1;
            	                	}
            	                    break;
            	            }

            	            switch (alt350)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3942:5: COMMA sz= integer_constant
            	        	    {
            	        	         MATCHT(COMMA, &FOLLOW_COMMA_in_time_clock_type12700);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruletime_clock_typeEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return bts;
            	        	        }


            	        	        FOLLOWPUSH(FOLLOW_integer_constant_in_time_clock_type12705);
            	        	        sz=integer_constant(ctx);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruletime_clock_typeEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return bts;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             szT = sz
            	        	            ; 
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	         MATCHT(GT, &FOLLOW_GT_in_time_clock_type12717);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruletime_clock_typeEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bts;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bts= sep::TypeManager::newClockTime(sep::TYPE_CLOCK_SPECIFIER, 
            	            bts
            	            , szT);
            	             
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3946:6: ( 'time' | 'ctime' | 'dtime' |pt= time_type_domain ) ( COMMA sz= integer_constant )?
            	    {
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3946:6: ( 'time' | 'ctime' | 'dtime' |pt= time_type_domain )
            	        {
            	            int alt351=4;
            	            switch ( LA(1) )
            	            {
            	            case 392:
            	            	{
            	            		alt351=1;
            	            	}
            	                break;
            	            case 264:
            	            	{
            	            		alt351=2;
            	            	}
            	                break;
            	            case 271:
            	            	{
            	            		alt351=3;
            	            	}
            	                break;
            	            case 270:
            	            case 283:
            	            case 309:
            	            case 310:
            	            case 357:
            	            case 358:
            	            case 360:
            	            case 399:
            	            case 400:
            	            case 401:
            	            case 402:
            	            case 407:
            	            case 408:
            	            case 409:
            	            	{
            	            		alt351=4;
            	            	}
            	                break;

            	            default:
            	                if (BACKTRACKING>0)
            	                {
            	                    FAILEDFLAG = ANTLR3_TRUE;
            	                    return bts;
            	                }

            	                CONSTRUCTEX();
            	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
            	                EXCEPTION->message      = (void *)"";
            	                EXCEPTION->decisionNum  = 351;
            	                EXCEPTION->state        = 0;


            	                goto ruletime_clock_typeEx;

            	            }

            	            switch (alt351)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3946:8: 'time'
            	        	    {
            	        	         MATCHT(392, &FOLLOW_392_in_time_clock_type12733);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruletime_clock_typeEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return bts;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             bts= sep::TypeManager::TIME;
            	        	                        
            	        	        }


            	        	    }
            	        	    break;
            	        	case 2:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3947:5: 'ctime'
            	        	    {
            	        	         MATCHT(264, &FOLLOW_264_in_time_clock_type12743);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruletime_clock_typeEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return bts;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             bts= sep::TypeManager::CONTINUOUS_TIME;
            	        	             
            	        	        }


            	        	    }
            	        	    break;
            	        	case 3:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3948:5: 'dtime'
            	        	    {
            	        	         MATCHT(271, &FOLLOW_271_in_time_clock_type12752);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruletime_clock_typeEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return bts;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             bts= sep::TypeManager::DISCRETE_TIME;
            	        	               
            	        	        }


            	        	    }
            	        	    break;
            	        	case 4:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3949:5: pt= time_type_domain
            	        	    {
            	        	        FOLLOWPUSH(FOLLOW_time_type_domain_in_time_clock_type12763);
            	        	        pt=time_type_domain(ctx);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruletime_clock_typeEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return bts;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             bts= 
            	        	            pt
            	        	            ;
            	        	               
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3951:3: ( COMMA sz= integer_constant )?
            	        {
            	            int alt352=2;
            	            switch ( LA(1) )
            	            {
            	                case COMMA:
            	                	{
            	                		{
            	                		    int LA352_1 = LA(2);
            	                		    if ( (synpred609_fml(ctx)))
            	                		    {
            	                		        alt352=1;
            	                		    }
            	                		}
            	                	}
            	                    break;
            	            }

            	            switch (alt352)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3951:5: COMMA sz= integer_constant
            	        	    {
            	        	         MATCHT(COMMA, &FOLLOW_COMMA_in_time_clock_type12775);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruletime_clock_typeEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return bts;
            	        	        }


            	        	        FOLLOWPUSH(FOLLOW_integer_constant_in_time_clock_type12780);
            	        	        sz=integer_constant(ctx);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruletime_clock_typeEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return bts;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             szT = sz
            	        	            ; 
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	        if ( BACKTRACKING==0 )
            	        {
            	             bts= sep::TypeManager::newClockTime(sep::TYPE_CLOCK_SPECIFIER, 
            	            bts
            	            , szT);
            	             
            	        }


            	    }
            	    break;

                }
            }

        }

    }

    // This is where rules clean up and exit
    //
    goto ruletime_clock_typeEx; /* Prevent compiler warnings */
    ruletime_clock_typeEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(147, time_clock_type_StartIndex); }

    return bts;
}
/* $ANTLR end time_clock_type */

/**
 * $ANTLR start time_type_domain
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3957:1: time_type_domain returns [ sep::TypeSpecifier type ] : ( ( 'integer' | 'int' ) ( LT_ n= integer_constant GT )? | ( 'uinteger' | 'uint' ) ( LT_ n= integer_constant GT )? | ( 'rational' | 'rat' ) | ( 'urational' | 'urat' ) | 'float' | 'ufloat' | 'double' | 'udouble' | 'real' | 'ureal' );
 */
static sep::TypeSpecifier
time_type_domain(pfmlParser ctx)
{
    sep::TypeSpecifier type;

    ANTLR3_UINT32 time_type_domain_StartIndex;

    sep::avm_size_t n;
    #undef	RETURN_TYPE_n
    #define	RETURN_TYPE_n sep::avm_size_t

    /* Initialize rule variables
     */
    time_type_domain_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(148)) )
    {
        {
        }



        return type;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3959:2: ( ( 'integer' | 'int' ) ( LT_ n= integer_constant GT )? | ( 'uinteger' | 'uint' ) ( LT_ n= integer_constant GT )? | ( 'rational' | 'rat' ) | ( 'urational' | 'urat' ) | 'float' | 'ufloat' | 'double' | 'udouble' | 'real' | 'ureal' )

            ANTLR3_UINT32 alt356;

            alt356=10;

            switch ( LA(1) )
            {
            case 309:
            case 310:
            	{
            		alt356=1;
            	}
                break;
            case 401:
            case 402:
            	{
            		alt356=2;
            	}
                break;
            case 357:
            case 358:
            	{
            		alt356=3;
            	}
                break;
            case 407:
            case 408:
            	{
            		alt356=4;
            	}
                break;
            case 283:
            	{
            		alt356=5;
            	}
                break;
            case 400:
            	{
            		alt356=6;
            	}
                break;
            case 270:
            	{
            		alt356=7;
            	}
                break;
            case 399:
            	{
            		alt356=8;
            	}
                break;
            case 360:
            	{
            		alt356=9;
            	}
                break;
            case 409:
            	{
            		alt356=10;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return type;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 356;
                EXCEPTION->state        = 0;


                goto ruletime_type_domainEx;

            }

            switch (alt356)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3959:4: ( 'integer' | 'int' ) ( LT_ n= integer_constant GT )?
        	    {
        	        if ( ((LA(1) >= 309) && (LA(1) <= 310)) )
        	        {
        	            CONSUME();
        	            PERRORRECOVERY=ANTLR3_FALSE;
        	            FAILEDFLAG=ANTLR3_FALSE;

        	        }
        	        else
        	        {
        	            if (BACKTRACKING>0)
        	            {
        	                FAILEDFLAG = ANTLR3_TRUE;
        	                return type;
        	            }

        	            CONSTRUCTEX();
        	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
        	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
        	            EXCEPTION->expectingSet = NULL;

        	            goto ruletime_type_domainEx;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             type= sep::TypeManager::INTEGER;
        	             
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3960:4: ( LT_ n= integer_constant GT )?
        	        {
        	            int alt354=2;
        	            switch ( LA(1) )
        	            {
        	                case LT_:
        	                	{
        	                		alt354=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt354)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3960:6: LT_ n= integer_constant GT
        	        	    {
        	        	         MATCHT(LT_, &FOLLOW_LT__in_time_type_domain12834);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruletime_type_domainEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return type;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_integer_constant_in_time_type_domain12843);
        	        	        n=integer_constant(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruletime_type_domainEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return type;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             type= sep::TypeManager::getTypeInteger( 
        	        	            n
        	        	             );
        	        	             
        	        	        }


        	        	         MATCHT(GT, &FOLLOW_GT_in_time_type_domain12856);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruletime_type_domainEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return type;
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3965:4: ( 'uinteger' | 'uint' ) ( LT_ n= integer_constant GT )?
        	    {
        	        if ( ((LA(1) >= 401) && (LA(1) <= 402)) )
        	        {
        	            CONSUME();
        	            PERRORRECOVERY=ANTLR3_FALSE;
        	            FAILEDFLAG=ANTLR3_FALSE;

        	        }
        	        else
        	        {
        	            if (BACKTRACKING>0)
        	            {
        	                FAILEDFLAG = ANTLR3_TRUE;
        	                return type;
        	            }

        	            CONSTRUCTEX();
        	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
        	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
        	            EXCEPTION->expectingSet = NULL;

        	            goto ruletime_type_domainEx;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             type= sep::TypeManager::UINTEGER;
        	             
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3966:4: ( LT_ n= integer_constant GT )?
        	        {
        	            int alt355=2;
        	            switch ( LA(1) )
        	            {
        	                case LT_:
        	                	{
        	                		alt355=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt355)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3966:6: LT_ n= integer_constant GT
        	        	    {
        	        	         MATCHT(LT_, &FOLLOW_LT__in_time_type_domain12885);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruletime_type_domainEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return type;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_integer_constant_in_time_type_domain12894);
        	        	        n=integer_constant(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruletime_type_domainEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return type;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             type= sep::TypeManager::getTypeUInteger( 
        	        	            n
        	        	            );
        	        	             
        	        	        }


        	        	         MATCHT(GT, &FOLLOW_GT_in_time_type_domain12907);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruletime_type_domainEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return type;
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3971:4: ( 'rational' | 'rat' )
        	    {
        	        if ( ((LA(1) >= 357) && (LA(1) <= 358)) )
        	        {
        	            CONSUME();
        	            PERRORRECOVERY=ANTLR3_FALSE;
        	            FAILEDFLAG=ANTLR3_FALSE;

        	        }
        	        else
        	        {
        	            if (BACKTRACKING>0)
        	            {
        	                FAILEDFLAG = ANTLR3_TRUE;
        	                return type;
        	            }

        	            CONSTRUCTEX();
        	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
        	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
        	            EXCEPTION->expectingSet = NULL;

        	            goto ruletime_type_domainEx;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             type= sep::TypeManager::RATIONAL;
        	             
        	        }


        	    }
        	    break;
        	case 4:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3972:4: ( 'urational' | 'urat' )
        	    {
        	        if ( ((LA(1) >= 407) && (LA(1) <= 408)) )
        	        {
        	            CONSUME();
        	            PERRORRECOVERY=ANTLR3_FALSE;
        	            FAILEDFLAG=ANTLR3_FALSE;

        	        }
        	        else
        	        {
        	            if (BACKTRACKING>0)
        	            {
        	                FAILEDFLAG = ANTLR3_TRUE;
        	                return type;
        	            }

        	            CONSTRUCTEX();
        	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
        	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
        	            EXCEPTION->expectingSet = NULL;

        	            goto ruletime_type_domainEx;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             type= sep::TypeManager::URATIONAL;
        	             
        	        }


        	    }
        	    break;
        	case 5:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3974:4: 'float'
        	    {
        	         MATCHT(283, &FOLLOW_283_in_time_type_domain12951);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruletime_type_domainEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return type;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             type= sep::TypeManager::FLOAT;
        	             
        	        }


        	    }
        	    break;
        	case 6:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3975:4: 'ufloat'
        	    {
        	         MATCHT(400, &FOLLOW_400_in_time_type_domain12963);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruletime_type_domainEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return type;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             type= sep::TypeManager::UFLOAT;
        	             
        	        }


        	    }
        	    break;
        	case 7:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3977:4: 'double'
        	    {
        	         MATCHT(270, &FOLLOW_270_in_time_type_domain12975);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruletime_type_domainEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return type;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             type= sep::TypeManager::DOUBLE;
        	             
        	        }


        	    }
        	    break;
        	case 8:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3978:4: 'udouble'
        	    {
        	         MATCHT(399, &FOLLOW_399_in_time_type_domain12986);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruletime_type_domainEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return type;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             type= sep::TypeManager::UDOUBLE;
        	             
        	        }


        	    }
        	    break;
        	case 9:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3980:4: 'real'
        	    {
        	         MATCHT(360, &FOLLOW_360_in_time_type_domain12997);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruletime_type_domainEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return type;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             type= sep::TypeManager::REAL;
        	             
        	        }


        	    }
        	    break;
        	case 10:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3981:4: 'ureal'
        	    {
        	         MATCHT(409, &FOLLOW_409_in_time_type_domain13010);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruletime_type_domainEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return type;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             type= sep::TypeManager::UREAL;
        	             
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruletime_type_domainEx; /* Prevent compiler warnings */
    ruletime_type_domainEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(148, time_type_domain_StartIndex); }

    return type;
}
/* $ANTLR end time_type_domain */

/**
 * $ANTLR start section_model_of_computation
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4045:1: section_model_of_computation[ sep::Machine * container ] : '@moc:' ;
 */
static void
section_model_of_computation(pfmlParser ctx, sep::Machine * container)
{
    ANTLR3_UINT32 section_model_of_computation_StartIndex;

    /* Initialize rule variables
     */
    section_model_of_computation_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(149)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4046:2: ( '@moc:' )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4046:4: '@moc:'
        {
             MATCHT(202, &FOLLOW_202_in_section_model_of_computation13042);
            if  (HASEXCEPTION())
            {
                goto rulesection_model_of_computationEx;
            }
            if (HASFAILED())
            {
                return ;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto rulesection_model_of_computationEx; /* Prevent compiler warnings */
    rulesection_model_of_computationEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(149, section_model_of_computation_StartIndex); }

    return ;
}
/* $ANTLR end section_model_of_computation */

/**
 * $ANTLR start section_routine
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4054:1: section_routine[ sep::Machine * container ] : ( '@routine:' | '@macro:' ) ( def_routine_model[ container , mdfr , spcfr ] )* ;
 */
static void
section_routine(pfmlParser ctx, sep::Machine * container)
{
    ANTLR3_UINT32 section_routine_StartIndex;

    /* Initialize rule variables
     */
    section_routine_StartIndex = INDEX();



    	 sep::Modifier mdfr;

    	sep::Specifier spcfr( sep::Specifier::DESIGN_MODEL_KIND );

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(150)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4060:2: ( ( '@routine:' | '@macro:' ) ( def_routine_model[ container , mdfr , spcfr ] )* )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4060:4: ( '@routine:' | '@macro:' ) ( def_routine_model[ container , mdfr , spcfr ] )*
        {
            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4060:4: ( '@routine:' | '@macro:' )
            {
                int alt357=2;
                switch ( LA(1) )
                {
                case 222:
                	{
                		alt357=1;
                	}
                    break;
                case 201:
                	{
                		alt357=2;
                	}
                    break;

                default:
                    if (BACKTRACKING>0)
                    {
                        FAILEDFLAG = ANTLR3_TRUE;
                        return ;
                    }

                    CONSTRUCTEX();
                    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                    EXCEPTION->message      = (void *)"";
                    EXCEPTION->decisionNum  = 357;
                    EXCEPTION->state        = 0;


                    goto rulesection_routineEx;

                }

                switch (alt357)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4060:6: '@routine:'
            	    {
            	         MATCHT(222, &FOLLOW_222_in_section_routine13066);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulesection_routineEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4061:6: '@macro:'
            	    {
            	         MATCHT(201, &FOLLOW_201_in_section_routine13073);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulesection_routineEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             mdfr.setNatureMacro(); 
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4063:4: ( def_routine_model[ container , mdfr , spcfr ] )*

            for (;;)
            {
                int alt358=2;
                switch ( LA(1) )
                {
                case 318:
                case 367:
                	{
                		alt358=1;
                	}
                    break;

                }

                switch (alt358)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4063:6: def_routine_model[ container , mdfr , spcfr ]
            	    {
            	        FOLLOWPUSH(FOLLOW_def_routine_model_in_section_routine13088);
            	        def_routine_model(ctx, container, mdfr, spcfr);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulesection_routineEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

            	default:
            	    goto loop358;	/* break out of the loop */
            	    break;
                }
            }
            loop358: ; /* Jump out to here if this rule does not match */


        }

    }

    // This is where rules clean up and exit
    //
    goto rulesection_routineEx; /* Prevent compiler warnings */
    rulesection_routineEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(150, section_routine_StartIndex); }

    return ;
}
/* $ANTLR end section_routine */

/**
 * $ANTLR start def_routine_model
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4066:1: def_routine_model[ sep::Machine * container ,\n\t\tsep::Modifier mdfr , sep::Specifier spcfr ] : ( 'routine' | 'macro' ( 'routine' )? ) def_routine_model_impl[ container , mdfr , spcfr ] ;
 */
static void
def_routine_model(pfmlParser ctx, sep::Machine * container, sep::Modifier mdfr, sep::Specifier spcfr)
{
    ANTLR3_UINT32 def_routine_model_StartIndex;

    /* Initialize rule variables
     */
    def_routine_model_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(151)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4069:2: ( ( 'routine' | 'macro' ( 'routine' )? ) def_routine_model_impl[ container , mdfr , spcfr ] )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4069:4: ( 'routine' | 'macro' ( 'routine' )? ) def_routine_model_impl[ container , mdfr , spcfr ]
        {
            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4069:4: ( 'routine' | 'macro' ( 'routine' )? )
            {
                int alt360=2;
                switch ( LA(1) )
                {
                case 367:
                	{
                		alt360=1;
                	}
                    break;
                case 318:
                	{
                		alt360=2;
                	}
                    break;

                default:
                    if (BACKTRACKING>0)
                    {
                        FAILEDFLAG = ANTLR3_TRUE;
                        return ;
                    }

                    CONSTRUCTEX();
                    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                    EXCEPTION->message      = (void *)"";
                    EXCEPTION->decisionNum  = 360;
                    EXCEPTION->state        = 0;


                    goto ruledef_routine_modelEx;

                }

                switch (alt360)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4069:5: 'routine'
            	    {
            	         MATCHT(367, &FOLLOW_367_in_def_routine_model13107);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_routine_modelEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4070:6: 'macro' ( 'routine' )?
            	    {
            	         MATCHT(318, &FOLLOW_318_in_def_routine_model13114);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_routine_modelEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             mdfr.setNatureMacro(); 
            	        }


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4071:6: ( 'routine' )?
            	        {
            	            int alt359=2;
            	            switch ( LA(1) )
            	            {
            	                case 367:
            	                	{
            	                		alt359=1;
            	                	}
            	                    break;
            	            }

            	            switch (alt359)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4071:8: 'routine'
            	        	    {
            	        	         MATCHT(367, &FOLLOW_367_in_def_routine_model13127);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledef_routine_modelEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	    }
            	    break;

                }
            }

            FOLLOWPUSH(FOLLOW_def_routine_model_impl_in_def_routine_model13141);
            def_routine_model_impl(ctx, container, mdfr, spcfr);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruledef_routine_modelEx;
            }
            if (HASFAILED())
            {
                return ;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_routine_modelEx; /* Prevent compiler warnings */
    ruledef_routine_modelEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(151, def_routine_model_StartIndex); }

    return ;
}
/* $ANTLR end def_routine_model */

/**
 * $ANTLR start def_routine_model_impl
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4077:1: def_routine_model_impl[ sep::Machine * container ,\n\t\tsep::Modifier mdfr , sep::Specifier spcfr ] : ID ( def_routine_parameters[ *_CPR_ ] )? ( ( '-->' | 'returns:' ) def_routine_returns[ *_CPR_ ] )? bs= block_statement ;
 */
static void
def_routine_model_impl(pfmlParser ctx, sep::Machine * container, sep::Modifier mdfr, sep::Specifier spcfr)
{
    ANTLR3_UINT32 def_routine_model_impl_StartIndex;

    pANTLR3_COMMON_TOKEN    ID10;
    sep::BFCode bs;
    #undef	RETURN_TYPE_bs
    #define	RETURN_TYPE_bs sep::BFCode

    /* Initialize rule variables
     */
    def_routine_model_impl_StartIndex = INDEX();



    	SAVE_RULE_BEGIN_LOCATION;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(152)) )
    {
        {

            	SET_RULE_LOCATION( _CPR_ );

            	POP_CTX;

        }
        {
        }



        return ;
    }

    ID10       = NULL;

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4088:2: ( ID ( def_routine_parameters[ *_CPR_ ] )? ( ( '-->' | 'returns:' ) def_routine_returns[ *_CPR_ ] )? bs= block_statement )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4088:4: ID ( def_routine_parameters[ *_CPR_ ] )? ( ( '-->' | 'returns:' ) def_routine_returns[ *_CPR_ ] )? bs= block_statement
        {
            ID10 = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_def_routine_model_impl13165);
            if  (HASEXCEPTION())
            {
                goto ruledef_routine_model_implEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            if ( BACKTRACKING==0 )
            {

                	  	PUSH_CTX_CPR( sep::Routine::newDefine(
                	  			container, mdfr, spcfr, STR((ID10->getText(ID10))->chars)) );

                		container->saveOwnedElement( _CPR_ );
                	  
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4096:4: ( def_routine_parameters[ *_CPR_ ] )?
            {
                int alt361=2;
                switch ( LA(1) )
                {
                    case LPAREN:
                    	{
                    		alt361=1;
                    	}
                        break;
                }

                switch (alt361)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4096:6: def_routine_parameters[ *_CPR_ ]
            	    {
            	        FOLLOWPUSH(FOLLOW_def_routine_parameters_in_def_routine_model_impl13178);
            	        def_routine_parameters(ctx, *_CPR_);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_routine_model_implEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4097:4: ( ( '-->' | 'returns:' ) def_routine_returns[ *_CPR_ ] )?
            {
                int alt362=2;
                switch ( LA(1) )
                {
                    case 163:
                    case 365:
                    	{
                    		alt362=1;
                    	}
                        break;
                }

                switch (alt362)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4097:6: ( '-->' | 'returns:' ) def_routine_returns[ *_CPR_ ]
            	    {
            	        if ( LA(1) == 163 || LA(1) == 365 )
            	        {
            	            CONSUME();
            	            PERRORRECOVERY=ANTLR3_FALSE;
            	            FAILEDFLAG=ANTLR3_FALSE;

            	        }
            	        else
            	        {
            	            if (BACKTRACKING>0)
            	            {
            	                FAILEDFLAG = ANTLR3_TRUE;
            	                return ;
            	            }

            	            CONSTRUCTEX();
            	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
            	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
            	            EXCEPTION->expectingSet = NULL;

            	            goto ruledef_routine_model_implEx;
            	        }


            	        FOLLOWPUSH(FOLLOW_def_routine_returns_in_def_routine_model_impl13200);
            	        def_routine_returns(ctx, *_CPR_);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_routine_model_implEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

                }
            }

            FOLLOWPUSH(FOLLOW_block_statement_in_def_routine_model_impl13212);
            bs=block_statement(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruledef_routine_model_implEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            if ( BACKTRACKING==0 )
            {
                 _CPR_->setCode(bs
                ); 
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_routine_model_implEx; /* Prevent compiler warnings */
    ruledef_routine_model_implEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
            else
            {
                {

                    	SET_RULE_LOCATION( _CPR_ );

                    	POP_CTX;

                }
            }


    if ( BACKTRACKING>0 ) { MEMOIZE(152, def_routine_model_impl_StartIndex); }

    return ;
}
/* $ANTLR end def_routine_model_impl */

/**
 * $ANTLR start def_routine_parameters
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4103:1: def_routine_parameters[ sep::Routine & routine ] : LPAREN ( def_routine_param_atom[ routine , offset++ ] ( COMMA def_routine_param_atom[ routine , offset++ ] )* )? RPAREN ;
 */
static void
def_routine_parameters(pfmlParser ctx, sep::Routine & routine)
{
    ANTLR3_UINT32 def_routine_parameters_StartIndex;

    /* Initialize rule variables
     */
    def_routine_parameters_StartIndex = INDEX();



    	sep::avm_size_t offset = 0;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(153)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4107:2: ( LPAREN ( def_routine_param_atom[ routine , offset++ ] ( COMMA def_routine_param_atom[ routine , offset++ ] )* )? RPAREN )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4107:4: LPAREN ( def_routine_param_atom[ routine , offset++ ] ( COMMA def_routine_param_atom[ routine , offset++ ] )* )? RPAREN
        {
             MATCHT(LPAREN, &FOLLOW_LPAREN_in_def_routine_parameters13233);
            if  (HASEXCEPTION())
            {
                goto ruledef_routine_parametersEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4108:7: ( def_routine_param_atom[ routine , offset++ ] ( COMMA def_routine_param_atom[ routine , offset++ ] )* )?
            {
                int alt364=2;
                switch ( LA(1) )
                {
                    case ASSIGN_REF:
                    case BAND:
                    case ID:
                    case LTE:
                    case 164:
                    case 166:
                    case 241:
                    case 242:
                    case 243:
                    case 245:
                    case 246:
                    case 249:
                    case 254:
                    case 255:
                    case 259:
                    case 261:
                    case 262:
                    case 264:
                    case 270:
                    case 271:
                    case 281:
                    case 282:
                    case 283:
                    case 295:
                    case 298:
                    case 305:
                    case 309:
                    case 310:
                    case 311:
                    case 315:
                    case 316:
                    case 317:
                    case 318:
                    case 320:
                    case 325:
                    case 326:
                    case 329:
                    case 333:
                    case 335:
                    case 341:
                    case 344:
                    case 345:
                    case 346:
                    case 357:
                    case 358:
                    case 360:
                    case 361:
                    case 364:
                    case 370:
                    case 373:
                    case 374:
                    case 387:
                    case 392:
                    case 399:
                    case 400:
                    case 401:
                    case 402:
                    case 405:
                    case 407:
                    case 408:
                    case 409:
                    case 412:
                    	{
                    		alt364=1;
                    	}
                        break;
                }

                switch (alt364)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4108:9: def_routine_param_atom[ routine , offset++ ] ( COMMA def_routine_param_atom[ routine , offset++ ] )*
            	    {
            	        FOLLOWPUSH(FOLLOW_def_routine_param_atom_in_def_routine_parameters13243);
            	        def_routine_param_atom(ctx, routine, offset++);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_routine_parametersEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4110:7: ( COMMA def_routine_param_atom[ routine , offset++ ] )*

            	        for (;;)
            	        {
            	            int alt363=2;
            	            switch ( LA(1) )
            	            {
            	            case COMMA:
            	            	{
            	            		alt363=1;
            	            	}
            	                break;

            	            }

            	            switch (alt363)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4110:9: COMMA def_routine_param_atom[ routine , offset++ ]
            	        	    {
            	        	         MATCHT(COMMA, &FOLLOW_COMMA_in_def_routine_parameters13255);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledef_routine_parametersEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	        FOLLOWPUSH(FOLLOW_def_routine_param_atom_in_def_routine_parameters13257);
            	        	        def_routine_param_atom(ctx, routine, offset++);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledef_routine_parametersEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	    }
            	        	    break;

            	        	default:
            	        	    goto loop363;	/* break out of the loop */
            	        	    break;
            	            }
            	        }
            	        loop363: ; /* Jump out to here if this rule does not match */


            	    }
            	    break;

                }
            }

             MATCHT(RPAREN, &FOLLOW_RPAREN_in_def_routine_parameters13269);
            if  (HASEXCEPTION())
            {
                goto ruledef_routine_parametersEx;
            }
            if (HASFAILED())
            {
                return ;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_routine_parametersEx; /* Prevent compiler warnings */
    ruledef_routine_parametersEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(153, def_routine_parameters_StartIndex); }

    return ;
}
/* $ANTLR end def_routine_parameters */

/**
 * $ANTLR start def_routine_param_atom
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4114:1: def_routine_param_atom[ sep::Routine & routine , sep::avm_size_t offset ] : ( ( ( modifier_param )? type_var ID )=> (m= modifier_param )? tv= type_var id= ID |id= ID ) (iv= initial_value )? ;
 */
static void
def_routine_param_atom(pfmlParser ctx, sep::Routine & routine, sep::avm_size_t offset)
{
    ANTLR3_UINT32 def_routine_param_atom_StartIndex;

    pANTLR3_COMMON_TOKEN    id;
    sep::Modifier m;
    #undef	RETURN_TYPE_m
    #define	RETURN_TYPE_m sep::Modifier

    sep::BF tv;
    #undef	RETURN_TYPE_tv
    #define	RETURN_TYPE_tv sep::BF

    sep::BF iv;
    #undef	RETURN_TYPE_iv
    #define	RETURN_TYPE_iv sep::BF

    /* Initialize rule variables
     */
    def_routine_param_atom_StartIndex = INDEX();



    	sep::BF variable;
    	sep::Variable * param;
    	sep::Machine * machine = routine.getContainerMachine();
    	sep::BF paramT = sep::TypeManager::UNIVERSAL;
    	sep::Modifier mdfr = sep::Modifier::PROPERTY_PARAMETER_MODIFIER;
    	mdfr.addFeatureKind( sep::Modifier::FEATURE_TRANSIENT_KIND );

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(154)) )
    {
        {
        }



        return ;
    }

    id       = NULL;

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4124:2: ( ( ( ( modifier_param )? type_var ID )=> (m= modifier_param )? tv= type_var id= ID |id= ID ) (iv= initial_value )? )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4124:4: ( ( ( modifier_param )? type_var ID )=> (m= modifier_param )? tv= type_var id= ID |id= ID ) (iv= initial_value )?
        {
            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4124:4: ( ( ( modifier_param )? type_var ID )=> (m= modifier_param )? tv= type_var id= ID |id= ID )
            {
                int alt366=2;
                {
                    int LA366_0 = LA(1);
                    if ( (synpred636_fml(ctx)) && (LA366_0 == 164 || LA366_0 == 295 || LA366_0 == 305))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == ASSIGN_REF || LA366_0 == 335 || LA366_0 == 341))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == 166 || LA366_0 == 298))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == LTE || LA366_0 == 364))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == 282))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == 262))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == BAND || LA366_0 == 361))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == 318))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == 243))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (((LA366_0 >= 245) && (LA366_0 <= 246))))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (((LA366_0 >= 309) && (LA366_0 <= 310))))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (((LA366_0 >= 401) && (LA366_0 <= 402))))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (((LA366_0 >= 345) && (LA366_0 <= 346))))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (((LA366_0 >= 357) && (LA366_0 <= 358))))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (((LA366_0 >= 407) && (LA366_0 <= 408))))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == 283))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == 400))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == 270))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == 399))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == 360))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == 409))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == 259))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == 392))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == 264))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == 271))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == 254))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == 255))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == 387))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == 333))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == 242))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == 344))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == 249))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == 320))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == 374))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == 261))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == 317))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == 405))
                    {
                        alt366=1;
                    }
                    else if ( (LA366_0 == ID))
                    {
                        {
                            int LA366_38 = LA(2);
                            if ( (synpred636_fml(ctx)))
                            {
                                alt366=1;
                            }
                            else if ( (ANTLR3_TRUE))
                            {
                                alt366=2;
                            }
                            else
                            {
                                if (BACKTRACKING>0)
                                {
                                    FAILEDFLAG = ANTLR3_TRUE;
                                    return ;
                                }


                                CONSTRUCTEX();
                                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                                EXCEPTION->message      = (void *)"";
                                EXCEPTION->decisionNum  = 366;
                                EXCEPTION->state        = 38;


                                goto ruledef_routine_param_atomEx;

                            }
                        }
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == 241))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == 412))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == 370))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == 316))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == 281))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == 315))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == 325))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == 326))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == 373))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == 329))
                    {
                        alt366=1;
                    }
                    else if ( (synpred636_fml(ctx)) && (LA366_0 == 311))
                    {
                        alt366=1;
                    }
                    else
                    {
                        if (BACKTRACKING>0)
                        {
                            FAILEDFLAG = ANTLR3_TRUE;
                            return ;
                        }


                        CONSTRUCTEX();
                        EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                        EXCEPTION->message      = (void *)"";
                        EXCEPTION->decisionNum  = 366;
                        EXCEPTION->state        = 0;


                        goto ruledef_routine_param_atomEx;

                    }
                }
                switch (alt366)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4124:6: ( ( modifier_param )? type_var ID )=> (m= modifier_param )? tv= type_var id= ID
            	    {
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4125:6: (m= modifier_param )?
            	        {
            	            int alt365=2;
            	            switch ( LA(1) )
            	            {
            	                case ASSIGN_REF:
            	                case BAND:
            	                case LTE:
            	                case 164:
            	                case 166:
            	                case 243:
            	                case 262:
            	                case 282:
            	                case 295:
            	                case 298:
            	                case 305:
            	                case 318:
            	                case 335:
            	                case 341:
            	                case 361:
            	                case 364:
            	                	{
            	                		alt365=1;
            	                	}
            	                    break;
            	            }

            	            switch (alt365)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4125:8: m= modifier_param
            	        	    {
            	        	        FOLLOWPUSH(FOLLOW_modifier_param_in_def_routine_param_atom13312);
            	        	        m=modifier_param(ctx);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledef_routine_param_atomEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             mdfr.override_ifdef( m
            	        	             ); 
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	        FOLLOWPUSH(FOLLOW_type_var_in_def_routine_param_atom13326);
            	        tv=type_var(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_routine_param_atomEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             paramT = tv
            	            ; 
            	        }


            	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_def_routine_param_atom13333);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_routine_param_atomEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4128:6: id= ID
            	    {
            	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_def_routine_param_atom13343);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_routine_param_atomEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {

            	            	    	variable = sep::ParserUtil::getVariable(STR((id->getText(id))->chars) , 1);
            	            	    	if( variable.invalid() )
            	            	    	{
            	            	    		sep::ParserUtil::avm_syntax_error(
            	            	    			"def_routine_param_atom:> " + routine.str(), (id->getLine(id)) )
            	            	    				<< "Unfound machine param's variable < "
            	              						<< STR((id->getText(id))->chars)
            	              						<< " > in routine header < " << " >"
            	              						<< sep::ParserUtil::SYNTAX_ERROR_EOL;
            	            	    	}
            	            	    
            	        }


            	    }
            	    break;

                }
            }

            if ( BACKTRACKING==0 )
            {

                	    if( variable.valid() )
                	    {
                		  	routine.saveParameter( param = new sep::Variable( &routine,
                		  			sep::Modifier::PROPERTY_MACRO_MODIFIER,
                		  			variable.to_ptr< sep::Variable >()->getType(),
                		  			STR((id->getText(id))->chars)) );
                		  	param->setOffset( offset );
                	    	param->setBinding( variable );
                	    }
                	    else
                	    {
                	    	param = new sep::Variable(&routine,
                	    			mdfr, 
                tv
                , STR((id->getText(id))->chars));
                		  	param->setOffset( offset );

                		  	// Only for Routine design as PROTOTYPE a.k.a. primitive routine
                		  	if( routine.getSpecifier().isDesignPrototypeStatic() )
                		  	{
                				routine.appendParameter(
                		  			machine->getPropertyPart().saveOwnedVariable( param ) );
                			}
                			else
                			{
                				routine.saveParameter( param );
                			}
                	    }
                	  
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4170:4: (iv= initial_value )?
            {
                int alt367=2;
                switch ( LA(1) )
                {
                    case ASSIGN:
                    case LPAREN:
                    	{
                    		alt367=1;
                    	}
                        break;
                }

                switch (alt367)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4170:6: iv= initial_value
            	    {
            	        FOLLOWPUSH(FOLLOW_initial_value_in_def_routine_param_atom13369);
            	        iv=initial_value(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_routine_param_atomEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             param->setValue(iv
            	            ); 
            	        }


            	    }
            	    break;

                }
            }

        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_routine_param_atomEx; /* Prevent compiler warnings */
    ruledef_routine_param_atomEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(154, def_routine_param_atom_StartIndex); }

    return ;
}
/* $ANTLR end def_routine_param_atom */

/**
 * $ANTLR start def_routine_returns
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4174:1: def_routine_returns[ sep::Routine & routine ] : ( LPAREN def_routine_returns_atom[ routine , offset++ ] ( COMMA def_routine_returns_atom[ routine , offset++ ] )* RPAREN |tv= type_var (iv= initial_value )? );
 */
static void
def_routine_returns(pfmlParser ctx, sep::Routine & routine)
{
    ANTLR3_UINT32 def_routine_returns_StartIndex;

    sep::BF tv;
    #undef	RETURN_TYPE_tv
    #define	RETURN_TYPE_tv sep::BF

    sep::BF iv;
    #undef	RETURN_TYPE_iv
    #define	RETURN_TYPE_iv sep::BF

    /* Initialize rule variables
     */
    def_routine_returns_StartIndex = INDEX();



    	sep::BF value;
    	sep::avm_size_t offset = 0;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(155)) )
    {
        {
        }



        return ;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4179:2: ( LPAREN def_routine_returns_atom[ routine , offset++ ] ( COMMA def_routine_returns_atom[ routine , offset++ ] )* RPAREN |tv= type_var (iv= initial_value )? )

            ANTLR3_UINT32 alt370;

            alt370=2;

            switch ( LA(1) )
            {
            case LPAREN:
            	{
            		alt370=1;
            	}
                break;
            case ID:
            case 241:
            case 242:
            case 245:
            case 246:
            case 249:
            case 254:
            case 255:
            case 259:
            case 261:
            case 264:
            case 270:
            case 271:
            case 281:
            case 283:
            case 309:
            case 310:
            case 311:
            case 315:
            case 316:
            case 317:
            case 320:
            case 325:
            case 326:
            case 329:
            case 333:
            case 344:
            case 345:
            case 346:
            case 357:
            case 358:
            case 360:
            case 370:
            case 373:
            case 374:
            case 387:
            case 392:
            case 399:
            case 400:
            case 401:
            case 402:
            case 405:
            case 407:
            case 408:
            case 409:
            case 412:
            	{
            		alt370=2;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 370;
                EXCEPTION->state        = 0;


                goto ruledef_routine_returnsEx;

            }

            switch (alt370)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4179:4: LPAREN def_routine_returns_atom[ routine , offset++ ] ( COMMA def_routine_returns_atom[ routine , offset++ ] )* RPAREN
        	    {
        	         MATCHT(LPAREN, &FOLLOW_LPAREN_in_def_routine_returns13393);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_routine_returnsEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_def_routine_returns_atom_in_def_routine_returns13401);
        	        def_routine_returns_atom(ctx, routine, offset++);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_routine_returnsEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4182:7: ( COMMA def_routine_returns_atom[ routine , offset++ ] )*

        	        for (;;)
        	        {
        	            int alt368=2;
        	            switch ( LA(1) )
        	            {
        	            case COMMA:
        	            	{
        	            		alt368=1;
        	            	}
        	                break;

        	            }

        	            switch (alt368)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4182:9: COMMA def_routine_returns_atom[ routine , offset++ ]
        	        	    {
        	        	         MATCHT(COMMA, &FOLLOW_COMMA_in_def_routine_returns13413);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_routine_returnsEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_def_routine_returns_atom_in_def_routine_returns13415);
        	        	        def_routine_returns_atom(ctx, routine, offset++);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_routine_returnsEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;

        	        	default:
        	        	    goto loop368;	/* break out of the loop */
        	        	    break;
        	            }
        	        }
        	        loop368: ; /* Jump out to here if this rule does not match */


        	         MATCHT(RPAREN, &FOLLOW_RPAREN_in_def_routine_returns13424);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_routine_returnsEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4185:4: tv= type_var (iv= initial_value )?
        	    {
        	        FOLLOWPUSH(FOLLOW_type_var_in_def_routine_returns13432);
        	        tv=type_var(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_routine_returnsEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4185:16: (iv= initial_value )?
        	        {
        	            int alt369=2;
        	            switch ( LA(1) )
        	            {
        	                case ASSIGN:
        	                case LPAREN:
        	                	{
        	                		alt369=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt369)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4185:18: iv= initial_value
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_initial_value_in_def_routine_returns13438);
        	        	        iv=initial_value(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruledef_routine_returnsEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             value = iv
        	        	            ; 
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	        if ( BACKTRACKING==0 )
        	        {

        	            		sep::Variable * variable;
        	            		routine.saveReturn( variable = new sep::Variable( &routine,
        	            				sep::Modifier::PROPERTY_RETURN_PARAMETER_MODIFIER,
        	            				tv
        	            , "#0", value) );
        	            		variable->setOffset( offset );
        	            	
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruledef_routine_returnsEx; /* Prevent compiler warnings */
    ruledef_routine_returnsEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(155, def_routine_returns_StartIndex); }

    return ;
}
/* $ANTLR end def_routine_returns */

/**
 * $ANTLR start def_routine_returns_atom
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4196:1: def_routine_returns_atom[ sep::Routine & routine , sep::avm_size_t offset ] : ( ( ( modifier_param )? type_var ID )=> (m= modifier_param )? tv= type_var id= ID |id= ID ) (iv= initial_value )? ;
 */
static void
def_routine_returns_atom(pfmlParser ctx, sep::Routine & routine, sep::avm_size_t offset)
{
    ANTLR3_UINT32 def_routine_returns_atom_StartIndex;

    pANTLR3_COMMON_TOKEN    id;
    sep::Modifier m;
    #undef	RETURN_TYPE_m
    #define	RETURN_TYPE_m sep::Modifier

    sep::BF tv;
    #undef	RETURN_TYPE_tv
    #define	RETURN_TYPE_tv sep::BF

    sep::BF iv;
    #undef	RETURN_TYPE_iv
    #define	RETURN_TYPE_iv sep::BF

    /* Initialize rule variables
     */
    def_routine_returns_atom_StartIndex = INDEX();



    	sep::BF variable;
    	sep::Variable * param;
    	sep::Machine * machine = routine.getContainerMachine();
    	sep::BF paramT = sep::TypeManager::UNIVERSAL;
    	sep::Modifier mdfr = sep::Modifier::PROPERTY_RETURN_PARAMETER_MODIFIER;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(156)) )
    {
        {
        }



        return ;
    }

    id       = NULL;

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4205:2: ( ( ( ( modifier_param )? type_var ID )=> (m= modifier_param )? tv= type_var id= ID |id= ID ) (iv= initial_value )? )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4205:4: ( ( ( modifier_param )? type_var ID )=> (m= modifier_param )? tv= type_var id= ID |id= ID ) (iv= initial_value )?
        {
            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4205:4: ( ( ( modifier_param )? type_var ID )=> (m= modifier_param )? tv= type_var id= ID |id= ID )
            {
                int alt372=2;
                {
                    int LA372_0 = LA(1);
                    if ( (synpred643_fml(ctx)) && (LA372_0 == 164 || LA372_0 == 295 || LA372_0 == 305))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == ASSIGN_REF || LA372_0 == 335 || LA372_0 == 341))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == 166 || LA372_0 == 298))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == LTE || LA372_0 == 364))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == 282))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == 262))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == BAND || LA372_0 == 361))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == 318))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == 243))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (((LA372_0 >= 245) && (LA372_0 <= 246))))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (((LA372_0 >= 309) && (LA372_0 <= 310))))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (((LA372_0 >= 401) && (LA372_0 <= 402))))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (((LA372_0 >= 345) && (LA372_0 <= 346))))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (((LA372_0 >= 357) && (LA372_0 <= 358))))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (((LA372_0 >= 407) && (LA372_0 <= 408))))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == 283))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == 400))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == 270))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == 399))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == 360))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == 409))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == 259))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == 392))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == 264))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == 271))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == 254))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == 255))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == 387))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == 333))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == 242))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == 344))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == 249))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == 320))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == 374))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == 261))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == 317))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == 405))
                    {
                        alt372=1;
                    }
                    else if ( (LA372_0 == ID))
                    {
                        {
                            int LA372_38 = LA(2);
                            if ( (synpred643_fml(ctx)))
                            {
                                alt372=1;
                            }
                            else if ( (ANTLR3_TRUE))
                            {
                                alt372=2;
                            }
                            else
                            {
                                if (BACKTRACKING>0)
                                {
                                    FAILEDFLAG = ANTLR3_TRUE;
                                    return ;
                                }


                                CONSTRUCTEX();
                                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                                EXCEPTION->message      = (void *)"";
                                EXCEPTION->decisionNum  = 372;
                                EXCEPTION->state        = 38;


                                goto ruledef_routine_returns_atomEx;

                            }
                        }
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == 241))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == 412))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == 370))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == 316))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == 281))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == 315))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == 325))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == 326))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == 373))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == 329))
                    {
                        alt372=1;
                    }
                    else if ( (synpred643_fml(ctx)) && (LA372_0 == 311))
                    {
                        alt372=1;
                    }
                    else
                    {
                        if (BACKTRACKING>0)
                        {
                            FAILEDFLAG = ANTLR3_TRUE;
                            return ;
                        }


                        CONSTRUCTEX();
                        EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                        EXCEPTION->message      = (void *)"";
                        EXCEPTION->decisionNum  = 372;
                        EXCEPTION->state        = 0;


                        goto ruledef_routine_returns_atomEx;

                    }
                }
                switch (alt372)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4205:6: ( ( modifier_param )? type_var ID )=> (m= modifier_param )? tv= type_var id= ID
            	    {
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4206:6: (m= modifier_param )?
            	        {
            	            int alt371=2;
            	            switch ( LA(1) )
            	            {
            	                case ASSIGN_REF:
            	                case BAND:
            	                case LTE:
            	                case 164:
            	                case 166:
            	                case 243:
            	                case 262:
            	                case 282:
            	                case 295:
            	                case 298:
            	                case 305:
            	                case 318:
            	                case 335:
            	                case 341:
            	                case 361:
            	                case 364:
            	                	{
            	                		alt371=1;
            	                	}
            	                    break;
            	            }

            	            switch (alt371)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4206:8: m= modifier_param
            	        	    {
            	        	        FOLLOWPUSH(FOLLOW_modifier_param_in_def_routine_returns_atom13491);
            	        	        m=modifier_param(ctx);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledef_routine_returns_atomEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             mdfr.override_ifdef( m
            	        	             ); 
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	        FOLLOWPUSH(FOLLOW_type_var_in_def_routine_returns_atom13505);
            	        tv=type_var(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_routine_returns_atomEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             paramT = tv
            	            ; 
            	        }


            	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_def_routine_returns_atom13512);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_routine_returns_atomEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4209:6: id= ID
            	    {
            	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_def_routine_returns_atom13522);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_routine_returns_atomEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {

            	            	    	variable = sep::ParserUtil::getVariable(STR((id->getText(id))->chars) , 1);
            	            	    	if( variable.invalid() )
            	            	    	{
            	            	    		sep::ParserUtil::avm_syntax_error(
            	            	    			"def_routine_returns_atom:> " + routine.str(), (id->getLine(id)) )
            	            	    				<< "Unfound machine return's variable < "
            	            	  					<< STR((id->getText(id))->chars)
            	            	  					<< " > in routine header < " << " >"
            	            	  					<< sep::ParserUtil::SYNTAX_ERROR_EOL;
            	            	    	}
            	            	    
            	        }


            	    }
            	    break;

                }
            }

            if ( BACKTRACKING==0 )
            {

                	    if( variable.valid() )
                	    {
                		  	routine.saveReturn( param = new sep::Variable( &routine,
                		  			sep::Modifier::PROPERTY_MACRO_MODIFIER,
                		  			variable.to_ptr< sep::Variable >()->getType(),
                		  			STR((id->getText(id))->chars)) );

                		  	param->setOffset( offset );
                	    	param->setBinding( variable );
                	    }
                	    else
                	    {
                	    	param = new sep::Variable(&routine,
                		  			mdfr, 
                tv
                , STR((id->getText(id))->chars));
                		  	param->setOffset( offset );

                		  	// Only for Routine design as PROTOTYPE a.k.a. primitive routine
                		  	if( routine.getSpecifier().isDesignPrototypeStatic() )
                		  	{
                		  		routine.appendReturn(
                		  			machine->getPropertyPart().saveOwnedVariable( param ));
                		  	}
                		  	else
                		  	{
                		  		routine.saveReturn( param );
                		  	}
                	    }
                	  
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4254:4: (iv= initial_value )?
            {
                int alt373=2;
                switch ( LA(1) )
                {
                    case ASSIGN:
                    case LPAREN:
                    	{
                    		alt373=1;
                    	}
                        break;
                }

                switch (alt373)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4254:6: iv= initial_value
            	    {
            	        FOLLOWPUSH(FOLLOW_initial_value_in_def_routine_returns_atom13550);
            	        iv=initial_value(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_routine_returns_atomEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             param->setValue(iv
            	            ); 
            	        }


            	    }
            	    break;

                }
            }

        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_routine_returns_atomEx; /* Prevent compiler warnings */
    ruledef_routine_returns_atomEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(156, def_routine_returns_atom_StartIndex); }

    return ;
}
/* $ANTLR end def_routine_returns_atom */

/**
 * $ANTLR start section_model_of_execution
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4262:1: section_model_of_execution[ sep::Machine * container ] : '@moe:' ( def_moe_primitive[ container ] )* ;
 */
static void
section_model_of_execution(pfmlParser ctx, sep::Machine * container)
{
    ANTLR3_UINT32 section_model_of_execution_StartIndex;

    /* Initialize rule variables
     */
    section_model_of_execution_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(157)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4263:2: ( '@moe:' ( def_moe_primitive[ container ] )* )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4263:4: '@moe:' ( def_moe_primitive[ container ] )*
        {
             MATCHT(204, &FOLLOW_204_in_section_model_of_execution13574);
            if  (HASEXCEPTION())
            {
                goto rulesection_model_of_executionEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4263:13: ( def_moe_primitive[ container ] )*

            for (;;)
            {
                int alt374=2;
                switch ( LA(1) )
                {
                case 170:
                case 175:
                case 177:
                case 179:
                case 182:
                case 184:
                case 189:
                case 190:
                case 191:
                case 194:
                case 199:
                case 218:
                case 223:
                case 224:
                case 225:
                case 226:
                case 228:
                case 367:
                	{
                		alt374=1;
                	}
                    break;

                }

                switch (alt374)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4263:15: def_moe_primitive[ container ]
            	    {
            	        FOLLOWPUSH(FOLLOW_def_moe_primitive_in_section_model_of_execution13579);
            	        def_moe_primitive(ctx, container);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulesection_model_of_executionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

            	default:
            	    goto loop374;	/* break out of the loop */
            	    break;
                }
            }
            loop374: ; /* Jump out to here if this rule does not match */


        }

    }

    // This is where rules clean up and exit
    //
    goto rulesection_model_of_executionEx; /* Prevent compiler warnings */
    rulesection_model_of_executionEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(157, section_model_of_execution_StartIndex); }

    return ;
}
/* $ANTLR end section_model_of_execution */

/**
 * $ANTLR start def_moe_primitive
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4266:1: def_moe_primitive[ sep::Machine * container ] : ( '@create' def_routine_seq[ theBehavior->getOnCreateRoutine() ] | '@init' def_routine_seq[ theBehavior->getOnInitRoutine() ] | '@final' def_routine_seq[ theBehavior->getOnFinalRoutine() ] | '@start' def_routine_seq[ theBehavior->getOnStartRoutine() ] | '@stop' def_routine_seq[ theBehavior->getOnStopRoutine() ] | '@ienable' def_routine_seq[ theBehavior->getOnIEnableRoutine() ] | '@enable' def_routine_seq[ theBehavior->getOnEnableRoutine() ] | '@idisable' def_routine_seq[ theBehavior->getOnIDisableRoutine() ] | '@disable' def_routine_seq[ theBehavior->getOnDisableRoutine() ] | '@iabort' def_routine_seq[ theBehavior->getOnIAbortRoutine() ] | '@abort' def_routine_seq[ theBehavior->getOnAbortRoutine() ] | '@irun' def_routine_seq[ theBehavior->getOnIRunRoutine() ] | '@run' def_routine_seq[ theBehavior->getOnRunRoutine() ] | '@rtc' def_routine_seq[ theBehavior->getOnRtcRoutine() ] | '@return' def_routine_seq[ theBehavior->getOnFinalRoutine() ] | '@concurrency' def_routine_seq[ theBehavior->getOnConcurrencyRoutine() ] | '@schedule' def_routine_seq[ theBehavior->getOnScheduleRoutine() ] | 'routine' def_routine_model_impl[ container , mdfr , spcfr ] );
 */
static void
def_moe_primitive(pfmlParser ctx, sep::Machine * container)
{
    ANTLR3_UINT32 def_moe_primitive_StartIndex;

    /* Initialize rule variables
     */
    def_moe_primitive_StartIndex = INDEX();



    	sep::BehavioralPart * theBehavior = container->getUniqBehaviorPart();

    	 sep::Modifier mdfr;

    	sep::Specifier spcfr( sep::Specifier::DESIGN_MODEL_KIND );

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(158)) )
    {
        {
        }



        return ;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4274:2: ( '@create' def_routine_seq[ theBehavior->getOnCreateRoutine() ] | '@init' def_routine_seq[ theBehavior->getOnInitRoutine() ] | '@final' def_routine_seq[ theBehavior->getOnFinalRoutine() ] | '@start' def_routine_seq[ theBehavior->getOnStartRoutine() ] | '@stop' def_routine_seq[ theBehavior->getOnStopRoutine() ] | '@ienable' def_routine_seq[ theBehavior->getOnIEnableRoutine() ] | '@enable' def_routine_seq[ theBehavior->getOnEnableRoutine() ] | '@idisable' def_routine_seq[ theBehavior->getOnIDisableRoutine() ] | '@disable' def_routine_seq[ theBehavior->getOnDisableRoutine() ] | '@iabort' def_routine_seq[ theBehavior->getOnIAbortRoutine() ] | '@abort' def_routine_seq[ theBehavior->getOnAbortRoutine() ] | '@irun' def_routine_seq[ theBehavior->getOnIRunRoutine() ] | '@run' def_routine_seq[ theBehavior->getOnRunRoutine() ] | '@rtc' def_routine_seq[ theBehavior->getOnRtcRoutine() ] | '@return' def_routine_seq[ theBehavior->getOnFinalRoutine() ] | '@concurrency' def_routine_seq[ theBehavior->getOnConcurrencyRoutine() ] | '@schedule' def_routine_seq[ theBehavior->getOnScheduleRoutine() ] | 'routine' def_routine_model_impl[ container , mdfr , spcfr ] )

            ANTLR3_UINT32 alt375;

            alt375=18;

            switch ( LA(1) )
            {
            case 177:
            	{
            		alt375=1;
            	}
                break;
            case 194:
            	{
            		alt375=2;
            	}
                break;
            case 184:
            	{
            		alt375=3;
            	}
                break;
            case 226:
            	{
            		alt375=4;
            	}
                break;
            case 228:
            	{
            		alt375=5;
            	}
                break;
            case 191:
            	{
            		alt375=6;
            	}
                break;
            case 182:
            	{
            		alt375=7;
            	}
                break;
            case 190:
            	{
            		alt375=8;
            	}
                break;
            case 179:
            	{
            		alt375=9;
            	}
                break;
            case 189:
            	{
            		alt375=10;
            	}
                break;
            case 170:
            	{
            		alt375=11;
            	}
                break;
            case 199:
            	{
            		alt375=12;
            	}
                break;
            case 224:
            	{
            		alt375=13;
            	}
                break;
            case 223:
            	{
            		alt375=14;
            	}
                break;
            case 218:
            	{
            		alt375=15;
            	}
                break;
            case 175:
            	{
            		alt375=16;
            	}
                break;
            case 225:
            	{
            		alt375=17;
            	}
                break;
            case 367:
            	{
            		alt375=18;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 375;
                EXCEPTION->state        = 0;


                goto ruledef_moe_primitiveEx;

            }

            switch (alt375)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4274:4: '@create' def_routine_seq[ theBehavior->getOnCreateRoutine() ]
        	    {
        	         MATCHT(177, &FOLLOW_177_in_def_moe_primitive13600);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_moe_primitiveEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_def_routine_seq_in_def_moe_primitive13608);
        	        def_routine_seq(ctx, theBehavior->getOnCreateRoutine());

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_moe_primitiveEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4275:4: '@init' def_routine_seq[ theBehavior->getOnInitRoutine() ]
        	    {
        	         MATCHT(194, &FOLLOW_194_in_def_moe_primitive13614);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_moe_primitiveEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_def_routine_seq_in_def_moe_primitive13624);
        	        def_routine_seq(ctx, theBehavior->getOnInitRoutine());

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_moe_primitiveEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4276:4: '@final' def_routine_seq[ theBehavior->getOnFinalRoutine() ]
        	    {
        	         MATCHT(184, &FOLLOW_184_in_def_moe_primitive13630);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_moe_primitiveEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_def_routine_seq_in_def_moe_primitive13639);
        	        def_routine_seq(ctx, theBehavior->getOnFinalRoutine());

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_moe_primitiveEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 4:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4278:4: '@start' def_routine_seq[ theBehavior->getOnStartRoutine() ]
        	    {
        	         MATCHT(226, &FOLLOW_226_in_def_moe_primitive13646);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_moe_primitiveEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_def_routine_seq_in_def_moe_primitive13655);
        	        def_routine_seq(ctx, theBehavior->getOnStartRoutine());

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_moe_primitiveEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 5:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4279:4: '@stop' def_routine_seq[ theBehavior->getOnStopRoutine() ]
        	    {
        	         MATCHT(228, &FOLLOW_228_in_def_moe_primitive13661);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_moe_primitiveEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_def_routine_seq_in_def_moe_primitive13671);
        	        def_routine_seq(ctx, theBehavior->getOnStopRoutine());

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_moe_primitiveEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 6:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4281:4: '@ienable' def_routine_seq[ theBehavior->getOnIEnableRoutine() ]
        	    {
        	         MATCHT(191, &FOLLOW_191_in_def_moe_primitive13678);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_moe_primitiveEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_def_routine_seq_in_def_moe_primitive13685);
        	        def_routine_seq(ctx, theBehavior->getOnIEnableRoutine());

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_moe_primitiveEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 7:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4282:4: '@enable' def_routine_seq[ theBehavior->getOnEnableRoutine() ]
        	    {
        	         MATCHT(182, &FOLLOW_182_in_def_moe_primitive13691);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_moe_primitiveEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_def_routine_seq_in_def_moe_primitive13699);
        	        def_routine_seq(ctx, theBehavior->getOnEnableRoutine());

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_moe_primitiveEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 8:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4284:4: '@idisable' def_routine_seq[ theBehavior->getOnIDisableRoutine() ]
        	    {
        	         MATCHT(190, &FOLLOW_190_in_def_moe_primitive13706);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_moe_primitiveEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_def_routine_seq_in_def_moe_primitive13712);
        	        def_routine_seq(ctx, theBehavior->getOnIDisableRoutine());

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_moe_primitiveEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 9:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4285:4: '@disable' def_routine_seq[ theBehavior->getOnDisableRoutine() ]
        	    {
        	         MATCHT(179, &FOLLOW_179_in_def_moe_primitive13718);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_moe_primitiveEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_def_routine_seq_in_def_moe_primitive13725);
        	        def_routine_seq(ctx, theBehavior->getOnDisableRoutine());

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_moe_primitiveEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 10:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4287:4: '@iabort' def_routine_seq[ theBehavior->getOnIAbortRoutine() ]
        	    {
        	         MATCHT(189, &FOLLOW_189_in_def_moe_primitive13732);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_moe_primitiveEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_def_routine_seq_in_def_moe_primitive13740);
        	        def_routine_seq(ctx, theBehavior->getOnIAbortRoutine());

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_moe_primitiveEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 11:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4288:4: '@abort' def_routine_seq[ theBehavior->getOnAbortRoutine() ]
        	    {
        	         MATCHT(170, &FOLLOW_170_in_def_moe_primitive13746);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_moe_primitiveEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_def_routine_seq_in_def_moe_primitive13755);
        	        def_routine_seq(ctx, theBehavior->getOnAbortRoutine());

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_moe_primitiveEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 12:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4290:4: '@irun' def_routine_seq[ theBehavior->getOnIRunRoutine() ]
        	    {
        	         MATCHT(199, &FOLLOW_199_in_def_moe_primitive13762);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_moe_primitiveEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_def_routine_seq_in_def_moe_primitive13772);
        	        def_routine_seq(ctx, theBehavior->getOnIRunRoutine());

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_moe_primitiveEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 13:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4291:4: '@run' def_routine_seq[ theBehavior->getOnRunRoutine() ]
        	    {
        	         MATCHT(224, &FOLLOW_224_in_def_moe_primitive13778);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_moe_primitiveEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_def_routine_seq_in_def_moe_primitive13789);
        	        def_routine_seq(ctx, theBehavior->getOnRunRoutine());

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_moe_primitiveEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 14:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4292:4: '@rtc' def_routine_seq[ theBehavior->getOnRtcRoutine() ]
        	    {
        	         MATCHT(223, &FOLLOW_223_in_def_moe_primitive13795);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_moe_primitiveEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_def_routine_seq_in_def_moe_primitive13806);
        	        def_routine_seq(ctx, theBehavior->getOnRtcRoutine());

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_moe_primitiveEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 15:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4294:4: '@return' def_routine_seq[ theBehavior->getOnFinalRoutine() ]
        	    {
        	         MATCHT(218, &FOLLOW_218_in_def_moe_primitive13813);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_moe_primitiveEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_def_routine_seq_in_def_moe_primitive13821);
        	        def_routine_seq(ctx, theBehavior->getOnFinalRoutine());

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_moe_primitiveEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 16:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4296:4: '@concurrency' def_routine_seq[ theBehavior->getOnConcurrencyRoutine() ]
        	    {
        	         MATCHT(175, &FOLLOW_175_in_def_moe_primitive13828);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_moe_primitiveEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_def_routine_seq_in_def_moe_primitive13831);
        	        def_routine_seq(ctx, theBehavior->getOnConcurrencyRoutine());

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_moe_primitiveEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 17:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4297:4: '@schedule' def_routine_seq[ theBehavior->getOnScheduleRoutine() ]
        	    {
        	         MATCHT(225, &FOLLOW_225_in_def_moe_primitive13837);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_moe_primitiveEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_def_routine_seq_in_def_moe_primitive13843);
        	        def_routine_seq(ctx, theBehavior->getOnScheduleRoutine());

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_moe_primitiveEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 18:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4300:4: 'routine' def_routine_model_impl[ container , mdfr , spcfr ]
        	    {
        	         MATCHT(367, &FOLLOW_367_in_def_moe_primitive13851);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_moe_primitiveEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_def_routine_model_impl_in_def_moe_primitive13856);
        	        def_routine_model_impl(ctx, container, mdfr, spcfr);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruledef_moe_primitiveEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruledef_moe_primitiveEx; /* Prevent compiler warnings */
    ruledef_moe_primitiveEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(158, def_moe_primitive_StartIndex); }

    return ;
}
/* $ANTLR end def_moe_primitive */

/**
 * $ANTLR start def_routine_seq
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4305:1: def_routine_seq[ sep::Routine & routine ] : ( def_routine_parameters[ routine ] )? ( ( '-->' | 'returns:' ) def_routine_returns[ routine ] )? bs= block_statement ;
 */
static void
def_routine_seq(pfmlParser ctx, sep::Routine & routine)
{
    ANTLR3_UINT32 def_routine_seq_StartIndex;

    sep::BFCode bs;
    #undef	RETURN_TYPE_bs
    #define	RETURN_TYPE_bs sep::BFCode

    /* Initialize rule variables
     */
    def_routine_seq_StartIndex = INDEX();



    	PUSH_CTX_CPR( & routine );

    	SAVE_RULE_BEGIN_LOCATION;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(159)) )
    {
        {

            	SET_RULE_LOCATION( _CPR_ );

            	POP_CTX;;

        }
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4316:2: ( ( def_routine_parameters[ routine ] )? ( ( '-->' | 'returns:' ) def_routine_returns[ routine ] )? bs= block_statement )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4316:4: ( def_routine_parameters[ routine ] )? ( ( '-->' | 'returns:' ) def_routine_returns[ routine ] )? bs= block_statement
        {
            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4316:4: ( def_routine_parameters[ routine ] )?
            {
                int alt376=2;
                switch ( LA(1) )
                {
                    case LPAREN:
                    	{
                    		alt376=1;
                    	}
                        break;
                }

                switch (alt376)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4316:6: def_routine_parameters[ routine ]
            	    {
            	        FOLLOWPUSH(FOLLOW_def_routine_parameters_in_def_routine_seq13881);
            	        def_routine_parameters(ctx, routine);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_routine_seqEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4317:4: ( ( '-->' | 'returns:' ) def_routine_returns[ routine ] )?
            {
                int alt377=2;
                switch ( LA(1) )
                {
                    case 163:
                    case 365:
                    	{
                    		alt377=1;
                    	}
                        break;
                }

                switch (alt377)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4317:6: ( '-->' | 'returns:' ) def_routine_returns[ routine ]
            	    {
            	        if ( LA(1) == 163 || LA(1) == 365 )
            	        {
            	            CONSUME();
            	            PERRORRECOVERY=ANTLR3_FALSE;
            	            FAILEDFLAG=ANTLR3_FALSE;

            	        }
            	        else
            	        {
            	            if (BACKTRACKING>0)
            	            {
            	                FAILEDFLAG = ANTLR3_TRUE;
            	                return ;
            	            }

            	            CONSTRUCTEX();
            	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
            	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
            	            EXCEPTION->expectingSet = NULL;

            	            goto ruledef_routine_seqEx;
            	        }


            	        FOLLOWPUSH(FOLLOW_def_routine_returns_in_def_routine_seq13903);
            	        def_routine_returns(ctx, routine);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledef_routine_seqEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

                }
            }

            FOLLOWPUSH(FOLLOW_block_statement_in_def_routine_seq13915);
            bs=block_statement(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruledef_routine_seqEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            if ( BACKTRACKING==0 )
            {
                 routine.seqCode(bs
                ); 
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruledef_routine_seqEx; /* Prevent compiler warnings */
    ruledef_routine_seqEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
            else
            {
                {

                    	SET_RULE_LOCATION( _CPR_ );

                    	POP_CTX;;

                }
            }


    if ( BACKTRACKING>0 ) { MEMOIZE(159, def_routine_seq_StartIndex); }

    return ;
}
/* $ANTLR end def_routine_seq */

/**
 * $ANTLR start section_model_of_interaction
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4327:1: section_model_of_interaction[ sep::Machine * machine ] : ( '@interaction:' | '@com:' ) ( com_connect[ machine, theInteraction ] )* ;
 */
static void
section_model_of_interaction(pfmlParser ctx, sep::Machine * machine)
{
    ANTLR3_UINT32 section_model_of_interaction_StartIndex;

    /* Initialize rule variables
     */
    section_model_of_interaction_StartIndex = INDEX();



    	sep::InteractionPart * theInteraction = machine->getUniqInteraction();

    	SAVE_RULE_BEGIN_LOCATION;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(160)) )
    {
        {

            	SET_RULE_LOCATION(theInteraction);

        }
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4337:2: ( ( '@interaction:' | '@com:' ) ( com_connect[ machine, theInteraction ] )* )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4337:4: ( '@interaction:' | '@com:' ) ( com_connect[ machine, theInteraction ] )*
        {
            if ( LA(1) == 172 || LA(1) == 198 )
            {
                CONSUME();
                PERRORRECOVERY=ANTLR3_FALSE;
                FAILEDFLAG=ANTLR3_FALSE;

            }
            else
            {
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
                EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
                EXCEPTION->expectingSet = NULL;

                goto rulesection_model_of_interactionEx;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4338:4: ( com_connect[ machine, theInteraction ] )*

            for (;;)
            {
                int alt378=2;
                switch ( LA(1) )
                {
                case 260:
                case 261:
                case 366:
                	{
                		alt378=1;
                	}
                    break;

                }

                switch (alt378)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4338:6: com_connect[ machine, theInteraction ]
            	    {
            	        FOLLOWPUSH(FOLLOW_com_connect_in_section_model_of_interaction13960);
            	        com_connect(ctx, machine, theInteraction);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulesection_model_of_interactionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

            	default:
            	    goto loop378;	/* break out of the loop */
            	    break;
                }
            }
            loop378: ; /* Jump out to here if this rule does not match */


        }

    }

    // This is where rules clean up and exit
    //
    goto rulesection_model_of_interactionEx; /* Prevent compiler warnings */
    rulesection_model_of_interactionEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
            else
            {
                {

                    	SET_RULE_LOCATION(theInteraction);

                }
            }


    if ( BACKTRACKING>0 ) { MEMOIZE(160, section_model_of_interaction_StartIndex); }

    return ;
}
/* $ANTLR end section_model_of_interaction */

/**
 * $ANTLR start com_protocol
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4341:1: com_protocol[ sep::Machine * machine , sep::ComProtocol * cp ] : ( 'env' | 'rdv' | 'multirdv' | 'flow' | 'anycast' | 'unicast' | 'multicast' | 'broadcast' |bc= buffer_com[ machine ] );
 */
static void
com_protocol(pfmlParser ctx, sep::Machine * machine, sep::ComProtocol * cp)
{
    ANTLR3_UINT32 com_protocol_StartIndex;

    sep::BF bc;
    #undef	RETURN_TYPE_bc
    #define	RETURN_TYPE_bc sep::BF

    /* Initialize rule variables
     */
    com_protocol_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(161)) )
    {
        {
        }



        return ;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4343:2: ( 'env' | 'rdv' | 'multirdv' | 'flow' | 'anycast' | 'unicast' | 'multicast' | 'broadcast' |bc= buffer_com[ machine ] )

            ANTLR3_UINT32 alt379;

            alt379=9;

            switch ( LA(1) )
            {
            case 277:
            	{
            		alt379=1;
            	}
                break;
            case 359:
            	{
            		alt379=2;
            	}
                break;
            case 328:
            	{
            		alt379=3;
            	}
                break;
            case 284:
            	{
            		alt379=4;
            	}
                break;
            case 240:
            	{
            		alt379=5;
            	}
                break;
            case 403:
            	{
            		alt379=6;
            	}
                break;
            case 324:
            	{
            		alt379=7;
            	}
                break;
            case 248:
            	{
            		alt379=8;
            	}
                break;
            case 249:
            case 281:
            case 315:
            case 325:
            case 326:
            case 329:
            case 356:
            case 370:
            case 373:
            case 412:
            	{
            		alt379=9;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 379;
                EXCEPTION->state        = 0;


                goto rulecom_protocolEx;

            }

            switch (alt379)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4343:4: 'env'
        	    {
        	         MATCHT(277, &FOLLOW_277_in_com_protocol13978);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulecom_protocolEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             cp->setProtocol(sep::ComProtocol::PROTOCOL_ENVIRONMENT_KIND); 
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4345:4: 'rdv'
        	    {
        	         MATCHT(359, &FOLLOW_359_in_com_protocol13992);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulecom_protocolEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             cp->setProtocolCast(sep::ComProtocol::PROTOCOL_RDV_KIND, sep::ComProtocol::PROTOCOL_UNICAST_KIND); 
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4346:4: 'multirdv'
        	    {
        	         MATCHT(328, &FOLLOW_328_in_com_protocol14005);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulecom_protocolEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             cp->setProtocolCast(sep::ComProtocol::PROTOCOL_MULTIRDV_KIND, sep::ComProtocol::PROTOCOL_MULTICAST_KIND); 
        	        }


        	    }
        	    break;
        	case 4:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4348:4: 'flow'
        	    {
        	         MATCHT(284, &FOLLOW_284_in_com_protocol14014);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulecom_protocolEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             cp->setProtocolCast(sep::ComProtocol::PROTOCOL_FLOW_KIND, sep::ComProtocol::PROTOCOL_MULTICAST_KIND); 
        	        }


        	    }
        	    break;
        	case 5:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4351:4: 'anycast'
        	    {
        	         MATCHT(240, &FOLLOW_240_in_com_protocol14028);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulecom_protocolEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             cp->setProtocolCast(sep::ComProtocol::PROTOCOL_ANYCAST_KIND, sep::ComProtocol::PROTOCOL_ANYCAST_KIND); 
        	        }


        	    }
        	    break;
        	case 6:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4353:4: 'unicast'
        	    {
        	         MATCHT(403, &FOLLOW_403_in_com_protocol14038);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulecom_protocolEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             cp->setProtocolCast(sep::ComProtocol::PROTOCOL_UNICAST_KIND, sep::ComProtocol::PROTOCOL_UNICAST_KIND); 
        	        }


        	    }
        	    break;
        	case 7:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4355:4: 'multicast'
        	    {
        	         MATCHT(324, &FOLLOW_324_in_com_protocol14048);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulecom_protocolEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             cp->setProtocolCast(sep::ComProtocol::PROTOCOL_MULTICAST_KIND, sep::ComProtocol::PROTOCOL_MULTICAST_KIND); 
        	        }


        	    }
        	    break;
        	case 8:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4357:4: 'broadcast'
        	    {
        	         MATCHT(248, &FOLLOW_248_in_com_protocol14056);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulecom_protocolEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             cp->setProtocolCast(sep::ComProtocol::PROTOCOL_BROADCAST_KIND, sep::ComProtocol::PROTOCOL_BROADCAST_KIND); 
        	        }


        	    }
        	    break;
        	case 9:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4359:4: bc= buffer_com[ machine ]
        	    {
        	        FOLLOWPUSH(FOLLOW_buffer_com_in_com_protocol14066);
        	        bc=buffer_com(ctx, machine);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulecom_protocolEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {

        	            		cp->setProtocol(sep::ComProtocol::PROTOCOL_BUFFER_KIND);
        	            		cp->setBuffer(
        	            bc
        	            );
        	            	
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto rulecom_protocolEx; /* Prevent compiler warnings */
    rulecom_protocolEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(161, com_protocol_StartIndex); }

    return ;
}
/* $ANTLR end com_protocol */

/**
 * $ANTLR start com_cast
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4366:1: com_cast[ sep::ComProtocol * cp ] : ( 'anycast' | 'unicast' | 'multicast' | 'broadcast' );
 */
static void
com_cast(pfmlParser ctx, sep::ComProtocol * cp)
{
    ANTLR3_UINT32 com_cast_StartIndex;

    /* Initialize rule variables
     */
    com_cast_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(162)) )
    {
        {
        }



        return ;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4367:2: ( 'anycast' | 'unicast' | 'multicast' | 'broadcast' )

            ANTLR3_UINT32 alt380;

            alt380=4;

            switch ( LA(1) )
            {
            case 240:
            	{
            		alt380=1;
            	}
                break;
            case 403:
            	{
            		alt380=2;
            	}
                break;
            case 324:
            	{
            		alt380=3;
            	}
                break;
            case 248:
            	{
            		alt380=4;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 380;
                EXCEPTION->state        = 0;


                goto rulecom_castEx;

            }

            switch (alt380)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4367:4: 'anycast'
        	    {
        	         MATCHT(240, &FOLLOW_240_in_com_cast14083);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulecom_castEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             cp->setCast(sep::ComProtocol::PROTOCOL_ANYCAST_KIND); 
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4368:4: 'unicast'
        	    {
        	         MATCHT(403, &FOLLOW_403_in_com_cast14093);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulecom_castEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             cp->setCast(sep::ComProtocol::PROTOCOL_UNICAST_KIND); 
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4369:4: 'multicast'
        	    {
        	         MATCHT(324, &FOLLOW_324_in_com_cast14103);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulecom_castEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             cp->setCast(sep::ComProtocol::PROTOCOL_MULTICAST_KIND); 
        	        }


        	    }
        	    break;
        	case 4:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4370:4: 'broadcast'
        	    {
        	         MATCHT(248, &FOLLOW_248_in_com_cast14111);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulecom_castEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             cp->setCast(sep::ComProtocol::PROTOCOL_BROADCAST_KIND); 
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto rulecom_castEx; /* Prevent compiler warnings */
    rulecom_castEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(162, com_cast_StartIndex); }

    return ;
}
/* $ANTLR end com_cast */

/**
 * $ANTLR start buffer_com
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4373:1: buffer_com[ sep::Machine * machine ] returns [ sep::BF buf ] : ( 'buffer' ( COLON (rb= ref_buffer[machine] |db= def_buffer ) | LT_ (rb= ref_buffer[machine] |db= def_buffer ) GT ) |db= def_buffer );
 */
static sep::BF
buffer_com(pfmlParser ctx, sep::Machine * machine)
{
    sep::BF buf;

    ANTLR3_UINT32 buffer_com_StartIndex;

    sep::BF rb;
    #undef	RETURN_TYPE_rb
    #define	RETURN_TYPE_rb sep::BF

    fmlParser_def_buffer_return db;
    #undef	RETURN_TYPE_db
    #define	RETURN_TYPE_db fmlParser_def_buffer_return

    /* Initialize rule variables
     */
    buffer_com_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(163)) )
    {
        {
        }



        return buf;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4375:2: ( 'buffer' ( COLON (rb= ref_buffer[machine] |db= def_buffer ) | LT_ (rb= ref_buffer[machine] |db= def_buffer ) GT ) |db= def_buffer )

            ANTLR3_UINT32 alt384;

            alt384=2;

            switch ( LA(1) )
            {
            case 249:
            	{
            		alt384=1;
            	}
                break;
            case 281:
            case 315:
            case 325:
            case 326:
            case 329:
            case 356:
            case 370:
            case 373:
            case 412:
            	{
            		alt384=2;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return buf;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 384;
                EXCEPTION->state        = 0;


                goto rulebuffer_comEx;

            }

            switch (alt384)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4375:4: 'buffer' ( COLON (rb= ref_buffer[machine] |db= def_buffer ) | LT_ (rb= ref_buffer[machine] |db= def_buffer ) GT )
        	    {
        	         MATCHT(249, &FOLLOW_249_in_buffer_com14132);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulebuffer_comEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return buf;
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4376:4: ( COLON (rb= ref_buffer[machine] |db= def_buffer ) | LT_ (rb= ref_buffer[machine] |db= def_buffer ) GT )
        	        {
        	            int alt383=2;
        	            switch ( LA(1) )
        	            {
        	            case COLON:
        	            	{
        	            		alt383=1;
        	            	}
        	                break;
        	            case LT_:
        	            	{
        	            		alt383=2;
        	            	}
        	                break;

        	            default:
        	                if (BACKTRACKING>0)
        	                {
        	                    FAILEDFLAG = ANTLR3_TRUE;
        	                    return buf;
        	                }

        	                CONSTRUCTEX();
        	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
        	                EXCEPTION->message      = (void *)"";
        	                EXCEPTION->decisionNum  = 383;
        	                EXCEPTION->state        = 0;


        	                goto rulebuffer_comEx;

        	            }

        	            switch (alt383)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4376:6: COLON (rb= ref_buffer[machine] |db= def_buffer )
        	        	    {
        	        	         MATCHT(COLON, &FOLLOW_COLON_in_buffer_com14139);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulebuffer_comEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return buf;
        	        	        }


        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4377:6: (rb= ref_buffer[machine] |db= def_buffer )
        	        	        {
        	        	            int alt381=2;
        	        	            switch ( LA(1) )
        	        	            {
        	        	            case ID:
        	        	            	{
        	        	            		alt381=1;
        	        	            	}
        	        	                break;
        	        	            case 281:
        	        	            case 315:
        	        	            case 325:
        	        	            case 326:
        	        	            case 329:
        	        	            case 356:
        	        	            case 370:
        	        	            case 373:
        	        	            case 412:
        	        	            	{
        	        	            		alt381=2;
        	        	            	}
        	        	                break;

        	        	            default:
        	        	                if (BACKTRACKING>0)
        	        	                {
        	        	                    FAILEDFLAG = ANTLR3_TRUE;
        	        	                    return buf;
        	        	                }

        	        	                CONSTRUCTEX();
        	        	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
        	        	                EXCEPTION->message      = (void *)"";
        	        	                EXCEPTION->decisionNum  = 381;
        	        	                EXCEPTION->state        = 0;


        	        	                goto rulebuffer_comEx;

        	        	            }

        	        	            switch (alt381)
        	        	            {
        	        	        	case 1:
        	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4377:8: rb= ref_buffer[machine]
        	        	        	    {
        	        	        	        FOLLOWPUSH(FOLLOW_ref_buffer_in_buffer_com14150);
        	        	        	        rb=ref_buffer(ctx, machine);

        	        	        	        FOLLOWPOP();
        	        	        	        if  (HASEXCEPTION())
        	        	        	        {
        	        	        	            goto rulebuffer_comEx;
        	        	        	        }
        	        	        	        if (HASFAILED())
        	        	        	        {
        	        	        	            return buf;
        	        	        	        }


        	        	        	        if ( BACKTRACKING==0 )
        	        	        	        {
        	        	        	             buf= 
        	        	        	            rb
        	        	        	            ;
        	        	        	             
        	        	        	        }


        	        	        	    }
        	        	        	    break;
        	        	        	case 2:
        	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4378:8: db= def_buffer
        	        	        	    {
        	        	        	        FOLLOWPUSH(FOLLOW_def_buffer_in_buffer_com14165);
        	        	        	        db=def_buffer(ctx);

        	        	        	        FOLLOWPOP();
        	        	        	        if  (HASEXCEPTION())
        	        	        	        {
        	        	        	            goto rulebuffer_comEx;
        	        	        	        }
        	        	        	        if (HASFAILED())
        	        	        	        {
        	        	        	            return buf;
        	        	        	        }


        	        	        	        if ( BACKTRACKING==0 )
        	        	        	        {

        	        	        	            			buf= sep::BF( new sep::Buffer(machine,
        	        	        	            				newBufferID(), 
        	        	        	            db.kind
        	        	        	            , db.size
        	        	        	            ) );

        	        	        	            	    
        	        	        	        }


        	        	        	    }
        	        	        	    break;

        	        	            }
        	        	        }

        	        	    }
        	        	    break;
        	        	case 2:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4385:6: LT_ (rb= ref_buffer[machine] |db= def_buffer ) GT
        	        	    {
        	        	         MATCHT(LT_, &FOLLOW_LT__in_buffer_com14187);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulebuffer_comEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return buf;
        	        	        }


        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4386:8: (rb= ref_buffer[machine] |db= def_buffer )
        	        	        {
        	        	            int alt382=2;
        	        	            switch ( LA(1) )
        	        	            {
        	        	            case ID:
        	        	            	{
        	        	            		alt382=1;
        	        	            	}
        	        	                break;
        	        	            case 281:
        	        	            case 315:
        	        	            case 325:
        	        	            case 326:
        	        	            case 329:
        	        	            case 356:
        	        	            case 370:
        	        	            case 373:
        	        	            case 412:
        	        	            	{
        	        	            		alt382=2;
        	        	            	}
        	        	                break;

        	        	            default:
        	        	                if (BACKTRACKING>0)
        	        	                {
        	        	                    FAILEDFLAG = ANTLR3_TRUE;
        	        	                    return buf;
        	        	                }

        	        	                CONSTRUCTEX();
        	        	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
        	        	                EXCEPTION->message      = (void *)"";
        	        	                EXCEPTION->decisionNum  = 382;
        	        	                EXCEPTION->state        = 0;


        	        	                goto rulebuffer_comEx;

        	        	            }

        	        	            switch (alt382)
        	        	            {
        	        	        	case 1:
        	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4386:10: rb= ref_buffer[machine]
        	        	        	    {
        	        	        	        FOLLOWPUSH(FOLLOW_ref_buffer_in_buffer_com14200);
        	        	        	        rb=ref_buffer(ctx, machine);

        	        	        	        FOLLOWPOP();
        	        	        	        if  (HASEXCEPTION())
        	        	        	        {
        	        	        	            goto rulebuffer_comEx;
        	        	        	        }
        	        	        	        if (HASFAILED())
        	        	        	        {
        	        	        	            return buf;
        	        	        	        }


        	        	        	        if ( BACKTRACKING==0 )
        	        	        	        {
        	        	        	             buf= 
        	        	        	            rb
        	        	        	            ;
        	        	        	             
        	        	        	        }


        	        	        	    }
        	        	        	    break;
        	        	        	case 2:
        	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4387:10: db= def_buffer
        	        	        	    {
        	        	        	        FOLLOWPUSH(FOLLOW_def_buffer_in_buffer_com14217);
        	        	        	        db=def_buffer(ctx);

        	        	        	        FOLLOWPOP();
        	        	        	        if  (HASEXCEPTION())
        	        	        	        {
        	        	        	            goto rulebuffer_comEx;
        	        	        	        }
        	        	        	        if (HASFAILED())
        	        	        	        {
        	        	        	            return buf;
        	        	        	        }


        	        	        	        if ( BACKTRACKING==0 )
        	        	        	        {

        	        	        	            				buf= sep::BF( new sep::Buffer(machine,
        	        	        	            						 newBufferID(), 
        	        	        	            db.kind
        	        	        	            , db.size
        	        	        	            ) );

        	        	        	            			
        	        	        	        }


        	        	        	    }
        	        	        	    break;

        	        	            }
        	        	        }

        	        	         MATCHT(GT, &FOLLOW_GT_in_buffer_com14238);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulebuffer_comEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return buf;
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4395:4: db= def_buffer
        	    {
        	        FOLLOWPUSH(FOLLOW_def_buffer_in_buffer_com14250);
        	        db=def_buffer(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulebuffer_comEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return buf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {

        	            		buf= sep::BF( new sep::Buffer(machine,
        	            				 newBufferID(), 
        	            db.kind
        	            , db.size
        	            ) );

        	            	
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto rulebuffer_comEx; /* Prevent compiler warnings */
    rulebuffer_comEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(163, buffer_com_StartIndex); }

    return buf;
}
/* $ANTLR end buffer_com */

/**
 * $ANTLR start com_connect
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4403:1: com_connect[ sep::Machine * machine , sep::InteractionPart * anInteraction ] : ( ( 'connector' | 'connect' ) ( LT_ com_protocol[ machine, aConnector ] ( COMMA com_cast[ aConnector ] )? GT )? ( ID )? LCURLY ( com_route[ machine, aConnector ] )+ RCURLY | ( 'route' ) ( LT_ com_protocol[ machine, aConnector ] ( COMMA com_cast[ aConnector ] )? GT )? ( com_route[ machine, aConnector ] | LCURLY ( com_route[ machine, aConnector ] )+ RCURLY | LBRACKET ( com_port[ machine , comRoute ] ( COMMA com_port[ machine , comRoute ] )* | STAR ) RBRACKET SEMI ) );
 */
static void
com_connect(pfmlParser ctx, sep::Machine * machine, sep::InteractionPart * anInteraction)
{
    ANTLR3_UINT32 com_connect_StartIndex;

    pANTLR3_COMMON_TOKEN    ID11;

    /* Initialize rule variables
     */
    com_connect_StartIndex = INDEX();



    	sep::Connector * aConnector;
    	anInteraction->saveConnector( aConnector = new sep::Connector(*anInteraction) );
    	aConnector->update(anInteraction);
    	std::string c_id;

    	sep::ComRoute * comRoute = NULL;

    	SAVE_RULE_BEGIN_LOCATION;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(164)) )
    {
        {

            	SET_RULE_LOCATION(aConnector);

        }
        {
        }



        return ;
    }

    ID11       = NULL;

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4418:2: ( ( 'connector' | 'connect' ) ( LT_ com_protocol[ machine, aConnector ] ( COMMA com_cast[ aConnector ] )? GT )? ( ID )? LCURLY ( com_route[ machine, aConnector ] )+ RCURLY | ( 'route' ) ( LT_ com_protocol[ machine, aConnector ] ( COMMA com_cast[ aConnector ] )? GT )? ( com_route[ machine, aConnector ] | LCURLY ( com_route[ machine, aConnector ] )+ RCURLY | LBRACKET ( com_port[ machine , comRoute ] ( COMMA com_port[ machine , comRoute ] )* | STAR ) RBRACKET SEMI ) )

            ANTLR3_UINT32 alt395;

            alt395=2;

            switch ( LA(1) )
            {
            case 260:
            case 261:
            	{
            		alt395=1;
            	}
                break;
            case 366:
            	{
            		alt395=2;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 395;
                EXCEPTION->state        = 0;


                goto rulecom_connectEx;

            }

            switch (alt395)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4418:4: ( 'connector' | 'connect' ) ( LT_ com_protocol[ machine, aConnector ] ( COMMA com_cast[ aConnector ] )? GT )? ( ID )? LCURLY ( com_route[ machine, aConnector ] )+ RCURLY
        	    {
        	        if ( ((LA(1) >= 260) && (LA(1) <= 261)) )
        	        {
        	            CONSUME();
        	            PERRORRECOVERY=ANTLR3_FALSE;
        	            FAILEDFLAG=ANTLR3_FALSE;

        	        }
        	        else
        	        {
        	            if (BACKTRACKING>0)
        	            {
        	                FAILEDFLAG = ANTLR3_TRUE;
        	                return ;
        	            }

        	            CONSTRUCTEX();
        	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
        	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
        	            EXCEPTION->expectingSet = NULL;

        	            goto rulecom_connectEx;
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4419:4: ( LT_ com_protocol[ machine, aConnector ] ( COMMA com_cast[ aConnector ] )? GT )?
        	        {
        	            int alt386=2;
        	            switch ( LA(1) )
        	            {
        	                case LT_:
        	                	{
        	                		alt386=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt386)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4419:6: LT_ com_protocol[ machine, aConnector ] ( COMMA com_cast[ aConnector ] )? GT
        	        	    {
        	        	         MATCHT(LT_, &FOLLOW_LT__in_com_connect14291);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulecom_connectEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_com_protocol_in_com_connect14298);
        	        	        com_protocol(ctx, machine, aConnector);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulecom_connectEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4421:6: ( COMMA com_cast[ aConnector ] )?
        	        	        {
        	        	            int alt385=2;
        	        	            switch ( LA(1) )
        	        	            {
        	        	                case COMMA:
        	        	                	{
        	        	                		alt385=1;
        	        	                	}
        	        	                    break;
        	        	            }

        	        	            switch (alt385)
        	        	            {
        	        	        	case 1:
        	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4421:8: COMMA com_cast[ aConnector ]
        	        	        	    {
        	        	        	         MATCHT(COMMA, &FOLLOW_COMMA_in_com_connect14308);
        	        	        	        if  (HASEXCEPTION())
        	        	        	        {
        	        	        	            goto rulecom_connectEx;
        	        	        	        }
        	        	        	        if (HASFAILED())
        	        	        	        {
        	        	        	            return ;
        	        	        	        }


        	        	        	        FOLLOWPUSH(FOLLOW_com_cast_in_com_connect14310);
        	        	        	        com_cast(ctx, aConnector);

        	        	        	        FOLLOWPOP();
        	        	        	        if  (HASEXCEPTION())
        	        	        	        {
        	        	        	            goto rulecom_connectEx;
        	        	        	        }
        	        	        	        if (HASFAILED())
        	        	        	        {
        	        	        	            return ;
        	        	        	        }


        	        	        	    }
        	        	        	    break;

        	        	            }
        	        	        }

        	        	         MATCHT(GT, &FOLLOW_GT_in_com_connect14321);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulecom_connectEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4424:4: ( ID )?
        	        {
        	            int alt387=2;
        	            switch ( LA(1) )
        	            {
        	                case ID:
        	                	{
        	                		alt387=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt387)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4424:6: ID
        	        	    {
        	        	        ID11 = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_com_connect14334);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulecom_connectEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             c_id = STR((ID11->getText(ID11))->chars); 
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	        if ( BACKTRACKING==0 )
        	        {
        	             aConnector->fullyUpdateAllNameID(newConnectID(c_id, "_#connector")); 
        	        }


        	         MATCHT(LCURLY, &FOLLOW_LCURLY_in_com_connect14349);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulecom_connectEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4427:4: ( com_route[ machine, aConnector ] )+
        	        {
        	            int cnt388=0;

        	            for (;;)
        	            {
        	                int alt388=2;
        	        	switch ( LA(1) )
        	        	{
        	        	case ID:
        	        	case 298:
        	        	case 305:
        	        	case 341:
        	        	case 364:
        	        		{
        	        			alt388=1;
        	        		}
        	        	    break;

        	        	}

        	        	switch (alt388)
        	        	{
        	        	    case 1:
        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4427:6: com_route[ machine, aConnector ]
        	        	        {
        	        	            FOLLOWPUSH(FOLLOW_com_route_in_com_connect14356);
        	        	            com_route(ctx, machine, aConnector);

        	        	            FOLLOWPOP();
        	        	            if  (HASEXCEPTION())
        	        	            {
        	        	                goto rulecom_connectEx;
        	        	            }
        	        	            if (HASFAILED())
        	        	            {
        	        	                return ;
        	        	            }


        	        	        }
        	        	        break;

        	        	    default:

        	        		if ( cnt388 >= 1 )
        	        		{
        	        		    goto loop388;
        	        		}
        	        		if (BACKTRACKING>0)
        	        		{
        	        		    FAILEDFLAG = ANTLR3_TRUE;
        	        		    return ;
        	        		}

        	        		/* mismatchedSetEx()
        	        		 */
        	        		CONSTRUCTEX();
        	        		EXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
        	        		EXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;


        	        		goto rulecom_connectEx;
        	        	}
        	        	cnt388++;
        	            }
        	            loop388: ;	/* Jump to here if this rule does not match */
        	        }

        	         MATCHT(RCURLY, &FOLLOW_RCURLY_in_com_connect14365);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulecom_connectEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4431:4: ( 'route' ) ( LT_ com_protocol[ machine, aConnector ] ( COMMA com_cast[ aConnector ] )? GT )? ( com_route[ machine, aConnector ] | LCURLY ( com_route[ machine, aConnector ] )+ RCURLY | LBRACKET ( com_port[ machine , comRoute ] ( COMMA com_port[ machine , comRoute ] )* | STAR ) RBRACKET SEMI )
        	    {
        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4431:4: ( 'route' )
        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4431:6: 'route'
        	        {
        	             MATCHT(366, &FOLLOW_366_in_com_connect14374);
        	            if  (HASEXCEPTION())
        	            {
        	                goto rulecom_connectEx;
        	            }
        	            if (HASFAILED())
        	            {
        	                return ;
        	            }


        	        }


        	        if ( BACKTRACKING==0 )
        	        {

        	            	  	aConnector->setNature( sep::IComPoint::IO_SIGNAL_NATURE );
        	            	  	aConnector->fullyUpdateAllNameID(newConnectID("", "_#route"));
        	            	  
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4436:4: ( LT_ com_protocol[ machine, aConnector ] ( COMMA com_cast[ aConnector ] )? GT )?
        	        {
        	            int alt390=2;
        	            switch ( LA(1) )
        	            {
        	                case LT_:
        	                	{
        	                		alt390=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt390)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4436:6: LT_ com_protocol[ machine, aConnector ] ( COMMA com_cast[ aConnector ] )? GT
        	        	    {
        	        	         MATCHT(LT_, &FOLLOW_LT__in_com_connect14388);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulecom_connectEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_com_protocol_in_com_connect14395);
        	        	        com_protocol(ctx, machine, aConnector);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulecom_connectEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4438:6: ( COMMA com_cast[ aConnector ] )?
        	        	        {
        	        	            int alt389=2;
        	        	            switch ( LA(1) )
        	        	            {
        	        	                case COMMA:
        	        	                	{
        	        	                		alt389=1;
        	        	                	}
        	        	                    break;
        	        	            }

        	        	            switch (alt389)
        	        	            {
        	        	        	case 1:
        	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4438:8: COMMA com_cast[ aConnector ]
        	        	        	    {
        	        	        	         MATCHT(COMMA, &FOLLOW_COMMA_in_com_connect14405);
        	        	        	        if  (HASEXCEPTION())
        	        	        	        {
        	        	        	            goto rulecom_connectEx;
        	        	        	        }
        	        	        	        if (HASFAILED())
        	        	        	        {
        	        	        	            return ;
        	        	        	        }


        	        	        	        FOLLOWPUSH(FOLLOW_com_cast_in_com_connect14407);
        	        	        	        com_cast(ctx, aConnector);

        	        	        	        FOLLOWPOP();
        	        	        	        if  (HASEXCEPTION())
        	        	        	        {
        	        	        	            goto rulecom_connectEx;
        	        	        	        }
        	        	        	        if (HASFAILED())
        	        	        	        {
        	        	        	            return ;
        	        	        	        }


        	        	        	    }
        	        	        	    break;

        	        	            }
        	        	        }

        	        	         MATCHT(GT, &FOLLOW_GT_in_com_connect14418);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulecom_connectEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4442:4: ( com_route[ machine, aConnector ] | LCURLY ( com_route[ machine, aConnector ] )+ RCURLY | LBRACKET ( com_port[ machine , comRoute ] ( COMMA com_port[ machine , comRoute ] )* | STAR ) RBRACKET SEMI )
        	        {
        	            int alt394=3;
        	            switch ( LA(1) )
        	            {
        	            case ID:
        	            case 298:
        	            case 305:
        	            case 341:
        	            case 364:
        	            	{
        	            		alt394=1;
        	            	}
        	                break;
        	            case LCURLY:
        	            	{
        	            		alt394=2;
        	            	}
        	                break;
        	            case LBRACKET:
        	            	{
        	            		alt394=3;
        	            	}
        	                break;

        	            default:
        	                if (BACKTRACKING>0)
        	                {
        	                    FAILEDFLAG = ANTLR3_TRUE;
        	                    return ;
        	                }

        	                CONSTRUCTEX();
        	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
        	                EXCEPTION->message      = (void *)"";
        	                EXCEPTION->decisionNum  = 394;
        	                EXCEPTION->state        = 0;


        	                goto rulecom_connectEx;

        	            }

        	            switch (alt394)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4442:6: com_route[ machine, aConnector ]
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_com_route_in_com_connect14432);
        	        	        com_route(ctx, machine, aConnector);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulecom_connectEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;
        	        	case 2:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4444:6: LCURLY ( com_route[ machine, aConnector ] )+ RCURLY
        	        	    {
        	        	         MATCHT(LCURLY, &FOLLOW_LCURLY_in_com_connect14441);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulecom_connectEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4445:6: ( com_route[ machine, aConnector ] )+
        	        	        {
        	        	            int cnt391=0;

        	        	            for (;;)
        	        	            {
        	        	                int alt391=2;
        	        	        	switch ( LA(1) )
        	        	        	{
        	        	        	case ID:
        	        	        	case 298:
        	        	        	case 305:
        	        	        	case 341:
        	        	        	case 364:
        	        	        		{
        	        	        			alt391=1;
        	        	        		}
        	        	        	    break;

        	        	        	}

        	        	        	switch (alt391)
        	        	        	{
        	        	        	    case 1:
        	        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4445:8: com_route[ machine, aConnector ]
        	        	        	        {
        	        	        	            FOLLOWPUSH(FOLLOW_com_route_in_com_connect14450);
        	        	        	            com_route(ctx, machine, aConnector);

        	        	        	            FOLLOWPOP();
        	        	        	            if  (HASEXCEPTION())
        	        	        	            {
        	        	        	                goto rulecom_connectEx;
        	        	        	            }
        	        	        	            if (HASFAILED())
        	        	        	            {
        	        	        	                return ;
        	        	        	            }


        	        	        	        }
        	        	        	        break;

        	        	        	    default:

        	        	        		if ( cnt391 >= 1 )
        	        	        		{
        	        	        		    goto loop391;
        	        	        		}
        	        	        		if (BACKTRACKING>0)
        	        	        		{
        	        	        		    FAILEDFLAG = ANTLR3_TRUE;
        	        	        		    return ;
        	        	        		}

        	        	        		/* mismatchedSetEx()
        	        	        		 */
        	        	        		CONSTRUCTEX();
        	        	        		EXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
        	        	        		EXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;


        	        	        		goto rulecom_connectEx;
        	        	        	}
        	        	        	cnt391++;
        	        	            }
        	        	            loop391: ;	/* Jump to here if this rule does not match */
        	        	        }

        	        	         MATCHT(RCURLY, &FOLLOW_RCURLY_in_com_connect14461);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulecom_connectEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;
        	        	case 3:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4448:6: LBRACKET ( com_port[ machine , comRoute ] ( COMMA com_port[ machine , comRoute ] )* | STAR ) RBRACKET SEMI
        	        	    {
        	        	         MATCHT(LBRACKET, &FOLLOW_LBRACKET_in_com_connect14469);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulecom_connectEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {

        	        	            	    	comRoute = new sep::ComRoute(aConnector,
        	        	            	    			sep::Modifier::PROPERTY_INOUT_DIRECTION);
        	        	            	      	aConnector->appendComRoute(comRoute);
        	        	            	    
        	        	        }


        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4454:6: ( com_port[ machine , comRoute ] ( COMMA com_port[ machine , comRoute ] )* | STAR )
        	        	        {
        	        	            int alt393=2;
        	        	            switch ( LA(1) )
        	        	            {
        	        	            case ID:
        	        	            	{
        	        	            		alt393=1;
        	        	            	}
        	        	                break;
        	        	            case STAR:
        	        	            	{
        	        	            		alt393=2;
        	        	            	}
        	        	                break;

        	        	            default:
        	        	                if (BACKTRACKING>0)
        	        	                {
        	        	                    FAILEDFLAG = ANTLR3_TRUE;
        	        	                    return ;
        	        	                }

        	        	                CONSTRUCTEX();
        	        	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
        	        	                EXCEPTION->message      = (void *)"";
        	        	                EXCEPTION->decisionNum  = 393;
        	        	                EXCEPTION->state        = 0;


        	        	                goto rulecom_connectEx;

        	        	            }

        	        	            switch (alt393)
        	        	            {
        	        	        	case 1:
        	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4454:8: com_port[ machine , comRoute ] ( COMMA com_port[ machine , comRoute ] )*
        	        	        	    {
        	        	        	        FOLLOWPUSH(FOLLOW_com_port_in_com_connect14485);
        	        	        	        com_port(ctx, machine, comRoute);

        	        	        	        FOLLOWPOP();
        	        	        	        if  (HASEXCEPTION())
        	        	        	        {
        	        	        	            goto rulecom_connectEx;
        	        	        	        }
        	        	        	        if (HASFAILED())
        	        	        	        {
        	        	        	            return ;
        	        	        	        }


        	        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4455:8: ( COMMA com_port[ machine , comRoute ] )*

        	        	        	        for (;;)
        	        	        	        {
        	        	        	            int alt392=2;
        	        	        	            switch ( LA(1) )
        	        	        	            {
        	        	        	            case COMMA:
        	        	        	            	{
        	        	        	            		alt392=1;
        	        	        	            	}
        	        	        	                break;

        	        	        	            }

        	        	        	            switch (alt392)
        	        	        	            {
        	        	        	        	case 1:
        	        	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4455:10: COMMA com_port[ machine , comRoute ]
        	        	        	        	    {
        	        	        	        	         MATCHT(COMMA, &FOLLOW_COMMA_in_com_connect14497);
        	        	        	        	        if  (HASEXCEPTION())
        	        	        	        	        {
        	        	        	        	            goto rulecom_connectEx;
        	        	        	        	        }
        	        	        	        	        if (HASFAILED())
        	        	        	        	        {
        	        	        	        	            return ;
        	        	        	        	        }


        	        	        	        	        FOLLOWPUSH(FOLLOW_com_port_in_com_connect14500);
        	        	        	        	        com_port(ctx, machine, comRoute);

        	        	        	        	        FOLLOWPOP();
        	        	        	        	        if  (HASEXCEPTION())
        	        	        	        	        {
        	        	        	        	            goto rulecom_connectEx;
        	        	        	        	        }
        	        	        	        	        if (HASFAILED())
        	        	        	        	        {
        	        	        	        	            return ;
        	        	        	        	        }


        	        	        	        	    }
        	        	        	        	    break;

        	        	        	        	default:
        	        	        	        	    goto loop392;	/* break out of the loop */
        	        	        	        	    break;
        	        	        	            }
        	        	        	        }
        	        	        	        loop392: ; /* Jump out to here if this rule does not match */


        	        	        	    }
        	        	        	    break;
        	        	        	case 2:
        	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4457:8: STAR
        	        	        	    {
        	        	        	         MATCHT(STAR, &FOLLOW_STAR_in_com_connect14514);
        	        	        	        if  (HASEXCEPTION())
        	        	        	        {
        	        	        	            goto rulecom_connectEx;
        	        	        	        }
        	        	        	        if (HASFAILED())
        	        	        	        {
        	        	        	            return ;
        	        	        	        }


        	        	        	        if ( BACKTRACKING==0 )
        	        	        	        {

        	        	        	            			sep::ComPoint * comPoint = new sep::ComPoint();
        	        	        	            	    	comPoint->setMachineAllSignal(machine);
        	        	        	            			comRoute->setComPoint(comPoint, sep::Modifier::DIRECTION_INOUT_KIND);

        	        	        	            			SET_RULE_LOCATION(comPoint);
        	        	        	            	    
        	        	        	        }


        	        	        	    }
        	        	        	    break;

        	        	            }
        	        	        }

        	        	         MATCHT(RBRACKET, &FOLLOW_RBRACKET_in_com_connect14535);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulecom_connectEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	         MATCHT(SEMI, &FOLLOW_SEMI_in_com_connect14542);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulecom_connectEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto rulecom_connectEx; /* Prevent compiler warnings */
    rulecom_connectEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
            else
            {
                {

                    	SET_RULE_LOCATION(aConnector);

                }
            }


    if ( BACKTRACKING>0 ) { MEMOIZE(164, com_connect_StartIndex); }

    return ;
}
/* $ANTLR end com_connect */

/**
 * $ANTLR start com_route
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4472:1: com_route[ sep::Machine * machine , sep::Connector * aConnector ] : ( modifier_set_direction_strict_text[ comRoute->getwModifier() ] ( LT_ (bc= buffer_com[ machine ] | com_cast[ comRoute ] ) GT )? ( com_port[ machine , comRoute ] SEMI | LCURLY ( com_port[ machine , comRoute ] SEMI )+ RCURLY | LBRACKET ( com_port[ machine , comRoute ] ( COMMA com_port[ machine , comRoute ] )* | STAR ) RBRACKET SEMI ) | com_port[ machine , comRoute ] SEMI );
 */
static void
com_route(pfmlParser ctx, sep::Machine * machine, sep::Connector * aConnector)
{
    ANTLR3_UINT32 com_route_StartIndex;

    sep::BF bc;
    #undef	RETURN_TYPE_bc
    #define	RETURN_TYPE_bc sep::BF

    /* Initialize rule variables
     */
    com_route_StartIndex = INDEX();



    	sep::ComRoute * comRoute = new sep::ComRoute(aConnector);
    	aConnector->appendComRoute(comRoute);

    	SAVE_RULE_BEGIN_LOCATION;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(165)) )
    {
        {

            	SET_RULE_LOCATION(comRoute);

        }
        {
        }



        return ;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4483:2: ( modifier_set_direction_strict_text[ comRoute->getwModifier() ] ( LT_ (bc= buffer_com[ machine ] | com_cast[ comRoute ] ) GT )? ( com_port[ machine , comRoute ] SEMI | LCURLY ( com_port[ machine , comRoute ] SEMI )+ RCURLY | LBRACKET ( com_port[ machine , comRoute ] ( COMMA com_port[ machine , comRoute ] )* | STAR ) RBRACKET SEMI ) | com_port[ machine , comRoute ] SEMI )

            ANTLR3_UINT32 alt402;

            alt402=2;

            switch ( LA(1) )
            {
            case 298:
            case 305:
            case 341:
            case 364:
            	{
            		alt402=1;
            	}
                break;
            case ID:
            	{
            		alt402=2;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 402;
                EXCEPTION->state        = 0;


                goto rulecom_routeEx;

            }

            switch (alt402)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4483:4: modifier_set_direction_strict_text[ comRoute->getwModifier() ] ( LT_ (bc= buffer_com[ machine ] | com_cast[ comRoute ] ) GT )? ( com_port[ machine , comRoute ] SEMI | LCURLY ( com_port[ machine , comRoute ] SEMI )+ RCURLY | LBRACKET ( com_port[ machine , comRoute ] ( COMMA com_port[ machine , comRoute ] )* | STAR ) RBRACKET SEMI )
        	    {
        	        FOLLOWPUSH(FOLLOW_modifier_set_direction_strict_text_in_com_route14570);
        	        modifier_set_direction_strict_text(ctx, comRoute->getwModifier());

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulecom_routeEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4484:4: ( LT_ (bc= buffer_com[ machine ] | com_cast[ comRoute ] ) GT )?
        	        {
        	            int alt397=2;
        	            switch ( LA(1) )
        	            {
        	                case LT_:
        	                	{
        	                		alt397=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt397)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4484:6: LT_ (bc= buffer_com[ machine ] | com_cast[ comRoute ] ) GT
        	        	    {
        	        	         MATCHT(LT_, &FOLLOW_LT__in_com_route14578);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulecom_routeEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4484:10: (bc= buffer_com[ machine ] | com_cast[ comRoute ] )
        	        	        {
        	        	            int alt396=2;
        	        	            switch ( LA(1) )
        	        	            {
        	        	            case 249:
        	        	            case 281:
        	        	            case 315:
        	        	            case 325:
        	        	            case 326:
        	        	            case 329:
        	        	            case 356:
        	        	            case 370:
        	        	            case 373:
        	        	            case 412:
        	        	            	{
        	        	            		alt396=1;
        	        	            	}
        	        	                break;
        	        	            case 240:
        	        	            case 248:
        	        	            case 324:
        	        	            case 403:
        	        	            	{
        	        	            		alt396=2;
        	        	            	}
        	        	                break;

        	        	            default:
        	        	                if (BACKTRACKING>0)
        	        	                {
        	        	                    FAILEDFLAG = ANTLR3_TRUE;
        	        	                    return ;
        	        	                }

        	        	                CONSTRUCTEX();
        	        	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
        	        	                EXCEPTION->message      = (void *)"";
        	        	                EXCEPTION->decisionNum  = 396;
        	        	                EXCEPTION->state        = 0;


        	        	                goto rulecom_routeEx;

        	        	            }

        	        	            switch (alt396)
        	        	            {
        	        	        	case 1:
        	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4485:6: bc= buffer_com[ machine ]
        	        	        	    {
        	        	        	        FOLLOWPUSH(FOLLOW_buffer_com_in_com_route14589);
        	        	        	        bc=buffer_com(ctx, machine);

        	        	        	        FOLLOWPOP();
        	        	        	        if  (HASEXCEPTION())
        	        	        	        {
        	        	        	            goto rulecom_routeEx;
        	        	        	        }
        	        	        	        if (HASFAILED())
        	        	        	        {
        	        	        	            return ;
        	        	        	        }


        	        	        	        if ( BACKTRACKING==0 )
        	        	        	        {

        	        	        	            	    	comRoute->setProtocol(sep::ComProtocol::PROTOCOL_BUFFER_KIND);
        	        	        	            	    	comRoute->setBuffer(bc
        	        	        	            );
        	        	        	            	    
        	        	        	        }


        	        	        	    }
        	        	        	    break;
        	        	        	case 2:
        	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4490:8: com_cast[ comRoute ]
        	        	        	    {
        	        	        	        FOLLOWPUSH(FOLLOW_com_cast_in_com_route14606);
        	        	        	        com_cast(ctx, comRoute);

        	        	        	        FOLLOWPOP();
        	        	        	        if  (HASEXCEPTION())
        	        	        	        {
        	        	        	            goto rulecom_routeEx;
        	        	        	        }
        	        	        	        if (HASFAILED())
        	        	        	        {
        	        	        	            return ;
        	        	        	        }


        	        	        	    }
        	        	        	    break;

        	        	            }
        	        	        }

        	        	         MATCHT(GT, &FOLLOW_GT_in_com_route14614);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulecom_routeEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4493:4: ( com_port[ machine , comRoute ] SEMI | LCURLY ( com_port[ machine , comRoute ] SEMI )+ RCURLY | LBRACKET ( com_port[ machine , comRoute ] ( COMMA com_port[ machine , comRoute ] )* | STAR ) RBRACKET SEMI )
        	        {
        	            int alt401=3;
        	            switch ( LA(1) )
        	            {
        	            case ID:
        	            	{
        	            		alt401=1;
        	            	}
        	                break;
        	            case LCURLY:
        	            	{
        	            		alt401=2;
        	            	}
        	                break;
        	            case LBRACKET:
        	            	{
        	            		alt401=3;
        	            	}
        	                break;

        	            default:
        	                if (BACKTRACKING>0)
        	                {
        	                    FAILEDFLAG = ANTLR3_TRUE;
        	                    return ;
        	                }

        	                CONSTRUCTEX();
        	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
        	                EXCEPTION->message      = (void *)"";
        	                EXCEPTION->decisionNum  = 401;
        	                EXCEPTION->state        = 0;


        	                goto rulecom_routeEx;

        	            }

        	            switch (alt401)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4493:6: com_port[ machine , comRoute ] SEMI
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_com_port_in_com_route14625);
        	        	        com_port(ctx, machine, comRoute);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulecom_routeEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	         MATCHT(SEMI, &FOLLOW_SEMI_in_com_route14629);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulecom_routeEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;
        	        	case 2:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4495:6: LCURLY ( com_port[ machine , comRoute ] SEMI )+ RCURLY
        	        	    {
        	        	         MATCHT(LCURLY, &FOLLOW_LCURLY_in_com_route14637);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulecom_routeEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4496:6: ( com_port[ machine , comRoute ] SEMI )+
        	        	        {
        	        	            int cnt398=0;

        	        	            for (;;)
        	        	            {
        	        	                int alt398=2;
        	        	        	switch ( LA(1) )
        	        	        	{
        	        	        	case ID:
        	        	        		{
        	        	        			alt398=1;
        	        	        		}
        	        	        	    break;

        	        	        	}

        	        	        	switch (alt398)
        	        	        	{
        	        	        	    case 1:
        	        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4496:8: com_port[ machine , comRoute ] SEMI
        	        	        	        {
        	        	        	            FOLLOWPUSH(FOLLOW_com_port_in_com_route14646);
        	        	        	            com_port(ctx, machine, comRoute);

        	        	        	            FOLLOWPOP();
        	        	        	            if  (HASEXCEPTION())
        	        	        	            {
        	        	        	                goto rulecom_routeEx;
        	        	        	            }
        	        	        	            if (HASFAILED())
        	        	        	            {
        	        	        	                return ;
        	        	        	            }


        	        	        	             MATCHT(SEMI, &FOLLOW_SEMI_in_com_route14650);
        	        	        	            if  (HASEXCEPTION())
        	        	        	            {
        	        	        	                goto rulecom_routeEx;
        	        	        	            }
        	        	        	            if (HASFAILED())
        	        	        	            {
        	        	        	                return ;
        	        	        	            }


        	        	        	        }
        	        	        	        break;

        	        	        	    default:

        	        	        		if ( cnt398 >= 1 )
        	        	        		{
        	        	        		    goto loop398;
        	        	        		}
        	        	        		if (BACKTRACKING>0)
        	        	        		{
        	        	        		    FAILEDFLAG = ANTLR3_TRUE;
        	        	        		    return ;
        	        	        		}

        	        	        		/* mismatchedSetEx()
        	        	        		 */
        	        	        		CONSTRUCTEX();
        	        	        		EXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
        	        	        		EXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;


        	        	        		goto rulecom_routeEx;
        	        	        	}
        	        	        	cnt398++;
        	        	            }
        	        	            loop398: ;	/* Jump to here if this rule does not match */
        	        	        }

        	        	         MATCHT(RCURLY, &FOLLOW_RCURLY_in_com_route14660);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulecom_routeEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;
        	        	case 3:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4499:6: LBRACKET ( com_port[ machine , comRoute ] ( COMMA com_port[ machine , comRoute ] )* | STAR ) RBRACKET SEMI
        	        	    {
        	        	         MATCHT(LBRACKET, &FOLLOW_LBRACKET_in_com_route14668);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulecom_routeEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4500:6: ( com_port[ machine , comRoute ] ( COMMA com_port[ machine , comRoute ] )* | STAR )
        	        	        {
        	        	            int alt400=2;
        	        	            switch ( LA(1) )
        	        	            {
        	        	            case ID:
        	        	            	{
        	        	            		alt400=1;
        	        	            	}
        	        	                break;
        	        	            case STAR:
        	        	            	{
        	        	            		alt400=2;
        	        	            	}
        	        	                break;

        	        	            default:
        	        	                if (BACKTRACKING>0)
        	        	                {
        	        	                    FAILEDFLAG = ANTLR3_TRUE;
        	        	                    return ;
        	        	                }

        	        	                CONSTRUCTEX();
        	        	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
        	        	                EXCEPTION->message      = (void *)"";
        	        	                EXCEPTION->decisionNum  = 400;
        	        	                EXCEPTION->state        = 0;


        	        	                goto rulecom_routeEx;

        	        	            }

        	        	            switch (alt400)
        	        	            {
        	        	        	case 1:
        	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4500:8: com_port[ machine , comRoute ] ( COMMA com_port[ machine , comRoute ] )*
        	        	        	    {
        	        	        	        FOLLOWPUSH(FOLLOW_com_port_in_com_route14677);
        	        	        	        com_port(ctx, machine, comRoute);

        	        	        	        FOLLOWPOP();
        	        	        	        if  (HASEXCEPTION())
        	        	        	        {
        	        	        	            goto rulecom_routeEx;
        	        	        	        }
        	        	        	        if (HASFAILED())
        	        	        	        {
        	        	        	            return ;
        	        	        	        }


        	        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4501:8: ( COMMA com_port[ machine , comRoute ] )*

        	        	        	        for (;;)
        	        	        	        {
        	        	        	            int alt399=2;
        	        	        	            switch ( LA(1) )
        	        	        	            {
        	        	        	            case COMMA:
        	        	        	            	{
        	        	        	            		alt399=1;
        	        	        	            	}
        	        	        	                break;

        	        	        	            }

        	        	        	            switch (alt399)
        	        	        	            {
        	        	        	        	case 1:
        	        	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4501:10: COMMA com_port[ machine , comRoute ]
        	        	        	        	    {
        	        	        	        	         MATCHT(COMMA, &FOLLOW_COMMA_in_com_route14689);
        	        	        	        	        if  (HASEXCEPTION())
        	        	        	        	        {
        	        	        	        	            goto rulecom_routeEx;
        	        	        	        	        }
        	        	        	        	        if (HASFAILED())
        	        	        	        	        {
        	        	        	        	            return ;
        	        	        	        	        }


        	        	        	        	        FOLLOWPUSH(FOLLOW_com_port_in_com_route14692);
        	        	        	        	        com_port(ctx, machine, comRoute);

        	        	        	        	        FOLLOWPOP();
        	        	        	        	        if  (HASEXCEPTION())
        	        	        	        	        {
        	        	        	        	            goto rulecom_routeEx;
        	        	        	        	        }
        	        	        	        	        if (HASFAILED())
        	        	        	        	        {
        	        	        	        	            return ;
        	        	        	        	        }


        	        	        	        	    }
        	        	        	        	    break;

        	        	        	        	default:
        	        	        	        	    goto loop399;	/* break out of the loop */
        	        	        	        	    break;
        	        	        	            }
        	        	        	        }
        	        	        	        loop399: ; /* Jump out to here if this rule does not match */


        	        	        	    }
        	        	        	    break;
        	        	        	case 2:
        	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4503:8: STAR
        	        	        	    {
        	        	        	         MATCHT(STAR, &FOLLOW_STAR_in_com_route14706);
        	        	        	        if  (HASEXCEPTION())
        	        	        	        {
        	        	        	            goto rulecom_routeEx;
        	        	        	        }
        	        	        	        if (HASFAILED())
        	        	        	        {
        	        	        	            return ;
        	        	        	        }


        	        	        	        if ( BACKTRACKING==0 )
        	        	        	        {

        	        	        	            			sep::ComPoint * comPoint = new sep::ComPoint();
        	        	        	            	    	comPoint->setMachineAllSignal(machine);
        	        	        	            			comRoute->setComPoint(comPoint, sep::Modifier::DIRECTION_INOUT_KIND);

        	        	        	            			SET_RULE_LOCATION(comPoint);
        	        	        	            	    
        	        	        	        }


        	        	        	    }
        	        	        	    break;

        	        	            }
        	        	        }

        	        	         MATCHT(RBRACKET, &FOLLOW_RBRACKET_in_com_route14727);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulecom_routeEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	         MATCHT(SEMI, &FOLLOW_SEMI_in_com_route14734);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulecom_routeEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4516:7: com_port[ machine , comRoute ] SEMI
        	    {
        	        FOLLOWPUSH(FOLLOW_com_port_in_com_route14748);
        	        com_port(ctx, machine, comRoute);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulecom_routeEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	         MATCHT(SEMI, &FOLLOW_SEMI_in_com_route14752);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulecom_routeEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto rulecom_routeEx; /* Prevent compiler warnings */
    rulecom_routeEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
            else
            {
                {

                    	SET_RULE_LOCATION(comRoute);

                }
            }


    if ( BACKTRACKING>0 ) { MEMOIZE(165, com_route_StartIndex); }

    return ;
}
/* $ANTLR end com_route */

/**
 * $ANTLR start com_port
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4520:1: com_port[ sep::Machine * machine , sep::ComRoute * comRoute] : ( ( qualifiedNameID '->' )=>m= qualifiedNameID '->' (cp= com_port_id[ machine , comMachine ] | LBRACKET (cp= com_port_id[ machine , comMachine ] ( COMMA cp= com_port_id[ machine , comMachine ] )* | STAR ) RBRACKET ) |cp= com_port_id[ machine , comMachine ] );
 */
static void
com_port(pfmlParser ctx, sep::Machine * machine, sep::ComRoute * comRoute)
{
    ANTLR3_UINT32 com_port_StartIndex;

    fmlParser_qualifiedNameID_return m;
    #undef	RETURN_TYPE_m
    #define	RETURN_TYPE_m fmlParser_qualifiedNameID_return

    sep::BF cp;
    #undef	RETURN_TYPE_cp
    #define	RETURN_TYPE_cp sep::BF

    /* Initialize rule variables
     */
    com_port_StartIndex = INDEX();



    	sep::Machine * comMachine = machine;
    	while( comMachine != NULL )
    	{
    		if( comMachine->hasPortSignal() || (! comMachine->hasContainer()) )
    		{
    			break;
    		}
    		comMachine = comMachine->getContainerMachine();
    	}

    	SAVE_RULE_BEGIN_LOCATION;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(166)) )
    {
        {
        }



        return ;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4535:2: ( ( qualifiedNameID '->' )=>m= qualifiedNameID '->' (cp= com_port_id[ machine , comMachine ] | LBRACKET (cp= com_port_id[ machine , comMachine ] ( COMMA cp= com_port_id[ machine , comMachine ] )* | STAR ) RBRACKET ) |cp= com_port_id[ machine , comMachine ] )

            ANTLR3_UINT32 alt406;

            alt406=2;

            switch ( LA(1) )
            {
            case ID:
            	{
            		{
            		    int LA406_1 = LA(2);
            		    if ( (synpred705_fml(ctx)))
            		    {
            		        alt406=1;
            		    }
            		    else if ( (ANTLR3_TRUE))
            		    {
            		        alt406=2;
            		    }
            		    else
            		    {
            		        if (BACKTRACKING>0)
            		        {
            		            FAILEDFLAG = ANTLR3_TRUE;
            		            return ;
            		        }


            		        CONSTRUCTEX();
            		        EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
            		        EXCEPTION->message      = (void *)"";
            		        EXCEPTION->decisionNum  = 406;
            		        EXCEPTION->state        = 1;


            		        goto rulecom_portEx;

            		    }
            		}
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 406;
                EXCEPTION->state        = 0;


                goto rulecom_portEx;

            }

            switch (alt406)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4535:4: ( qualifiedNameID '->' )=>m= qualifiedNameID '->' (cp= com_port_id[ machine , comMachine ] | LBRACKET (cp= com_port_id[ machine , comMachine ] ( COMMA cp= com_port_id[ machine , comMachine ] )* | STAR ) RBRACKET )
        	    {
        	        FOLLOWPUSH(FOLLOW_qualifiedNameID_in_com_port14786);
        	        m=qualifiedNameID(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulecom_portEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             comMachine = sep::ParserUtil::getMachine(machine, m.s
        	            , m.nb
        	            ); 
        	        }


        	         MATCHT(164, &FOLLOW_164_in_com_port14800);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulecom_portEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4541:4: (cp= com_port_id[ machine , comMachine ] | LBRACKET (cp= com_port_id[ machine , comMachine ] ( COMMA cp= com_port_id[ machine , comMachine ] )* | STAR ) RBRACKET )
        	        {
        	            int alt405=2;
        	            switch ( LA(1) )
        	            {
        	            case ID:
        	            	{
        	            		alt405=1;
        	            	}
        	                break;
        	            case LBRACKET:
        	            	{
        	            		alt405=2;
        	            	}
        	                break;

        	            default:
        	                if (BACKTRACKING>0)
        	                {
        	                    FAILEDFLAG = ANTLR3_TRUE;
        	                    return ;
        	                }

        	                CONSTRUCTEX();
        	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
        	                EXCEPTION->message      = (void *)"";
        	                EXCEPTION->decisionNum  = 405;
        	                EXCEPTION->state        = 0;


        	                goto rulecom_portEx;

        	            }

        	            switch (alt405)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4541:6: cp= com_port_id[ machine , comMachine ]
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_com_port_id_in_com_port14810);
        	        	        cp=com_port_id(ctx, machine, comMachine);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulecom_portEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             comRoute->appendComPoint(cp
        	        	            ); 
        	        	        }


        	        	    }
        	        	    break;
        	        	case 2:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4544:6: LBRACKET (cp= com_port_id[ machine , comMachine ] ( COMMA cp= com_port_id[ machine , comMachine ] )* | STAR ) RBRACKET
        	        	    {
        	        	         MATCHT(LBRACKET, &FOLLOW_LBRACKET_in_com_port14826);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulecom_portEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4545:6: (cp= com_port_id[ machine , comMachine ] ( COMMA cp= com_port_id[ machine , comMachine ] )* | STAR )
        	        	        {
        	        	            int alt404=2;
        	        	            switch ( LA(1) )
        	        	            {
        	        	            case ID:
        	        	            	{
        	        	            		alt404=1;
        	        	            	}
        	        	                break;
        	        	            case STAR:
        	        	            	{
        	        	            		alt404=2;
        	        	            	}
        	        	                break;

        	        	            default:
        	        	                if (BACKTRACKING>0)
        	        	                {
        	        	                    FAILEDFLAG = ANTLR3_TRUE;
        	        	                    return ;
        	        	                }

        	        	                CONSTRUCTEX();
        	        	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
        	        	                EXCEPTION->message      = (void *)"";
        	        	                EXCEPTION->decisionNum  = 404;
        	        	                EXCEPTION->state        = 0;


        	        	                goto rulecom_portEx;

        	        	            }

        	        	            switch (alt404)
        	        	            {
        	        	        	case 1:
        	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4545:8: cp= com_port_id[ machine , comMachine ] ( COMMA cp= com_port_id[ machine , comMachine ] )*
        	        	        	    {
        	        	        	        FOLLOWPUSH(FOLLOW_com_port_id_in_com_port14837);
        	        	        	        cp=com_port_id(ctx, machine, comMachine);

        	        	        	        FOLLOWPOP();
        	        	        	        if  (HASEXCEPTION())
        	        	        	        {
        	        	        	            goto rulecom_portEx;
        	        	        	        }
        	        	        	        if (HASFAILED())
        	        	        	        {
        	        	        	            return ;
        	        	        	        }


        	        	        	        if ( BACKTRACKING==0 )
        	        	        	        {
        	        	        	             comRoute->appendComPoint(cp
        	        	        	            ); 
        	        	        	        }


        	        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4548:8: ( COMMA cp= com_port_id[ machine , comMachine ] )*

        	        	        	        for (;;)
        	        	        	        {
        	        	        	            int alt403=2;
        	        	        	            switch ( LA(1) )
        	        	        	            {
        	        	        	            case COMMA:
        	        	        	            	{
        	        	        	            		alt403=1;
        	        	        	            	}
        	        	        	                break;

        	        	        	            }

        	        	        	            switch (alt403)
        	        	        	            {
        	        	        	        	case 1:
        	        	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4548:10: COMMA cp= com_port_id[ machine , comMachine ]
        	        	        	        	    {
        	        	        	        	         MATCHT(COMMA, &FOLLOW_COMMA_in_com_port14859);
        	        	        	        	        if  (HASEXCEPTION())
        	        	        	        	        {
        	        	        	        	            goto rulecom_portEx;
        	        	        	        	        }
        	        	        	        	        if (HASFAILED())
        	        	        	        	        {
        	        	        	        	            return ;
        	        	        	        	        }


        	        	        	        	        FOLLOWPUSH(FOLLOW_com_port_id_in_com_port14864);
        	        	        	        	        cp=com_port_id(ctx, machine, comMachine);

        	        	        	        	        FOLLOWPOP();
        	        	        	        	        if  (HASEXCEPTION())
        	        	        	        	        {
        	        	        	        	            goto rulecom_portEx;
        	        	        	        	        }
        	        	        	        	        if (HASFAILED())
        	        	        	        	        {
        	        	        	        	            return ;
        	        	        	        	        }


        	        	        	        	        if ( BACKTRACKING==0 )
        	        	        	        	        {
        	        	        	        	             comRoute->appendComPoint(cp
        	        	        	        	            ); 
        	        	        	        	        }


        	        	        	        	    }
        	        	        	        	    break;

        	        	        	        	default:
        	        	        	        	    goto loop403;	/* break out of the loop */
        	        	        	        	    break;
        	        	        	            }
        	        	        	        }
        	        	        	        loop403: ; /* Jump out to here if this rule does not match */


        	        	        	    }
        	        	        	    break;
        	        	        	case 2:
        	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4551:8: STAR
        	        	        	    {
        	        	        	         MATCHT(STAR, &FOLLOW_STAR_in_com_port14887);
        	        	        	        if  (HASEXCEPTION())
        	        	        	        {
        	        	        	            goto rulecom_portEx;
        	        	        	        }
        	        	        	        if (HASFAILED())
        	        	        	        {
        	        	        	            return ;
        	        	        	        }


        	        	        	        if ( BACKTRACKING==0 )
        	        	        	        {

        	        	        	            	    	sep::ComPoint * comPoint = new sep::ComPoint();
        	        	        	            			comPoint->setMachineAllSignal(comMachine);
        	        	        	            			comRoute->setComPoint(comPoint, sep::Modifier::DIRECTION_INOUT_KIND);

        	        	        	            			SET_RULE_LOCATION(comPoint);
        	        	        	            	    
        	        	        	        }


        	        	        	    }
        	        	        	    break;

        	        	            }
        	        	        }

        	        	         MATCHT(RBRACKET, &FOLLOW_RBRACKET_in_com_port14908);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulecom_portEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ;
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4564:4: cp= com_port_id[ machine , comMachine ]
        	    {
        	        FOLLOWPUSH(FOLLOW_com_port_id_in_com_port14922);
        	        cp=com_port_id(ctx, machine, comMachine);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulecom_portEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             comRoute->appendComPoint(cp
        	            ); 
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto rulecom_portEx; /* Prevent compiler warnings */
    rulecom_portEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(166, com_port_StartIndex); }

    return ;
}
/* $ANTLR end com_port */

/**
 * $ANTLR start com_port_id
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4569:1: com_port_id[ sep::Machine * machine , sep::Machine * comMachine ] returns [ sep::BF comPoint ] : id= qualifiedNameID ;
 */
static sep::BF
com_port_id(pfmlParser ctx, sep::Machine * machine, sep::Machine * comMachine)
{
    sep::BF comPoint;

    ANTLR3_UINT32 com_port_id_StartIndex;

    fmlParser_qualifiedNameID_return id;
    #undef	RETURN_TYPE_id
    #define	RETURN_TYPE_id fmlParser_qualifiedNameID_return

    /* Initialize rule variables
     */
    com_port_id_StartIndex = INDEX();



    	SAVE_RULE_BEGIN_LOCATION;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(167)) )
    {
        {
        }



        return comPoint;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4575:2: (id= qualifiedNameID )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4575:4: id= qualifiedNameID
        {
            FOLLOWPUSH(FOLLOW_qualifiedNameID_in_com_port_id14951);
            id=qualifiedNameID(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto rulecom_port_idEx;
            }
            if (HASFAILED())
            {
                return comPoint;
            }


            if ( BACKTRACKING==0 )
            {

                		sep::ComPoint * aComPoint;
                		comPoint= sep::BF( aComPoint = new sep::ComPoint() );


                		SET_RULE_LOCATION(aComPoint);

                		const sep::BF & comPort = sep::ParserUtil::getComPortSignal(
                				comMachine, id.s
                , id.nb
                );
                	  	if( comPort.valid() )
                	  	{
                	  		aComPoint->setMachinePort(comMachine, comPort.to_ptr< sep::Port >());
                	  	}
                	  	else
                	  	{
                	  		aComPoint->setMachine(comMachine);
                	  		aComPoint->setMachinePort(NEW_QNID(id.s
                , id.nb
                ));
                	  	}
                	  
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto rulecom_port_idEx; /* Prevent compiler warnings */
    rulecom_port_idEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(167, com_port_id_StartIndex); }

    return comPoint;
}
/* $ANTLR end com_port_id */

/**
 * $ANTLR start statement
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4604:1: statement returns [ sep::BFCode ac ] : (s= statement_assign |s= statement_com |s= statement_constraint |s= statement_jump |s= statement_activity |s= statement_invoke_routine |s= statement_moc |s= statement_invoke |s= statement_invoke_method |s= statement_activity_new |s= statement_ite |s= statement_iteration |s= block_statement |s= prefix_statement |s= statement_prompt |s= meta_statement );
 */
static sep::BFCode
statement(pfmlParser ctx)
{
    sep::BFCode ac;

    ANTLR3_UINT32 statement_StartIndex;

    sep::BFCode s;
    #undef	RETURN_TYPE_s
    #define	RETURN_TYPE_s sep::BFCode

    /* Initialize rule variables
     */
    statement_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(168)) )
    {
        {
        }



        return ac;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4606:2: (s= statement_assign |s= statement_com |s= statement_constraint |s= statement_jump |s= statement_activity |s= statement_invoke_routine |s= statement_moc |s= statement_invoke |s= statement_invoke_method |s= statement_activity_new |s= statement_ite |s= statement_iteration |s= block_statement |s= prefix_statement |s= statement_prompt |s= meta_statement )

            ANTLR3_UINT32 alt407;

            alt407=16;

            switch ( LA(1) )
            {
            case ID:
            	{
            		{
            		    int LA407_1 = LA(2);
            		    if ( (synpred709_fml(ctx)))
            		    {
            		        alt407=1;
            		    }
            		    else if ( (synpred714_fml(ctx)))
            		    {
            		        alt407=6;
            		    }
            		    else
            		    {
            		        if (BACKTRACKING>0)
            		        {
            		            FAILEDFLAG = ANTLR3_TRUE;
            		            return ac;
            		        }


            		        CONSTRUCTEX();
            		        EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
            		        EXCEPTION->message      = (void *)"";
            		        EXCEPTION->decisionNum  = 407;
            		        EXCEPTION->state        = 1;


            		        goto rulestatementEx;

            		    }
            		}
            	}
                break;
            case 299:
            case 300:
            case 301:
            case 302:
            case 303:
            case 304:
            case 305:
            case 336:
            case 337:
            case 338:
            case 339:
            case 340:
            case 341:
            	{
            		alt407=2;
            	}
                break;
            case 256:
            case 278:
            case 290:
            case 391:
            	{
            		alt407=3;
            	}
                break;
            case 247:
            case 263:
            case 279:
            case 364:
            	{
            		alt407=4;
            	}
                break;
            case 236:
            case 267:
            case 268:
            case 275:
            case 282:
            case 289:
            case 291:
            case 292:
            case 293:
            case 296:
            case 312:
            case 362:
            case 363:
            case 368:
            case 369:
            case 371:
            case 377:
            case 386:
            case 389:
            case 415:
            	{
            		alt407=5;
            	}
                break;
            case COLONx2:
            case DECR:
            case INCR:
            	{
            		alt407=1;
            	}
                break;
            case 385:
            	{
            		alt407=7;
            	}
                break;
            case LPAREN_INVOKE:
            	{
            		alt407=8;
            	}
                break;
            case 250:
            	{
            		alt407=9;
            	}
                break;
            case 330:
            	{
            		alt407=10;
            	}
                break;
            case 294:
            	{
            		alt407=11;
            	}
                break;
            case 269:
            case 285:
            case 416:
            	{
            		alt407=12;
            	}
                break;
            case LCURLY:
            	{
            		alt407=13;
            	}
                break;
            case DOLLAR_LCURLY:
            	{
            		alt407=14;
            	}
                break;
            case STATEMENT_PROMPT:
            	{
            		alt407=15;
            	}
                break;
            case 154:
            case 155:
            case 156:
            case 157:
            	{
            		alt407=16;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ac;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 407;
                EXCEPTION->state        = 0;


                goto rulestatementEx;

            }

            switch (alt407)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4606:4: s= statement_assign
        	    {
        	        FOLLOWPUSH(FOLLOW_statement_assign_in_statement14981);
        	        s=statement_assign(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatementEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= 
        	            s
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4608:4: s= statement_com
        	    {
        	        FOLLOWPUSH(FOLLOW_statement_com_in_statement15002);
        	        s=statement_com(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatementEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= 
        	            s
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4609:4: s= statement_constraint
        	    {
        	        FOLLOWPUSH(FOLLOW_statement_constraint_in_statement15025);
        	        s=statement_constraint(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatementEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= 
        	            s
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 4:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4610:4: s= statement_jump
        	    {
        	        FOLLOWPUSH(FOLLOW_statement_jump_in_statement15041);
        	        s=statement_jump(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatementEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= 
        	            s
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 5:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4613:4: s= statement_activity
        	    {
        	        FOLLOWPUSH(FOLLOW_statement_activity_in_statement15065);
        	        s=statement_activity(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatementEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= 
        	            s
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 6:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4614:4: s= statement_invoke_routine
        	    {
        	        FOLLOWPUSH(FOLLOW_statement_invoke_routine_in_statement15083);
        	        s=statement_invoke_routine(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatementEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= 
        	            s
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 7:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4616:4: s= statement_moc
        	    {
        	        FOLLOWPUSH(FOLLOW_statement_moc_in_statement15096);
        	        s=statement_moc(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatementEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= 
        	            s
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 8:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4618:4: s= statement_invoke
        	    {
        	        FOLLOWPUSH(FOLLOW_statement_invoke_in_statement15120);
        	        s=statement_invoke(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatementEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= 
        	            s
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 9:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4619:4: s= statement_invoke_method
        	    {
        	        FOLLOWPUSH(FOLLOW_statement_invoke_method_in_statement15140);
        	        s=statement_invoke_method(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatementEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= 
        	            s
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 10:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4621:4: s= statement_activity_new
        	    {
        	        FOLLOWPUSH(FOLLOW_statement_activity_new_in_statement15154);
        	        s=statement_activity_new(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatementEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= 
        	            s
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 11:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4623:4: s= statement_ite
        	    {
        	        FOLLOWPUSH(FOLLOW_statement_ite_in_statement15169);
        	        s=statement_ite(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatementEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= 
        	            s
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 12:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4624:4: s= statement_iteration
        	    {
        	        FOLLOWPUSH(FOLLOW_statement_iteration_in_statement15192);
        	        s=statement_iteration(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatementEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= 
        	            s
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 13:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4628:4: s= block_statement
        	    {
        	        FOLLOWPUSH(FOLLOW_block_statement_in_statement15212);
        	        s=block_statement(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatementEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= 
        	            s
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 14:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4630:4: s= prefix_statement
        	    {
        	        FOLLOWPUSH(FOLLOW_prefix_statement_in_statement15234);
        	        s=prefix_statement(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatementEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= 
        	            s
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 15:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4632:4: s= statement_prompt
        	    {
        	        FOLLOWPUSH(FOLLOW_statement_prompt_in_statement15255);
        	        s=statement_prompt(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatementEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= 
        	            s
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 16:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4634:4: s= meta_statement
        	    {
        	        FOLLOWPUSH(FOLLOW_meta_statement_in_statement15276);
        	        s=meta_statement(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatementEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= 
        	            s
        	            ;
        	             
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto rulestatementEx; /* Prevent compiler warnings */
    rulestatementEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(168, statement_StartIndex); }

    return ac;
}
/* $ANTLR end statement */

/**
 * $ANTLR start block_statement
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4640:1: block_statement returns [ sep::BFCode ac ] : LCURLY (o= op_block )? (s= statement )* RCURLY ;
 */
static sep::BFCode
block_statement(pfmlParser ctx)
{
    sep::BFCode ac;

    ANTLR3_UINT32 block_statement_StartIndex;

    sep::Operator * o;
    #undef	RETURN_TYPE_o
    #define	RETURN_TYPE_o sep::Operator *

    sep::BFCode s;
    #undef	RETURN_TYPE_s
    #define	RETURN_TYPE_s sep::BFCode

    /* Initialize rule variables
     */
    block_statement_StartIndex = INDEX();



    	sep::Operator * op = OP(SEQUENCE);
    	bool implicitSequenceOp = true;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(169)) )
    {
        {

            	if( implicitSequenceOp && ac
            .valid() && ac
            ->singleton() &&
            			sep::OperatorManager::isSchedule(op) )
            	{
            		sep::BFCode singleCode = ac
            ->first().bfCode();
            		ac= singleCode;

            	}

        }
        {
        }



        return ac;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4654:2: ( LCURLY (o= op_block )? (s= statement )* RCURLY )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4654:4: LCURLY (o= op_block )? (s= statement )* RCURLY
        {
             MATCHT(LCURLY, &FOLLOW_LCURLY_in_block_statement15317);
            if  (HASEXCEPTION())
            {
                goto ruleblock_statementEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4654:12: (o= op_block )?
            {
                int alt408=2;
                switch ( LA(1) )
                {
                    case OP_ATOMIC_SEQUENCE:
                    case OP_CONCURRENCY_AND:
                    case OP_CONCURRENCY_ASYNC:
                    case OP_CONCURRENCY_INTERLEAVING:
                    case OP_CONCURRENCY_OR:
                    case OP_CONCURRENCY_PARALLEL:
                    case OP_CONCURRENCY_RDV_AND:
                    case OP_CONCURRENCY_RDV_ASYNC:
                    case OP_CONCURRENCY_RDV_INTERLEAVING:
                    case OP_CONCURRENCY_RDV_OR:
                    case OP_CONCURRENCY_RDV_PARALLEL:
                    case OP_FORK:
                    case OP_JOIN:
                    case OP_NON_DETERMINISM:
                    case OP_SCHEDULE_AND_THEN:
                    case OP_SCHEDULE_GT:
                    case OP_SCHEDULE_LT:
                    case OP_SCHEDULE_OR_ELSE:
                    case OP_SCHEDULE_XOR:
                    case OP_SEQUENCE:
                    case OP_SEQUENCE_SIDE:
                    case OP_SEQUENCE_WEAK:
                    	{
                    		alt408=1;
                    	}
                        break;
                }

                switch (alt408)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4654:14: o= op_block
            	    {
            	        FOLLOWPUSH(FOLLOW_op_block_in_block_statement15324);
            	        o=op_block(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleblock_statementEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             op = o
            	            ; implicitSequenceOp = false; 
            	        }


            	    }
            	    break;

                }
            }

            if ( BACKTRACKING==0 )
            {
                 ac= NEW_STMT(op);
                 
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4656:6: (s= statement )*

            for (;;)
            {
                int alt409=2;
                switch ( LA(1) )
                {
                case COLONx2:
                case DECR:
                case DOLLAR_LCURLY:
                case ID:
                case INCR:
                case LCURLY:
                case LPAREN_INVOKE:
                case STATEMENT_PROMPT:
                case 154:
                case 155:
                case 156:
                case 157:
                case 236:
                case 247:
                case 250:
                case 256:
                case 263:
                case 267:
                case 268:
                case 269:
                case 275:
                case 278:
                case 279:
                case 282:
                case 285:
                case 289:
                case 290:
                case 291:
                case 292:
                case 293:
                case 294:
                case 296:
                case 299:
                case 300:
                case 301:
                case 302:
                case 303:
                case 304:
                case 305:
                case 312:
                case 330:
                case 336:
                case 337:
                case 338:
                case 339:
                case 340:
                case 341:
                case 362:
                case 363:
                case 364:
                case 368:
                case 369:
                case 371:
                case 377:
                case 385:
                case 386:
                case 389:
                case 391:
                case 415:
                case 416:
                	{
                		alt409=1;
                	}
                    break;

                }

                switch (alt409)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4656:9: s= statement
            	    {
            	        FOLLOWPUSH(FOLLOW_statement_in_block_statement15348);
            	        s=statement(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleblock_statementEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             ac
            	            ->append(s
            	            ); 
            	        }


            	    }
            	    break;

            	default:
            	    goto loop409;	/* break out of the loop */
            	    break;
                }
            }
            loop409: ; /* Jump out to here if this rule does not match */


             MATCHT(RCURLY, &FOLLOW_RCURLY_in_block_statement15360);
            if  (HASEXCEPTION())
            {
                goto ruleblock_statementEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruleblock_statementEx; /* Prevent compiler warnings */
    ruleblock_statementEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
            else
            {
                {

                    	if( implicitSequenceOp && ac
                    .valid() && ac
                    ->singleton() &&
                    			sep::OperatorManager::isSchedule(op) )
                    	{
                    		sep::BFCode singleCode = ac
                    ->first().bfCode();
                    		ac= singleCode;

                    	}

                }
            }


    if ( BACKTRACKING>0 ) { MEMOIZE(169, block_statement_StartIndex); }

    return ac;
}
/* $ANTLR end block_statement */

/**
 * $ANTLR start op_block
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4660:1: op_block returns [ sep::Operator * op ] : (o= op_sequence |o= op_scheduling |o= op_concurrency | OP_FORK | OP_JOIN );
 */
static sep::Operator *
op_block(pfmlParser ctx)
{
    sep::Operator * op;

    ANTLR3_UINT32 op_block_StartIndex;

    sep::Operator * o;
    #undef	RETURN_TYPE_o
    #define	RETURN_TYPE_o sep::Operator *

    /* Initialize rule variables
     */
    op_block_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(170)) )
    {
        {
        }



        return op;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4662:2: (o= op_sequence |o= op_scheduling |o= op_concurrency | OP_FORK | OP_JOIN )

            ANTLR3_UINT32 alt410;

            alt410=5;

            switch ( LA(1) )
            {
            case OP_ATOMIC_SEQUENCE:
            case OP_SEQUENCE:
            case OP_SEQUENCE_SIDE:
            case OP_SEQUENCE_WEAK:
            	{
            		alt410=1;
            	}
                break;
            case OP_NON_DETERMINISM:
            case OP_SCHEDULE_AND_THEN:
            case OP_SCHEDULE_GT:
            case OP_SCHEDULE_LT:
            case OP_SCHEDULE_OR_ELSE:
            case OP_SCHEDULE_XOR:
            	{
            		alt410=2;
            	}
                break;
            case OP_CONCURRENCY_AND:
            case OP_CONCURRENCY_ASYNC:
            case OP_CONCURRENCY_INTERLEAVING:
            case OP_CONCURRENCY_OR:
            case OP_CONCURRENCY_PARALLEL:
            case OP_CONCURRENCY_RDV_AND:
            case OP_CONCURRENCY_RDV_ASYNC:
            case OP_CONCURRENCY_RDV_INTERLEAVING:
            case OP_CONCURRENCY_RDV_OR:
            case OP_CONCURRENCY_RDV_PARALLEL:
            	{
            		alt410=3;
            	}
                break;
            case OP_FORK:
            	{
            		alt410=4;
            	}
                break;
            case OP_JOIN:
            	{
            		alt410=5;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return op;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 410;
                EXCEPTION->state        = 0;


                goto ruleop_blockEx;

            }

            switch (alt410)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4662:4: o= op_sequence
        	    {
        	        FOLLOWPUSH(FOLLOW_op_sequence_in_op_block15377);
        	        o=op_sequence(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_blockEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= 
        	            o
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4663:4: o= op_scheduling
        	    {
        	        FOLLOWPUSH(FOLLOW_op_scheduling_in_op_block15389);
        	        o=op_scheduling(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_blockEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= 
        	            o
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4664:4: o= op_concurrency
        	    {
        	        FOLLOWPUSH(FOLLOW_op_concurrency_in_op_block15399);
        	        o=op_concurrency(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_blockEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= 
        	            o
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 4:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4666:4: OP_FORK
        	    {
        	         MATCHT(OP_FORK, &FOLLOW_OP_FORK_in_op_block15407);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_blockEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(FORK);
        	             
        	        }


        	    }
        	    break;
        	case 5:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4667:4: OP_JOIN
        	    {
        	         MATCHT(OP_JOIN, &FOLLOW_OP_JOIN_in_op_block15423);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_blockEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(JOIN);
        	             
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruleop_blockEx; /* Prevent compiler warnings */
    ruleop_blockEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(170, op_block_StartIndex); }

    return op;
}
/* $ANTLR end op_block */

/**
 * $ANTLR start op_sequence
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4670:1: op_sequence returns [ sep::Operator * op ] : ( OP_SEQUENCE | OP_SEQUENCE_SIDE | OP_SEQUENCE_WEAK | OP_ATOMIC_SEQUENCE );
 */
static sep::Operator *
op_sequence(pfmlParser ctx)
{
    sep::Operator * op;

    ANTLR3_UINT32 op_sequence_StartIndex;

    /* Initialize rule variables
     */
    op_sequence_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(171)) )
    {
        {
        }



        return op;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4672:2: ( OP_SEQUENCE | OP_SEQUENCE_SIDE | OP_SEQUENCE_WEAK | OP_ATOMIC_SEQUENCE )

            ANTLR3_UINT32 alt411;

            alt411=4;

            switch ( LA(1) )
            {
            case OP_SEQUENCE:
            	{
            		alt411=1;
            	}
                break;
            case OP_SEQUENCE_SIDE:
            	{
            		alt411=2;
            	}
                break;
            case OP_SEQUENCE_WEAK:
            	{
            		alt411=3;
            	}
                break;
            case OP_ATOMIC_SEQUENCE:
            	{
            		alt411=4;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return op;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 411;
                EXCEPTION->state        = 0;


                goto ruleop_sequenceEx;

            }

            switch (alt411)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4672:4: OP_SEQUENCE
        	    {
        	         MATCHT(OP_SEQUENCE, &FOLLOW_OP_SEQUENCE_in_op_sequence15449);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_sequenceEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(SEQUENCE);
        	             
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4673:4: OP_SEQUENCE_SIDE
        	    {
        	         MATCHT(OP_SEQUENCE_SIDE, &FOLLOW_OP_SEQUENCE_SIDE_in_op_sequence15464);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_sequenceEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(SEQUENCE_SIDE);
        	             
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4674:4: OP_SEQUENCE_WEAK
        	    {
        	         MATCHT(OP_SEQUENCE_WEAK, &FOLLOW_OP_SEQUENCE_WEAK_in_op_sequence15474);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_sequenceEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(SEQUENCE_WEAK);
        	             
        	        }


        	    }
        	    break;
        	case 4:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4676:4: OP_ATOMIC_SEQUENCE
        	    {
        	         MATCHT(OP_ATOMIC_SEQUENCE, &FOLLOW_OP_ATOMIC_SEQUENCE_in_op_sequence15485);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_sequenceEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(ATOMIC_SEQUENCE);
        	             
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruleop_sequenceEx; /* Prevent compiler warnings */
    ruleop_sequenceEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(171, op_sequence_StartIndex); }

    return op;
}
/* $ANTLR end op_sequence */

/**
 * $ANTLR start op_scheduling
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4679:1: op_scheduling returns [ sep::Operator * op ] : ( OP_SCHEDULE_GT | OP_SCHEDULE_LT | OP_SCHEDULE_XOR | OP_SCHEDULE_AND_THEN | OP_SCHEDULE_OR_ELSE | OP_NON_DETERMINISM );
 */
static sep::Operator *
op_scheduling(pfmlParser ctx)
{
    sep::Operator * op;

    ANTLR3_UINT32 op_scheduling_StartIndex;

    /* Initialize rule variables
     */
    op_scheduling_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(172)) )
    {
        {
        }



        return op;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4681:2: ( OP_SCHEDULE_GT | OP_SCHEDULE_LT | OP_SCHEDULE_XOR | OP_SCHEDULE_AND_THEN | OP_SCHEDULE_OR_ELSE | OP_NON_DETERMINISM )

            ANTLR3_UINT32 alt412;

            alt412=6;

            switch ( LA(1) )
            {
            case OP_SCHEDULE_GT:
            	{
            		alt412=1;
            	}
                break;
            case OP_SCHEDULE_LT:
            	{
            		alt412=2;
            	}
                break;
            case OP_SCHEDULE_XOR:
            	{
            		alt412=3;
            	}
                break;
            case OP_SCHEDULE_AND_THEN:
            	{
            		alt412=4;
            	}
                break;
            case OP_SCHEDULE_OR_ELSE:
            	{
            		alt412=5;
            	}
                break;
            case OP_NON_DETERMINISM:
            	{
            		alt412=6;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return op;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 412;
                EXCEPTION->state        = 0;


                goto ruleop_schedulingEx;

            }

            switch (alt412)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4681:4: OP_SCHEDULE_GT
        	    {
        	         MATCHT(OP_SCHEDULE_GT, &FOLLOW_OP_SCHEDULE_GT_in_op_scheduling15503);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_schedulingEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(PRIOR_GT);
        	             
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4682:4: OP_SCHEDULE_LT
        	    {
        	         MATCHT(OP_SCHEDULE_LT, &FOLLOW_OP_SCHEDULE_LT_in_op_scheduling15517);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_schedulingEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(PRIOR_LT);
        	             
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4683:4: OP_SCHEDULE_XOR
        	    {
        	         MATCHT(OP_SCHEDULE_XOR, &FOLLOW_OP_SCHEDULE_XOR_in_op_scheduling15531);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_schedulingEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(EXCLUSIVE);
        	             
        	        }


        	    }
        	    break;
        	case 4:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4685:4: OP_SCHEDULE_AND_THEN
        	    {
        	         MATCHT(OP_SCHEDULE_AND_THEN, &FOLLOW_OP_SCHEDULE_AND_THEN_in_op_scheduling15545);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_schedulingEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(SCHEDULE_AND_THEN);
        	             
        	        }


        	    }
        	    break;
        	case 5:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4686:4: OP_SCHEDULE_OR_ELSE
        	    {
        	         MATCHT(OP_SCHEDULE_OR_ELSE, &FOLLOW_OP_SCHEDULE_OR_ELSE_in_op_scheduling15553);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_schedulingEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(SCHEDULE_OR_ELSE);
        	             
        	        }


        	    }
        	    break;
        	case 6:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4688:4: OP_NON_DETERMINISM
        	    {
        	         MATCHT(OP_NON_DETERMINISM, &FOLLOW_OP_NON_DETERMINISM_in_op_scheduling15563);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_schedulingEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(NONDETERMINISM);
        	             
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruleop_schedulingEx; /* Prevent compiler warnings */
    ruleop_schedulingEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(172, op_scheduling_StartIndex); }

    return op;
}
/* $ANTLR end op_scheduling */

/**
 * $ANTLR start op_concurrency
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4691:1: op_concurrency returns [ sep::Operator * op ] : ( OP_CONCURRENCY_ASYNC | OP_CONCURRENCY_AND | OP_CONCURRENCY_OR | OP_CONCURRENCY_INTERLEAVING | OP_CONCURRENCY_PARALLEL | OP_CONCURRENCY_RDV_ASYNC | OP_CONCURRENCY_RDV_AND | OP_CONCURRENCY_RDV_OR | OP_CONCURRENCY_RDV_INTERLEAVING | OP_CONCURRENCY_RDV_PARALLEL );
 */
static sep::Operator *
op_concurrency(pfmlParser ctx)
{
    sep::Operator * op;

    ANTLR3_UINT32 op_concurrency_StartIndex;

    /* Initialize rule variables
     */
    op_concurrency_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(173)) )
    {
        {
        }



        return op;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4693:2: ( OP_CONCURRENCY_ASYNC | OP_CONCURRENCY_AND | OP_CONCURRENCY_OR | OP_CONCURRENCY_INTERLEAVING | OP_CONCURRENCY_PARALLEL | OP_CONCURRENCY_RDV_ASYNC | OP_CONCURRENCY_RDV_AND | OP_CONCURRENCY_RDV_OR | OP_CONCURRENCY_RDV_INTERLEAVING | OP_CONCURRENCY_RDV_PARALLEL )

            ANTLR3_UINT32 alt413;

            alt413=10;

            switch ( LA(1) )
            {
            case OP_CONCURRENCY_ASYNC:
            	{
            		alt413=1;
            	}
                break;
            case OP_CONCURRENCY_AND:
            	{
            		alt413=2;
            	}
                break;
            case OP_CONCURRENCY_OR:
            	{
            		alt413=3;
            	}
                break;
            case OP_CONCURRENCY_INTERLEAVING:
            	{
            		alt413=4;
            	}
                break;
            case OP_CONCURRENCY_PARALLEL:
            	{
            		alt413=5;
            	}
                break;
            case OP_CONCURRENCY_RDV_ASYNC:
            	{
            		alt413=6;
            	}
                break;
            case OP_CONCURRENCY_RDV_AND:
            	{
            		alt413=7;
            	}
                break;
            case OP_CONCURRENCY_RDV_OR:
            	{
            		alt413=8;
            	}
                break;
            case OP_CONCURRENCY_RDV_INTERLEAVING:
            	{
            		alt413=9;
            	}
                break;
            case OP_CONCURRENCY_RDV_PARALLEL:
            	{
            		alt413=10;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return op;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 413;
                EXCEPTION->state        = 0;


                goto ruleop_concurrencyEx;

            }

            switch (alt413)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4693:4: OP_CONCURRENCY_ASYNC
        	    {
        	         MATCHT(OP_CONCURRENCY_ASYNC, &FOLLOW_OP_CONCURRENCY_ASYNC_in_op_concurrency15583);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_concurrencyEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(ASYNCHRONOUS);
        	             
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4694:4: OP_CONCURRENCY_AND
        	    {
        	         MATCHT(OP_CONCURRENCY_AND, &FOLLOW_OP_CONCURRENCY_AND_in_op_concurrency15601);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_concurrencyEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(STRONG_SYNCHRONOUS);
        	             
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4695:4: OP_CONCURRENCY_OR
        	    {
        	         MATCHT(OP_CONCURRENCY_OR, &FOLLOW_OP_CONCURRENCY_OR_in_op_concurrency15621);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_concurrencyEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(WEAK_SYNCHRONOUS);
        	             
        	        }


        	    }
        	    break;
        	case 4:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4696:4: OP_CONCURRENCY_INTERLEAVING
        	    {
        	         MATCHT(OP_CONCURRENCY_INTERLEAVING, &FOLLOW_OP_CONCURRENCY_INTERLEAVING_in_op_concurrency15642);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_concurrencyEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(INTERLEAVING);
        	             
        	        }


        	    }
        	    break;
        	case 5:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4697:4: OP_CONCURRENCY_PARALLEL
        	    {
        	         MATCHT(OP_CONCURRENCY_PARALLEL, &FOLLOW_OP_CONCURRENCY_PARALLEL_in_op_concurrency15653);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_concurrencyEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(PARALLEL);
        	             
        	        }


        	    }
        	    break;
        	case 6:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4699:4: OP_CONCURRENCY_RDV_ASYNC
        	    {
        	         MATCHT(OP_CONCURRENCY_RDV_ASYNC, &FOLLOW_OP_CONCURRENCY_RDV_ASYNC_in_op_concurrency15669);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_concurrencyEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(RDV_ASYNCHRONOUS);
        	             
        	        }


        	    }
        	    break;
        	case 7:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4700:4: OP_CONCURRENCY_RDV_AND
        	    {
        	         MATCHT(OP_CONCURRENCY_RDV_AND, &FOLLOW_OP_CONCURRENCY_RDV_AND_in_op_concurrency15683);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_concurrencyEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(RDV_STRONG_SYNCHRONOUS);
        	             
        	        }


        	    }
        	    break;
        	case 8:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4701:4: OP_CONCURRENCY_RDV_OR
        	    {
        	         MATCHT(OP_CONCURRENCY_RDV_OR, &FOLLOW_OP_CONCURRENCY_RDV_OR_in_op_concurrency15699);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_concurrencyEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(RDV_WEAK_SYNCHRONOUS);
        	             
        	        }


        	    }
        	    break;
        	case 9:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4702:4: OP_CONCURRENCY_RDV_INTERLEAVING
        	    {
        	         MATCHT(OP_CONCURRENCY_RDV_INTERLEAVING, &FOLLOW_OP_CONCURRENCY_RDV_INTERLEAVING_in_op_concurrency15716);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_concurrencyEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(RDV_INTERLEAVING);
        	             
        	        }


        	    }
        	    break;
        	case 10:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4703:4: OP_CONCURRENCY_RDV_PARALLEL
        	    {
        	         MATCHT(OP_CONCURRENCY_RDV_PARALLEL, &FOLLOW_OP_CONCURRENCY_RDV_PARALLEL_in_op_concurrency15723);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_concurrencyEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(RDV_PARALLEL);
        	             
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruleop_concurrencyEx; /* Prevent compiler warnings */
    ruleop_concurrencyEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(173, op_concurrency_StartIndex); }

    return op;
}
/* $ANTLR end op_concurrency */

/**
 * $ANTLR start op_invokable
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4708:1: op_invokable returns [ sep::Operator * op ] : ( PLUS | MINUS | STAR | DIV | MOD | EQUAL | NEQUAL | SEQUAL | NSEQUAL | GT | GTE | LT_ | LTE | LNOT | LAND | LAND_THEN | LOR | LOR_ELSE | BNOT | BAND | BOR | BXOR | LSHIFT | RSHIFT | ASSIGN | ASSIGN_AFTER | ASSIGN_REF | ASSIGN_MACRO | OP_PUSH | OP_ASSIGN_TOP | OP_TOP | OP_POP );
 */
static sep::Operator *
op_invokable(pfmlParser ctx)
{
    sep::Operator * op;

    ANTLR3_UINT32 op_invokable_StartIndex;

    /* Initialize rule variables
     */
    op_invokable_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(174)) )
    {
        {
        }



        return op;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4710:2: ( PLUS | MINUS | STAR | DIV | MOD | EQUAL | NEQUAL | SEQUAL | NSEQUAL | GT | GTE | LT_ | LTE | LNOT | LAND | LAND_THEN | LOR | LOR_ELSE | BNOT | BAND | BOR | BXOR | LSHIFT | RSHIFT | ASSIGN | ASSIGN_AFTER | ASSIGN_REF | ASSIGN_MACRO | OP_PUSH | OP_ASSIGN_TOP | OP_TOP | OP_POP )

            ANTLR3_UINT32 alt414;

            alt414=32;

            switch ( LA(1) )
            {
            case PLUS:
            	{
            		alt414=1;
            	}
                break;
            case MINUS:
            	{
            		alt414=2;
            	}
                break;
            case STAR:
            	{
            		alt414=3;
            	}
                break;
            case DIV:
            	{
            		alt414=4;
            	}
                break;
            case MOD:
            	{
            		alt414=5;
            	}
                break;
            case EQUAL:
            	{
            		alt414=6;
            	}
                break;
            case NEQUAL:
            	{
            		alt414=7;
            	}
                break;
            case SEQUAL:
            	{
            		alt414=8;
            	}
                break;
            case NSEQUAL:
            	{
            		alt414=9;
            	}
                break;
            case GT:
            	{
            		alt414=10;
            	}
                break;
            case GTE:
            	{
            		alt414=11;
            	}
                break;
            case LT_:
            	{
            		alt414=12;
            	}
                break;
            case LTE:
            	{
            		alt414=13;
            	}
                break;
            case LNOT:
            	{
            		alt414=14;
            	}
                break;
            case LAND:
            	{
            		alt414=15;
            	}
                break;
            case LAND_THEN:
            	{
            		alt414=16;
            	}
                break;
            case LOR:
            	{
            		alt414=17;
            	}
                break;
            case LOR_ELSE:
            	{
            		alt414=18;
            	}
                break;
            case BNOT:
            	{
            		alt414=19;
            	}
                break;
            case BAND:
            	{
            		alt414=20;
            	}
                break;
            case BOR:
            	{
            		alt414=21;
            	}
                break;
            case BXOR:
            	{
            		alt414=22;
            	}
                break;
            case LSHIFT:
            	{
            		alt414=23;
            	}
                break;
            case RSHIFT:
            	{
            		alt414=24;
            	}
                break;
            case ASSIGN:
            	{
            		alt414=25;
            	}
                break;
            case ASSIGN_AFTER:
            	{
            		alt414=26;
            	}
                break;
            case ASSIGN_REF:
            	{
            		alt414=27;
            	}
                break;
            case ASSIGN_MACRO:
            	{
            		alt414=28;
            	}
                break;
            case OP_PUSH:
            	{
            		alt414=29;
            	}
                break;
            case OP_ASSIGN_TOP:
            	{
            		alt414=30;
            	}
                break;
            case OP_TOP:
            	{
            		alt414=31;
            	}
                break;
            case OP_POP:
            	{
            		alt414=32;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return op;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 414;
                EXCEPTION->state        = 0;


                goto ruleop_invokableEx;

            }

            switch (alt414)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4710:4: PLUS
        	    {
        	         MATCHT(PLUS, &FOLLOW_PLUS_in_op_invokable15746);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_invokableEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(PLUS);
        	                     
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4712:4: MINUS
        	    {
        	         MATCHT(MINUS, &FOLLOW_MINUS_in_op_invokable15766);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_invokableEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(MINUS);
        	                    
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4714:4: STAR
        	    {
        	         MATCHT(STAR, &FOLLOW_STAR_in_op_invokable15785);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_invokableEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(MULT);
        	                     
        	        }


        	    }
        	    break;
        	case 4:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4715:4: DIV
        	    {
        	         MATCHT(DIV, &FOLLOW_DIV_in_op_invokable15804);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_invokableEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(DIV);
        	                      
        	        }


        	    }
        	    break;
        	case 5:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4716:4: MOD
        	    {
        	         MATCHT(MOD, &FOLLOW_MOD_in_op_invokable15824);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_invokableEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(MOD);
        	                      
        	        }


        	    }
        	    break;
        	case 6:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4720:4: EQUAL
        	    {
        	         MATCHT(EQUAL, &FOLLOW_EQUAL_in_op_invokable15847);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_invokableEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(EQ);
        	                       
        	        }


        	    }
        	    break;
        	case 7:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4721:4: NEQUAL
        	    {
        	         MATCHT(NEQUAL, &FOLLOW_NEQUAL_in_op_invokable15865);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_invokableEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(NEQ);
        	                      
        	        }


        	    }
        	    break;
        	case 8:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4723:4: SEQUAL
        	    {
        	         MATCHT(SEQUAL, &FOLLOW_SEQUAL_in_op_invokable15883);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_invokableEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(SEQ);
        	                      
        	        }


        	    }
        	    break;
        	case 9:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4724:4: NSEQUAL
        	    {
        	         MATCHT(NSEQUAL, &FOLLOW_NSEQUAL_in_op_invokable15900);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_invokableEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(NSEQ);
        	                     
        	        }


        	    }
        	    break;
        	case 10:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4726:4: GT
        	    {
        	         MATCHT(GT, &FOLLOW_GT_in_op_invokable15917);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_invokableEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(GT);
        	                       
        	        }


        	    }
        	    break;
        	case 11:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4727:4: GTE
        	    {
        	         MATCHT(GTE, &FOLLOW_GTE_in_op_invokable15938);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_invokableEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(GTE);
        	                      
        	        }


        	    }
        	    break;
        	case 12:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4728:4: LT_
        	    {
        	         MATCHT(LT_, &FOLLOW_LT__in_op_invokable15958);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_invokableEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(LT);
        	                       
        	        }


        	    }
        	    break;
        	case 13:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4729:4: LTE
        	    {
        	         MATCHT(LTE, &FOLLOW_LTE_in_op_invokable15978);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_invokableEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(LTE);
        	                      
        	        }


        	    }
        	    break;
        	case 14:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4731:4: LNOT
        	    {
        	         MATCHT(LNOT, &FOLLOW_LNOT_in_op_invokable15999);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_invokableEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(NOT);
        	                      
        	        }


        	    }
        	    break;
        	case 15:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4732:4: LAND
        	    {
        	         MATCHT(LAND, &FOLLOW_LAND_in_op_invokable16018);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_invokableEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(AND);
        	                      
        	        }


        	    }
        	    break;
        	case 16:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4733:4: LAND_THEN
        	    {
        	         MATCHT(LAND_THEN, &FOLLOW_LAND_THEN_in_op_invokable16037);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_invokableEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(AND_THEN);
        	                 
        	        }


        	    }
        	    break;
        	case 17:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4734:4: LOR
        	    {
        	         MATCHT(LOR, &FOLLOW_LOR_in_op_invokable16051);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_invokableEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(OR);
        	                       
        	        }


        	    }
        	    break;
        	case 18:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4735:4: LOR_ELSE
        	    {
        	         MATCHT(LOR_ELSE, &FOLLOW_LOR_ELSE_in_op_invokable16071);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_invokableEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(OR_ELSE);
        	                  
        	        }


        	    }
        	    break;
        	case 19:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4737:4: BNOT
        	    {
        	         MATCHT(BNOT, &FOLLOW_BNOT_in_op_invokable16087);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_invokableEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(BNOT);
        	                     
        	        }


        	    }
        	    break;
        	case 20:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4738:4: BAND
        	    {
        	         MATCHT(BAND, &FOLLOW_BAND_in_op_invokable16106);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_invokableEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(BAND);
        	                     
        	        }


        	    }
        	    break;
        	case 21:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4739:4: BOR
        	    {
        	         MATCHT(BOR, &FOLLOW_BOR_in_op_invokable16125);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_invokableEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(BOR);
        	                      
        	        }


        	    }
        	    break;
        	case 22:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4740:4: BXOR
        	    {
        	         MATCHT(BXOR, &FOLLOW_BXOR_in_op_invokable16145);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_invokableEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(BXOR);
        	                     
        	        }


        	    }
        	    break;
        	case 23:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4742:4: LSHIFT
        	    {
        	         MATCHT(LSHIFT, &FOLLOW_LSHIFT_in_op_invokable16165);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_invokableEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(LSHIFT);
        	                   
        	        }


        	    }
        	    break;
        	case 24:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4743:4: RSHIFT
        	    {
        	         MATCHT(RSHIFT, &FOLLOW_RSHIFT_in_op_invokable16182);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_invokableEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(RSHIFT);
        	                   
        	        }


        	    }
        	    break;
        	case 25:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4745:4: ASSIGN
        	    {
        	         MATCHT(ASSIGN, &FOLLOW_ASSIGN_in_op_invokable16200);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_invokableEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(ASSIGN);
        	                   
        	        }


        	    }
        	    break;
        	case 26:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4746:4: ASSIGN_AFTER
        	    {
        	         MATCHT(ASSIGN_AFTER, &FOLLOW_ASSIGN_AFTER_in_op_invokable16217);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_invokableEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(ASSIGN_AFTER);
        	             
        	        }


        	    }
        	    break;
        	case 27:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4747:4: ASSIGN_REF
        	    {
        	         MATCHT(ASSIGN_REF, &FOLLOW_ASSIGN_REF_in_op_invokable16228);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_invokableEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(ASSIGN_REF);
        	               
        	        }


        	    }
        	    break;
        	case 28:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4748:4: ASSIGN_MACRO
        	    {
        	         MATCHT(ASSIGN_MACRO, &FOLLOW_ASSIGN_MACRO_in_op_invokable16241);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_invokableEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(ASSIGN_MACRO);
        	             
        	        }


        	    }
        	    break;
        	case 29:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4750:4: OP_PUSH
        	    {
        	         MATCHT(OP_PUSH, &FOLLOW_OP_PUSH_in_op_invokable16253);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_invokableEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(PUSH);
        	                     
        	        }


        	    }
        	    break;
        	case 30:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4751:4: OP_ASSIGN_TOP
        	    {
        	         MATCHT(OP_ASSIGN_TOP, &FOLLOW_OP_ASSIGN_TOP_in_op_invokable16269);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_invokableEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(ASSIGN_TOP);
        	               
        	        }


        	    }
        	    break;
        	case 31:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4752:4: OP_TOP
        	    {
        	         MATCHT(OP_TOP, &FOLLOW_OP_TOP_in_op_invokable16279);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_invokableEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(TOP);
        	                      
        	        }


        	    }
        	    break;
        	case 32:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4753:4: OP_POP
        	    {
        	         MATCHT(OP_POP, &FOLLOW_OP_POP_in_op_invokable16296);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_invokableEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(POP);
        	                      
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruleop_invokableEx; /* Prevent compiler warnings */
    ruleop_invokableEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(174, op_invokable_StartIndex); }

    return op;
}
/* $ANTLR end op_invokable */

/**
 * $ANTLR start prefix_statement
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4760:1: prefix_statement returns [ sep::BFCode ac ] : DOLLAR_LCURLY op= avm_operator (ps= prefix_statement |e= unaryExpression )* RCURLY ;
 */
static sep::BFCode
prefix_statement(pfmlParser ctx)
{
    sep::BFCode ac;

    ANTLR3_UINT32 prefix_statement_StartIndex;

    sep::Operator * op;
    #undef	RETURN_TYPE_op
    #define	RETURN_TYPE_op sep::Operator *

    sep::BFCode ps;
    #undef	RETURN_TYPE_ps
    #define	RETURN_TYPE_ps sep::BFCode

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    /* Initialize rule variables
     */
    prefix_statement_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(175)) )
    {
        {
        }



        return ac;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4762:2: ( DOLLAR_LCURLY op= avm_operator (ps= prefix_statement |e= unaryExpression )* RCURLY )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4762:4: DOLLAR_LCURLY op= avm_operator (ps= prefix_statement |e= unaryExpression )* RCURLY
        {
             MATCHT(DOLLAR_LCURLY, &FOLLOW_DOLLAR_LCURLY_in_prefix_statement16327);
            if  (HASEXCEPTION())
            {
                goto ruleprefix_statementEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            FOLLOWPUSH(FOLLOW_avm_operator_in_prefix_statement16332);
            op=avm_operator(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruleprefix_statementEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            if ( BACKTRACKING==0 )
            {
                 ac= NEW_STMT(op);
                  
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4763:6: (ps= prefix_statement |e= unaryExpression )*

            for (;;)
            {
                int alt415=3;
                switch ( LA(1) )
                {
                case DOLLAR_LCURLY:
                	{
                		{
                		   /* dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState)
                		    */
                		    int LA415_1 = LA(2);
                		    if ( (synpred778_fml(ctx)))
                		    {
                		        alt415=1;
                		    }
                		    else if ( (synpred779_fml(ctx)))
                		    {
                		        alt415=2;
                		    }

                		}
                	}
                    break;
                case BNOT:
                case COLONx2:
                case CharLiteral:
                case DECR:
                case FloatLiteral:
                case ID:
                case INCR:
                case IntegerLiteral:
                case LBRACKET:
                case LBRACKET_BAR:
                case LCURLY:
                case LNOT:
                case LPAREN:
                case LPAREN_INVOKE:
                case MINUS:
                case OP_POP:
                case OP_TOP:
                case PERCENT_LCURLY:
                case PLUS:
                case RationalLiteral:
                case StringLiteral:
                case 158:
                case 159:
                case 160:
                case 161:
                case 162:
                case 237:
                case 256:
                case 265:
                case 277:
                case 280:
                case 294:
                case 313:
                case 330:
                case 331:
                case 332:
                case 343:
                case 347:
                case 372:
                case 397:
                	{
                		alt415=2;
                	}
                    break;

                }

                switch (alt415)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4763:8: ps= prefix_statement
            	    {
            	        FOLLOWPUSH(FOLLOW_prefix_statement_in_prefix_statement16346);
            	        ps=prefix_statement(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleprefix_statementEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             ac
            	            ->append(ps
            	            ); 
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4764:8: e= unaryExpression
            	    {
            	        FOLLOWPUSH(FOLLOW_unaryExpression_in_prefix_statement16367);
            	        e=unaryExpression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleprefix_statementEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             ac
            	            ->append(e
            	            );  
            	        }


            	    }
            	    break;

            	default:
            	    goto loop415;	/* break out of the loop */
            	    break;
                }
            }
            loop415: ; /* Jump out to here if this rule does not match */


             MATCHT(RCURLY, &FOLLOW_RCURLY_in_prefix_statement16392);
            if  (HASEXCEPTION())
            {
                goto ruleprefix_statementEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruleprefix_statementEx; /* Prevent compiler warnings */
    ruleprefix_statementEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(175, prefix_statement_StartIndex); }

    return ac;
}
/* $ANTLR end prefix_statement */

/**
 * $ANTLR start prefix_expression
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4769:1: prefix_expression returns [ sep::BFCode ac ] : DOLLAR_LCURLY op= avm_operator (ps= prefix_expression |e= unaryExpression )* RCURLY ;
 */
static sep::BFCode
prefix_expression(pfmlParser ctx)
{
    sep::BFCode ac;

    ANTLR3_UINT32 prefix_expression_StartIndex;

    sep::Operator * op;
    #undef	RETURN_TYPE_op
    #define	RETURN_TYPE_op sep::Operator *

    sep::BFCode ps;
    #undef	RETURN_TYPE_ps
    #define	RETURN_TYPE_ps sep::BFCode

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    /* Initialize rule variables
     */
    prefix_expression_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(176)) )
    {
        {
        }



        return ac;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4771:2: ( DOLLAR_LCURLY op= avm_operator (ps= prefix_expression |e= unaryExpression )* RCURLY )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4771:4: DOLLAR_LCURLY op= avm_operator (ps= prefix_expression |e= unaryExpression )* RCURLY
        {
             MATCHT(DOLLAR_LCURLY, &FOLLOW_DOLLAR_LCURLY_in_prefix_expression16407);
            if  (HASEXCEPTION())
            {
                goto ruleprefix_expressionEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            FOLLOWPUSH(FOLLOW_avm_operator_in_prefix_expression16412);
            op=avm_operator(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruleprefix_expressionEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            if ( BACKTRACKING==0 )
            {
                 ac= NEW_STMT(op);
                  
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4772:6: (ps= prefix_expression |e= unaryExpression )*

            for (;;)
            {
                int alt416=3;
                switch ( LA(1) )
                {
                case DOLLAR_LCURLY:
                	{
                		{
                		   /* dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState)
                		    */
                		    int LA416_1 = LA(2);
                		    if ( (synpred780_fml(ctx)))
                		    {
                		        alt416=1;
                		    }
                		    else if ( (synpred781_fml(ctx)))
                		    {
                		        alt416=2;
                		    }

                		}
                	}
                    break;
                case BNOT:
                case COLONx2:
                case CharLiteral:
                case DECR:
                case FloatLiteral:
                case ID:
                case INCR:
                case IntegerLiteral:
                case LBRACKET:
                case LBRACKET_BAR:
                case LCURLY:
                case LNOT:
                case LPAREN:
                case LPAREN_INVOKE:
                case MINUS:
                case OP_POP:
                case OP_TOP:
                case PERCENT_LCURLY:
                case PLUS:
                case RationalLiteral:
                case StringLiteral:
                case 158:
                case 159:
                case 160:
                case 161:
                case 162:
                case 237:
                case 256:
                case 265:
                case 277:
                case 280:
                case 294:
                case 313:
                case 330:
                case 331:
                case 332:
                case 343:
                case 347:
                case 372:
                case 397:
                	{
                		alt416=2;
                	}
                    break;

                }

                switch (alt416)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4772:8: ps= prefix_expression
            	    {
            	        FOLLOWPUSH(FOLLOW_prefix_expression_in_prefix_expression16426);
            	        ps=prefix_expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleprefix_expressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             ac
            	            ->append(ps
            	            ); 
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4773:8: e= unaryExpression
            	    {
            	        FOLLOWPUSH(FOLLOW_unaryExpression_in_prefix_expression16446);
            	        e=unaryExpression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleprefix_expressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             ac
            	            ->append(e
            	            );  
            	        }


            	    }
            	    break;

            	default:
            	    goto loop416;	/* break out of the loop */
            	    break;
                }
            }
            loop416: ; /* Jump out to here if this rule does not match */


             MATCHT(RCURLY, &FOLLOW_RCURLY_in_prefix_expression16471);
            if  (HASEXCEPTION())
            {
                goto ruleprefix_expressionEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruleprefix_expressionEx; /* Prevent compiler warnings */
    ruleprefix_expressionEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(176, prefix_expression_StartIndex); }

    return ac;
}
/* $ANTLR end prefix_expression */

/**
 * $ANTLR start avm_operator
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4778:1: avm_operator returns [ sep::Operator * op ] : (o= op_invokable |o= op_activity |{...}? ID );
 */
static sep::Operator *
avm_operator(pfmlParser ctx)
{
    sep::Operator * op;

    ANTLR3_UINT32 avm_operator_StartIndex;

    sep::Operator * o;
    #undef	RETURN_TYPE_o
    #define	RETURN_TYPE_o sep::Operator *

    /* Initialize rule variables
     */
    avm_operator_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(177)) )
    {
        {
        }



        return op;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4780:2: (o= op_invokable |o= op_activity |{...}? ID )

            ANTLR3_UINT32 alt417;

            alt417=3;

            switch ( LA(1) )
            {
            case ASSIGN:
            case ASSIGN_AFTER:
            case ASSIGN_MACRO:
            case ASSIGN_REF:
            case BAND:
            case BNOT:
            case BOR:
            case BXOR:
            case DIV:
            case EQUAL:
            case GT:
            case GTE:
            case LAND:
            case LAND_THEN:
            case LNOT:
            case LOR:
            case LOR_ELSE:
            case LSHIFT:
            case LTE:
            case LT_:
            case MINUS:
            case MOD:
            case NEQUAL:
            case NSEQUAL:
            case OP_ASSIGN_TOP:
            case OP_POP:
            case OP_PUSH:
            case OP_TOP:
            case PLUS:
            case RSHIFT:
            case SEQUAL:
            case STAR:
            	{
            		alt417=1;
            	}
                break;
            case 236:
            case 267:
            case 268:
            case 275:
            case 282:
            case 291:
            case 292:
            case 293:
            case 296:
            case 362:
            case 363:
            case 368:
            case 369:
            case 371:
            case 377:
            case 386:
            case 389:
            case 415:
            	{
            		alt417=2;
            	}
                break;
            case ID:
            	{
            		alt417=3;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return op;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 417;
                EXCEPTION->state        = 0;


                goto ruleavm_operatorEx;

            }

            switch (alt417)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4780:4: o= op_invokable
        	    {
        	        FOLLOWPUSH(FOLLOW_op_invokable_in_avm_operator16488);
        	        o=op_invokable(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleavm_operatorEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= 
        	            o
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4782:4: o= op_activity
        	    {
        	        FOLLOWPUSH(FOLLOW_op_activity_in_avm_operator16500);
        	        o=op_activity(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleavm_operatorEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= 
        	            o
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4784:4: {...}? ID
        	    {
        	        if ( !(( (op = sep::OperatorManager::getOp(STR(LT(1)->getText(LT(1))->chars))) != NULL )) )
        	        {
        	            if (BACKTRACKING>0)
        	            {
        	                FAILEDFLAG = ANTLR3_TRUE;
        	                return op;
        	            }

        	                CONSTRUCTEX();
        	                EXCEPTION->type         = ANTLR3_FAILED_PREDICATE_EXCEPTION;
        	                EXCEPTION->message      = (void *)" (op = sep::OperatorManager::getOp(STR(LT(1)->getText(LT(1))->chars))) != NULL ";
        	                EXCEPTION->ruleName	 = (void *)"avm_operator";


        	        }

        	         MATCHT(ID, &FOLLOW_ID_in_avm_operator16512);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleavm_operatorEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruleavm_operatorEx; /* Prevent compiler warnings */
    ruleavm_operatorEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(177, avm_operator_StartIndex); }

    return op;
}
/* $ANTLR end avm_operator */

/**
 * $ANTLR start statement_invoke_method
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4792:1: statement_invoke_method returns [ sep::BFCode ac ] : 'call' id= ID ( decl_instance_machine_params[ callProcedure ] )? ( decl_instance_machine_returns[ callProcedure ] )? SEMI ;
 */
static sep::BFCode
statement_invoke_method(pfmlParser ctx)
{
    sep::BFCode ac;

    ANTLR3_UINT32 statement_invoke_method_StartIndex;

    pANTLR3_COMMON_TOKEN    id;

    /* Initialize rule variables
     */
    statement_invoke_method_StartIndex = INDEX();



    	sep::BF modelProcedure;
    	sep::Machine * callProcedure;

    	SAVE_RULE_BEGIN_LOCATION;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(178)) )
    {
        {

            	SET_RULE_LOCATION(callProcedure);

        }
        {
        }



        return ac;
    }

    id       = NULL;

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4804:2: ( 'call' id= ID ( decl_instance_machine_params[ callProcedure ] )? ( decl_instance_machine_returns[ callProcedure ] )? SEMI )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4804:4: 'call' id= ID ( decl_instance_machine_params[ callProcedure ] )? ( decl_instance_machine_returns[ callProcedure ] )? SEMI
        {
             MATCHT(250, &FOLLOW_250_in_statement_invoke_method16541);
            if  (HASEXCEPTION())
            {
                goto rulestatement_invoke_methodEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_statement_invoke_method16545);
            if  (HASEXCEPTION())
            {
                goto rulestatement_invoke_methodEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            if ( BACKTRACKING==0 )
            {

                	  	modelProcedure = sep::ParserUtil::getvarProcedure(STR((id->getText(id))->chars));

                	  	callProcedure = sep::Machine::newProcedureInstance(_CPM_,
                	  			sep::OSS() << "call_" << ++mProcedureCallCount
                	  					<< '#' << STR((id->getText(id))->chars), modelProcedure);

                		callProcedure->getwSpecifier().setDesignInstanceStatic();

                	  	
                ac= NEW_STMT1(OP(INVOKE_METHOD), sep::BF(callProcedure));

                	  
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4817:4: ( decl_instance_machine_params[ callProcedure ] )?
            {
                int alt418=2;
                switch ( LA(1) )
                {
                    case LPAREN:
                    	{
                    		alt418=1;
                    	}
                        break;
                }

                switch (alt418)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4817:4: decl_instance_machine_params[ callProcedure ]
            	    {
            	        FOLLOWPUSH(FOLLOW_decl_instance_machine_params_in_statement_invoke_method16556);
            	        decl_instance_machine_params(ctx, callProcedure);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_invoke_methodEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4818:4: ( decl_instance_machine_returns[ callProcedure ] )?
            {
                int alt419=2;
                switch ( LA(1) )
                {
                    case 163:
                    case 365:
                    	{
                    		alt419=1;
                    	}
                        break;
                }

                switch (alt419)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4818:4: decl_instance_machine_returns[ callProcedure ]
            	    {
            	        FOLLOWPUSH(FOLLOW_decl_instance_machine_returns_in_statement_invoke_method16565);
            	        decl_instance_machine_returns(ctx, callProcedure);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_invoke_methodEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	    }
            	    break;

                }
            }

             MATCHT(SEMI, &FOLLOW_SEMI_in_statement_invoke_method16574);
            if  (HASEXCEPTION())
            {
                goto rulestatement_invoke_methodEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto rulestatement_invoke_methodEx; /* Prevent compiler warnings */
    rulestatement_invoke_methodEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
            else
            {
                {

                    	SET_RULE_LOCATION(callProcedure);

                }
            }


    if ( BACKTRACKING>0 ) { MEMOIZE(178, statement_invoke_method_StartIndex); }

    return ac;
}
/* $ANTLR end statement_invoke_method */

/**
 * $ANTLR start statement_invoke
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4824:1: statement_invoke returns [ sep::BFCode ac ] : LPAREN_INVOKE ue= unaryExpression (id= ID | 'in' |op= op_invokable ) (e= expression )* ( 'provided:' e= expression | 'from:' ue= unaryExpression | 'to:' ue= unaryExpression | 'activity:' o= op_activity )? RPAREN SEMI ;
 */
static sep::BFCode
statement_invoke(pfmlParser ctx)
{
    sep::BFCode ac;

    ANTLR3_UINT32 statement_invoke_StartIndex;

    pANTLR3_COMMON_TOKEN    id;
    sep::BF ue;
    #undef	RETURN_TYPE_ue
    #define	RETURN_TYPE_ue sep::BF

    sep::Operator * op;
    #undef	RETURN_TYPE_op
    #define	RETURN_TYPE_op sep::Operator *

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    sep::Operator * o;
    #undef	RETURN_TYPE_o
    #define	RETURN_TYPE_o sep::Operator *

    /* Initialize rule variables
     */
    statement_invoke_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(179)) )
    {
        {
        }



        return ac;
    }

    id       = NULL;

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4826:2: ( LPAREN_INVOKE ue= unaryExpression (id= ID | 'in' |op= op_invokable ) (e= expression )* ( 'provided:' e= expression | 'from:' ue= unaryExpression | 'to:' ue= unaryExpression | 'activity:' o= op_activity )? RPAREN SEMI )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4826:4: LPAREN_INVOKE ue= unaryExpression (id= ID | 'in' |op= op_invokable ) (e= expression )* ( 'provided:' e= expression | 'from:' ue= unaryExpression | 'to:' ue= unaryExpression | 'activity:' o= op_activity )? RPAREN SEMI
        {
             MATCHT(LPAREN_INVOKE, &FOLLOW_LPAREN_INVOKE_in_statement_invoke16590);
            if  (HASEXCEPTION())
            {
                goto rulestatement_invokeEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            FOLLOWPUSH(FOLLOW_unaryExpression_in_statement_invoke16599);
            ue=unaryExpression(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto rulestatement_invokeEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            if ( BACKTRACKING==0 )
            {
                 ac= NEW_STMT1(OP(INVOKE_METHOD), 
                ue
                );
                 
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4828:6: (id= ID | 'in' |op= op_invokable )
            {
                int alt420=3;
                switch ( LA(1) )
                {
                case ID:
                	{
                		alt420=1;
                	}
                    break;
                case 295:
                	{
                		alt420=2;
                	}
                    break;
                case ASSIGN:
                case ASSIGN_AFTER:
                case ASSIGN_MACRO:
                case ASSIGN_REF:
                case BAND:
                case BNOT:
                case BOR:
                case BXOR:
                case DIV:
                case EQUAL:
                case GT:
                case GTE:
                case LAND:
                case LAND_THEN:
                case LNOT:
                case LOR:
                case LOR_ELSE:
                case LSHIFT:
                case LTE:
                case LT_:
                case MINUS:
                case MOD:
                case NEQUAL:
                case NSEQUAL:
                case OP_ASSIGN_TOP:
                case OP_POP:
                case OP_PUSH:
                case OP_TOP:
                case PLUS:
                case RSHIFT:
                case SEQUAL:
                case STAR:
                	{
                		alt420=3;
                	}
                    break;

                default:
                    if (BACKTRACKING>0)
                    {
                        FAILEDFLAG = ANTLR3_TRUE;
                        return ac;
                    }

                    CONSTRUCTEX();
                    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                    EXCEPTION->message      = (void *)"";
                    EXCEPTION->decisionNum  = 420;
                    EXCEPTION->state        = 0;


                    goto rulestatement_invokeEx;

                }

                switch (alt420)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4828:8: id= ID
            	    {
            	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_statement_invoke16612);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_invokeEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             ac
            	            ->append(sep::ParserUtil::getInvokable(ue
            	            , STR((id->getText(id))->chars))); 
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4829:8: 'in'
            	    {
            	         MATCHT(295, &FOLLOW_295_in_statement_invoke16634);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_invokeEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             ac
            	            ->append( INCR_BF(OP(IN)) ); 
            	        }


            	    }
            	    break;
            	case 3:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4830:8: op= op_invokable
            	    {
            	        FOLLOWPUSH(FOLLOW_op_invokable_in_statement_invoke16659);
            	        op=op_invokable(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_invokeEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             ac
            	            ->append( INCR_BF(op
            	            ) ); 
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4832:6: (e= expression )*

            for (;;)
            {
                int alt421=2;
                switch ( LA(1) )
                {
                case BNOT:
                case COLONx2:
                case CharLiteral:
                case DECR:
                case DOLLAR_LCURLY:
                case FloatLiteral:
                case ID:
                case INCR:
                case IntegerLiteral:
                case LBRACKET:
                case LBRACKET_BAR:
                case LCURLY:
                case LNOT:
                case LPAREN:
                case LPAREN_INVOKE:
                case MINUS:
                case OP_POP:
                case OP_TOP:
                case PERCENT_LCURLY:
                case PLUS:
                case RationalLiteral:
                case StringLiteral:
                case 158:
                case 159:
                case 160:
                case 161:
                case 162:
                case 237:
                case 256:
                case 265:
                case 277:
                case 280:
                case 294:
                case 313:
                case 330:
                case 331:
                case 332:
                case 343:
                case 347:
                case 372:
                case 397:
                	{
                		alt421=1;
                	}
                    break;

                }

                switch (alt421)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4832:8: e= expression
            	    {
            	        FOLLOWPUSH(FOLLOW_expression_in_statement_invoke16680);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_invokeEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             ac
            	            ->append(e
            	            ); 
            	        }


            	    }
            	    break;

            	default:
            	    goto loop421;	/* break out of the loop */
            	    break;
                }
            }
            loop421: ; /* Jump out to here if this rule does not match */


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4833:6: ( 'provided:' e= expression | 'from:' ue= unaryExpression | 'to:' ue= unaryExpression | 'activity:' o= op_activity )?
            {
                int alt422=5;
                switch ( LA(1) )
                {
                    case 354:
                    	{
                    		alt422=1;
                    	}
                        break;
                    case 287:
                    	{
                    		alt422=2;
                    	}
                        break;
                    case 394:
                    	{
                    		alt422=3;
                    	}
                        break;
                    case 238:
                    	{
                    		alt422=4;
                    	}
                        break;
                }

                switch (alt422)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4833:8: 'provided:' e= expression
            	    {
            	         MATCHT(354, &FOLLOW_354_in_statement_invoke16698);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_invokeEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_statement_invoke16704);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_invokeEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4834:8: 'from:' ue= unaryExpression
            	    {
            	         MATCHT(287, &FOLLOW_287_in_statement_invoke16713);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_invokeEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        FOLLOWPUSH(FOLLOW_unaryExpression_in_statement_invoke16723);
            	        ue=unaryExpression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_invokeEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	    }
            	    break;
            	case 3:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4835:8: 'to:' ue= unaryExpression
            	    {
            	         MATCHT(394, &FOLLOW_394_in_statement_invoke16732);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_invokeEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        FOLLOWPUSH(FOLLOW_unaryExpression_in_statement_invoke16744);
            	        ue=unaryExpression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_invokeEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	    }
            	    break;
            	case 4:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4836:8: 'activity:' o= op_activity
            	    {
            	         MATCHT(238, &FOLLOW_238_in_statement_invoke16753);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_invokeEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        FOLLOWPUSH(FOLLOW_op_activity_in_statement_invoke16759);
            	        o=op_activity(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_invokeEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	    }
            	    break;

                }
            }

             MATCHT(RPAREN, &FOLLOW_RPAREN_in_statement_invoke16772);
            if  (HASEXCEPTION())
            {
                goto rulestatement_invokeEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


             MATCHT(SEMI, &FOLLOW_SEMI_in_statement_invoke16777);
            if  (HASEXCEPTION())
            {
                goto rulestatement_invokeEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto rulestatement_invokeEx; /* Prevent compiler warnings */
    rulestatement_invokeEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(179, statement_invoke_StartIndex); }

    return ac;
}
/* $ANTLR end statement_invoke */

/**
 * $ANTLR start expression_invoke
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4842:1: expression_invoke returns [ sep::BFCode ac ] : LPAREN_INVOKE e= unaryExpression (id= ID | 'in' |op= op_invokable ) (e= expression )* ( 'provided:' e= expression | 'from:' ue= unaryExpression | 'to:' ue= unaryExpression | 'activity:' o= op_activity )? RPAREN ;
 */
static sep::BFCode
expression_invoke(pfmlParser ctx)
{
    sep::BFCode ac;

    ANTLR3_UINT32 expression_invoke_StartIndex;

    pANTLR3_COMMON_TOKEN    id;
    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    sep::Operator * op;
    #undef	RETURN_TYPE_op
    #define	RETURN_TYPE_op sep::Operator *

    sep::BF ue;
    #undef	RETURN_TYPE_ue
    #define	RETURN_TYPE_ue sep::BF

    sep::Operator * o;
    #undef	RETURN_TYPE_o
    #define	RETURN_TYPE_o sep::Operator *

    /* Initialize rule variables
     */
    expression_invoke_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(180)) )
    {
        {
        }



        return ac;
    }

    id       = NULL;

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4844:2: ( LPAREN_INVOKE e= unaryExpression (id= ID | 'in' |op= op_invokable ) (e= expression )* ( 'provided:' e= expression | 'from:' ue= unaryExpression | 'to:' ue= unaryExpression | 'activity:' o= op_activity )? RPAREN )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4844:4: LPAREN_INVOKE e= unaryExpression (id= ID | 'in' |op= op_invokable ) (e= expression )* ( 'provided:' e= expression | 'from:' ue= unaryExpression | 'to:' ue= unaryExpression | 'activity:' o= op_activity )? RPAREN
        {
             MATCHT(LPAREN_INVOKE, &FOLLOW_LPAREN_INVOKE_in_expression_invoke16792);
            if  (HASEXCEPTION())
            {
                goto ruleexpression_invokeEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            FOLLOWPUSH(FOLLOW_unaryExpression_in_expression_invoke16801);
            e=unaryExpression(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruleexpression_invokeEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            if ( BACKTRACKING==0 )
            {
                 ac= NEW_STMT1(OP(INVOKE_METHOD), 
                e
                );
                 
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4846:6: (id= ID | 'in' |op= op_invokable )
            {
                int alt423=3;
                switch ( LA(1) )
                {
                case ID:
                	{
                		alt423=1;
                	}
                    break;
                case 295:
                	{
                		alt423=2;
                	}
                    break;
                case ASSIGN:
                case ASSIGN_AFTER:
                case ASSIGN_MACRO:
                case ASSIGN_REF:
                case BAND:
                case BNOT:
                case BOR:
                case BXOR:
                case DIV:
                case EQUAL:
                case GT:
                case GTE:
                case LAND:
                case LAND_THEN:
                case LNOT:
                case LOR:
                case LOR_ELSE:
                case LSHIFT:
                case LTE:
                case LT_:
                case MINUS:
                case MOD:
                case NEQUAL:
                case NSEQUAL:
                case OP_ASSIGN_TOP:
                case OP_POP:
                case OP_PUSH:
                case OP_TOP:
                case PLUS:
                case RSHIFT:
                case SEQUAL:
                case STAR:
                	{
                		alt423=3;
                	}
                    break;

                default:
                    if (BACKTRACKING>0)
                    {
                        FAILEDFLAG = ANTLR3_TRUE;
                        return ac;
                    }

                    CONSTRUCTEX();
                    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                    EXCEPTION->message      = (void *)"";
                    EXCEPTION->decisionNum  = 423;
                    EXCEPTION->state        = 0;


                    goto ruleexpression_invokeEx;

                }

                switch (alt423)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4846:8: id= ID
            	    {
            	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_expression_invoke16815);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpression_invokeEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             ac
            	            ->append(sep::ParserUtil::getInvokable(e
            	            , STR((id->getText(id))->chars))); 
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4847:8: 'in'
            	    {
            	         MATCHT(295, &FOLLOW_295_in_expression_invoke16837);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpression_invokeEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             ac
            	            ->append( INCR_BF(OP(IN)) ); 
            	        }


            	    }
            	    break;
            	case 3:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4848:8: op= op_invokable
            	    {
            	        FOLLOWPUSH(FOLLOW_op_invokable_in_expression_invoke16862);
            	        op=op_invokable(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpression_invokeEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             ac
            	            ->append( INCR_BF(op
            	            ) ); 
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4850:6: (e= expression )*

            for (;;)
            {
                int alt424=2;
                switch ( LA(1) )
                {
                case BNOT:
                case COLONx2:
                case CharLiteral:
                case DECR:
                case DOLLAR_LCURLY:
                case FloatLiteral:
                case ID:
                case INCR:
                case IntegerLiteral:
                case LBRACKET:
                case LBRACKET_BAR:
                case LCURLY:
                case LNOT:
                case LPAREN:
                case LPAREN_INVOKE:
                case MINUS:
                case OP_POP:
                case OP_TOP:
                case PERCENT_LCURLY:
                case PLUS:
                case RationalLiteral:
                case StringLiteral:
                case 158:
                case 159:
                case 160:
                case 161:
                case 162:
                case 237:
                case 256:
                case 265:
                case 277:
                case 280:
                case 294:
                case 313:
                case 330:
                case 331:
                case 332:
                case 343:
                case 347:
                case 372:
                case 397:
                	{
                		alt424=1;
                	}
                    break;

                }

                switch (alt424)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4850:8: e= expression
            	    {
            	        FOLLOWPUSH(FOLLOW_expression_in_expression_invoke16883);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpression_invokeEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             ac
            	            ->append(e
            	            ); 
            	        }


            	    }
            	    break;

            	default:
            	    goto loop424;	/* break out of the loop */
            	    break;
                }
            }
            loop424: ; /* Jump out to here if this rule does not match */


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4851:6: ( 'provided:' e= expression | 'from:' ue= unaryExpression | 'to:' ue= unaryExpression | 'activity:' o= op_activity )?
            {
                int alt425=5;
                switch ( LA(1) )
                {
                    case 354:
                    	{
                    		alt425=1;
                    	}
                        break;
                    case 287:
                    	{
                    		alt425=2;
                    	}
                        break;
                    case 394:
                    	{
                    		alt425=3;
                    	}
                        break;
                    case 238:
                    	{
                    		alt425=4;
                    	}
                        break;
                }

                switch (alt425)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4851:8: 'provided:' e= expression
            	    {
            	         MATCHT(354, &FOLLOW_354_in_expression_invoke16901);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpression_invokeEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_expression_invoke16907);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpression_invokeEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4852:8: 'from:' ue= unaryExpression
            	    {
            	         MATCHT(287, &FOLLOW_287_in_expression_invoke16916);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpression_invokeEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        FOLLOWPUSH(FOLLOW_unaryExpression_in_expression_invoke16925);
            	        ue=unaryExpression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpression_invokeEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	    }
            	    break;
            	case 3:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4853:8: 'to:' ue= unaryExpression
            	    {
            	         MATCHT(394, &FOLLOW_394_in_expression_invoke16934);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpression_invokeEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        FOLLOWPUSH(FOLLOW_unaryExpression_in_expression_invoke16945);
            	        ue=unaryExpression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpression_invokeEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	    }
            	    break;
            	case 4:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4854:8: 'activity:' o= op_activity
            	    {
            	         MATCHT(238, &FOLLOW_238_in_expression_invoke16954);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpression_invokeEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        FOLLOWPUSH(FOLLOW_op_activity_in_expression_invoke16960);
            	        o=op_activity(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpression_invokeEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	    }
            	    break;

                }
            }

             MATCHT(RPAREN, &FOLLOW_RPAREN_in_expression_invoke16973);
            if  (HASEXCEPTION())
            {
                goto ruleexpression_invokeEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruleexpression_invokeEx; /* Prevent compiler warnings */
    ruleexpression_invokeEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(180, expression_invoke_StartIndex); }

    return ac;
}
/* $ANTLR end expression_invoke */

/**
 * $ANTLR start statement_activity_new
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4864:1: statement_activity_new returns [ sep::BFCode ac ] : 'new' id= qualifiedNameID decl_instance_dynamic_impl[ _CPM_ , ptrInstance ] ( ( '-->' | 'returns:' ) e= expression )? SEMI ;
 */
static sep::BFCode
statement_activity_new(pfmlParser ctx)
{
    sep::BFCode ac;

    ANTLR3_UINT32 statement_activity_new_StartIndex;

    fmlParser_qualifiedNameID_return id;
    #undef	RETURN_TYPE_id
    #define	RETURN_TYPE_id fmlParser_qualifiedNameID_return

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    /* Initialize rule variables
     */
    statement_activity_new_StartIndex = INDEX();



    	sep::Machine * ptrInstance = NULL;
    	sep::BF aModel;
    	
    	sep::Machine * container = _CPM_;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(181)) )
    {
        {

            	if( aModel.is< sep::Machine >() )
            	{
            		POP_CTX;
            	}

        }
        {
        }



        return ac;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4878:2: ( 'new' id= qualifiedNameID decl_instance_dynamic_impl[ _CPM_ , ptrInstance ] ( ( '-->' | 'returns:' ) e= expression )? SEMI )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4878:4: 'new' id= qualifiedNameID decl_instance_dynamic_impl[ _CPM_ , ptrInstance ] ( ( '-->' | 'returns:' ) e= expression )? SEMI
        {
             MATCHT(330, &FOLLOW_330_in_statement_activity_new17001);
            if  (HASEXCEPTION())
            {
                goto rulestatement_activity_newEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            if ( BACKTRACKING==0 )
            {
                 ac= NEW_STMT(OP(INVOKE_NEW));
                 
            }


            FOLLOWPUSH(FOLLOW_qualifiedNameID_in_statement_activity_new17012);
            id=qualifiedNameID(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto rulestatement_activity_newEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            if ( BACKTRACKING==0 )
            {

                	  	aModel = sep::ParserUtil::getvarMachine(id.s
                , id.nb
                );

                	  	if( aModel.is< sep::Machine >() )
                	  	{
                	  		PUSH_CTX_NEW( aModel.to_ptr< sep::Machine >() );
                	  	}

                	  	ptrInstance = sep::Machine::newInstance(container,
                	  			newInvokeNewInstanceNameID(container, id.s
                ), aModel, 1, 1);

                		ptrInstance->getwSpecifier().override_ifdef(
                				sep::Specifier::DESIGN_INSTANCE_DYNAMIC_SPECIFIER );

                	  	 ac
                ->append( container->saveOwnedElement( ptrInstance ) );
                	  
            }


            FOLLOWPUSH(FOLLOW_decl_instance_dynamic_impl_in_statement_activity_new17027);
            decl_instance_dynamic_impl(ctx, _CPM_, ptrInstance);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto rulestatement_activity_newEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4900:4: ( ( '-->' | 'returns:' ) e= expression )?
            {
                int alt426=2;
                switch ( LA(1) )
                {
                    case 163:
                    case 365:
                    	{
                    		alt426=1;
                    	}
                        break;
                }

                switch (alt426)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4900:6: ( '-->' | 'returns:' ) e= expression
            	    {
            	        if ( LA(1) == 163 || LA(1) == 365 )
            	        {
            	            CONSUME();
            	            PERRORRECOVERY=ANTLR3_FALSE;
            	            FAILEDFLAG=ANTLR3_FALSE;

            	        }
            	        else
            	        {
            	            if (BACKTRACKING>0)
            	            {
            	                FAILEDFLAG = ANTLR3_TRUE;
            	                return ac;
            	            }

            	            CONSTRUCTEX();
            	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
            	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
            	            EXCEPTION->expectingSet = NULL;

            	            goto rulestatement_activity_newEx;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_statement_activity_new17048);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_activity_newEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	    }
            	    break;

                }
            }

             MATCHT(SEMI, &FOLLOW_SEMI_in_statement_activity_new17060);
            if  (HASEXCEPTION())
            {
                goto rulestatement_activity_newEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto rulestatement_activity_newEx; /* Prevent compiler warnings */
    rulestatement_activity_newEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
            else
            {
                {

                    	if( aModel.is< sep::Machine >() )
                    	{
                    		POP_CTX;
                    	}

                }
            }


    if ( BACKTRACKING>0 ) { MEMOIZE(181, statement_activity_new_StartIndex); }

    return ac;
}
/* $ANTLR end statement_activity_new */

/**
 * $ANTLR start decl_instance_dynamic_impl
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4906:1: decl_instance_dynamic_impl[ sep::Machine * container , sep::Machine * ptrInstance ] : ( ( LPAREN )=> LPAREN ( def_instance_on_new_activity[ ptrInstance ] )? RPAREN )? ( ( LCURLY )=> LCURLY (s= statement )* ( def_instance_activity[ ptrInstance ] )* RCURLY )? ;
 */
static void
decl_instance_dynamic_impl(pfmlParser ctx, sep::Machine * container, sep::Machine * ptrInstance)
{
    ANTLR3_UINT32 decl_instance_dynamic_impl_StartIndex;

    sep::BFCode s;
    #undef	RETURN_TYPE_s
    #define	RETURN_TYPE_s sep::BFCode

    /* Initialize rule variables
     */
    decl_instance_dynamic_impl_StartIndex = INDEX();



    	SAVE_RULE_BEGIN_LOCATION;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(182)) )
    {
        {

            	SET_RULE_LOCATION(ptrInstance);

        }
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4914:2: ( ( ( LPAREN )=> LPAREN ( def_instance_on_new_activity[ ptrInstance ] )? RPAREN )? ( ( LCURLY )=> LCURLY (s= statement )* ( def_instance_activity[ ptrInstance ] )* RCURLY )? )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4914:4: ( ( LPAREN )=> LPAREN ( def_instance_on_new_activity[ ptrInstance ] )? RPAREN )? ( ( LCURLY )=> LCURLY (s= statement )* ( def_instance_activity[ ptrInstance ] )* RCURLY )?
        {
            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4914:4: ( ( LPAREN )=> LPAREN ( def_instance_on_new_activity[ ptrInstance ] )? RPAREN )?
            {
                int alt428=2;
                {
                    int LA428_0 = LA(1);
                    if ( (synpred802_fml(ctx)) && (LA428_0 == LPAREN))
                    {
                        alt428=1;
                    }
                }
                switch (alt428)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4914:6: ( LPAREN )=> LPAREN ( def_instance_on_new_activity[ ptrInstance ] )? RPAREN
            	    {
            	         MATCHT(LPAREN, &FOLLOW_LPAREN_in_decl_instance_dynamic_impl17093);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledecl_instance_dynamic_implEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4915:6: ( def_instance_on_new_activity[ ptrInstance ] )?
            	        {
            	            int alt427=2;
            	            switch ( LA(1) )
            	            {
            	                case BNOT:
            	                case COLONx2:
            	                case CharLiteral:
            	                case DECR:
            	                case DOLLAR_LCURLY:
            	                case FloatLiteral:
            	                case ID:
            	                case INCR:
            	                case IntegerLiteral:
            	                case LBRACKET:
            	                case LBRACKET_BAR:
            	                case LCURLY:
            	                case LNOT:
            	                case LPAREN:
            	                case LPAREN_INVOKE:
            	                case MINUS:
            	                case OP_POP:
            	                case OP_TOP:
            	                case PERCENT_LCURLY:
            	                case PLUS:
            	                case RationalLiteral:
            	                case StringLiteral:
            	                case 158:
            	                case 159:
            	                case 160:
            	                case 161:
            	                case 162:
            	                case 237:
            	                case 256:
            	                case 265:
            	                case 277:
            	                case 280:
            	                case 294:
            	                case 313:
            	                case 330:
            	                case 331:
            	                case 332:
            	                case 343:
            	                case 347:
            	                case 372:
            	                case 397:
            	                	{
            	                		alt427=1;
            	                	}
            	                    break;
            	            }

            	            switch (alt427)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4915:8: def_instance_on_new_activity[ ptrInstance ]
            	        	    {
            	        	        FOLLOWPUSH(FOLLOW_def_instance_on_new_activity_in_decl_instance_dynamic_impl17102);
            	        	        def_instance_on_new_activity(ctx, ptrInstance);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledecl_instance_dynamic_implEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	         MATCHT(RPAREN, &FOLLOW_RPAREN_in_decl_instance_dynamic_impl17114);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledecl_instance_dynamic_implEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4919:4: ( ( LCURLY )=> LCURLY (s= statement )* ( def_instance_activity[ ptrInstance ] )* RCURLY )?
            {
                int alt431=2;
                {
                    int LA431_0 = LA(1);
                    if ( (synpred804_fml(ctx)) && (LA431_0 == LCURLY))
                    {
                        alt431=1;
                    }
                }
                switch (alt431)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4919:6: ( LCURLY )=> LCURLY (s= statement )* ( def_instance_activity[ ptrInstance ] )* RCURLY
            	    {
            	         MATCHT(LCURLY, &FOLLOW_LCURLY_in_decl_instance_dynamic_impl17136);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledecl_instance_dynamic_implEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4920:6: (s= statement )*

            	        for (;;)
            	        {
            	            int alt429=2;
            	            switch ( LA(1) )
            	            {
            	            case COLONx2:
            	            case DECR:
            	            case DOLLAR_LCURLY:
            	            case ID:
            	            case INCR:
            	            case LCURLY:
            	            case LPAREN_INVOKE:
            	            case STATEMENT_PROMPT:
            	            case 154:
            	            case 155:
            	            case 156:
            	            case 157:
            	            case 236:
            	            case 247:
            	            case 250:
            	            case 256:
            	            case 263:
            	            case 267:
            	            case 268:
            	            case 269:
            	            case 275:
            	            case 278:
            	            case 279:
            	            case 282:
            	            case 285:
            	            case 289:
            	            case 290:
            	            case 291:
            	            case 292:
            	            case 293:
            	            case 294:
            	            case 296:
            	            case 299:
            	            case 300:
            	            case 301:
            	            case 302:
            	            case 303:
            	            case 304:
            	            case 305:
            	            case 312:
            	            case 330:
            	            case 336:
            	            case 337:
            	            case 338:
            	            case 339:
            	            case 340:
            	            case 341:
            	            case 362:
            	            case 363:
            	            case 364:
            	            case 368:
            	            case 369:
            	            case 371:
            	            case 377:
            	            case 385:
            	            case 386:
            	            case 389:
            	            case 391:
            	            case 415:
            	            case 416:
            	            	{
            	            		alt429=1;
            	            	}
            	                break;

            	            }

            	            switch (alt429)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4920:8: s= statement
            	        	    {
            	        	        FOLLOWPUSH(FOLLOW_statement_in_decl_instance_dynamic_impl17147);
            	        	        s=statement(ctx);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledecl_instance_dynamic_implEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             ptrInstance->getUniqBehaviorPart()->seqOnCreate(s
            	        	            ); 
            	        	        }


            	        	    }
            	        	    break;

            	        	default:
            	        	    goto loop429;	/* break out of the loop */
            	        	    break;
            	            }
            	        }
            	        loop429: ; /* Jump out to here if this rule does not match */


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4922:6: ( def_instance_activity[ ptrInstance ] )*

            	        for (;;)
            	        {
            	            int alt430=2;
            	            switch ( LA(1) )
            	            {
            	            case 177:
            	            case 226:
            	            	{
            	            		alt430=1;
            	            	}
            	                break;

            	            }

            	            switch (alt430)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4922:8: def_instance_activity[ ptrInstance ]
            	        	    {
            	        	        FOLLOWPUSH(FOLLOW_def_instance_activity_in_decl_instance_dynamic_impl17162);
            	        	        def_instance_activity(ctx, ptrInstance);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruledecl_instance_dynamic_implEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	    }
            	        	    break;

            	        	default:
            	        	    goto loop430;	/* break out of the loop */
            	        	    break;
            	            }
            	        }
            	        loop430: ; /* Jump out to here if this rule does not match */


            	         MATCHT(RCURLY, &FOLLOW_RCURLY_in_decl_instance_dynamic_impl17173);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruledecl_instance_dynamic_implEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;

                }
            }

        }

    }

    // This is where rules clean up and exit
    //
    goto ruledecl_instance_dynamic_implEx; /* Prevent compiler warnings */
    ruledecl_instance_dynamic_implEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
            else
            {
                {

                    	SET_RULE_LOCATION(ptrInstance);

                }
            }


    if ( BACKTRACKING>0 ) { MEMOIZE(182, decl_instance_dynamic_impl_StartIndex); }

    return ;
}
/* $ANTLR end decl_instance_dynamic_impl */

/**
 * $ANTLR start expression_activity_new
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4929:1: expression_activity_new returns [ sep::BFCode ac ] : 'new' id= qualifiedNameID activity_machine_param_return[ aModel , ac ] ;
 */
static sep::BFCode
expression_activity_new(pfmlParser ctx)
{
    sep::BFCode ac;

    ANTLR3_UINT32 expression_activity_new_StartIndex;

    fmlParser_qualifiedNameID_return id;
    #undef	RETURN_TYPE_id
    #define	RETURN_TYPE_id fmlParser_qualifiedNameID_return

    /* Initialize rule variables
     */
    expression_activity_new_StartIndex = INDEX();



    	sep::Machine * ptrInstance = NULL;
    	sep::BF aModel;
    	
    	sep::Machine * container = _CPM_;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(183)) )
    {
        {

            	if( aModel.is< sep::Machine >() )
            	{
            		POP_CTX;
            	}

        }
        {
        }



        return ac;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4943:2: ( 'new' id= qualifiedNameID activity_machine_param_return[ aModel , ac ] )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4943:4: 'new' id= qualifiedNameID activity_machine_param_return[ aModel , ac ]
        {
             MATCHT(330, &FOLLOW_330_in_expression_activity_new17204);
            if  (HASEXCEPTION())
            {
                goto ruleexpression_activity_newEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            if ( BACKTRACKING==0 )
            {
                 ac= NEW_STMT(OP(INVOKE_NEW));
                 
            }


            FOLLOWPUSH(FOLLOW_qualifiedNameID_in_expression_activity_new17216);
            id=qualifiedNameID(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruleexpression_activity_newEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            if ( BACKTRACKING==0 )
            {

                	  	sep::BF aModel = sep::ParserUtil::getvarMachine(id.s
                , id.nb
                );

                	  	if( aModel.is< sep::Machine >() )
                	  	{
                	  		PUSH_CTX_NEW( aModel.to_ptr< sep::Machine >() );
                	  	}

                	  	ptrInstance = sep::Machine::newInstance(container,
                	  			newInvokeNewInstanceNameID(container, id.s
                ), aModel, 1, 1);

                		ptrInstance->getwSpecifier().override_ifdef(
                				sep::Specifier::DESIGN_INSTANCE_DYNAMIC_SPECIFIER );

                	  	 ac
                ->append( container->saveOwnedElement( ptrInstance ) );
                	  
            }


            FOLLOWPUSH(FOLLOW_activity_machine_param_return_in_expression_activity_new17227);
            activity_machine_param_return(ctx, aModel, ac);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruleexpression_activity_newEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruleexpression_activity_newEx; /* Prevent compiler warnings */
    ruleexpression_activity_newEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
            else
            {
                {

                    	if( aModel.is< sep::Machine >() )
                    	{
                    		POP_CTX;
                    	}

                }
            }


    if ( BACKTRACKING>0 ) { MEMOIZE(183, expression_activity_new_StartIndex); }

    return ac;
}
/* $ANTLR end expression_activity_new */

/**
 * $ANTLR start statement_prompt
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4973:1: statement_prompt returns [ sep::BFCode ac ] : STATEMENT_PROMPT spi= statement_prompt_impl ;
 */
static sep::BFCode
statement_prompt(pfmlParser ctx)
{
    sep::BFCode ac;

    ANTLR3_UINT32 statement_prompt_StartIndex;

    sep::BFCode spi;
    #undef	RETURN_TYPE_spi
    #define	RETURN_TYPE_spi sep::BFCode

    /* Initialize rule variables
     */
    statement_prompt_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(184)) )
    {
        {
        }



        return ac;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4975:2: ( STATEMENT_PROMPT spi= statement_prompt_impl )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4975:4: STATEMENT_PROMPT spi= statement_prompt_impl
        {
             MATCHT(STATEMENT_PROMPT, &FOLLOW_STATEMENT_PROMPT_in_statement_prompt17251);
            if  (HASEXCEPTION())
            {
                goto rulestatement_promptEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            FOLLOWPUSH(FOLLOW_statement_prompt_impl_in_statement_prompt17256);
            spi=statement_prompt_impl(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto rulestatement_promptEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            if ( BACKTRACKING==0 )
            {
                 ac=  
                spi
                ;
                 
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto rulestatement_promptEx; /* Prevent compiler warnings */
    rulestatement_promptEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(184, statement_prompt_StartIndex); }

    return ac;
}
/* $ANTLR end statement_prompt */

/**
 * $ANTLR start statement_prompt_impl
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4978:1: statement_prompt_impl returns [ sep::BFCode ac ] : spo= statement_prompt_obs ;
 */
static sep::BFCode
statement_prompt_impl(pfmlParser ctx)
{
    sep::BFCode ac;

    ANTLR3_UINT32 statement_prompt_impl_StartIndex;

    sep::BFCode spo;
    #undef	RETURN_TYPE_spo
    #define	RETURN_TYPE_spo sep::BFCode

    /* Initialize rule variables
     */
    statement_prompt_impl_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(185)) )
    {
        {
        }



        return ac;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4980:2: (spo= statement_prompt_obs )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4980:4: spo= statement_prompt_obs
        {
            FOLLOWPUSH(FOLLOW_statement_prompt_obs_in_statement_prompt_impl17275);
            spo=statement_prompt_obs(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto rulestatement_prompt_implEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            if ( BACKTRACKING==0 )
            {
                 ac= 
                spo
                ;
                 
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto rulestatement_prompt_implEx; /* Prevent compiler warnings */
    rulestatement_prompt_implEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(185, statement_prompt_impl_StartIndex); }

    return ac;
}
/* $ANTLR end statement_prompt_impl */

/**
 * $ANTLR start statement_prompt_obs
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4984:1: statement_prompt_obs returns [ sep::BFCode ac ] :{...}? ID ( 'ctx:' id= qualifiedNameID )? LCURLY bs= statement_prompt_obs_com[ varMachine ] RCURLY ( 'provided:' e= expression | LBRACKET e= expression RBRACKET ) SEMI ;
 */
static sep::BFCode
statement_prompt_obs(pfmlParser ctx)
{
    sep::BFCode ac;

    ANTLR3_UINT32 statement_prompt_obs_StartIndex;

    fmlParser_qualifiedNameID_return id;
    #undef	RETURN_TYPE_id
    #define	RETURN_TYPE_id fmlParser_qualifiedNameID_return

    sep::BFCode bs;
    #undef	RETURN_TYPE_bs
    #define	RETURN_TYPE_bs sep::BFCode

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    /* Initialize rule variables
     */
    statement_prompt_obs_StartIndex = INDEX();



    	sep::BF varMachine = INCR_BF(_SYSTEM_);

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(186)) )
    {
        {
        }



        return ac;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4989:2: ({...}? ID ( 'ctx:' id= qualifiedNameID )? LCURLY bs= statement_prompt_obs_com[ varMachine ] RCURLY ( 'provided:' e= expression | LBRACKET e= expression RBRACKET ) SEMI )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4989:4: {...}? ID ( 'ctx:' id= qualifiedNameID )? LCURLY bs= statement_prompt_obs_com[ varMachine ] RCURLY ( 'provided:' e= expression | LBRACKET e= expression RBRACKET ) SEMI
        {
            if ( !(( IS_KEYWORD( "obs" ) )) )
            {
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ac;
                }

                    CONSTRUCTEX();
                    EXCEPTION->type         = ANTLR3_FAILED_PREDICATE_EXCEPTION;
                    EXCEPTION->message      = (void *)" IS_KEYWORD( \"obs\" ) ";
                    EXCEPTION->ruleName	 = (void *)"statement_prompt_obs";


            }

             MATCHT(ID, &FOLLOW_ID_in_statement_prompt_obs17300);
            if  (HASEXCEPTION())
            {
                goto rulestatement_prompt_obsEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4991:4: ( 'ctx:' id= qualifiedNameID )?
            {
                int alt432=2;
                switch ( LA(1) )
                {
                    case 266:
                    	{
                    		alt432=1;
                    	}
                        break;
                }

                switch (alt432)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4991:6: 'ctx:' id= qualifiedNameID
            	    {
            	         MATCHT(266, &FOLLOW_266_in_statement_prompt_obs17308);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_prompt_obsEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        FOLLOWPUSH(FOLLOW_qualifiedNameID_in_statement_prompt_obs17312);
            	        id=qualifiedNameID(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_prompt_obsEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             varMachine = sep::ParserUtil::getvarMachine(id.s
            	            , id.nb
            	            ); 
            	        }


            	    }
            	    break;

                }
            }

             MATCHT(LCURLY, &FOLLOW_LCURLY_in_statement_prompt_obs17329);
            if  (HASEXCEPTION())
            {
                goto rulestatement_prompt_obsEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            FOLLOWPUSH(FOLLOW_statement_prompt_obs_com_in_statement_prompt_obs17338);
            bs=statement_prompt_obs_com(ctx, varMachine);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto rulestatement_prompt_obsEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


             MATCHT(RCURLY, &FOLLOW_RCURLY_in_statement_prompt_obs17344);
            if  (HASEXCEPTION())
            {
                goto rulestatement_prompt_obsEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4999:4: ( 'provided:' e= expression | LBRACKET e= expression RBRACKET )
            {
                int alt433=2;
                switch ( LA(1) )
                {
                case 354:
                	{
                		alt433=1;
                	}
                    break;
                case LBRACKET:
                	{
                		alt433=2;
                	}
                    break;

                default:
                    if (BACKTRACKING>0)
                    {
                        FAILEDFLAG = ANTLR3_TRUE;
                        return ac;
                    }

                    CONSTRUCTEX();
                    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                    EXCEPTION->message      = (void *)"";
                    EXCEPTION->decisionNum  = 433;
                    EXCEPTION->state        = 0;


                    goto rulestatement_prompt_obsEx;

                }

                switch (alt433)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4999:6: 'provided:' e= expression
            	    {
            	         MATCHT(354, &FOLLOW_354_in_statement_prompt_obs17352);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_prompt_obsEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_statement_prompt_obs17356);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_prompt_obsEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5000:6: LBRACKET e= expression RBRACKET
            	    {
            	         MATCHT(LBRACKET, &FOLLOW_LBRACKET_in_statement_prompt_obs17363);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_prompt_obsEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_statement_prompt_obs17367);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_prompt_obsEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	         MATCHT(RBRACKET, &FOLLOW_RBRACKET_in_statement_prompt_obs17369);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_prompt_obsEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	    }
            	    break;

                }
            }

             MATCHT(SEMI, &FOLLOW_SEMI_in_statement_prompt_obs17379);
            if  (HASEXCEPTION())
            {
                goto rulestatement_prompt_obsEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            if ( BACKTRACKING==0 )
            {
                 ac= NEW_STMT3(OP(OBS), varMachine, 
                bs
                , e
                );
                 
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto rulestatement_prompt_obsEx; /* Prevent compiler warnings */
    rulestatement_prompt_obsEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(186, statement_prompt_obs_StartIndex); }

    return ac;
}
/* $ANTLR end statement_prompt_obs */

/**
 * $ANTLR start statement_prompt_obs_com
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5008:1: statement_prompt_obs_com[ const sep::BF & varMachine ] returns [ sep::BFCode ac ] : sc= statement_com ;
 */
static sep::BFCode
statement_prompt_obs_com(pfmlParser ctx, const sep::BF & varMachine)
{
    sep::BFCode ac;

    ANTLR3_UINT32 statement_prompt_obs_com_StartIndex;

    sep::BFCode sc;
    #undef	RETURN_TYPE_sc
    #define	RETURN_TYPE_sc sep::BFCode

    /* Initialize rule variables
     */
    statement_prompt_obs_com_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(187)) )
    {
        {
        }



        return ac;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5010:2: (sc= statement_com )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5010:4: sc= statement_com
        {
            FOLLOWPUSH(FOLLOW_statement_com_in_statement_prompt_obs_com17404);
            sc=statement_com(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto rulestatement_prompt_obs_comEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            if ( BACKTRACKING==0 )
            {
                 ac= 
                sc
                ;
                 
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto rulestatement_prompt_obs_comEx; /* Prevent compiler warnings */
    rulestatement_prompt_obs_comEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(187, statement_prompt_obs_com_StartIndex); }

    return ac;
}
/* $ANTLR end statement_prompt_obs_com */

/**
 * $ANTLR start meta_statement
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5018:1: meta_statement returns [ sep::BFCode ac ] : ( '$:informal' bs= block_statement | '$:trace' bs= block_statement | '$:debug' bs= block_statement | '$:comment' bs= block_statement );
 */
static sep::BFCode
meta_statement(pfmlParser ctx)
{
    sep::BFCode ac;

    ANTLR3_UINT32 meta_statement_StartIndex;

    sep::BFCode bs;
    #undef	RETURN_TYPE_bs
    #define	RETURN_TYPE_bs sep::BFCode

    /* Initialize rule variables
     */
    meta_statement_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(188)) )
    {
        {
        }



        return ac;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5020:2: ( '$:informal' bs= block_statement | '$:trace' bs= block_statement | '$:debug' bs= block_statement | '$:comment' bs= block_statement )

            ANTLR3_UINT32 alt434;

            alt434=4;

            switch ( LA(1) )
            {
            case 156:
            	{
            		alt434=1;
            	}
                break;
            case 157:
            	{
            		alt434=2;
            	}
                break;
            case 155:
            	{
            		alt434=3;
            	}
                break;
            case 154:
            	{
            		alt434=4;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ac;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 434;
                EXCEPTION->state        = 0;


                goto rulemeta_statementEx;

            }

            switch (alt434)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5020:4: '$:informal' bs= block_statement
        	    {
        	         MATCHT(156, &FOLLOW_156_in_meta_statement17427);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulemeta_statementEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        FOLLOWPUSH(FOLLOW_block_statement_in_meta_statement17432);
        	        bs=block_statement(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulemeta_statementEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= NEW_STMT1(OP(INFORMAL), 
        	            bs
        	            );
        	             
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5021:4: '$:trace' bs= block_statement
        	    {
        	         MATCHT(157, &FOLLOW_157_in_meta_statement17440);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulemeta_statementEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        FOLLOWPUSH(FOLLOW_block_statement_in_meta_statement17448);
        	        bs=block_statement(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulemeta_statementEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= NEW_STMT1(OP(TRACE)   , 
        	            bs
        	            );
        	             
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5022:4: '$:debug' bs= block_statement
        	    {
        	         MATCHT(155, &FOLLOW_155_in_meta_statement17456);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulemeta_statementEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        FOLLOWPUSH(FOLLOW_block_statement_in_meta_statement17464);
        	        bs=block_statement(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulemeta_statementEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= NEW_STMT1(OP(DEBUG)   , 
        	            bs
        	            );
        	             
        	        }


        	    }
        	    break;
        	case 4:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5023:4: '$:comment' bs= block_statement
        	    {
        	         MATCHT(154, &FOLLOW_154_in_meta_statement17472);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulemeta_statementEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        FOLLOWPUSH(FOLLOW_block_statement_in_meta_statement17478);
        	        bs=block_statement(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulemeta_statementEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= NEW_STMT1(OP(COMMENT) , 
        	            bs
        	            );
        	             
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto rulemeta_statementEx; /* Prevent compiler warnings */
    rulemeta_statementEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(188, meta_statement_StartIndex); }

    return ac;
}
/* $ANTLR end meta_statement */

/**
 * $ANTLR start statement_assign
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5055:1: statement_assign returns [ sep::BFCode ac ] : (lv= lvalue ( ( ASSIGN | ASSIGN_AFTER ) e= expression SEMI | ASSIGN_REF e= lvalue SEMI | ASSIGN_MACRO e= expression SEMI | ( PLUS_ASSIGN | PLUS_ASSIGN_AFTER ) e= expression SEMI | ( MINUS_ASSIGN | MINUS_ASSIGN_AFTER ) e= expression SEMI | ( STAR_ASSIGN | STAR_ASSIGN_AFTER ) e= expression SEMI | ( DIV_ASSIGN | DIV_ASSIGN_AFTER ) e= expression SEMI | ( MOD_ASSIGN | MOD_ASSIGN_AFTER ) e= expression SEMI | ( LAND_ASSIGN | LAND_ASSIGN_AFTER ) e= expression SEMI | ( LOR_ASSIGN | LOR_ASSIGN_AFTER ) e= expression SEMI | ( BAND_ASSIGN | BAND_ASSIGN_AFTER ) e= expression SEMI | ( BOR_ASSIGN | BOR_ASSIGN_AFTER ) e= expression SEMI | ( BXOR_ASSIGN | BXOR_ASSIGN_AFTER ) e= expression SEMI | ( LSHIFT_ASSIGN | LSHIFT_ASSIGN_AFTER ) e= expression SEMI | ( RSHIFT_ASSIGN | RSHIFT_ASSIGN_AFTER ) e= expression SEMI | OP_PUSH e= expression ( OP_PUSH e= expression )* SEMI | OP_ASSIGN_TOP e= expression SEMI | OP_TOP v= lvalue SEMI | OP_POP (v= lvalue )* SEMI | INCR SEMI | DECR SEMI ) | INCR lv= lvalue SEMI | DECR lv= lvalue SEMI );
 */
static sep::BFCode
statement_assign(pfmlParser ctx)
{
    sep::BFCode ac;

    ANTLR3_UINT32 statement_assign_StartIndex;

    sep::BF lv;
    #undef	RETURN_TYPE_lv
    #define	RETURN_TYPE_lv sep::BF

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    sep::BF v;
    #undef	RETURN_TYPE_v
    #define	RETURN_TYPE_v sep::BF

    /* Initialize rule variables
     */
    statement_assign_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(189)) )
    {
        {
        }



        return ac;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5058:2: (lv= lvalue ( ( ASSIGN | ASSIGN_AFTER ) e= expression SEMI | ASSIGN_REF e= lvalue SEMI | ASSIGN_MACRO e= expression SEMI | ( PLUS_ASSIGN | PLUS_ASSIGN_AFTER ) e= expression SEMI | ( MINUS_ASSIGN | MINUS_ASSIGN_AFTER ) e= expression SEMI | ( STAR_ASSIGN | STAR_ASSIGN_AFTER ) e= expression SEMI | ( DIV_ASSIGN | DIV_ASSIGN_AFTER ) e= expression SEMI | ( MOD_ASSIGN | MOD_ASSIGN_AFTER ) e= expression SEMI | ( LAND_ASSIGN | LAND_ASSIGN_AFTER ) e= expression SEMI | ( LOR_ASSIGN | LOR_ASSIGN_AFTER ) e= expression SEMI | ( BAND_ASSIGN | BAND_ASSIGN_AFTER ) e= expression SEMI | ( BOR_ASSIGN | BOR_ASSIGN_AFTER ) e= expression SEMI | ( BXOR_ASSIGN | BXOR_ASSIGN_AFTER ) e= expression SEMI | ( LSHIFT_ASSIGN | LSHIFT_ASSIGN_AFTER ) e= expression SEMI | ( RSHIFT_ASSIGN | RSHIFT_ASSIGN_AFTER ) e= expression SEMI | OP_PUSH e= expression ( OP_PUSH e= expression )* SEMI | OP_ASSIGN_TOP e= expression SEMI | OP_TOP v= lvalue SEMI | OP_POP (v= lvalue )* SEMI | INCR SEMI | DECR SEMI ) | INCR lv= lvalue SEMI | DECR lv= lvalue SEMI )

            ANTLR3_UINT32 alt438;

            alt438=3;

            switch ( LA(1) )
            {
            case COLONx2:
            case ID:
            	{
            		alt438=1;
            	}
                break;
            case INCR:
            	{
            		alt438=2;
            	}
                break;
            case DECR:
            	{
            		alt438=3;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ac;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 438;
                EXCEPTION->state        = 0;


                goto rulestatement_assignEx;

            }

            switch (alt438)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5058:4: lv= lvalue ( ( ASSIGN | ASSIGN_AFTER ) e= expression SEMI | ASSIGN_REF e= lvalue SEMI | ASSIGN_MACRO e= expression SEMI | ( PLUS_ASSIGN | PLUS_ASSIGN_AFTER ) e= expression SEMI | ( MINUS_ASSIGN | MINUS_ASSIGN_AFTER ) e= expression SEMI | ( STAR_ASSIGN | STAR_ASSIGN_AFTER ) e= expression SEMI | ( DIV_ASSIGN | DIV_ASSIGN_AFTER ) e= expression SEMI | ( MOD_ASSIGN | MOD_ASSIGN_AFTER ) e= expression SEMI | ( LAND_ASSIGN | LAND_ASSIGN_AFTER ) e= expression SEMI | ( LOR_ASSIGN | LOR_ASSIGN_AFTER ) e= expression SEMI | ( BAND_ASSIGN | BAND_ASSIGN_AFTER ) e= expression SEMI | ( BOR_ASSIGN | BOR_ASSIGN_AFTER ) e= expression SEMI | ( BXOR_ASSIGN | BXOR_ASSIGN_AFTER ) e= expression SEMI | ( LSHIFT_ASSIGN | LSHIFT_ASSIGN_AFTER ) e= expression SEMI | ( RSHIFT_ASSIGN | RSHIFT_ASSIGN_AFTER ) e= expression SEMI | OP_PUSH e= expression ( OP_PUSH e= expression )* SEMI | OP_ASSIGN_TOP e= expression SEMI | OP_TOP v= lvalue SEMI | OP_POP (v= lvalue )* SEMI | INCR SEMI | DECR SEMI )
        	    {
        	        FOLLOWPUSH(FOLLOW_lvalue_in_statement_assign17510);
        	        lv=lvalue(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_assignEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5059:2: ( ( ASSIGN | ASSIGN_AFTER ) e= expression SEMI | ASSIGN_REF e= lvalue SEMI | ASSIGN_MACRO e= expression SEMI | ( PLUS_ASSIGN | PLUS_ASSIGN_AFTER ) e= expression SEMI | ( MINUS_ASSIGN | MINUS_ASSIGN_AFTER ) e= expression SEMI | ( STAR_ASSIGN | STAR_ASSIGN_AFTER ) e= expression SEMI | ( DIV_ASSIGN | DIV_ASSIGN_AFTER ) e= expression SEMI | ( MOD_ASSIGN | MOD_ASSIGN_AFTER ) e= expression SEMI | ( LAND_ASSIGN | LAND_ASSIGN_AFTER ) e= expression SEMI | ( LOR_ASSIGN | LOR_ASSIGN_AFTER ) e= expression SEMI | ( BAND_ASSIGN | BAND_ASSIGN_AFTER ) e= expression SEMI | ( BOR_ASSIGN | BOR_ASSIGN_AFTER ) e= expression SEMI | ( BXOR_ASSIGN | BXOR_ASSIGN_AFTER ) e= expression SEMI | ( LSHIFT_ASSIGN | LSHIFT_ASSIGN_AFTER ) e= expression SEMI | ( RSHIFT_ASSIGN | RSHIFT_ASSIGN_AFTER ) e= expression SEMI | OP_PUSH e= expression ( OP_PUSH e= expression )* SEMI | OP_ASSIGN_TOP e= expression SEMI | OP_TOP v= lvalue SEMI | OP_POP (v= lvalue )* SEMI | INCR SEMI | DECR SEMI )
        	        {
        	            int alt437=21;
        	            switch ( LA(1) )
        	            {
        	            case ASSIGN:
        	            case ASSIGN_AFTER:
        	            	{
        	            		alt437=1;
        	            	}
        	                break;
        	            case ASSIGN_REF:
        	            	{
        	            		alt437=2;
        	            	}
        	                break;
        	            case ASSIGN_MACRO:
        	            	{
        	            		alt437=3;
        	            	}
        	                break;
        	            case PLUS_ASSIGN:
        	            case PLUS_ASSIGN_AFTER:
        	            	{
        	            		alt437=4;
        	            	}
        	                break;
        	            case MINUS_ASSIGN:
        	            case MINUS_ASSIGN_AFTER:
        	            	{
        	            		alt437=5;
        	            	}
        	                break;
        	            case STAR_ASSIGN:
        	            case STAR_ASSIGN_AFTER:
        	            	{
        	            		alt437=6;
        	            	}
        	                break;
        	            case DIV_ASSIGN:
        	            case DIV_ASSIGN_AFTER:
        	            	{
        	            		alt437=7;
        	            	}
        	                break;
        	            case MOD_ASSIGN:
        	            case MOD_ASSIGN_AFTER:
        	            	{
        	            		alt437=8;
        	            	}
        	                break;
        	            case LAND_ASSIGN:
        	            case LAND_ASSIGN_AFTER:
        	            	{
        	            		alt437=9;
        	            	}
        	                break;
        	            case LOR_ASSIGN:
        	            case LOR_ASSIGN_AFTER:
        	            	{
        	            		alt437=10;
        	            	}
        	                break;
        	            case BAND_ASSIGN:
        	            case BAND_ASSIGN_AFTER:
        	            	{
        	            		alt437=11;
        	            	}
        	                break;
        	            case BOR_ASSIGN:
        	            case BOR_ASSIGN_AFTER:
        	            	{
        	            		alt437=12;
        	            	}
        	                break;
        	            case BXOR_ASSIGN:
        	            case BXOR_ASSIGN_AFTER:
        	            	{
        	            		alt437=13;
        	            	}
        	                break;
        	            case LSHIFT_ASSIGN:
        	            case LSHIFT_ASSIGN_AFTER:
        	            	{
        	            		alt437=14;
        	            	}
        	                break;
        	            case RSHIFT_ASSIGN:
        	            case RSHIFT_ASSIGN_AFTER:
        	            	{
        	            		alt437=15;
        	            	}
        	                break;
        	            case OP_PUSH:
        	            	{
        	            		alt437=16;
        	            	}
        	                break;
        	            case OP_ASSIGN_TOP:
        	            	{
        	            		alt437=17;
        	            	}
        	                break;
        	            case OP_TOP:
        	            	{
        	            		alt437=18;
        	            	}
        	                break;
        	            case OP_POP:
        	            	{
        	            		alt437=19;
        	            	}
        	                break;
        	            case INCR:
        	            	{
        	            		alt437=20;
        	            	}
        	                break;
        	            case DECR:
        	            	{
        	            		alt437=21;
        	            	}
        	                break;

        	            default:
        	                if (BACKTRACKING>0)
        	                {
        	                    FAILEDFLAG = ANTLR3_TRUE;
        	                    return ac;
        	                }

        	                CONSTRUCTEX();
        	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
        	                EXCEPTION->message      = (void *)"";
        	                EXCEPTION->decisionNum  = 437;
        	                EXCEPTION->state        = 0;


        	                goto rulestatement_assignEx;

        	            }

        	            switch (alt437)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5059:4: ( ASSIGN | ASSIGN_AFTER ) e= expression SEMI
        	        	    {
        	        	        if ( ((LA(1) >= ASSIGN) && (LA(1) <= ASSIGN_AFTER)) )
        	        	        {
        	        	            CONSUME();
        	        	            PERRORRECOVERY=ANTLR3_FALSE;
        	        	            FAILEDFLAG=ANTLR3_FALSE;

        	        	        }
        	        	        else
        	        	        {
        	        	            if (BACKTRACKING>0)
        	        	            {
        	        	                FAILEDFLAG = ANTLR3_TRUE;
        	        	                return ac;
        	        	            }

        	        	            CONSTRUCTEX();
        	        	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
        	        	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
        	        	            EXCEPTION->expectingSet = NULL;

        	        	            goto rulestatement_assignEx;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_expression_in_statement_assign17528);
        	        	        e=expression(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	         MATCHT(SEMI, &FOLLOW_SEMI_in_statement_assign17531);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             ac= NEW_STMT2(OP(ASSIGN), 
        	        	            lv
        	        	            , e
        	        	            );
        	        	             
        	        	        }


        	        	    }
        	        	    break;
        	        	case 2:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5062:4: ASSIGN_REF e= lvalue SEMI
        	        	    {
        	        	         MATCHT(ASSIGN_REF, &FOLLOW_ASSIGN_REF_in_statement_assign17542);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_lvalue_in_statement_assign17547);
        	        	        e=lvalue(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	         MATCHT(SEMI, &FOLLOW_SEMI_in_statement_assign17550);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             ac= NEW_STMT2(OP(ASSIGN_REF), 
        	        	            lv
        	        	            , e
        	        	            );
        	        	             
        	        	        }


        	        	    }
        	        	    break;
        	        	case 3:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5065:4: ASSIGN_MACRO e= expression SEMI
        	        	    {
        	        	         MATCHT(ASSIGN_MACRO, &FOLLOW_ASSIGN_MACRO_in_statement_assign17559);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_expression_in_statement_assign17564);
        	        	        e=expression(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	         MATCHT(SEMI, &FOLLOW_SEMI_in_statement_assign17567);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             ac= NEW_STMT2(OP(ASSIGN_MACRO), 
        	        	            lv
        	        	            , e
        	        	            );
        	        	             
        	        	        }


        	        	    }
        	        	    break;
        	        	case 4:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5069:4: ( PLUS_ASSIGN | PLUS_ASSIGN_AFTER ) e= expression SEMI
        	        	    {
        	        	        if ( ((LA(1) >= PLUS_ASSIGN) && (LA(1) <= PLUS_ASSIGN_AFTER)) )
        	        	        {
        	        	            CONSUME();
        	        	            PERRORRECOVERY=ANTLR3_FALSE;
        	        	            FAILEDFLAG=ANTLR3_FALSE;

        	        	        }
        	        	        else
        	        	        {
        	        	            if (BACKTRACKING>0)
        	        	            {
        	        	                FAILEDFLAG = ANTLR3_TRUE;
        	        	                return ac;
        	        	            }

        	        	            CONSTRUCTEX();
        	        	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
        	        	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
        	        	            EXCEPTION->expectingSet = NULL;

        	        	            goto rulestatement_assignEx;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_expression_in_statement_assign17590);
        	        	        e=expression(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	         MATCHT(SEMI, &FOLLOW_SEMI_in_statement_assign17593);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             ac= NEW_STMT_ASSIGN_OP(OP(PLUS), 
        	        	            lv
        	        	            , e
        	        	            );
        	        	             
        	        	        }


        	        	    }
        	        	    break;
        	        	case 5:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5072:4: ( MINUS_ASSIGN | MINUS_ASSIGN_AFTER ) e= expression SEMI
        	        	    {
        	        	        if ( ((LA(1) >= MINUS_ASSIGN) && (LA(1) <= MINUS_ASSIGN_AFTER)) )
        	        	        {
        	        	            CONSUME();
        	        	            PERRORRECOVERY=ANTLR3_FALSE;
        	        	            FAILEDFLAG=ANTLR3_FALSE;

        	        	        }
        	        	        else
        	        	        {
        	        	            if (BACKTRACKING>0)
        	        	            {
        	        	                FAILEDFLAG = ANTLR3_TRUE;
        	        	                return ac;
        	        	            }

        	        	            CONSTRUCTEX();
        	        	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
        	        	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
        	        	            EXCEPTION->expectingSet = NULL;

        	        	            goto rulestatement_assignEx;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_expression_in_statement_assign17615);
        	        	        e=expression(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	         MATCHT(SEMI, &FOLLOW_SEMI_in_statement_assign17618);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             ac= NEW_STMT_ASSIGN_OP(OP(MINUS), 
        	        	            lv
        	        	            , e
        	        	            );
        	        	             
        	        	        }


        	        	    }
        	        	    break;
        	        	case 6:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5075:4: ( STAR_ASSIGN | STAR_ASSIGN_AFTER ) e= expression SEMI
        	        	    {
        	        	        if ( ((LA(1) >= STAR_ASSIGN) && (LA(1) <= STAR_ASSIGN_AFTER)) )
        	        	        {
        	        	            CONSUME();
        	        	            PERRORRECOVERY=ANTLR3_FALSE;
        	        	            FAILEDFLAG=ANTLR3_FALSE;

        	        	        }
        	        	        else
        	        	        {
        	        	            if (BACKTRACKING>0)
        	        	            {
        	        	                FAILEDFLAG = ANTLR3_TRUE;
        	        	                return ac;
        	        	            }

        	        	            CONSTRUCTEX();
        	        	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
        	        	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
        	        	            EXCEPTION->expectingSet = NULL;

        	        	            goto rulestatement_assignEx;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_expression_in_statement_assign17640);
        	        	        e=expression(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	         MATCHT(SEMI, &FOLLOW_SEMI_in_statement_assign17643);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             ac= NEW_STMT_ASSIGN_OP(OP(MULT), 
        	        	            lv
        	        	            , e
        	        	            );
        	        	             
        	        	        }


        	        	    }
        	        	    break;
        	        	case 7:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5078:4: ( DIV_ASSIGN | DIV_ASSIGN_AFTER ) e= expression SEMI
        	        	    {
        	        	        if ( ((LA(1) >= DIV_ASSIGN) && (LA(1) <= DIV_ASSIGN_AFTER)) )
        	        	        {
        	        	            CONSUME();
        	        	            PERRORRECOVERY=ANTLR3_FALSE;
        	        	            FAILEDFLAG=ANTLR3_FALSE;

        	        	        }
        	        	        else
        	        	        {
        	        	            if (BACKTRACKING>0)
        	        	            {
        	        	                FAILEDFLAG = ANTLR3_TRUE;
        	        	                return ac;
        	        	            }

        	        	            CONSTRUCTEX();
        	        	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
        	        	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
        	        	            EXCEPTION->expectingSet = NULL;

        	        	            goto rulestatement_assignEx;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_expression_in_statement_assign17665);
        	        	        e=expression(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	         MATCHT(SEMI, &FOLLOW_SEMI_in_statement_assign17668);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             ac= NEW_STMT_ASSIGN_OP(OP(DIV), 
        	        	            lv
        	        	            , e
        	        	            );
        	        	             
        	        	        }


        	        	    }
        	        	    break;
        	        	case 8:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5081:4: ( MOD_ASSIGN | MOD_ASSIGN_AFTER ) e= expression SEMI
        	        	    {
        	        	        if ( ((LA(1) >= MOD_ASSIGN) && (LA(1) <= MOD_ASSIGN_AFTER)) )
        	        	        {
        	        	            CONSUME();
        	        	            PERRORRECOVERY=ANTLR3_FALSE;
        	        	            FAILEDFLAG=ANTLR3_FALSE;

        	        	        }
        	        	        else
        	        	        {
        	        	            if (BACKTRACKING>0)
        	        	            {
        	        	                FAILEDFLAG = ANTLR3_TRUE;
        	        	                return ac;
        	        	            }

        	        	            CONSTRUCTEX();
        	        	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
        	        	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
        	        	            EXCEPTION->expectingSet = NULL;

        	        	            goto rulestatement_assignEx;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_expression_in_statement_assign17690);
        	        	        e=expression(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	         MATCHT(SEMI, &FOLLOW_SEMI_in_statement_assign17693);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             ac= NEW_STMT_ASSIGN_OP(OP(MOD), 
        	        	            lv
        	        	            , e
        	        	            );
        	        	             
        	        	        }


        	        	    }
        	        	    break;
        	        	case 9:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5085:4: ( LAND_ASSIGN | LAND_ASSIGN_AFTER ) e= expression SEMI
        	        	    {
        	        	        if ( ((LA(1) >= LAND_ASSIGN) && (LA(1) <= LAND_ASSIGN_AFTER)) )
        	        	        {
        	        	            CONSUME();
        	        	            PERRORRECOVERY=ANTLR3_FALSE;
        	        	            FAILEDFLAG=ANTLR3_FALSE;

        	        	        }
        	        	        else
        	        	        {
        	        	            if (BACKTRACKING>0)
        	        	            {
        	        	                FAILEDFLAG = ANTLR3_TRUE;
        	        	                return ac;
        	        	            }

        	        	            CONSTRUCTEX();
        	        	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
        	        	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
        	        	            EXCEPTION->expectingSet = NULL;

        	        	            goto rulestatement_assignEx;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_expression_in_statement_assign17716);
        	        	        e=expression(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	         MATCHT(SEMI, &FOLLOW_SEMI_in_statement_assign17719);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             ac= NEW_STMT_ASSIGN_OP(OP(AND), 
        	        	            lv
        	        	            , e
        	        	            );
        	        	             
        	        	        }


        	        	    }
        	        	    break;
        	        	case 10:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5088:4: ( LOR_ASSIGN | LOR_ASSIGN_AFTER ) e= expression SEMI
        	        	    {
        	        	        if ( ((LA(1) >= LOR_ASSIGN) && (LA(1) <= LOR_ASSIGN_AFTER)) )
        	        	        {
        	        	            CONSUME();
        	        	            PERRORRECOVERY=ANTLR3_FALSE;
        	        	            FAILEDFLAG=ANTLR3_FALSE;

        	        	        }
        	        	        else
        	        	        {
        	        	            if (BACKTRACKING>0)
        	        	            {
        	        	                FAILEDFLAG = ANTLR3_TRUE;
        	        	                return ac;
        	        	            }

        	        	            CONSTRUCTEX();
        	        	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
        	        	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
        	        	            EXCEPTION->expectingSet = NULL;

        	        	            goto rulestatement_assignEx;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_expression_in_statement_assign17741);
        	        	        e=expression(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	         MATCHT(SEMI, &FOLLOW_SEMI_in_statement_assign17744);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             ac= NEW_STMT_ASSIGN_OP(OP(OR), 
        	        	            lv
        	        	            , e
        	        	            );
        	        	             
        	        	        }


        	        	    }
        	        	    break;
        	        	case 11:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5092:4: ( BAND_ASSIGN | BAND_ASSIGN_AFTER ) e= expression SEMI
        	        	    {
        	        	        if ( ((LA(1) >= BAND_ASSIGN) && (LA(1) <= BAND_ASSIGN_AFTER)) )
        	        	        {
        	        	            CONSUME();
        	        	            PERRORRECOVERY=ANTLR3_FALSE;
        	        	            FAILEDFLAG=ANTLR3_FALSE;

        	        	        }
        	        	        else
        	        	        {
        	        	            if (BACKTRACKING>0)
        	        	            {
        	        	                FAILEDFLAG = ANTLR3_TRUE;
        	        	                return ac;
        	        	            }

        	        	            CONSTRUCTEX();
        	        	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
        	        	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
        	        	            EXCEPTION->expectingSet = NULL;

        	        	            goto rulestatement_assignEx;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_expression_in_statement_assign17767);
        	        	        e=expression(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	         MATCHT(SEMI, &FOLLOW_SEMI_in_statement_assign17770);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             ac= NEW_STMT_ASSIGN_OP(OP(BAND), 
        	        	            lv
        	        	            , e
        	        	            );
        	        	             
        	        	        }


        	        	    }
        	        	    break;
        	        	case 12:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5095:4: ( BOR_ASSIGN | BOR_ASSIGN_AFTER ) e= expression SEMI
        	        	    {
        	        	        if ( ((LA(1) >= BOR_ASSIGN) && (LA(1) <= BOR_ASSIGN_AFTER)) )
        	        	        {
        	        	            CONSUME();
        	        	            PERRORRECOVERY=ANTLR3_FALSE;
        	        	            FAILEDFLAG=ANTLR3_FALSE;

        	        	        }
        	        	        else
        	        	        {
        	        	            if (BACKTRACKING>0)
        	        	            {
        	        	                FAILEDFLAG = ANTLR3_TRUE;
        	        	                return ac;
        	        	            }

        	        	            CONSTRUCTEX();
        	        	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
        	        	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
        	        	            EXCEPTION->expectingSet = NULL;

        	        	            goto rulestatement_assignEx;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_expression_in_statement_assign17792);
        	        	        e=expression(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	         MATCHT(SEMI, &FOLLOW_SEMI_in_statement_assign17795);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             ac= NEW_STMT_ASSIGN_OP(OP(BOR), 
        	        	            lv
        	        	            , e
        	        	            );
        	        	             
        	        	        }


        	        	    }
        	        	    break;
        	        	case 13:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5098:4: ( BXOR_ASSIGN | BXOR_ASSIGN_AFTER ) e= expression SEMI
        	        	    {
        	        	        if ( ((LA(1) >= BXOR_ASSIGN) && (LA(1) <= BXOR_ASSIGN_AFTER)) )
        	        	        {
        	        	            CONSUME();
        	        	            PERRORRECOVERY=ANTLR3_FALSE;
        	        	            FAILEDFLAG=ANTLR3_FALSE;

        	        	        }
        	        	        else
        	        	        {
        	        	            if (BACKTRACKING>0)
        	        	            {
        	        	                FAILEDFLAG = ANTLR3_TRUE;
        	        	                return ac;
        	        	            }

        	        	            CONSTRUCTEX();
        	        	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
        	        	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
        	        	            EXCEPTION->expectingSet = NULL;

        	        	            goto rulestatement_assignEx;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_expression_in_statement_assign17817);
        	        	        e=expression(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	         MATCHT(SEMI, &FOLLOW_SEMI_in_statement_assign17820);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             ac= NEW_STMT_ASSIGN_OP(OP(BXOR), 
        	        	            lv
        	        	            , e
        	        	            );
        	        	             
        	        	        }


        	        	    }
        	        	    break;
        	        	case 14:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5102:4: ( LSHIFT_ASSIGN | LSHIFT_ASSIGN_AFTER ) e= expression SEMI
        	        	    {
        	        	        if ( ((LA(1) >= LSHIFT_ASSIGN) && (LA(1) <= LSHIFT_ASSIGN_AFTER)) )
        	        	        {
        	        	            CONSUME();
        	        	            PERRORRECOVERY=ANTLR3_FALSE;
        	        	            FAILEDFLAG=ANTLR3_FALSE;

        	        	        }
        	        	        else
        	        	        {
        	        	            if (BACKTRACKING>0)
        	        	            {
        	        	                FAILEDFLAG = ANTLR3_TRUE;
        	        	                return ac;
        	        	            }

        	        	            CONSTRUCTEX();
        	        	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
        	        	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
        	        	            EXCEPTION->expectingSet = NULL;

        	        	            goto rulestatement_assignEx;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_expression_in_statement_assign17843);
        	        	        e=expression(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	         MATCHT(SEMI, &FOLLOW_SEMI_in_statement_assign17846);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             ac= NEW_STMT_ASSIGN_OP(OP(LSHIFT), 
        	        	            lv
        	        	            , e
        	        	            );
        	        	             
        	        	        }


        	        	    }
        	        	    break;
        	        	case 15:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5105:4: ( RSHIFT_ASSIGN | RSHIFT_ASSIGN_AFTER ) e= expression SEMI
        	        	    {
        	        	        if ( ((LA(1) >= RSHIFT_ASSIGN) && (LA(1) <= RSHIFT_ASSIGN_AFTER)) )
        	        	        {
        	        	            CONSUME();
        	        	            PERRORRECOVERY=ANTLR3_FALSE;
        	        	            FAILEDFLAG=ANTLR3_FALSE;

        	        	        }
        	        	        else
        	        	        {
        	        	            if (BACKTRACKING>0)
        	        	            {
        	        	                FAILEDFLAG = ANTLR3_TRUE;
        	        	                return ac;
        	        	            }

        	        	            CONSTRUCTEX();
        	        	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
        	        	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
        	        	            EXCEPTION->expectingSet = NULL;

        	        	            goto rulestatement_assignEx;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_expression_in_statement_assign17868);
        	        	        e=expression(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	         MATCHT(SEMI, &FOLLOW_SEMI_in_statement_assign17871);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             ac= NEW_STMT_ASSIGN_OP(OP(RSHIFT), 
        	        	            lv
        	        	            , e
        	        	            );
        	        	             
        	        	        }


        	        	    }
        	        	    break;
        	        	case 16:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5112:4: OP_PUSH e= expression ( OP_PUSH e= expression )* SEMI
        	        	    {
        	        	         MATCHT(OP_PUSH, &FOLLOW_OP_PUSH_in_statement_assign17887);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_expression_in_statement_assign17892);
        	        	        e=expression(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             ac= NEW_STMT2(OP(PUSH), 
        	        	            lv
        	        	            , e
        	        	            );
        	        	             
        	        	        }


        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5114:4: ( OP_PUSH e= expression )*

        	        	        for (;;)
        	        	        {
        	        	            int alt435=2;
        	        	            switch ( LA(1) )
        	        	            {
        	        	            case OP_PUSH:
        	        	            	{
        	        	            		alt435=1;
        	        	            	}
        	        	                break;

        	        	            }

        	        	            switch (alt435)
        	        	            {
        	        	        	case 1:
        	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5114:6: OP_PUSH e= expression
        	        	        	    {
        	        	        	         MATCHT(OP_PUSH, &FOLLOW_OP_PUSH_in_statement_assign17902);
        	        	        	        if  (HASEXCEPTION())
        	        	        	        {
        	        	        	            goto rulestatement_assignEx;
        	        	        	        }
        	        	        	        if (HASFAILED())
        	        	        	        {
        	        	        	            return ac;
        	        	        	        }


        	        	        	        FOLLOWPUSH(FOLLOW_expression_in_statement_assign17907);
        	        	        	        e=expression(ctx);

        	        	        	        FOLLOWPOP();
        	        	        	        if  (HASEXCEPTION())
        	        	        	        {
        	        	        	            goto rulestatement_assignEx;
        	        	        	        }
        	        	        	        if (HASFAILED())
        	        	        	        {
        	        	        	            return ac;
        	        	        	        }


        	        	        	        if ( BACKTRACKING==0 )
        	        	        	        {
        	        	        	             ac
        	        	        	            ->append(e
        	        	        	            ); 
        	        	        	        }


        	        	        	    }
        	        	        	    break;

        	        	        	default:
        	        	        	    goto loop435;	/* break out of the loop */
        	        	        	    break;
        	        	            }
        	        	        }
        	        	        loop435: ; /* Jump out to here if this rule does not match */


        	        	         MATCHT(SEMI, &FOLLOW_SEMI_in_statement_assign17918);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	    }
        	        	    break;
        	        	case 17:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5120:4: OP_ASSIGN_TOP e= expression SEMI
        	        	    {
        	        	         MATCHT(OP_ASSIGN_TOP, &FOLLOW_OP_ASSIGN_TOP_in_statement_assign17930);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_expression_in_statement_assign17935);
        	        	        e=expression(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	         MATCHT(SEMI, &FOLLOW_SEMI_in_statement_assign17938);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             ac= NEW_STMT2(OP(ASSIGN_TOP), 
        	        	            lv
        	        	            , e
        	        	            );
        	        	             
        	        	        }


        	        	    }
        	        	    break;
        	        	case 18:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5126:4: OP_TOP v= lvalue SEMI
        	        	    {
        	        	         MATCHT(OP_TOP, &FOLLOW_OP_TOP_in_statement_assign17953);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_lvalue_in_statement_assign17958);
        	        	        v=lvalue(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	         MATCHT(SEMI, &FOLLOW_SEMI_in_statement_assign17961);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             ac= NEW_STMT2(OP(TOP), 
        	        	            lv
        	        	            , v
        	        	            );
        	        	             
        	        	        }


        	        	    }
        	        	    break;
        	        	case 19:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5132:4: OP_POP (v= lvalue )* SEMI
        	        	    {
        	        	         MATCHT(OP_POP, &FOLLOW_OP_POP_in_statement_assign17976);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             ac= NEW_STMT1(OP(POP), 
        	        	            lv
        	        	            );
        	        	             
        	        	        }


        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5133:4: (v= lvalue )*

        	        	        for (;;)
        	        	        {
        	        	            int alt436=2;
        	        	            switch ( LA(1) )
        	        	            {
        	        	            case COLONx2:
        	        	            case ID:
        	        	            	{
        	        	            		alt436=1;
        	        	            	}
        	        	                break;

        	        	            }

        	        	            switch (alt436)
        	        	            {
        	        	        	case 1:
        	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5133:6: v= lvalue
        	        	        	    {
        	        	        	        FOLLOWPUSH(FOLLOW_lvalue_in_statement_assign17992);
        	        	        	        v=lvalue(ctx);

        	        	        	        FOLLOWPOP();
        	        	        	        if  (HASEXCEPTION())
        	        	        	        {
        	        	        	            goto rulestatement_assignEx;
        	        	        	        }
        	        	        	        if (HASFAILED())
        	        	        	        {
        	        	        	            return ac;
        	        	        	        }


        	        	        	        if ( BACKTRACKING==0 )
        	        	        	        {
        	        	        	             ac
        	        	        	            ->append(v
        	        	        	            ); 
        	        	        	        }


        	        	        	    }
        	        	        	    break;

        	        	        	default:
        	        	        	    goto loop436;	/* break out of the loop */
        	        	        	    break;
        	        	            }
        	        	        }
        	        	        loop436: ; /* Jump out to here if this rule does not match */


        	        	         MATCHT(SEMI, &FOLLOW_SEMI_in_statement_assign18003);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	    }
        	        	    break;
        	        	case 20:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5137:4: INCR SEMI
        	        	    {
        	        	         MATCHT(INCR, &FOLLOW_INCR_in_statement_assign18011);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	         MATCHT(SEMI, &FOLLOW_SEMI_in_statement_assign18014);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             ac= NEW_STMT_ASSIGN_OP(OP(PLUS), 
        	        	            lv
        	        	            ,
        	        	            		sep::ExpressionConstant::INTEGER_ONE);
        	        	             
        	        	        }


        	        	    }
        	        	    break;
        	        	case 21:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5142:4: DECR SEMI
        	        	    {
        	        	         MATCHT(DECR, &FOLLOW_DECR_in_statement_assign18025);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	         MATCHT(SEMI, &FOLLOW_SEMI_in_statement_assign18028);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_assignEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             ac= NEW_STMT_ASSIGN_OP(OP(PLUS), 
        	        	            lv
        	        	            ,
        	        	            		sep::ExpressionConstant::INTEGER_MINUS_ONE);
        	        	             
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5154:4: INCR lv= lvalue SEMI
        	    {
        	         MATCHT(INCR, &FOLLOW_INCR_in_statement_assign18048);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_assignEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        FOLLOWPUSH(FOLLOW_lvalue_in_statement_assign18053);
        	        lv=lvalue(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_assignEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	         MATCHT(SEMI, &FOLLOW_SEMI_in_statement_assign18056);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_assignEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= NEW_STMT_ASSIGN_OP(OP(PLUS), 
        	            lv
        	            ,
        	            		sep::ExpressionConstant::INTEGER_ONE);
        	             
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5159:4: DECR lv= lvalue SEMI
        	    {
        	         MATCHT(DECR, &FOLLOW_DECR_in_statement_assign18067);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_assignEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        FOLLOWPUSH(FOLLOW_lvalue_in_statement_assign18072);
        	        lv=lvalue(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_assignEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	         MATCHT(SEMI, &FOLLOW_SEMI_in_statement_assign18075);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_assignEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= NEW_STMT_ASSIGN_OP(OP(PLUS), 
        	            lv
        	            ,
        	            		sep::ExpressionConstant::INTEGER_MINUS_ONE);
        	             
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto rulestatement_assignEx; /* Prevent compiler warnings */
    rulestatement_assignEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(189, statement_assign_StartIndex); }

    return ac;
}
/* $ANTLR end statement_assign */

/**
 * $ANTLR start lvalue
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5165:1: lvalue returns [ sep::BF bf ] : ( COLONx2 )? id= ID ( ( DOT id= ID ) | ( LBRACKET e= expression RBRACKET ) )* ;
 */
static sep::BF
lvalue(pfmlParser ctx)
{
    sep::BF bf;

    ANTLR3_UINT32 lvalue_StartIndex;

    pANTLR3_COMMON_TOKEN    id;
    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    /* Initialize rule variables
     */
    lvalue_StartIndex = INDEX();



    	sep::UniFormIdentifier * ufi;
    	sep::BF bfUfi; // for automatic destruction of << UFI >> if need

    	sep::avm_size_t countID = 1;
    	bool isnotEXPR = true;

    	SAVE_RULE_BEGIN_LOCATION;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(190)) )
    {
        {
        }



        return bf;
    }

    id       = NULL;

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5176:2: ( ( COLONx2 )? id= ID ( ( DOT id= ID ) | ( LBRACKET e= expression RBRACKET ) )* )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5176:4: ( COLONx2 )? id= ID ( ( DOT id= ID ) | ( LBRACKET e= expression RBRACKET ) )*
        {
            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5176:4: ( COLONx2 )?
            {
                int alt439=2;
                switch ( LA(1) )
                {
                    case COLONx2:
                    	{
                    		alt439=1;
                    	}
                        break;
                }

                switch (alt439)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5176:6: COLONx2
            	    {
            	         MATCHT(COLONx2, &FOLLOW_COLONx2_in_lvalue18100);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulelvalueEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             ufi->setAbsolute(); 
            	        }


            	    }
            	    break;

                }
            }

            id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_lvalue18112);
            if  (HASEXCEPTION())
            {
                goto rulelvalueEx;
            }
            if (HASFAILED())
            {
                return bf;
            }


            if ( BACKTRACKING==0 )
            {

                	  	ufi = new sep::UniFormIdentifier(false);
                	  	bfUfi = ufi;

                		if( (bf= sep::ParserUtil::getvar(STR((id->getText(id))->chars), 1)).valid() )
                		{
                		  	ufi->appendFieldVariable(
                bf
                );

                		}
                		else if( (bf= sep::ParserUtil::getvarMachine(
                				STR((id->getText(id))->chars), 1)).valid() )
                		{
                		  	ufi->appendFieldMachine(
                bf
                );

                		}
                		else
                		{
                		  	ufi->appendField(STR((id->getText(id))->chars));
                		}

                		
                bf= bfUfi;

                	  
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5199:4: ( ( DOT id= ID ) | ( LBRACKET e= expression RBRACKET ) )*

            for (;;)
            {
                int alt440=3;
                switch ( LA(1) )
                {
                case DOT:
                	{
                		alt440=1;
                	}
                    break;
                case LBRACKET:
                	{
                		alt440=2;
                	}
                    break;

                }

                switch (alt440)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5199:6: ( DOT id= ID )
            	    {
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5199:6: ( DOT id= ID )
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5199:8: DOT id= ID
            	        {
            	             MATCHT(DOT, &FOLLOW_DOT_in_lvalue18127);
            	            if  (HASEXCEPTION())
            	            {
            	                goto rulelvalueEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return bf;
            	            }


            	            id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_lvalue18131);
            	            if  (HASEXCEPTION())
            	            {
            	                goto rulelvalueEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return bf;
            	            }


            	            if ( BACKTRACKING==0 )
            	            {
            	                 ufi->appendField(STR((id->getText(id))->chars));  ++countID; 
            	            }


            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5202:6: ( LBRACKET e= expression RBRACKET )
            	    {
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5202:6: ( LBRACKET e= expression RBRACKET )
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5202:8: LBRACKET e= expression RBRACKET
            	        {
            	             MATCHT(LBRACKET, &FOLLOW_LBRACKET_in_lvalue18150);
            	            if  (HASEXCEPTION())
            	            {
            	                goto rulelvalueEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return bf;
            	            }


            	            FOLLOWPUSH(FOLLOW_expression_in_lvalue18155);
            	            e=expression(ctx);

            	            FOLLOWPOP();
            	            if  (HASEXCEPTION())
            	            {
            	                goto rulelvalueEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return bf;
            	            }


            	             MATCHT(RBRACKET, &FOLLOW_RBRACKET_in_lvalue18158);
            	            if  (HASEXCEPTION())
            	            {
            	                goto rulelvalueEx;
            	            }
            	            if (HASFAILED())
            	            {
            	                return bf;
            	            }


            	            if ( BACKTRACKING==0 )
            	            {
            	                 ufi->appendIndex(e
            	                ); isnotEXPR = false; 
            	            }


            	        }


            	    }
            	    break;

            	default:
            	    goto loop440;	/* break out of the loop */
            	    break;
                }
            }
            loop440: ; /* Jump out to here if this rule does not match */


            if ( BACKTRACKING==0 )
            {

                		if( isnotEXPR )
                		{
                			if( countID == 1 )
                			{
                				bf= ufi->first();

                			}
                			else if( (bf= sep::ParserUtil::getvar(
                					ufi->str(), countID)).invalid() )
                			{
                				
                bf
                 = bfUfi;

                				SET_RULE_LOCATION(ufi);
                			}
                		}
                	
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto rulelvalueEx; /* Prevent compiler warnings */
    rulelvalueEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(190, lvalue_StartIndex); }

    return bf;
}
/* $ANTLR end lvalue */

/**
 * $ANTLR start parameters
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5272:1: parameters[ const sep::BFCode & ac ] : LPAREN e= expression ( COMMA e= expression )* RPAREN ;
 */
static void
parameters(pfmlParser ctx, const sep::BFCode & ac)
{
    ANTLR3_UINT32 parameters_StartIndex;

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    /* Initialize rule variables
     */
    parameters_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(191)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5273:2: ( LPAREN e= expression ( COMMA e= expression )* RPAREN )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5273:4: LPAREN e= expression ( COMMA e= expression )* RPAREN
        {
             MATCHT(LPAREN, &FOLLOW_LPAREN_in_parameters18239);
            if  (HASEXCEPTION())
            {
                goto ruleparametersEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            FOLLOWPUSH(FOLLOW_expression_in_parameters18244);
            e=expression(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruleparametersEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            if ( BACKTRACKING==0 )
            {
                 ac->append(
                e
                ); 
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5274:4: ( COMMA e= expression )*

            for (;;)
            {
                int alt441=2;
                switch ( LA(1) )
                {
                case COMMA:
                	{
                		alt441=1;
                	}
                    break;

                }

                switch (alt441)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5274:6: COMMA e= expression
            	    {
            	         MATCHT(COMMA, &FOLLOW_COMMA_in_parameters18254);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleparametersEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_parameters18258);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleparametersEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             ac->append(
            	            e
            	            ); 
            	        }


            	    }
            	    break;

            	default:
            	    goto loop441;	/* break out of the loop */
            	    break;
                }
            }
            loop441: ; /* Jump out to here if this rule does not match */


             MATCHT(RPAREN, &FOLLOW_RPAREN_in_parameters18270);
            if  (HASEXCEPTION())
            {
                goto ruleparametersEx;
            }
            if (HASFAILED())
            {
                return ;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruleparametersEx; /* Prevent compiler warnings */
    ruleparametersEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(191, parameters_StartIndex); }

    return ;
}
/* $ANTLR end parameters */

/**
 * $ANTLR start statement_com
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5283:1: statement_com returns [ sep::BFCode ac ] : (s= statement_com_input |s= statement_com_output );
 */
static sep::BFCode
statement_com(pfmlParser ctx)
{
    sep::BFCode ac;

    ANTLR3_UINT32 statement_com_StartIndex;

    sep::BFCode s;
    #undef	RETURN_TYPE_s
    #define	RETURN_TYPE_s sep::BFCode

    /* Initialize rule variables
     */
    statement_com_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(192)) )
    {
        {
        }



        return ac;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5285:2: (s= statement_com_input |s= statement_com_output )

            ANTLR3_UINT32 alt442;

            alt442=2;

            switch ( LA(1) )
            {
            case 299:
            case 300:
            case 301:
            case 302:
            case 303:
            case 304:
            case 305:
            	{
            		alt442=1;
            	}
                break;
            case 336:
            case 337:
            case 338:
            case 339:
            case 340:
            case 341:
            	{
            		alt442=2;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ac;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 442;
                EXCEPTION->state        = 0;


                goto rulestatement_comEx;

            }

            switch (alt442)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5285:4: s= statement_com_input
        	    {
        	        FOLLOWPUSH(FOLLOW_statement_com_input_in_statement_com18292);
        	        s=statement_com_input(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_comEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= 
        	            s
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5286:4: s= statement_com_output
        	    {
        	        FOLLOWPUSH(FOLLOW_statement_com_output_in_statement_com18303);
        	        s=statement_com_output(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_comEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= 
        	            s
        	            ;
        	             
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto rulestatement_comEx; /* Prevent compiler warnings */
    rulestatement_comEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(192, statement_com_StartIndex); }

    return ac;
}
/* $ANTLR end statement_com */

/**
 * $ANTLR start statement_com_input
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5289:1: statement_com_input returns [ sep::BFCode ac ] : (tok= 'input' |tok= 'input#save' |tok= 'input#var' |tok= 'input#flow' |tok= 'input#env' |tok= 'input#buffer' |tok= 'input#rdv' ) id= qualifiedNameID ( parameters_port[ port , ac ] )? ( '<--' ( 'env' |me= expression ) ( '<-' id= qualifiedNameID )? )? ( ( '<==' | 'via' ) id= qualifiedNameID )? SEMI ;
 */
static sep::BFCode
statement_com_input(pfmlParser ctx)
{
    sep::BFCode ac;

    ANTLR3_UINT32 statement_com_input_StartIndex;

    pANTLR3_COMMON_TOKEN    tok;
    fmlParser_qualifiedNameID_return id;
    #undef	RETURN_TYPE_id
    #define	RETURN_TYPE_id fmlParser_qualifiedNameID_return

    sep::BF me;
    #undef	RETURN_TYPE_me
    #define	RETURN_TYPE_me sep::BF

    /* Initialize rule variables
     */
    statement_com_input_StartIndex = INDEX();



    	sep::BF varPortSignal;
    	sep::Port * port = NULL;
    	sep::Operator * op = NULL;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(193)) )
    {
        {
        }



        return ac;
    }

    tok       = NULL;

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5296:2: ( (tok= 'input' |tok= 'input#save' |tok= 'input#var' |tok= 'input#flow' |tok= 'input#env' |tok= 'input#buffer' |tok= 'input#rdv' ) id= qualifiedNameID ( parameters_port[ port , ac ] )? ( '<--' ( 'env' |me= expression ) ( '<-' id= qualifiedNameID )? )? ( ( '<==' | 'via' ) id= qualifiedNameID )? SEMI )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5296:4: (tok= 'input' |tok= 'input#save' |tok= 'input#var' |tok= 'input#flow' |tok= 'input#env' |tok= 'input#buffer' |tok= 'input#rdv' ) id= qualifiedNameID ( parameters_port[ port , ac ] )? ( '<--' ( 'env' |me= expression ) ( '<-' id= qualifiedNameID )? )? ( ( '<==' | 'via' ) id= qualifiedNameID )? SEMI
        {
            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5296:4: (tok= 'input' |tok= 'input#save' |tok= 'input#var' |tok= 'input#flow' |tok= 'input#env' |tok= 'input#buffer' |tok= 'input#rdv' )
            {
                int alt443=7;
                switch ( LA(1) )
                {
                case 305:
                	{
                		alt443=1;
                	}
                    break;
                case 303:
                	{
                		alt443=2;
                	}
                    break;
                case 304:
                	{
                		alt443=3;
                	}
                    break;
                case 301:
                	{
                		alt443=4;
                	}
                    break;
                case 300:
                	{
                		alt443=5;
                	}
                    break;
                case 299:
                	{
                		alt443=6;
                	}
                    break;
                case 302:
                	{
                		alt443=7;
                	}
                    break;

                default:
                    if (BACKTRACKING>0)
                    {
                        FAILEDFLAG = ANTLR3_TRUE;
                        return ac;
                    }

                    CONSTRUCTEX();
                    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                    EXCEPTION->message      = (void *)"";
                    EXCEPTION->decisionNum  = 443;
                    EXCEPTION->state        = 0;


                    goto rulestatement_com_inputEx;

                }

                switch (alt443)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5296:6: tok= 'input'
            	    {
            	        tok = (pANTLR3_COMMON_TOKEN) MATCHT(305, &FOLLOW_305_in_statement_com_input18329);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_com_inputEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             op = OP(INPUT);        
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5297:6: tok= 'input#save'
            	    {
            	        tok = (pANTLR3_COMMON_TOKEN) MATCHT(303, &FOLLOW_303_in_statement_com_input18347);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_com_inputEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             op = OP(INPUT_SAVE);   
            	        }


            	    }
            	    break;
            	case 3:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5298:6: tok= 'input#var'
            	    {
            	        tok = (pANTLR3_COMMON_TOKEN) MATCHT(304, &FOLLOW_304_in_statement_com_input18360);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_com_inputEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             op = OP(INPUT_VAR);    
            	        }


            	    }
            	    break;
            	case 4:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5299:6: tok= 'input#flow'
            	    {
            	        tok = (pANTLR3_COMMON_TOKEN) MATCHT(301, &FOLLOW_301_in_statement_com_input18374);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_com_inputEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             op = OP(INPUT_FLOW);   
            	        }


            	    }
            	    break;
            	case 5:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5300:6: tok= 'input#env'
            	    {
            	        tok = (pANTLR3_COMMON_TOKEN) MATCHT(300, &FOLLOW_300_in_statement_com_input18387);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_com_inputEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             op = OP(INPUT_ENV);    
            	        }


            	    }
            	    break;
            	case 6:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5301:6: tok= 'input#buffer'
            	    {
            	        tok = (pANTLR3_COMMON_TOKEN) MATCHT(299, &FOLLOW_299_in_statement_com_input18401);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_com_inputEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             op = OP(INPUT_BUFFER); 
            	        }


            	    }
            	    break;
            	case 7:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5302:6: tok= 'input#rdv'
            	    {
            	        tok = (pANTLR3_COMMON_TOKEN) MATCHT(302, &FOLLOW_302_in_statement_com_input18412);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_com_inputEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             op = OP(INPUT_RDV);    
            	        }


            	    }
            	    break;

                }
            }

            FOLLOWPUSH(FOLLOW_qualifiedNameID_in_statement_com_input18426);
            id=qualifiedNameID(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto rulestatement_com_inputEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            if ( BACKTRACKING==0 )
            {

                	  	ac= NEW_STMT1( op,
                	  		varPortSignal = sep::ParserUtil::getvarPortSignal(
                id.s
                , id.nb
                ) );

                	  	if( varPortSignal.is< sep::Port >() )
                	  	{ port = varPortSignal.to_ptr< sep::Port >(); }
                	  	else if( varPortSignal.invalid() )
                	  	{
                	  		sep::ParserUtil::avm_syntax_error(
                	  			"statement_com_input:> ", (tok->getLine(tok)) )
                	  				<< "Unfound port/signal or variable < " << 
                id.s

                	  				<< " > in machine < " << str_header( _CPM_ ) << " >"
                	  				<< sep::ParserUtil::SYNTAX_ERROR_EOL;
                	  	}
                	  
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5318:4: ( parameters_port[ port , ac ] )?
            {
                int alt444=2;
                switch ( LA(1) )
                {
                    case LPAREN:
                    	{
                    		alt444=1;
                    	}
                        break;
                }

                switch (alt444)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5318:4: parameters_port[ port , ac ]
            	    {
            	        FOLLOWPUSH(FOLLOW_parameters_port_in_statement_com_input18436);
            	        parameters_port(ctx, port, ac);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_com_inputEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5319:4: ( '<--' ( 'env' |me= expression ) ( '<-' id= qualifiedNameID )? )?
            {
                int alt447=2;
                switch ( LA(1) )
                {
                    case 165:
                    	{
                    		alt447=1;
                    	}
                        break;
                }

                switch (alt447)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5319:6: '<--' ( 'env' |me= expression ) ( '<-' id= qualifiedNameID )?
            	    {
            	         MATCHT(165, &FOLLOW_165_in_statement_com_input18446);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_com_inputEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5320:6: ( 'env' |me= expression )
            	        {
            	            int alt445=2;
            	            switch ( LA(1) )
            	            {
            	            case 277:
            	            	{
            	            		{
            	            		    int LA445_1 = LA(2);
            	            		    if ( (synpred861_fml(ctx)))
            	            		    {
            	            		        alt445=1;
            	            		    }
            	            		    else if ( (ANTLR3_TRUE))
            	            		    {
            	            		        alt445=2;
            	            		    }
            	            		    else
            	            		    {
            	            		        if (BACKTRACKING>0)
            	            		        {
            	            		            FAILEDFLAG = ANTLR3_TRUE;
            	            		            return ac;
            	            		        }


            	            		        CONSTRUCTEX();
            	            		        EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
            	            		        EXCEPTION->message      = (void *)"";
            	            		        EXCEPTION->decisionNum  = 445;
            	            		        EXCEPTION->state        = 1;


            	            		        goto rulestatement_com_inputEx;

            	            		    }
            	            		}
            	            	}
            	                break;
            	            case BNOT:
            	            case COLONx2:
            	            case CharLiteral:
            	            case DECR:
            	            case DOLLAR_LCURLY:
            	            case FloatLiteral:
            	            case ID:
            	            case INCR:
            	            case IntegerLiteral:
            	            case LBRACKET:
            	            case LBRACKET_BAR:
            	            case LCURLY:
            	            case LNOT:
            	            case LPAREN:
            	            case LPAREN_INVOKE:
            	            case MINUS:
            	            case OP_POP:
            	            case OP_TOP:
            	            case PERCENT_LCURLY:
            	            case PLUS:
            	            case RationalLiteral:
            	            case StringLiteral:
            	            case 158:
            	            case 159:
            	            case 160:
            	            case 161:
            	            case 162:
            	            case 237:
            	            case 256:
            	            case 265:
            	            case 280:
            	            case 294:
            	            case 313:
            	            case 330:
            	            case 331:
            	            case 332:
            	            case 343:
            	            case 347:
            	            case 372:
            	            case 397:
            	            	{
            	            		alt445=2;
            	            	}
            	                break;

            	            default:
            	                if (BACKTRACKING>0)
            	                {
            	                    FAILEDFLAG = ANTLR3_TRUE;
            	                    return ac;
            	                }

            	                CONSTRUCTEX();
            	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
            	                EXCEPTION->message      = (void *)"";
            	                EXCEPTION->decisionNum  = 445;
            	                EXCEPTION->state        = 0;


            	                goto rulestatement_com_inputEx;

            	            }

            	            switch (alt445)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5320:8: 'env'
            	        	    {
            	        	         MATCHT(277, &FOLLOW_277_in_statement_com_input18455);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto rulestatement_com_inputEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ac;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             ac
            	        	            ->setOperator( OP(INPUT_ENV) ); 
            	        	        }


            	        	    }
            	        	    break;
            	        	case 2:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5321:8: me= expression
            	        	    {
            	        	        FOLLOWPUSH(FOLLOW_expression_in_statement_com_input18469);
            	        	        me=expression(ctx);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto rulestatement_com_inputEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ac;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {

            	        	            			sep::BFCode inputFrom = NEW_STMT2(OP(INPUT_FROM), ac
            	        	            ->first(), me
            	        	            );

            	        	            			inputFrom->insert(inputFrom->end(), ++(ac
            	        	            ->begin()), ac
            	        	            ->end());
            	        	            			ac= inputFrom;

            	        	            		
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5329:6: ( '<-' id= qualifiedNameID )?
            	        {
            	            int alt446=2;
            	            switch ( LA(1) )
            	            {
            	                case ASSIGN_REF:
            	                	{
            	                		alt446=1;
            	                	}
            	                    break;
            	            }

            	            switch (alt446)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5329:8: '<-' id= qualifiedNameID
            	        	    {
            	        	         MATCHT(ASSIGN_REF, &FOLLOW_ASSIGN_REF_in_statement_com_input18489);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto rulestatement_com_inputEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ac;
            	        	        }


            	        	        FOLLOWPUSH(FOLLOW_qualifiedNameID_in_statement_com_input18493);
            	        	        id=qualifiedNameID(ctx);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto rulestatement_com_inputEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ac;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             ac
            	        	            ->append(sep::ParserUtil::getvarPortSignal(id.s
            	        	            , id.nb
            	        	            )); 
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5333:4: ( ( '<==' | 'via' ) id= qualifiedNameID )?
            {
                int alt448=2;
                switch ( LA(1) )
                {
                    case 167:
                    case 413:
                    	{
                    		alt448=1;
                    	}
                        break;
                }

                switch (alt448)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5333:6: ( '<==' | 'via' ) id= qualifiedNameID
            	    {
            	        if ( LA(1) == 167 || LA(1) == 413 )
            	        {
            	            CONSUME();
            	            PERRORRECOVERY=ANTLR3_FALSE;
            	            FAILEDFLAG=ANTLR3_FALSE;

            	        }
            	        else
            	        {
            	            if (BACKTRACKING>0)
            	            {
            	                FAILEDFLAG = ANTLR3_TRUE;
            	                return ac;
            	            }

            	            CONSTRUCTEX();
            	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
            	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
            	            EXCEPTION->expectingSet = NULL;

            	            goto rulestatement_com_inputEx;
            	        }


            	        FOLLOWPUSH(FOLLOW_qualifiedNameID_in_statement_com_input18533);
            	        id=qualifiedNameID(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_com_inputEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             sep::ParserUtil::updateSignalRoutingChannel(
            	            	  		sep::Modifier::DIRECTION_INPUT_KIND, ac
            	            , id.s
            	            , id.nb
            	            ); 
            	        }


            	    }
            	    break;

                }
            }

             MATCHT(SEMI, &FOLLOW_SEMI_in_statement_com_input18549);
            if  (HASEXCEPTION())
            {
                goto rulestatement_com_inputEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto rulestatement_com_inputEx; /* Prevent compiler warnings */
    rulestatement_com_inputEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(193, statement_com_input_StartIndex); }

    return ac;
}
/* $ANTLR end statement_com_input */

/**
 * $ANTLR start statement_com_output
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5340:1: statement_com_output returns [ sep::BFCode ac ] : (tok= 'output' |tok= 'output#var' |tok= 'output#flow' |tok= 'output#env' |tok= 'output#buffer' |tok= 'output#rdv' ) id= qualifiedNameID ( parameters_port[ port , ac ] )? ( '-->' ( 'env' |me= expression ) ( '->' id= qualifiedNameID )? )? ( ( '==>' | 'via' ) id= qualifiedNameID )? SEMI ;
 */
static sep::BFCode
statement_com_output(pfmlParser ctx)
{
    sep::BFCode ac;

    ANTLR3_UINT32 statement_com_output_StartIndex;

    pANTLR3_COMMON_TOKEN    tok;
    fmlParser_qualifiedNameID_return id;
    #undef	RETURN_TYPE_id
    #define	RETURN_TYPE_id fmlParser_qualifiedNameID_return

    sep::BF me;
    #undef	RETURN_TYPE_me
    #define	RETURN_TYPE_me sep::BF

    /* Initialize rule variables
     */
    statement_com_output_StartIndex = INDEX();



    	sep::BF varPortSignal;
    	sep::Port * port = NULL;
    	sep::Operator * op = NULL;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(194)) )
    {
        {
        }



        return ac;
    }

    tok       = NULL;

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5347:2: ( (tok= 'output' |tok= 'output#var' |tok= 'output#flow' |tok= 'output#env' |tok= 'output#buffer' |tok= 'output#rdv' ) id= qualifiedNameID ( parameters_port[ port , ac ] )? ( '-->' ( 'env' |me= expression ) ( '->' id= qualifiedNameID )? )? ( ( '==>' | 'via' ) id= qualifiedNameID )? SEMI )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5347:4: (tok= 'output' |tok= 'output#var' |tok= 'output#flow' |tok= 'output#env' |tok= 'output#buffer' |tok= 'output#rdv' ) id= qualifiedNameID ( parameters_port[ port , ac ] )? ( '-->' ( 'env' |me= expression ) ( '->' id= qualifiedNameID )? )? ( ( '==>' | 'via' ) id= qualifiedNameID )? SEMI
        {
            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5347:4: (tok= 'output' |tok= 'output#var' |tok= 'output#flow' |tok= 'output#env' |tok= 'output#buffer' |tok= 'output#rdv' )
            {
                int alt449=6;
                switch ( LA(1) )
                {
                case 341:
                	{
                		alt449=1;
                	}
                    break;
                case 340:
                	{
                		alt449=2;
                	}
                    break;
                case 338:
                	{
                		alt449=3;
                	}
                    break;
                case 337:
                	{
                		alt449=4;
                	}
                    break;
                case 336:
                	{
                		alt449=5;
                	}
                    break;
                case 339:
                	{
                		alt449=6;
                	}
                    break;

                default:
                    if (BACKTRACKING>0)
                    {
                        FAILEDFLAG = ANTLR3_TRUE;
                        return ac;
                    }

                    CONSTRUCTEX();
                    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                    EXCEPTION->message      = (void *)"";
                    EXCEPTION->decisionNum  = 449;
                    EXCEPTION->state        = 0;


                    goto rulestatement_com_outputEx;

                }

                switch (alt449)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5347:6: tok= 'output'
            	    {
            	        tok = (pANTLR3_COMMON_TOKEN) MATCHT(341, &FOLLOW_341_in_statement_com_output18572);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_com_outputEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             op = OP(OUTPUT);        
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5348:6: tok= 'output#var'
            	    {
            	        tok = (pANTLR3_COMMON_TOKEN) MATCHT(340, &FOLLOW_340_in_statement_com_output18590);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_com_outputEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             op = OP(OUTPUT_VAR);    
            	        }


            	    }
            	    break;
            	case 3:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5349:6: tok= 'output#flow'
            	    {
            	        tok = (pANTLR3_COMMON_TOKEN) MATCHT(338, &FOLLOW_338_in_statement_com_output18604);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_com_outputEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             op = OP(OUTPUT_FLOW);   
            	        }


            	    }
            	    break;
            	case 4:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5350:6: tok= 'output#env'
            	    {
            	        tok = (pANTLR3_COMMON_TOKEN) MATCHT(337, &FOLLOW_337_in_statement_com_output18617);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_com_outputEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             op = OP(OUTPUT_ENV);    
            	        }


            	    }
            	    break;
            	case 5:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5351:6: tok= 'output#buffer'
            	    {
            	        tok = (pANTLR3_COMMON_TOKEN) MATCHT(336, &FOLLOW_336_in_statement_com_output18631);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_com_outputEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             op = OP(OUTPUT_BUFFER); 
            	        }


            	    }
            	    break;
            	case 6:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5352:6: tok= 'output#rdv'
            	    {
            	        tok = (pANTLR3_COMMON_TOKEN) MATCHT(339, &FOLLOW_339_in_statement_com_output18642);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_com_outputEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             op = OP(OUTPUT_RDV);    
            	        }


            	    }
            	    break;

                }
            }

            FOLLOWPUSH(FOLLOW_qualifiedNameID_in_statement_com_output18656);
            id=qualifiedNameID(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto rulestatement_com_outputEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            if ( BACKTRACKING==0 )
            {

                	  	ac= NEW_STMT1( op,
                	  		varPortSignal = sep::ParserUtil::getvarPortSignal(
                id.s
                , id.nb
                ) );

                	  	if( varPortSignal.is< sep::Port >() )
                	  	{ port = varPortSignal.to_ptr< sep::Port >(); }
                	  	else if( varPortSignal.invalid() )
                	  	{
                	  		sep::ParserUtil::avm_syntax_error(
                	  			"statement_com_output:>", (tok->getLine(tok)) )
                	  				<< "Unfound port/signal or variable < " << 
                id.s

                	  				<< " > in machine < " << str_header( _CPM_ ) << " >"
                	  				<< sep::ParserUtil::SYNTAX_ERROR_EOL;
                	  	}
                	  
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5368:4: ( parameters_port[ port , ac ] )?
            {
                int alt450=2;
                switch ( LA(1) )
                {
                    case LPAREN:
                    	{
                    		alt450=1;
                    	}
                        break;
                }

                switch (alt450)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5368:4: parameters_port[ port , ac ]
            	    {
            	        FOLLOWPUSH(FOLLOW_parameters_port_in_statement_com_output18666);
            	        parameters_port(ctx, port, ac);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_com_outputEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5369:4: ( '-->' ( 'env' |me= expression ) ( '->' id= qualifiedNameID )? )?
            {
                int alt453=2;
                switch ( LA(1) )
                {
                    case 163:
                    	{
                    		alt453=1;
                    	}
                        break;
                }

                switch (alt453)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5369:6: '-->' ( 'env' |me= expression ) ( '->' id= qualifiedNameID )?
            	    {
            	         MATCHT(163, &FOLLOW_163_in_statement_com_output18676);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_com_outputEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5370:6: ( 'env' |me= expression )
            	        {
            	            int alt451=2;
            	            switch ( LA(1) )
            	            {
            	            case 277:
            	            	{
            	            		{
            	            		    int LA451_1 = LA(2);
            	            		    if ( (synpred872_fml(ctx)))
            	            		    {
            	            		        alt451=1;
            	            		    }
            	            		    else if ( (ANTLR3_TRUE))
            	            		    {
            	            		        alt451=2;
            	            		    }
            	            		    else
            	            		    {
            	            		        if (BACKTRACKING>0)
            	            		        {
            	            		            FAILEDFLAG = ANTLR3_TRUE;
            	            		            return ac;
            	            		        }


            	            		        CONSTRUCTEX();
            	            		        EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
            	            		        EXCEPTION->message      = (void *)"";
            	            		        EXCEPTION->decisionNum  = 451;
            	            		        EXCEPTION->state        = 1;


            	            		        goto rulestatement_com_outputEx;

            	            		    }
            	            		}
            	            	}
            	                break;
            	            case BNOT:
            	            case COLONx2:
            	            case CharLiteral:
            	            case DECR:
            	            case DOLLAR_LCURLY:
            	            case FloatLiteral:
            	            case ID:
            	            case INCR:
            	            case IntegerLiteral:
            	            case LBRACKET:
            	            case LBRACKET_BAR:
            	            case LCURLY:
            	            case LNOT:
            	            case LPAREN:
            	            case LPAREN_INVOKE:
            	            case MINUS:
            	            case OP_POP:
            	            case OP_TOP:
            	            case PERCENT_LCURLY:
            	            case PLUS:
            	            case RationalLiteral:
            	            case StringLiteral:
            	            case 158:
            	            case 159:
            	            case 160:
            	            case 161:
            	            case 162:
            	            case 237:
            	            case 256:
            	            case 265:
            	            case 280:
            	            case 294:
            	            case 313:
            	            case 330:
            	            case 331:
            	            case 332:
            	            case 343:
            	            case 347:
            	            case 372:
            	            case 397:
            	            	{
            	            		alt451=2;
            	            	}
            	                break;

            	            default:
            	                if (BACKTRACKING>0)
            	                {
            	                    FAILEDFLAG = ANTLR3_TRUE;
            	                    return ac;
            	                }

            	                CONSTRUCTEX();
            	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
            	                EXCEPTION->message      = (void *)"";
            	                EXCEPTION->decisionNum  = 451;
            	                EXCEPTION->state        = 0;


            	                goto rulestatement_com_outputEx;

            	            }

            	            switch (alt451)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5370:8: 'env'
            	        	    {
            	        	         MATCHT(277, &FOLLOW_277_in_statement_com_output18685);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto rulestatement_com_outputEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ac;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             ac
            	        	            ->setOperator( OP(OUTPUT_ENV) ); 
            	        	        }


            	        	    }
            	        	    break;
            	        	case 2:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5371:8: me= expression
            	        	    {
            	        	        FOLLOWPUSH(FOLLOW_expression_in_statement_com_output18699);
            	        	        me=expression(ctx);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto rulestatement_com_outputEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ac;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {

            	        	            		  	sep::BFCode outputTo = NEW_STMT2(OP(OUTPUT_TO), ac
            	        	            ->first(), me
            	        	            );

            	        	            		  	outputTo->insert(outputTo->end(), ++(ac
            	        	            ->begin()), ac
            	        	            ->end());
            	        	            		  	ac= outputTo;

            	        	            		  
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5379:6: ( '->' id= qualifiedNameID )?
            	        {
            	            int alt452=2;
            	            switch ( LA(1) )
            	            {
            	                case 164:
            	                	{
            	                		alt452=1;
            	                	}
            	                    break;
            	            }

            	            switch (alt452)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5379:8: '->' id= qualifiedNameID
            	        	    {
            	        	         MATCHT(164, &FOLLOW_164_in_statement_com_output18721);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto rulestatement_com_outputEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ac;
            	        	        }


            	        	        FOLLOWPUSH(FOLLOW_qualifiedNameID_in_statement_com_output18725);
            	        	        id=qualifiedNameID(ctx);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto rulestatement_com_outputEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ac;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             ac
            	        	            ->append(sep::ParserUtil::getvarPortSignal(id.s
            	        	            , id.nb
            	        	            )); 
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	    }
            	    break;

                }
            }

            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5383:4: ( ( '==>' | 'via' ) id= qualifiedNameID )?
            {
                int alt454=2;
                switch ( LA(1) )
                {
                    case 168:
                    case 413:
                    	{
                    		alt454=1;
                    	}
                        break;
                }

                switch (alt454)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5383:6: ( '==>' | 'via' ) id= qualifiedNameID
            	    {
            	        if ( LA(1) == 168 || LA(1) == 413 )
            	        {
            	            CONSUME();
            	            PERRORRECOVERY=ANTLR3_FALSE;
            	            FAILEDFLAG=ANTLR3_FALSE;

            	        }
            	        else
            	        {
            	            if (BACKTRACKING>0)
            	            {
            	                FAILEDFLAG = ANTLR3_TRUE;
            	                return ac;
            	            }

            	            CONSTRUCTEX();
            	            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
            	            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
            	            EXCEPTION->expectingSet = NULL;

            	            goto rulestatement_com_outputEx;
            	        }


            	        FOLLOWPUSH(FOLLOW_qualifiedNameID_in_statement_com_output18765);
            	        id=qualifiedNameID(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_com_outputEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             sep::ParserUtil::updateSignalRoutingChannel(
            	            	  		sep::Modifier::DIRECTION_OUTPUT_KIND, ac
            	            , id.s
            	            , id.nb
            	            ); 
            	        }


            	    }
            	    break;

                }
            }

             MATCHT(SEMI, &FOLLOW_SEMI_in_statement_com_output18781);
            if  (HASEXCEPTION())
            {
                goto rulestatement_com_outputEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto rulestatement_com_outputEx; /* Prevent compiler warnings */
    rulestatement_com_outputEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(194, statement_com_output_StartIndex); }

    return ac;
}
/* $ANTLR end statement_com_output */

/**
 * $ANTLR start parameters_port
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5391:1: parameters_port[ sep::Port * port , const sep::BFCode & ac ] : LPAREN lp= labelled_argument ( COMMA lp= labelled_argument )* RPAREN ;
 */
static void
parameters_port(pfmlParser ctx, sep::Port * port, const sep::BFCode & ac)
{
    ANTLR3_UINT32 parameters_port_StartIndex;

    fmlParser_labelled_argument_return lp;
    #undef	RETURN_TYPE_lp
    #define	RETURN_TYPE_lp fmlParser_labelled_argument_return

    /* Initialize rule variables
     */
    parameters_port_StartIndex = INDEX();



    	sep::BFVector labelledParams(
    			(port != NULL) ? port->getParametersCount() : 0 );

    	sep::BFList positionalParams;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(195)) )
    {
        {

            	sep::ParserUtil::computePortParameter(
            			port, ac, labelledParams, positionalParams);

        }
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5403:2: ( LPAREN lp= labelled_argument ( COMMA lp= labelled_argument )* RPAREN )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5403:4: LPAREN lp= labelled_argument ( COMMA lp= labelled_argument )* RPAREN
        {
             MATCHT(LPAREN, &FOLLOW_LPAREN_in_parameters_port18804);
            if  (HASEXCEPTION())
            {
                goto ruleparameters_portEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            FOLLOWPUSH(FOLLOW_labelled_argument_in_parameters_port18813);
            lp=labelled_argument(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruleparameters_portEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            if ( BACKTRACKING==0 )
            {

                    		sep::ParserUtil::appendPortParameter(port, lp.label
                ,
                    				labelledParams, positionalParams, lp.arg
                );
                	    
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5409:4: ( COMMA lp= labelled_argument )*

            for (;;)
            {
                int alt455=2;
                switch ( LA(1) )
                {
                case COMMA:
                	{
                		alt455=1;
                	}
                    break;

                }

                switch (alt455)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5409:6: COMMA lp= labelled_argument
            	    {
            	         MATCHT(COMMA, &FOLLOW_COMMA_in_parameters_port18827);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleparameters_portEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        FOLLOWPUSH(FOLLOW_labelled_argument_in_parameters_port18832);
            	        lp=labelled_argument(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleparameters_portEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {

            	                		sep::ParserUtil::appendPortParameter(port, lp.label
            	            ,
            	                				labelledParams, positionalParams, lp.arg
            	            );
            	            	    
            	        }


            	    }
            	    break;

            	default:
            	    goto loop455;	/* break out of the loop */
            	    break;
                }
            }
            loop455: ; /* Jump out to here if this rule does not match */


             MATCHT(RPAREN, &FOLLOW_RPAREN_in_parameters_port18852);
            if  (HASEXCEPTION())
            {
                goto ruleparameters_portEx;
            }
            if (HASFAILED())
            {
                return ;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruleparameters_portEx; /* Prevent compiler warnings */
    ruleparameters_portEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
            else
            {
                {

                    	sep::ParserUtil::computePortParameter(
                    			port, ac, labelledParams, positionalParams);

                }
            }


    if ( BACKTRACKING>0 ) { MEMOIZE(195, parameters_port_StartIndex); }

    return ;
}
/* $ANTLR end parameters_port */

/**
 * $ANTLR start expression_com
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5420:1: expression_com returns [ sep::BFCode ac ] : ( 'present' id= qualifiedNameID | 'absent' id= qualifiedNameID );
 */
static sep::BFCode
expression_com(pfmlParser ctx)
{
    sep::BFCode ac;

    ANTLR3_UINT32 expression_com_StartIndex;

    fmlParser_qualifiedNameID_return id;
    #undef	RETURN_TYPE_id
    #define	RETURN_TYPE_id fmlParser_qualifiedNameID_return

    /* Initialize rule variables
     */
    expression_com_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(196)) )
    {
        {
        }



        return ac;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5422:2: ( 'present' id= qualifiedNameID | 'absent' id= qualifiedNameID )

            ANTLR3_UINT32 alt456;

            alt456=2;

            switch ( LA(1) )
            {
            case 347:
            	{
            		alt456=1;
            	}
                break;
            case 237:
            	{
            		alt456=2;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ac;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 456;
                EXCEPTION->state        = 0;


                goto ruleexpression_comEx;

            }

            switch (alt456)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5422:4: 'present' id= qualifiedNameID
        	    {
        	         MATCHT(347, &FOLLOW_347_in_expression_com18869);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleexpression_comEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        FOLLOWPUSH(FOLLOW_qualifiedNameID_in_expression_com18874);
        	        id=qualifiedNameID(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleexpression_comEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= NEW_STMT1(OP(PRESENT),
        	            		sep::ParserUtil::getvarPortSignal(
        	            id.s
        	            , id.nb
        	            ));
        	             
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5426:4: 'absent' id= qualifiedNameID
        	    {
        	         MATCHT(237, &FOLLOW_237_in_expression_com18883);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleexpression_comEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        FOLLOWPUSH(FOLLOW_qualifiedNameID_in_expression_com18888);
        	        id=qualifiedNameID(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleexpression_comEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= NEW_STMT1(OP(ABSENT),
        	            		sep::ParserUtil::getvarPortSignal(
        	            id.s
        	            , id.nb
        	            ));
        	             
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruleexpression_comEx; /* Prevent compiler warnings */
    ruleexpression_comEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(196, expression_com_StartIndex); }

    return ac;
}
/* $ANTLR end expression_com */

/**
 * $ANTLR start statement_constraint
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5435:1: statement_constraint returns [ sep::BFCode ac ] : (s= statement_guard |s= statement_timed_guard |s= statement_checksat );
 */
static sep::BFCode
statement_constraint(pfmlParser ctx)
{
    sep::BFCode ac;

    ANTLR3_UINT32 statement_constraint_StartIndex;

    sep::BFCode s;
    #undef	RETURN_TYPE_s
    #define	RETURN_TYPE_s sep::BFCode

    /* Initialize rule variables
     */
    statement_constraint_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(197)) )
    {
        {
        }



        return ac;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5437:2: (s= statement_guard |s= statement_timed_guard |s= statement_checksat )

            ANTLR3_UINT32 alt457;

            alt457=3;

            switch ( LA(1) )
            {
            case 278:
            case 290:
            	{
            		alt457=1;
            	}
                break;
            case 391:
            	{
            		alt457=2;
            	}
                break;
            case 256:
            	{
            		alt457=3;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ac;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 457;
                EXCEPTION->state        = 0;


                goto rulestatement_constraintEx;

            }

            switch (alt457)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5437:4: s= statement_guard
        	    {
        	        FOLLOWPUSH(FOLLOW_statement_guard_in_statement_constraint18912);
        	        s=statement_guard(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_constraintEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= 
        	            s
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5438:4: s= statement_timed_guard
        	    {
        	        FOLLOWPUSH(FOLLOW_statement_timed_guard_in_statement_constraint18928);
        	        s=statement_timed_guard(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_constraintEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= 
        	            s
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5439:4: s= statement_checksat
        	    {
        	        FOLLOWPUSH(FOLLOW_statement_checksat_in_statement_constraint18938);
        	        s=statement_checksat(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_constraintEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= 
        	            s
        	            ;
        	             
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto rulestatement_constraintEx; /* Prevent compiler warnings */
    rulestatement_constraintEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(197, statement_constraint_StartIndex); }

    return ac;
}
/* $ANTLR end statement_constraint */

/**
 * $ANTLR start statement_guard
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5443:1: statement_guard returns [ sep::BFCode ac ] : ( 'guard' e= expression SEMI | 'event' e= expression SEMI );
 */
static sep::BFCode
statement_guard(pfmlParser ctx)
{
    sep::BFCode ac;

    ANTLR3_UINT32 statement_guard_StartIndex;

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    /* Initialize rule variables
     */
    statement_guard_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(198)) )
    {
        {
        }



        return ac;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5445:2: ( 'guard' e= expression SEMI | 'event' e= expression SEMI )

            ANTLR3_UINT32 alt458;

            alt458=2;

            switch ( LA(1) )
            {
            case 290:
            	{
            		alt458=1;
            	}
                break;
            case 278:
            	{
            		alt458=2;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ac;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 458;
                EXCEPTION->state        = 0;


                goto rulestatement_guardEx;

            }

            switch (alt458)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5445:4: 'guard' e= expression SEMI
        	    {
        	         MATCHT(290, &FOLLOW_290_in_statement_guard18960);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_guardEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        FOLLOWPUSH(FOLLOW_expression_in_statement_guard18965);
        	        e=expression(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_guardEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	         MATCHT(SEMI, &FOLLOW_SEMI_in_statement_guard18968);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_guardEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= NEW_STMT1(OP(GUARD), 
        	            e
        	            );
        	             
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5448:4: 'event' e= expression SEMI
        	    {
        	         MATCHT(278, &FOLLOW_278_in_statement_guard18977);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_guardEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        FOLLOWPUSH(FOLLOW_expression_in_statement_guard18982);
        	        e=expression(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_guardEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	         MATCHT(SEMI, &FOLLOW_SEMI_in_statement_guard18985);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_guardEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= NEW_STMT1(OP(EVENT), 
        	            e
        	            );
        	             
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto rulestatement_guardEx; /* Prevent compiler warnings */
    rulestatement_guardEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(198, statement_guard_StartIndex); }

    return ac;
}
/* $ANTLR end statement_guard */

/**
 * $ANTLR start statement_timed_guard
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5452:1: statement_timed_guard returns [ sep::BFCode ac ] : 'tguard' e= expression SEMI ;
 */
static sep::BFCode
statement_timed_guard(pfmlParser ctx)
{
    sep::BFCode ac;

    ANTLR3_UINT32 statement_timed_guard_StartIndex;

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    /* Initialize rule variables
     */
    statement_timed_guard_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(199)) )
    {
        {
        }



        return ac;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5454:2: ( 'tguard' e= expression SEMI )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5454:4: 'tguard' e= expression SEMI
        {
             MATCHT(391, &FOLLOW_391_in_statement_timed_guard19003);
            if  (HASEXCEPTION())
            {
                goto rulestatement_timed_guardEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            FOLLOWPUSH(FOLLOW_expression_in_statement_timed_guard19008);
            e=expression(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto rulestatement_timed_guardEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


             MATCHT(SEMI, &FOLLOW_SEMI_in_statement_timed_guard19011);
            if  (HASEXCEPTION())
            {
                goto rulestatement_timed_guardEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            if ( BACKTRACKING==0 )
            {
                 ac= NEW_STMT1(OP(TIMED_GUARD), 
                e
                );
                 
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto rulestatement_timed_guardEx; /* Prevent compiler warnings */
    rulestatement_timed_guardEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(199, statement_timed_guard_StartIndex); }

    return ac;
}
/* $ANTLR end statement_timed_guard */

/**
 * $ANTLR start statement_checksat
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5458:1: statement_checksat returns [ sep::BFCode ac ] : 'checksat' ( LT_ (id= StringLiteral |id= ID ) GT | 'solver:' (id= StringLiteral |id= ID ) )? e= expression SEMI ;
 */
static sep::BFCode
statement_checksat(pfmlParser ctx)
{
    sep::BFCode ac;

    ANTLR3_UINT32 statement_checksat_StartIndex;

    pANTLR3_COMMON_TOKEN    id;
    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    /* Initialize rule variables
     */
    statement_checksat_StartIndex = INDEX();



    	std::string solverID;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(200)) )
    {
        {
        }



        return ac;
    }

    id       = NULL;

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5463:2: ( 'checksat' ( LT_ (id= StringLiteral |id= ID ) GT | 'solver:' (id= StringLiteral |id= ID ) )? e= expression SEMI )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5463:4: 'checksat' ( LT_ (id= StringLiteral |id= ID ) GT | 'solver:' (id= StringLiteral |id= ID ) )? e= expression SEMI
        {
             MATCHT(256, &FOLLOW_256_in_statement_checksat19033);
            if  (HASEXCEPTION())
            {
                goto rulestatement_checksatEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5464:4: ( LT_ (id= StringLiteral |id= ID ) GT | 'solver:' (id= StringLiteral |id= ID ) )?
            {
                int alt461=3;
                switch ( LA(1) )
                {
                    case LT_:
                    	{
                    		alt461=1;
                    	}
                        break;
                    case 376:
                    	{
                    		alt461=2;
                    	}
                        break;
                }

                switch (alt461)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5464:6: LT_ (id= StringLiteral |id= ID ) GT
            	    {
            	         MATCHT(LT_, &FOLLOW_LT__in_statement_checksat19040);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_checksatEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5464:11: (id= StringLiteral |id= ID )
            	        {
            	            int alt459=2;
            	            switch ( LA(1) )
            	            {
            	            case StringLiteral:
            	            	{
            	            		alt459=1;
            	            	}
            	                break;
            	            case ID:
            	            	{
            	            		alt459=2;
            	            	}
            	                break;

            	            default:
            	                if (BACKTRACKING>0)
            	                {
            	                    FAILEDFLAG = ANTLR3_TRUE;
            	                    return ac;
            	                }

            	                CONSTRUCTEX();
            	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
            	                EXCEPTION->message      = (void *)"";
            	                EXCEPTION->decisionNum  = 459;
            	                EXCEPTION->state        = 0;


            	                goto rulestatement_checksatEx;

            	            }

            	            switch (alt459)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5464:13: id= StringLiteral
            	        	    {
            	        	        id = (pANTLR3_COMMON_TOKEN) MATCHT(StringLiteral, &FOLLOW_StringLiteral_in_statement_checksat19047);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto rulestatement_checksatEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ac;
            	        	        }


            	        	    }
            	        	    break;
            	        	case 2:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5464:32: id= ID
            	        	    {
            	        	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_statement_checksat19053);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto rulestatement_checksatEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ac;
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	         MATCHT(GT, &FOLLOW_GT_in_statement_checksat19058);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_checksatEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             solverID = STR((id->getText(id))->chars); 
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5465:6: 'solver:' (id= StringLiteral |id= ID )
            	    {
            	         MATCHT(376, &FOLLOW_376_in_statement_checksat19070);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_checksatEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5465:17: (id= StringLiteral |id= ID )
            	        {
            	            int alt460=2;
            	            switch ( LA(1) )
            	            {
            	            case StringLiteral:
            	            	{
            	            		alt460=1;
            	            	}
            	                break;
            	            case ID:
            	            	{
            	            		alt460=2;
            	            	}
            	                break;

            	            default:
            	                if (BACKTRACKING>0)
            	                {
            	                    FAILEDFLAG = ANTLR3_TRUE;
            	                    return ac;
            	                }

            	                CONSTRUCTEX();
            	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
            	                EXCEPTION->message      = (void *)"";
            	                EXCEPTION->decisionNum  = 460;
            	                EXCEPTION->state        = 0;


            	                goto rulestatement_checksatEx;

            	            }

            	            switch (alt460)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5465:19: id= StringLiteral
            	        	    {
            	        	        id = (pANTLR3_COMMON_TOKEN) MATCHT(StringLiteral, &FOLLOW_StringLiteral_in_statement_checksat19077);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto rulestatement_checksatEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ac;
            	        	        }


            	        	    }
            	        	    break;
            	        	case 2:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5465:38: id= ID
            	        	    {
            	        	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_statement_checksat19083);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto rulestatement_checksatEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ac;
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	        if ( BACKTRACKING==0 )
            	        {
            	             solverID = STR((id->getText(id))->chars); 
            	        }


            	    }
            	    break;

                }
            }

            FOLLOWPUSH(FOLLOW_expression_in_statement_checksat19101);
            e=expression(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto rulestatement_checksatEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


             MATCHT(SEMI, &FOLLOW_SEMI_in_statement_checksat19104);
            if  (HASEXCEPTION())
            {
                goto rulestatement_checksatEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            if ( BACKTRACKING==0 )
            {

                		if( solverID.empty() )
                		{
                			ac= NEW_STMT1( OP(CHECK_SAT), 
                e
                 );

                		}
                		else
                		{
                			ac= NEW_STMT2( OP(CHECK_SAT), NEW_STRING(solverID), 
                e
                 );

                		}
                	
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto rulestatement_checksatEx; /* Prevent compiler warnings */
    rulestatement_checksatEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(200, statement_checksat_StartIndex); }

    return ac;
}
/* $ANTLR end statement_checksat */

/**
 * $ANTLR start expression_guard
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5481:1: expression_guard returns [ sep::BFCode ac ] : 'checksat' ( LT_ (id= StringLiteral |id= ID ) GT | 'solver:' (id= StringLiteral |id= ID ) )? e= expression ;
 */
static sep::BFCode
expression_guard(pfmlParser ctx)
{
    sep::BFCode ac;

    ANTLR3_UINT32 expression_guard_StartIndex;

    pANTLR3_COMMON_TOKEN    id;
    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    /* Initialize rule variables
     */
    expression_guard_StartIndex = INDEX();



    	std::string solverID;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(201)) )
    {
        {
        }



        return ac;
    }

    id       = NULL;

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5486:2: ( 'checksat' ( LT_ (id= StringLiteral |id= ID ) GT | 'solver:' (id= StringLiteral |id= ID ) )? e= expression )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5486:4: 'checksat' ( LT_ (id= StringLiteral |id= ID ) GT | 'solver:' (id= StringLiteral |id= ID ) )? e= expression
        {
             MATCHT(256, &FOLLOW_256_in_expression_guard19127);
            if  (HASEXCEPTION())
            {
                goto ruleexpression_guardEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5487:4: ( LT_ (id= StringLiteral |id= ID ) GT | 'solver:' (id= StringLiteral |id= ID ) )?
            {
                int alt464=3;
                switch ( LA(1) )
                {
                    case LT_:
                    	{
                    		alt464=1;
                    	}
                        break;
                    case 376:
                    	{
                    		alt464=2;
                    	}
                        break;
                }

                switch (alt464)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5487:6: LT_ (id= StringLiteral |id= ID ) GT
            	    {
            	         MATCHT(LT_, &FOLLOW_LT__in_expression_guard19134);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpression_guardEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5487:11: (id= StringLiteral |id= ID )
            	        {
            	            int alt462=2;
            	            switch ( LA(1) )
            	            {
            	            case StringLiteral:
            	            	{
            	            		alt462=1;
            	            	}
            	                break;
            	            case ID:
            	            	{
            	            		alt462=2;
            	            	}
            	                break;

            	            default:
            	                if (BACKTRACKING>0)
            	                {
            	                    FAILEDFLAG = ANTLR3_TRUE;
            	                    return ac;
            	                }

            	                CONSTRUCTEX();
            	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
            	                EXCEPTION->message      = (void *)"";
            	                EXCEPTION->decisionNum  = 462;
            	                EXCEPTION->state        = 0;


            	                goto ruleexpression_guardEx;

            	            }

            	            switch (alt462)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5487:13: id= StringLiteral
            	        	    {
            	        	        id = (pANTLR3_COMMON_TOKEN) MATCHT(StringLiteral, &FOLLOW_StringLiteral_in_expression_guard19141);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruleexpression_guardEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ac;
            	        	        }


            	        	    }
            	        	    break;
            	        	case 2:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5487:32: id= ID
            	        	    {
            	        	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_expression_guard19147);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruleexpression_guardEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ac;
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	         MATCHT(GT, &FOLLOW_GT_in_expression_guard19152);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpression_guardEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             solverID = STR((id->getText(id))->chars); 
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5488:6: 'solver:' (id= StringLiteral |id= ID )
            	    {
            	         MATCHT(376, &FOLLOW_376_in_expression_guard19164);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpression_guardEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5488:17: (id= StringLiteral |id= ID )
            	        {
            	            int alt463=2;
            	            switch ( LA(1) )
            	            {
            	            case StringLiteral:
            	            	{
            	            		alt463=1;
            	            	}
            	                break;
            	            case ID:
            	            	{
            	            		alt463=2;
            	            	}
            	                break;

            	            default:
            	                if (BACKTRACKING>0)
            	                {
            	                    FAILEDFLAG = ANTLR3_TRUE;
            	                    return ac;
            	                }

            	                CONSTRUCTEX();
            	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
            	                EXCEPTION->message      = (void *)"";
            	                EXCEPTION->decisionNum  = 463;
            	                EXCEPTION->state        = 0;


            	                goto ruleexpression_guardEx;

            	            }

            	            switch (alt463)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5488:19: id= StringLiteral
            	        	    {
            	        	        id = (pANTLR3_COMMON_TOKEN) MATCHT(StringLiteral, &FOLLOW_StringLiteral_in_expression_guard19171);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruleexpression_guardEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ac;
            	        	        }


            	        	    }
            	        	    break;
            	        	case 2:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5488:38: id= ID
            	        	    {
            	        	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_expression_guard19177);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruleexpression_guardEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ac;
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	        if ( BACKTRACKING==0 )
            	        {
            	             solverID = STR((id->getText(id))->chars); 
            	        }


            	    }
            	    break;

                }
            }

            FOLLOWPUSH(FOLLOW_expression_in_expression_guard19195);
            e=expression(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruleexpression_guardEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            if ( BACKTRACKING==0 )
            {

                		if( solverID.empty() )
                		{
                			ac= NEW_STMT1( OP(CHECK_SAT), 
                e
                );

                		}
                		else
                		{
                			ac= NEW_STMT2( OP(CHECK_SAT), NEW_STRING(solverID), 
                e
                 );

                		}
                	
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruleexpression_guardEx; /* Prevent compiler warnings */
    ruleexpression_guardEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(201, expression_guard_StartIndex); }

    return ac;
}
/* $ANTLR end expression_guard */

/**
 * $ANTLR start statement_ite
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5507:1: statement_ite returns [ sep::BFCode ac ] : 'if' e= expression bs= block_statement ( ( 'elseif' | 'else' 'if' ) e= expression bs= block_statement )* ( 'else' bs= block_statement )? ;
 */
static sep::BFCode
statement_ite(pfmlParser ctx)
{
    sep::BFCode ac;

    ANTLR3_UINT32 statement_ite_StartIndex;

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    sep::BFCode bs;
    #undef	RETURN_TYPE_bs
    #define	RETURN_TYPE_bs sep::BFCode

    /* Initialize rule variables
     */
    statement_ite_StartIndex = INDEX();



    	sep::BFCode elseifCode;
    	sep::BFCode code;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(202)) )
    {
        {
        }



        return ac;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5513:2: ( 'if' e= expression bs= block_statement ( ( 'elseif' | 'else' 'if' ) e= expression bs= block_statement )* ( 'else' bs= block_statement )? )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5513:4: 'if' e= expression bs= block_statement ( ( 'elseif' | 'else' 'if' ) e= expression bs= block_statement )* ( 'else' bs= block_statement )?
        {
             MATCHT(294, &FOLLOW_294_in_statement_ite19221);
            if  (HASEXCEPTION())
            {
                goto rulestatement_iteEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            FOLLOWPUSH(FOLLOW_expression_in_statement_ite19226);
            e=expression(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto rulestatement_iteEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            FOLLOWPUSH(FOLLOW_block_statement_in_statement_ite19231);
            bs=block_statement(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto rulestatement_iteEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            if ( BACKTRACKING==0 )
            {
                 code = ac= NEW_STMT2(OP(IF), 
                e
                , bs
                );
                 
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5515:4: ( ( 'elseif' | 'else' 'if' ) e= expression bs= block_statement )*

            for (;;)
            {
                int alt466=2;
                switch ( LA(1) )
                {
                case 273:
                	{
                		{
                		   /* dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState)
                		    */
                		    int LA466_1 = LA(2);
                		    if ( (synpred891_fml(ctx)))
                		    {
                		        alt466=1;
                		    }

                		}
                	}
                    break;
                case 274:
                	{
                		alt466=1;
                	}
                    break;

                }

                switch (alt466)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5515:6: ( 'elseif' | 'else' 'if' ) e= expression bs= block_statement
            	    {
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5515:6: ( 'elseif' | 'else' 'if' )
            	        {
            	            int alt465=2;
            	            switch ( LA(1) )
            	            {
            	            case 274:
            	            	{
            	            		alt465=1;
            	            	}
            	                break;
            	            case 273:
            	            	{
            	            		alt465=2;
            	            	}
            	                break;

            	            default:
            	                if (BACKTRACKING>0)
            	                {
            	                    FAILEDFLAG = ANTLR3_TRUE;
            	                    return ac;
            	                }

            	                CONSTRUCTEX();
            	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
            	                EXCEPTION->message      = (void *)"";
            	                EXCEPTION->decisionNum  = 465;
            	                EXCEPTION->state        = 0;


            	                goto rulestatement_iteEx;

            	            }

            	            switch (alt465)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5515:8: 'elseif'
            	        	    {
            	        	         MATCHT(274, &FOLLOW_274_in_statement_ite19245);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto rulestatement_iteEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ac;
            	        	        }


            	        	    }
            	        	    break;
            	        	case 2:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5515:19: 'else' 'if'
            	        	    {
            	        	         MATCHT(273, &FOLLOW_273_in_statement_ite19249);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto rulestatement_iteEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ac;
            	        	        }


            	        	         MATCHT(294, &FOLLOW_294_in_statement_ite19251);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto rulestatement_iteEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ac;
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	        FOLLOWPUSH(FOLLOW_expression_in_statement_ite19258);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_iteEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        FOLLOWPUSH(FOLLOW_block_statement_in_statement_ite19263);
            	        bs=block_statement(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_iteEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {

            	            	    	code->setOperator(OP(IFE));
            	            	    	code->append(elseifCode = NEW_STMT2(OP(IF), e
            	            , bs
            	            ));
            	            	    	code = elseifCode;
            	            	    
            	        }


            	    }
            	    break;

            	default:
            	    goto loop466;	/* break out of the loop */
            	    break;
                }
            }
            loop466: ; /* Jump out to here if this rule does not match */


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5522:4: ( 'else' bs= block_statement )?
            {
                int alt467=2;
                switch ( LA(1) )
                {
                    case 273:
                    	{
                    		alt467=1;
                    	}
                        break;
                }

                switch (alt467)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5522:6: 'else' bs= block_statement
            	    {
            	         MATCHT(273, &FOLLOW_273_in_statement_ite19283);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_iteEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        FOLLOWPUSH(FOLLOW_block_statement_in_statement_ite19288);
            	        bs=block_statement(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_iteEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {

            	            	    	if( bs
            	            ->nonempty() )
            	            	    	{
            	            	    		code->setOperator(OP(IFE)); code->append(bs
            	            );
            	            	    	}
            	            	    
            	        }


            	    }
            	    break;

                }
            }

        }

    }

    // This is where rules clean up and exit
    //
    goto rulestatement_iteEx; /* Prevent compiler warnings */
    rulestatement_iteEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(202, statement_ite_StartIndex); }

    return ac;
}
/* $ANTLR end statement_ite */

/**
 * $ANTLR start expression_ite
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5532:1: expression_ite returns [ sep::BFCode ac ] : 'if' c= expression LCURLY e= expression RCURLY ( ( 'elseif' | 'else' 'if' ) c= expression LCURLY e= expression RCURLY )* ( 'else' LCURLY e= expression RCURLY )? ;
 */
static sep::BFCode
expression_ite(pfmlParser ctx)
{
    sep::BFCode ac;

    ANTLR3_UINT32 expression_ite_StartIndex;

    sep::BF c;
    #undef	RETURN_TYPE_c
    #define	RETURN_TYPE_c sep::BF

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    /* Initialize rule variables
     */
    expression_ite_StartIndex = INDEX();



    	sep::BFCode elseifExpr;
    	sep::BFCode expr;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(203)) )
    {
        {
        }



        return ac;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5538:2: ( 'if' c= expression LCURLY e= expression RCURLY ( ( 'elseif' | 'else' 'if' ) c= expression LCURLY e= expression RCURLY )* ( 'else' LCURLY e= expression RCURLY )? )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5538:4: 'if' c= expression LCURLY e= expression RCURLY ( ( 'elseif' | 'else' 'if' ) c= expression LCURLY e= expression RCURLY )* ( 'else' LCURLY e= expression RCURLY )?
        {
             MATCHT(294, &FOLLOW_294_in_expression_ite19320);
            if  (HASEXCEPTION())
            {
                goto ruleexpression_iteEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            FOLLOWPUSH(FOLLOW_expression_in_expression_ite19325);
            c=expression(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruleexpression_iteEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


             MATCHT(LCURLY, &FOLLOW_LCURLY_in_expression_ite19328);
            if  (HASEXCEPTION())
            {
                goto ruleexpression_iteEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            FOLLOWPUSH(FOLLOW_expression_in_expression_ite19333);
            e=expression(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruleexpression_iteEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


             MATCHT(RCURLY, &FOLLOW_RCURLY_in_expression_ite19336);
            if  (HASEXCEPTION())
            {
                goto ruleexpression_iteEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            if ( BACKTRACKING==0 )
            {
                 expr = ac= NEW_STMT2(OP(IF), 
                c
                , e
                );
                 
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5540:4: ( ( 'elseif' | 'else' 'if' ) c= expression LCURLY e= expression RCURLY )*

            for (;;)
            {
                int alt469=2;
                switch ( LA(1) )
                {
                case 273:
                	{
                		{
                		   /* dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState)
                		    */
                		    int LA469_1 = LA(2);
                		    if ( (synpred894_fml(ctx)))
                		    {
                		        alt469=1;
                		    }

                		}
                	}
                    break;
                case 274:
                	{
                		alt469=1;
                	}
                    break;

                }

                switch (alt469)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5540:6: ( 'elseif' | 'else' 'if' ) c= expression LCURLY e= expression RCURLY
            	    {
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5540:6: ( 'elseif' | 'else' 'if' )
            	        {
            	            int alt468=2;
            	            switch ( LA(1) )
            	            {
            	            case 274:
            	            	{
            	            		alt468=1;
            	            	}
            	                break;
            	            case 273:
            	            	{
            	            		alt468=2;
            	            	}
            	                break;

            	            default:
            	                if (BACKTRACKING>0)
            	                {
            	                    FAILEDFLAG = ANTLR3_TRUE;
            	                    return ac;
            	                }

            	                CONSTRUCTEX();
            	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
            	                EXCEPTION->message      = (void *)"";
            	                EXCEPTION->decisionNum  = 468;
            	                EXCEPTION->state        = 0;


            	                goto ruleexpression_iteEx;

            	            }

            	            switch (alt468)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5540:8: 'elseif'
            	        	    {
            	        	         MATCHT(274, &FOLLOW_274_in_expression_ite19350);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruleexpression_iteEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ac;
            	        	        }


            	        	    }
            	        	    break;
            	        	case 2:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5540:19: 'else' 'if'
            	        	    {
            	        	         MATCHT(273, &FOLLOW_273_in_expression_ite19354);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruleexpression_iteEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ac;
            	        	        }


            	        	         MATCHT(294, &FOLLOW_294_in_expression_ite19356);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruleexpression_iteEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ac;
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	        FOLLOWPUSH(FOLLOW_expression_in_expression_ite19362);
            	        c=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpression_iteEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	         MATCHT(LCURLY, &FOLLOW_LCURLY_in_expression_ite19365);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpression_iteEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_expression_ite19370);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpression_iteEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	         MATCHT(RCURLY, &FOLLOW_RCURLY_in_expression_ite19373);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpression_iteEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {

            	            			expr->setOperator(OP(IFE));
            	            	    	expr->append(elseifExpr = NEW_STMT2(OP(IF), c
            	            , e
            	            ));
            	            	    	expr = elseifExpr;
            	            	    
            	        }


            	    }
            	    break;

            	default:
            	    goto loop469;	/* break out of the loop */
            	    break;
                }
            }
            loop469: ; /* Jump out to here if this rule does not match */


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5547:4: ( 'else' LCURLY e= expression RCURLY )?
            {
                int alt470=2;
                switch ( LA(1) )
                {
                    case 273:
                    	{
                    		alt470=1;
                    	}
                        break;
                }

                switch (alt470)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5547:6: 'else' LCURLY e= expression RCURLY
            	    {
            	         MATCHT(273, &FOLLOW_273_in_expression_ite19393);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpression_iteEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	         MATCHT(LCURLY, &FOLLOW_LCURLY_in_expression_ite19396);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpression_iteEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_expression_ite19401);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpression_iteEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	         MATCHT(RCURLY, &FOLLOW_RCURLY_in_expression_ite19404);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpression_iteEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             expr->setOperator(OP(IFE)); expr->append(e
            	            ); 
            	        }


            	    }
            	    break;

                }
            }

        }

    }

    // This is where rules clean up and exit
    //
    goto ruleexpression_iteEx; /* Prevent compiler warnings */
    ruleexpression_iteEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(203, expression_ite_StartIndex); }

    return ac;
}
/* $ANTLR end expression_ite */

/**
 * $ANTLR start statement_iteration
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5571:1: statement_iteration returns [ sep::BFCode ac ] : ( 'for' (isa= for_assign_header SEMI e= expression SEMI sai= for_assign_header | LPAREN isa= for_assign_header SEMI e= expression SEMI sai= for_assign_header RPAREN |lv= lvalue COLON e= expression | LPAREN lv= lvalue COLON e= expression RPAREN ) sa= block_statement | 'while' e= expression bs= block_statement | 'do' bs= block_statement 'while' e= expression SEMI );
 */
static sep::BFCode
statement_iteration(pfmlParser ctx)
{
    sep::BFCode ac;

    ANTLR3_UINT32 statement_iteration_StartIndex;

    sep::BFCode isa;
    #undef	RETURN_TYPE_isa
    #define	RETURN_TYPE_isa sep::BFCode

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    sep::BFCode sai;
    #undef	RETURN_TYPE_sai
    #define	RETURN_TYPE_sai sep::BFCode

    sep::BF lv;
    #undef	RETURN_TYPE_lv
    #define	RETURN_TYPE_lv sep::BF

    sep::BFCode sa;
    #undef	RETURN_TYPE_sa
    #define	RETURN_TYPE_sa sep::BFCode

    sep::BFCode bs;
    #undef	RETURN_TYPE_bs
    #define	RETURN_TYPE_bs sep::BFCode

    /* Initialize rule variables
     */
    statement_iteration_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(204)) )
    {
        {
        }



        return ac;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5573:2: ( 'for' (isa= for_assign_header SEMI e= expression SEMI sai= for_assign_header | LPAREN isa= for_assign_header SEMI e= expression SEMI sai= for_assign_header RPAREN |lv= lvalue COLON e= expression | LPAREN lv= lvalue COLON e= expression RPAREN ) sa= block_statement | 'while' e= expression bs= block_statement | 'do' bs= block_statement 'while' e= expression SEMI )

            ANTLR3_UINT32 alt472;

            alt472=3;

            switch ( LA(1) )
            {
            case 285:
            	{
            		alt472=1;
            	}
                break;
            case 416:
            	{
            		alt472=2;
            	}
                break;
            case 269:
            	{
            		alt472=3;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ac;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 472;
                EXCEPTION->state        = 0;


                goto rulestatement_iterationEx;

            }

            switch (alt472)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5573:4: 'for' (isa= for_assign_header SEMI e= expression SEMI sai= for_assign_header | LPAREN isa= for_assign_header SEMI e= expression SEMI sai= for_assign_header RPAREN |lv= lvalue COLON e= expression | LPAREN lv= lvalue COLON e= expression RPAREN ) sa= block_statement
        	    {
        	         MATCHT(285, &FOLLOW_285_in_statement_iteration19451);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_iterationEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5574:4: (isa= for_assign_header SEMI e= expression SEMI sai= for_assign_header | LPAREN isa= for_assign_header SEMI e= expression SEMI sai= for_assign_header RPAREN |lv= lvalue COLON e= expression | LPAREN lv= lvalue COLON e= expression RPAREN )
        	        {
        	            int alt471=4;
        	            switch ( LA(1) )
        	            {
        	            case COLONx2:
        	            case ID:
        	            	{
        	            		{
        	            		    int LA471_1 = LA(2);
        	            		    if ( (synpred896_fml(ctx)))
        	            		    {
        	            		        alt471=1;
        	            		    }
        	            		    else if ( (synpred898_fml(ctx)))
        	            		    {
        	            		        alt471=3;
        	            		    }
        	            		    else
        	            		    {
        	            		        if (BACKTRACKING>0)
        	            		        {
        	            		            FAILEDFLAG = ANTLR3_TRUE;
        	            		            return ac;
        	            		        }


        	            		        CONSTRUCTEX();
        	            		        EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
        	            		        EXCEPTION->message      = (void *)"";
        	            		        EXCEPTION->decisionNum  = 471;
        	            		        EXCEPTION->state        = 1;


        	            		        goto rulestatement_iterationEx;

        	            		    }
        	            		}
        	            	}
        	                break;
        	            case LPAREN:
        	            	{
        	            		{
        	            		    int LA471_4 = LA(2);
        	            		    if ( (synpred897_fml(ctx)))
        	            		    {
        	            		        alt471=2;
        	            		    }
        	            		    else if ( (ANTLR3_TRUE))
        	            		    {
        	            		        alt471=4;
        	            		    }
        	            		    else
        	            		    {
        	            		        if (BACKTRACKING>0)
        	            		        {
        	            		            FAILEDFLAG = ANTLR3_TRUE;
        	            		            return ac;
        	            		        }


        	            		        CONSTRUCTEX();
        	            		        EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
        	            		        EXCEPTION->message      = (void *)"";
        	            		        EXCEPTION->decisionNum  = 471;
        	            		        EXCEPTION->state        = 4;


        	            		        goto rulestatement_iterationEx;

        	            		    }
        	            		}
        	            	}
        	                break;
        	            case DECR:
        	            case INCR:
        	            	{
        	            		alt471=1;
        	            	}
        	                break;

        	            default:
        	                if (BACKTRACKING>0)
        	                {
        	                    FAILEDFLAG = ANTLR3_TRUE;
        	                    return ac;
        	                }

        	                CONSTRUCTEX();
        	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
        	                EXCEPTION->message      = (void *)"";
        	                EXCEPTION->decisionNum  = 471;
        	                EXCEPTION->state        = 0;


        	                goto rulestatement_iterationEx;

        	            }

        	            switch (alt471)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5574:6: isa= for_assign_header SEMI e= expression SEMI sai= for_assign_header
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_for_assign_header_in_statement_iteration19460);
        	        	        isa=for_assign_header(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_iterationEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	         MATCHT(SEMI, &FOLLOW_SEMI_in_statement_iteration19463);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_iterationEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_expression_in_statement_iteration19468);
        	        	        e=expression(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_iterationEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	         MATCHT(SEMI, &FOLLOW_SEMI_in_statement_iteration19471);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_iterationEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_for_assign_header_in_statement_iteration19476);
        	        	        sai=for_assign_header(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_iterationEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             ac= NEW_STMT3(OP(FOR), 
        	        	            isa
        	        	            , e
        	        	            , sai
        	        	            );
        	        	             
        	        	        }


        	        	    }
        	        	    break;
        	        	case 2:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5577:6: LPAREN isa= for_assign_header SEMI e= expression SEMI sai= for_assign_header RPAREN
        	        	    {
        	        	         MATCHT(LPAREN, &FOLLOW_LPAREN_in_statement_iteration19495);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_iterationEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_for_assign_header_in_statement_iteration19506);
        	        	        isa=for_assign_header(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_iterationEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	         MATCHT(SEMI, &FOLLOW_SEMI_in_statement_iteration19509);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_iterationEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_expression_in_statement_iteration19514);
        	        	        e=expression(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_iterationEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	         MATCHT(SEMI, &FOLLOW_SEMI_in_statement_iteration19517);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_iterationEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_for_assign_header_in_statement_iteration19522);
        	        	        sai=for_assign_header(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_iterationEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	         MATCHT(RPAREN, &FOLLOW_RPAREN_in_statement_iteration19529);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_iterationEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             ac= NEW_STMT3(OP(FOR), 
        	        	            isa
        	        	            , e
        	        	            , sai
        	        	            );
        	        	             
        	        	        }


        	        	    }
        	        	    break;
        	        	case 3:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5582:6: lv= lvalue COLON e= expression
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_lvalue_in_statement_iteration19550);
        	        	        lv=lvalue(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_iterationEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	         MATCHT(COLON, &FOLLOW_COLON_in_statement_iteration19553);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_iterationEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_expression_in_statement_iteration19558);
        	        	        e=expression(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_iterationEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             ac= NEW_STMT2(OP(FOREACH), 
        	        	            lv
        	        	            , e
        	        	            );
        	        	             
        	        	        }


        	        	    }
        	        	    break;
        	        	case 4:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5585:6: LPAREN lv= lvalue COLON e= expression RPAREN
        	        	    {
        	        	         MATCHT(LPAREN, &FOLLOW_LPAREN_in_statement_iteration19577);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_iterationEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_lvalue_in_statement_iteration19582);
        	        	        lv=lvalue(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_iterationEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	         MATCHT(COLON, &FOLLOW_COLON_in_statement_iteration19585);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_iterationEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_expression_in_statement_iteration19590);
        	        	        e=expression(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_iterationEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	         MATCHT(RPAREN, &FOLLOW_RPAREN_in_statement_iteration19593);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_iterationEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             ac= NEW_STMT2(OP(FOREACH), 
        	        	            lv
        	        	            , e
        	        	            );
        	        	             
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	        FOLLOWPUSH(FOLLOW_block_statement_in_statement_iteration19612);
        	        sa=block_statement(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_iterationEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac
        	            ->append(sa
        	            ); 
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5590:4: 'while' e= expression bs= block_statement
        	    {
        	         MATCHT(416, &FOLLOW_416_in_statement_iteration19621);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_iterationEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        FOLLOWPUSH(FOLLOW_expression_in_statement_iteration19626);
        	        e=expression(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_iterationEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        FOLLOWPUSH(FOLLOW_block_statement_in_statement_iteration19631);
        	        bs=block_statement(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_iterationEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= NEW_STMT2(OP(WHILE_DO), 
        	            e
        	            , bs
        	            );
        	             
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5593:4: 'do' bs= block_statement 'while' e= expression SEMI
        	    {
        	         MATCHT(269, &FOLLOW_269_in_statement_iteration19640);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_iterationEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        FOLLOWPUSH(FOLLOW_block_statement_in_statement_iteration19645);
        	        bs=block_statement(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_iterationEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	         MATCHT(416, &FOLLOW_416_in_statement_iteration19648);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_iterationEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        FOLLOWPUSH(FOLLOW_expression_in_statement_iteration19653);
        	        e=expression(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_iterationEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	         MATCHT(SEMI, &FOLLOW_SEMI_in_statement_iteration19656);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_iterationEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= NEW_STMT2(OP(DO_WHILE), 
        	            bs
        	            , e
        	            );
        	             
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto rulestatement_iterationEx; /* Prevent compiler warnings */
    rulestatement_iterationEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(204, statement_iteration_StartIndex); }

    return ac;
}
/* $ANTLR end statement_iteration */

/**
 * $ANTLR start for_assign_header
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5598:1: for_assign_header returns [ sep::BFCode ac ] : (lv= lvalue ( ASSIGN e= expression | INCR | DECR ) | INCR lv= lvalue | DECR lv= lvalue );
 */
static sep::BFCode
for_assign_header(pfmlParser ctx)
{
    sep::BFCode ac;

    ANTLR3_UINT32 for_assign_header_StartIndex;

    sep::BF lv;
    #undef	RETURN_TYPE_lv
    #define	RETURN_TYPE_lv sep::BF

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    /* Initialize rule variables
     */
    for_assign_header_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(205)) )
    {
        {
        }



        return ac;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5601:2: (lv= lvalue ( ASSIGN e= expression | INCR | DECR ) | INCR lv= lvalue | DECR lv= lvalue )

            ANTLR3_UINT32 alt474;

            alt474=3;

            switch ( LA(1) )
            {
            case COLONx2:
            case ID:
            	{
            		alt474=1;
            	}
                break;
            case INCR:
            	{
            		alt474=2;
            	}
                break;
            case DECR:
            	{
            		alt474=3;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ac;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 474;
                EXCEPTION->state        = 0;


                goto rulefor_assign_headerEx;

            }

            switch (alt474)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5601:4: lv= lvalue ( ASSIGN e= expression | INCR | DECR )
        	    {
        	        FOLLOWPUSH(FOLLOW_lvalue_in_for_assign_header19679);
        	        lv=lvalue(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulefor_assign_headerEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5602:2: ( ASSIGN e= expression | INCR | DECR )
        	        {
        	            int alt473=3;
        	            switch ( LA(1) )
        	            {
        	            case ASSIGN:
        	            	{
        	            		alt473=1;
        	            	}
        	                break;
        	            case INCR:
        	            	{
        	            		alt473=2;
        	            	}
        	                break;
        	            case DECR:
        	            	{
        	            		alt473=3;
        	            	}
        	                break;

        	            default:
        	                if (BACKTRACKING>0)
        	                {
        	                    FAILEDFLAG = ANTLR3_TRUE;
        	                    return ac;
        	                }

        	                CONSTRUCTEX();
        	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
        	                EXCEPTION->message      = (void *)"";
        	                EXCEPTION->decisionNum  = 473;
        	                EXCEPTION->state        = 0;


        	                goto rulefor_assign_headerEx;

        	            }

        	            switch (alt473)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5602:4: ASSIGN e= expression
        	        	    {
        	        	         MATCHT(ASSIGN, &FOLLOW_ASSIGN_in_for_assign_header19684);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulefor_assign_headerEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_expression_in_for_assign_header19689);
        	        	        e=expression(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulefor_assign_headerEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             ac= NEW_STMT2(OP(ASSIGN), 
        	        	            lv
        	        	            , e
        	        	            );
        	        	             
        	        	        }


        	        	    }
        	        	    break;
        	        	case 2:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5607:4: INCR
        	        	    {
        	        	         MATCHT(INCR, &FOLLOW_INCR_in_for_assign_header19702);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulefor_assign_headerEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             ac= NEW_STMT_ASSIGN_OP(OP(PLUS), 
        	        	            lv
        	        	            ,
        	        	            		sep::ExpressionConstant::INTEGER_ONE);
        	        	             
        	        	        }


        	        	    }
        	        	    break;
        	        	case 3:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5612:4: DECR
        	        	    {
        	        	         MATCHT(DECR, &FOLLOW_DECR_in_for_assign_header19713);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulefor_assign_headerEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             ac= NEW_STMT_ASSIGN_OP(OP(PLUS), 
        	        	            lv
        	        	            ,
        	        	            		sep::ExpressionConstant::INTEGER_MINUS_ONE);
        	        	             
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5617:4: INCR lv= lvalue
        	    {
        	         MATCHT(INCR, &FOLLOW_INCR_in_for_assign_header19725);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulefor_assign_headerEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        FOLLOWPUSH(FOLLOW_lvalue_in_for_assign_header19730);
        	        lv=lvalue(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulefor_assign_headerEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= NEW_STMT_ASSIGN_OP(OP(PLUS), 
        	            lv
        	            ,
        	            		 sep::ExpressionConstant::INTEGER_ONE);
        	             
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5622:4: DECR lv= lvalue
        	    {
        	         MATCHT(DECR, &FOLLOW_DECR_in_for_assign_header19741);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulefor_assign_headerEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        FOLLOWPUSH(FOLLOW_lvalue_in_for_assign_header19746);
        	        lv=lvalue(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulefor_assign_headerEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= NEW_STMT_ASSIGN_OP(OP(PLUS), 
        	            lv
        	            ,
        	            		sep::ExpressionConstant::INTEGER_MINUS_ONE);
        	             
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto rulefor_assign_headerEx; /* Prevent compiler warnings */
    rulefor_assign_headerEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(205, for_assign_header_StartIndex); }

    return ac;
}
/* $ANTLR end for_assign_header */

/**
 * $ANTLR start statement_jump
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5632:1: statement_jump returns [ sep::BFCode ac ] : ( 'break' (e= expression )? SEMI | 'continue' (e= expression )? SEMI | 'return' (e= expression ( COMMA e= expression )* )? SEMI | 'exit' (e= expression )? SEMI );
 */
static sep::BFCode
statement_jump(pfmlParser ctx)
{
    sep::BFCode ac;

    ANTLR3_UINT32 statement_jump_StartIndex;

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    /* Initialize rule variables
     */
    statement_jump_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(206)) )
    {
        {
        }



        return ac;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5634:2: ( 'break' (e= expression )? SEMI | 'continue' (e= expression )? SEMI | 'return' (e= expression ( COMMA e= expression )* )? SEMI | 'exit' (e= expression )? SEMI )

            ANTLR3_UINT32 alt480;

            alt480=4;

            switch ( LA(1) )
            {
            case 247:
            	{
            		alt480=1;
            	}
                break;
            case 263:
            	{
            		alt480=2;
            	}
                break;
            case 364:
            	{
            		alt480=3;
            	}
                break;
            case 279:
            	{
            		alt480=4;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ac;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 480;
                EXCEPTION->state        = 0;


                goto rulestatement_jumpEx;

            }

            switch (alt480)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5634:4: 'break' (e= expression )? SEMI
        	    {
        	         MATCHT(247, &FOLLOW_247_in_statement_jump19769);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_jumpEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= NEW_STMT(OP(BREAK));
        	             
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5635:4: (e= expression )?
        	        {
        	            int alt475=2;
        	            switch ( LA(1) )
        	            {
        	                case BNOT:
        	                case COLONx2:
        	                case CharLiteral:
        	                case DECR:
        	                case DOLLAR_LCURLY:
        	                case FloatLiteral:
        	                case ID:
        	                case INCR:
        	                case IntegerLiteral:
        	                case LBRACKET:
        	                case LBRACKET_BAR:
        	                case LCURLY:
        	                case LNOT:
        	                case LPAREN:
        	                case LPAREN_INVOKE:
        	                case MINUS:
        	                case OP_POP:
        	                case OP_TOP:
        	                case PERCENT_LCURLY:
        	                case PLUS:
        	                case RationalLiteral:
        	                case StringLiteral:
        	                case 158:
        	                case 159:
        	                case 160:
        	                case 161:
        	                case 162:
        	                case 237:
        	                case 256:
        	                case 265:
        	                case 277:
        	                case 280:
        	                case 294:
        	                case 313:
        	                case 330:
        	                case 331:
        	                case 332:
        	                case 343:
        	                case 347:
        	                case 372:
        	                case 397:
        	                	{
        	                		alt475=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt475)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5635:6: e= expression
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_expression_in_statement_jump19788);
        	        	        e=expression(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_jumpEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             ac
        	        	            ->append( e
        	        	             ); 
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	         MATCHT(SEMI, &FOLLOW_SEMI_in_statement_jump19799);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_jumpEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5638:4: 'continue' (e= expression )? SEMI
        	    {
        	         MATCHT(263, &FOLLOW_263_in_statement_jump19805);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_jumpEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= NEW_STMT(OP(CONTINUE));
        	             
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5639:4: (e= expression )?
        	        {
        	            int alt476=2;
        	            switch ( LA(1) )
        	            {
        	                case BNOT:
        	                case COLONx2:
        	                case CharLiteral:
        	                case DECR:
        	                case DOLLAR_LCURLY:
        	                case FloatLiteral:
        	                case ID:
        	                case INCR:
        	                case IntegerLiteral:
        	                case LBRACKET:
        	                case LBRACKET_BAR:
        	                case LCURLY:
        	                case LNOT:
        	                case LPAREN:
        	                case LPAREN_INVOKE:
        	                case MINUS:
        	                case OP_POP:
        	                case OP_TOP:
        	                case PERCENT_LCURLY:
        	                case PLUS:
        	                case RationalLiteral:
        	                case StringLiteral:
        	                case 158:
        	                case 159:
        	                case 160:
        	                case 161:
        	                case 162:
        	                case 237:
        	                case 256:
        	                case 265:
        	                case 277:
        	                case 280:
        	                case 294:
        	                case 313:
        	                case 330:
        	                case 331:
        	                case 332:
        	                case 343:
        	                case 347:
        	                case 372:
        	                case 397:
        	                	{
        	                		alt476=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt476)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5639:6: e= expression
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_expression_in_statement_jump19821);
        	        	        e=expression(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_jumpEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             ac
        	        	            ->append( e
        	        	             ); 
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	         MATCHT(SEMI, &FOLLOW_SEMI_in_statement_jump19832);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_jumpEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5642:4: 'return' (e= expression ( COMMA e= expression )* )? SEMI
        	    {
        	         MATCHT(364, &FOLLOW_364_in_statement_jump19838);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_jumpEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= NEW_STMT(OP(RETURN));
        	             
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5643:4: (e= expression ( COMMA e= expression )* )?
        	        {
        	            int alt478=2;
        	            switch ( LA(1) )
        	            {
        	                case BNOT:
        	                case COLONx2:
        	                case CharLiteral:
        	                case DECR:
        	                case DOLLAR_LCURLY:
        	                case FloatLiteral:
        	                case ID:
        	                case INCR:
        	                case IntegerLiteral:
        	                case LBRACKET:
        	                case LBRACKET_BAR:
        	                case LCURLY:
        	                case LNOT:
        	                case LPAREN:
        	                case LPAREN_INVOKE:
        	                case MINUS:
        	                case OP_POP:
        	                case OP_TOP:
        	                case PERCENT_LCURLY:
        	                case PLUS:
        	                case RationalLiteral:
        	                case StringLiteral:
        	                case 158:
        	                case 159:
        	                case 160:
        	                case 161:
        	                case 162:
        	                case 237:
        	                case 256:
        	                case 265:
        	                case 277:
        	                case 280:
        	                case 294:
        	                case 313:
        	                case 330:
        	                case 331:
        	                case 332:
        	                case 343:
        	                case 347:
        	                case 372:
        	                case 397:
        	                	{
        	                		alt478=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt478)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5643:6: e= expression ( COMMA e= expression )*
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_expression_in_statement_jump19856);
        	        	        e=expression(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_jumpEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             ac
        	        	            ->append( e
        	        	             ); 
        	        	        }


        	        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5644:6: ( COMMA e= expression )*

        	        	        for (;;)
        	        	        {
        	        	            int alt477=2;
        	        	            switch ( LA(1) )
        	        	            {
        	        	            case COMMA:
        	        	            	{
        	        	            		alt477=1;
        	        	            	}
        	        	                break;

        	        	            }

        	        	            switch (alt477)
        	        	            {
        	        	        	case 1:
        	        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5644:8: COMMA e= expression
        	        	        	    {
        	        	        	         MATCHT(COMMA, &FOLLOW_COMMA_in_statement_jump19868);
        	        	        	        if  (HASEXCEPTION())
        	        	        	        {
        	        	        	            goto rulestatement_jumpEx;
        	        	        	        }
        	        	        	        if (HASFAILED())
        	        	        	        {
        	        	        	            return ac;
        	        	        	        }


        	        	        	        FOLLOWPUSH(FOLLOW_expression_in_statement_jump19872);
        	        	        	        e=expression(ctx);

        	        	        	        FOLLOWPOP();
        	        	        	        if  (HASEXCEPTION())
        	        	        	        {
        	        	        	            goto rulestatement_jumpEx;
        	        	        	        }
        	        	        	        if (HASFAILED())
        	        	        	        {
        	        	        	            return ac;
        	        	        	        }


        	        	        	        if ( BACKTRACKING==0 )
        	        	        	        {
        	        	        	             ac
        	        	        	            ->append( e
        	        	        	             ); 
        	        	        	        }


        	        	        	    }
        	        	        	    break;

        	        	        	default:
        	        	        	    goto loop477;	/* break out of the loop */
        	        	        	    break;
        	        	            }
        	        	        }
        	        	        loop477: ; /* Jump out to here if this rule does not match */


        	        	    }
        	        	    break;

        	            }
        	        }

        	         MATCHT(SEMI, &FOLLOW_SEMI_in_statement_jump19889);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_jumpEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	    }
        	    break;
        	case 4:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5648:4: 'exit' (e= expression )? SEMI
        	    {
        	         MATCHT(279, &FOLLOW_279_in_statement_jump19895);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_jumpEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= NEW_STMT(OP(EXIT));
        	             
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5649:4: (e= expression )?
        	        {
        	            int alt479=2;
        	            switch ( LA(1) )
        	            {
        	                case BNOT:
        	                case COLONx2:
        	                case CharLiteral:
        	                case DECR:
        	                case DOLLAR_LCURLY:
        	                case FloatLiteral:
        	                case ID:
        	                case INCR:
        	                case IntegerLiteral:
        	                case LBRACKET:
        	                case LBRACKET_BAR:
        	                case LCURLY:
        	                case LNOT:
        	                case LPAREN:
        	                case LPAREN_INVOKE:
        	                case MINUS:
        	                case OP_POP:
        	                case OP_TOP:
        	                case PERCENT_LCURLY:
        	                case PLUS:
        	                case RationalLiteral:
        	                case StringLiteral:
        	                case 158:
        	                case 159:
        	                case 160:
        	                case 161:
        	                case 162:
        	                case 237:
        	                case 256:
        	                case 265:
        	                case 277:
        	                case 280:
        	                case 294:
        	                case 313:
        	                case 330:
        	                case 331:
        	                case 332:
        	                case 343:
        	                case 347:
        	                case 372:
        	                case 397:
        	                	{
        	                		alt479=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt479)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5649:6: e= expression
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_expression_in_statement_jump19915);
        	        	        e=expression(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_jumpEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             ac
        	        	            ->append( e
        	        	             ); 
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	         MATCHT(SEMI, &FOLLOW_SEMI_in_statement_jump19926);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_jumpEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto rulestatement_jumpEx; /* Prevent compiler warnings */
    rulestatement_jumpEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(206, statement_jump_StartIndex); }

    return ac;
}
/* $ANTLR end statement_jump */

/**
 * $ANTLR start expression_lambda
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5657:1: expression_lambda returns [ sep::BFCode ac ] : 'lambda' (id= ID )* '->' e= expression ;
 */
static sep::BFCode
expression_lambda(pfmlParser ctx)
{
    sep::BFCode ac;

    ANTLR3_UINT32 expression_lambda_StartIndex;

    pANTLR3_COMMON_TOKEN    id;
    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    /* Initialize rule variables
     */
    expression_lambda_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(207)) )
    {
        {
        }



        return ac;
    }

    id       = NULL;

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5659:2: ( 'lambda' (id= ID )* '->' e= expression )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5659:4: 'lambda' (id= ID )* '->' e= expression
        {
             MATCHT(313, &FOLLOW_313_in_expression_lambda19945);
            if  (HASEXCEPTION())
            {
                goto ruleexpression_lambdaEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            if ( BACKTRACKING==0 )
            {
                 ac= NEW_CODE( OP(LAMBDA) );
                 
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5660:4: (id= ID )*

            for (;;)
            {
                int alt481=2;
                switch ( LA(1) )
                {
                case ID:
                	{
                		alt481=1;
                	}
                    break;

                }

                switch (alt481)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5660:6: id= ID
            	    {
            	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_expression_lambda19957);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpression_lambdaEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             ac
            	            ->append( NEW_ID(STR((id->getText(id))->chars)) ); 
            	        }


            	    }
            	    break;

            	default:
            	    goto loop481;	/* break out of the loop */
            	    break;
                }
            }
            loop481: ; /* Jump out to here if this rule does not match */


             MATCHT(164, &FOLLOW_164_in_expression_lambda19969);
            if  (HASEXCEPTION())
            {
                goto ruleexpression_lambdaEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            FOLLOWPUSH(FOLLOW_expression_in_expression_lambda19973);
            e=expression(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruleexpression_lambdaEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            if ( BACKTRACKING==0 )
            {
                 ac
                ->append( e
                 ); 
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruleexpression_lambdaEx; /* Prevent compiler warnings */
    ruleexpression_lambdaEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(207, expression_lambda_StartIndex); }

    return ac;
}
/* $ANTLR end expression_lambda */

/**
 * $ANTLR start expression_status
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5669:1: expression_status returns [ sep::BFCode ac ] : ( 'status#was' o= op_activity id= qualifiedNameID | 'status#is' o= op_activity id= qualifiedNameID | 'status#being' o= op_activity id= qualifiedNameID | 'status#will' o= op_activity id= qualifiedNameID | 'changed' lv= lvalue | 'changed#to' lv= lvalue );
 */
static sep::BFCode
expression_status(pfmlParser ctx)
{
    sep::BFCode ac;

    ANTLR3_UINT32 expression_status_StartIndex;

    sep::Operator * o;
    #undef	RETURN_TYPE_o
    #define	RETURN_TYPE_o sep::Operator *

    fmlParser_qualifiedNameID_return id;
    #undef	RETURN_TYPE_id
    #define	RETURN_TYPE_id fmlParser_qualifiedNameID_return

    sep::BF lv;
    #undef	RETURN_TYPE_lv
    #define	RETURN_TYPE_lv sep::BF

    /* Initialize rule variables
     */
    expression_status_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(208)) )
    {
        {
        }



        return ac;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5671:2: ( 'status#was' o= op_activity id= qualifiedNameID | 'status#is' o= op_activity id= qualifiedNameID | 'status#being' o= op_activity id= qualifiedNameID | 'status#will' o= op_activity id= qualifiedNameID | 'changed' lv= lvalue | 'changed#to' lv= lvalue )

            ANTLR3_UINT32 alt482;

            alt482=6;

            switch ( LA(1) )
            {
            case 383:
            	{
            		alt482=1;
            	}
                break;
            case 382:
            	{
            		alt482=2;
            	}
                break;
            case 381:
            	{
            		alt482=3;
            	}
                break;
            case 384:
            	{
            		alt482=4;
            	}
                break;
            case 252:
            	{
            		alt482=5;
            	}
                break;
            case 251:
            	{
            		alt482=6;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ac;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 482;
                EXCEPTION->state        = 0;


                goto ruleexpression_statusEx;

            }

            switch (alt482)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5671:4: 'status#was' o= op_activity id= qualifiedNameID
        	    {
        	         MATCHT(383, &FOLLOW_383_in_expression_status19996);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleexpression_statusEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        FOLLOWPUSH(FOLLOW_op_activity_in_expression_status20003);
        	        o=op_activity(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleexpression_statusEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        FOLLOWPUSH(FOLLOW_qualifiedNameID_in_expression_status20008);
        	        id=qualifiedNameID(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleexpression_statusEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= NEW_STMT2(OP(STATUS_WAS), INCR_BF(
        	            o
        	            ),
        	            			sep::ParserUtil::getvarMachine(id.s
        	            , id.nb
        	            ));
        	             
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5675:4: 'status#is' o= op_activity id= qualifiedNameID
        	    {
        	         MATCHT(382, &FOLLOW_382_in_expression_status20017);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleexpression_statusEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        FOLLOWPUSH(FOLLOW_op_activity_in_expression_status20025);
        	        o=op_activity(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleexpression_statusEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        FOLLOWPUSH(FOLLOW_qualifiedNameID_in_expression_status20030);
        	        id=qualifiedNameID(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleexpression_statusEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= NEW_STMT2(OP(STATUS_IS), INCR_BF(
        	            o
        	            ),
        	            			sep::ParserUtil::getvarMachine(id.s
        	            , id.nb
        	            ));
        	             
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5679:4: 'status#being' o= op_activity id= qualifiedNameID
        	    {
        	         MATCHT(381, &FOLLOW_381_in_expression_status20039);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleexpression_statusEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        FOLLOWPUSH(FOLLOW_op_activity_in_expression_status20044);
        	        o=op_activity(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleexpression_statusEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        FOLLOWPUSH(FOLLOW_qualifiedNameID_in_expression_status20049);
        	        id=qualifiedNameID(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleexpression_statusEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= NEW_STMT2(OP(STATUS_BEING), INCR_BF(
        	            o
        	            ),
        	            			sep::ParserUtil::getvarMachine(id.s
        	            , id.nb
        	            ));
        	             
        	        }


        	    }
        	    break;
        	case 4:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5683:4: 'status#will' o= op_activity id= qualifiedNameID
        	    {
        	         MATCHT(384, &FOLLOW_384_in_expression_status20058);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleexpression_statusEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        FOLLOWPUSH(FOLLOW_op_activity_in_expression_status20064);
        	        o=op_activity(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleexpression_statusEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        FOLLOWPUSH(FOLLOW_qualifiedNameID_in_expression_status20069);
        	        id=qualifiedNameID(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleexpression_statusEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= NEW_STMT2(OP(STATUS_WILL), INCR_BF(
        	            o
        	            ),
        	            			sep::ParserUtil::getvarMachine(id.s
        	            , id.nb
        	            ));
        	             
        	        }


        	    }
        	    break;
        	case 5:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5687:4: 'changed' lv= lvalue
        	    {
        	         MATCHT(252, &FOLLOW_252_in_expression_status20078);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleexpression_statusEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        FOLLOWPUSH(FOLLOW_lvalue_in_expression_status20086);
        	        lv=lvalue(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleexpression_statusEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= NEW_STMT1(OP(CHANGED), 
        	            lv
        	            );
        	             
        	        }


        	    }
        	    break;
        	case 6:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5690:4: 'changed#to' lv= lvalue
        	    {
        	         MATCHT(251, &FOLLOW_251_in_expression_status20095);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleexpression_statusEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        FOLLOWPUSH(FOLLOW_lvalue_in_expression_status20100);
        	        lv=lvalue(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleexpression_statusEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= NEW_STMT1(OP(CHANGED_TO), 
        	            lv
        	            );
        	             
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruleexpression_statusEx; /* Prevent compiler warnings */
    ruleexpression_statusEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(208, expression_status_StartIndex); }

    return ac;
}
/* $ANTLR end expression_status */

/**
 * $ANTLR start op_activity
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5694:1: op_activity returns [ sep::Operator * op ] : ( 'init' | 'final' | 'destroy' | 'start' | 'restart' | 'stop' | 'ienable' | 'enable' | 'idisable' | 'disable' | 'iabort' | 'abort' | 'run' | 'rtc' | 'schedule' | 'suspend' | 'resume' | 'wait' );
 */
static sep::Operator *
op_activity(pfmlParser ctx)
{
    sep::Operator * op;

    ANTLR3_UINT32 op_activity_StartIndex;

    /* Initialize rule variables
     */
    op_activity_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(209)) )
    {
        {
        }



        return op;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5696:2: ( 'init' | 'final' | 'destroy' | 'start' | 'restart' | 'stop' | 'ienable' | 'enable' | 'idisable' | 'disable' | 'iabort' | 'abort' | 'run' | 'rtc' | 'schedule' | 'suspend' | 'resume' | 'wait' )

            ANTLR3_UINT32 alt483;

            alt483=18;

            switch ( LA(1) )
            {
            case 296:
            	{
            		alt483=1;
            	}
                break;
            case 282:
            	{
            		alt483=2;
            	}
                break;
            case 267:
            	{
            		alt483=3;
            	}
                break;
            case 377:
            	{
            		alt483=4;
            	}
                break;
            case 362:
            	{
            		alt483=5;
            	}
                break;
            case 386:
            	{
            		alt483=6;
            	}
                break;
            case 293:
            	{
            		alt483=7;
            	}
                break;
            case 275:
            	{
            		alt483=8;
            	}
                break;
            case 292:
            	{
            		alt483=9;
            	}
                break;
            case 268:
            	{
            		alt483=10;
            	}
                break;
            case 291:
            	{
            		alt483=11;
            	}
                break;
            case 236:
            	{
            		alt483=12;
            	}
                break;
            case 369:
            	{
            		alt483=13;
            	}
                break;
            case 368:
            	{
            		alt483=14;
            	}
                break;
            case 371:
            	{
            		alt483=15;
            	}
                break;
            case 389:
            	{
            		alt483=16;
            	}
                break;
            case 363:
            	{
            		alt483=17;
            	}
                break;
            case 415:
            	{
            		alt483=18;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return op;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 483;
                EXCEPTION->state        = 0;


                goto ruleop_activityEx;

            }

            switch (alt483)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5696:4: 'init'
        	    {
        	         MATCHT(296, &FOLLOW_296_in_op_activity20118);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(INIT);
        	                        
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5697:4: 'final'
        	    {
        	         MATCHT(282, &FOLLOW_282_in_op_activity20129);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(FINAL);
        	                       
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5698:4: 'destroy'
        	    {
        	         MATCHT(267, &FOLLOW_267_in_op_activity20139);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(DESTROY);
        	                     
        	        }


        	    }
        	    break;
        	case 4:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5699:4: 'start'
        	    {
        	         MATCHT(377, &FOLLOW_377_in_op_activity20147);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(START);
        	                       
        	        }


        	    }
        	    break;
        	case 5:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5700:4: 'restart'
        	    {
        	         MATCHT(362, &FOLLOW_362_in_op_activity20157);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(RESTART);
        	                     
        	        }


        	    }
        	    break;
        	case 6:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5701:4: 'stop'
        	    {
        	         MATCHT(386, &FOLLOW_386_in_op_activity20165);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(STOP);
        	                        
        	        }


        	    }
        	    break;
        	case 7:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5702:4: 'ienable'
        	    {
        	         MATCHT(293, &FOLLOW_293_in_op_activity20176);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(IENABLE_INVOKE);
        	              
        	        }


        	    }
        	    break;
        	case 8:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5703:4: 'enable'
        	    {
        	         MATCHT(275, &FOLLOW_275_in_op_activity20184);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(ENABLE_INVOKE);
        	               
        	        }


        	    }
        	    break;
        	case 9:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5704:4: 'idisable'
        	    {
        	         MATCHT(292, &FOLLOW_292_in_op_activity20193);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(IDISABLE_INVOKE);
        	             
        	        }


        	    }
        	    break;
        	case 10:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5705:4: 'disable'
        	    {
        	         MATCHT(268, &FOLLOW_268_in_op_activity20200);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(DISABLE_INVOKE);
        	              
        	        }


        	    }
        	    break;
        	case 11:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5706:4: 'iabort'
        	    {
        	         MATCHT(291, &FOLLOW_291_in_op_activity20208);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(IABORT_INVOKE);
        	               
        	        }


        	    }
        	    break;
        	case 12:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5707:4: 'abort'
        	    {
        	         MATCHT(236, &FOLLOW_236_in_op_activity20217);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(ABORT_INVOKE);
        	                
        	        }


        	    }
        	    break;
        	case 13:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5708:4: 'run'
        	    {
        	         MATCHT(369, &FOLLOW_369_in_op_activity20227);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(RUN);
        	                         
        	        }


        	    }
        	    break;
        	case 14:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5709:4: 'rtc'
        	    {
        	         MATCHT(368, &FOLLOW_368_in_op_activity20239);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(RTC);
        	                         
        	        }


        	    }
        	    break;
        	case 15:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5710:4: 'schedule'
        	    {
        	         MATCHT(371, &FOLLOW_371_in_op_activity20251);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(SCHEDULE_INVOKE);
        	             
        	        }


        	    }
        	    break;
        	case 16:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5711:4: 'suspend'
        	    {
        	         MATCHT(389, &FOLLOW_389_in_op_activity20258);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(SUSPEND);
        	                     
        	        }


        	    }
        	    break;
        	case 17:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5712:4: 'resume'
        	    {
        	         MATCHT(363, &FOLLOW_363_in_op_activity20266);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(RESUME);
        	                      
        	        }


        	    }
        	    break;
        	case 18:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5713:4: 'wait'
        	    {
        	         MATCHT(415, &FOLLOW_415_in_op_activity20275);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleop_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(WAIT);
        	                        
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruleop_activityEx; /* Prevent compiler warnings */
    ruleop_activityEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(209, op_activity_StartIndex); }

    return op;
}
/* $ANTLR end op_activity */

/**
 * $ANTLR start statement_activity
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5721:1: statement_activity returns [ sep::BFCode ac ] : (o= op_activity (id= qualifiedNameID )? ( activity_machine_param_return[ machine , ac ] )? SEMI | 'goto' id= qualifiedNameID (fs= statement_init_flow[flowTarget] | SEMI ) | 'join' e= expression SEMI );
 */
static sep::BFCode
statement_activity(pfmlParser ctx)
{
    sep::BFCode ac;

    ANTLR3_UINT32 statement_activity_StartIndex;

    sep::Operator * o;
    #undef	RETURN_TYPE_o
    #define	RETURN_TYPE_o sep::Operator *

    fmlParser_qualifiedNameID_return id;
    #undef	RETURN_TYPE_id
    #define	RETURN_TYPE_id fmlParser_qualifiedNameID_return

    sep::BFCode fs;
    #undef	RETURN_TYPE_fs
    #define	RETURN_TYPE_fs sep::BFCode

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    /* Initialize rule variables
     */
    statement_activity_StartIndex = INDEX();



    	sep::BF flowTarget;
    	sep::BF machine;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(210)) )
    {
        {
        }



        return ac;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5727:2: (o= op_activity (id= qualifiedNameID )? ( activity_machine_param_return[ machine , ac ] )? SEMI | 'goto' id= qualifiedNameID (fs= statement_init_flow[flowTarget] | SEMI ) | 'join' e= expression SEMI )

            ANTLR3_UINT32 alt487;

            alt487=3;

            switch ( LA(1) )
            {
            case 236:
            case 267:
            case 268:
            case 275:
            case 282:
            case 291:
            case 292:
            case 293:
            case 296:
            case 362:
            case 363:
            case 368:
            case 369:
            case 371:
            case 377:
            case 386:
            case 389:
            case 415:
            	{
            		alt487=1;
            	}
                break;
            case 289:
            	{
            		alt487=2;
            	}
                break;
            case 312:
            	{
            		alt487=3;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ac;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 487;
                EXCEPTION->state        = 0;


                goto rulestatement_activityEx;

            }

            switch (alt487)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5727:4: o= op_activity (id= qualifiedNameID )? ( activity_machine_param_return[ machine , ac ] )? SEMI
        	    {
        	        FOLLOWPUSH(FOLLOW_op_activity_in_statement_activity20307);
        	        o=op_activity(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= NEW_STMT(
        	            o
        	            );
        	             
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5728:4: (id= qualifiedNameID )?
        	        {
        	            int alt484=2;
        	            switch ( LA(1) )
        	            {
        	                case ID:
        	                	{
        	                		alt484=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt484)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5728:6: id= qualifiedNameID
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_qualifiedNameID_in_statement_activity20319);
        	        	        id=qualifiedNameID(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_activityEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             ac
        	        	            ->append(machine =
        	        	            	    	sep::ParserUtil::getvarMachine(id.s
        	        	            , id.nb
        	        	            )); 
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5733:4: ( activity_machine_param_return[ machine , ac ] )?
        	        {
        	            int alt485=2;
        	            switch ( LA(1) )
        	            {
        	                case LPAREN:
        	                	{
        	                		alt485=1;
        	                	}
        	                    break;
        	            }

        	            switch (alt485)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5733:4: activity_machine_param_return[ machine , ac ]
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_activity_machine_param_return_in_statement_activity20338);
        	        	        activity_machine_param_return(ctx, machine, ac);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_activityEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	         MATCHT(SEMI, &FOLLOW_SEMI_in_statement_activity20346);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5740:4: 'goto' id= qualifiedNameID (fs= statement_init_flow[flowTarget] | SEMI )
        	    {
        	         MATCHT(289, &FOLLOW_289_in_statement_activity20355);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        FOLLOWPUSH(FOLLOW_qualifiedNameID_in_statement_activity20360);
        	        id=qualifiedNameID(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= NEW_STMT1(OP(GOTO),
        	            	  	flowTarget = sep::ParserUtil::getvarMachine(
        	            id.s
        	            , id.nb
        	            ));
        	             
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5743:4: (fs= statement_init_flow[flowTarget] | SEMI )
        	        {
        	            int alt486=2;
        	            switch ( LA(1) )
        	            {
        	            case 284:
        	            	{
        	            		alt486=1;
        	            	}
        	                break;
        	            case SEMI:
        	            	{
        	            		alt486=2;
        	            	}
        	                break;

        	            default:
        	                if (BACKTRACKING>0)
        	                {
        	                    FAILEDFLAG = ANTLR3_TRUE;
        	                    return ac;
        	                }

        	                CONSTRUCTEX();
        	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
        	                EXCEPTION->message      = (void *)"";
        	                EXCEPTION->decisionNum  = 486;
        	                EXCEPTION->state        = 0;


        	                goto rulestatement_activityEx;

        	            }

        	            switch (alt486)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5743:6: fs= statement_init_flow[flowTarget]
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_statement_init_flow_in_statement_activity20374);
        	        	        fs=statement_init_flow(ctx, flowTarget);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_activityEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             ac
        	        	            ->append(fs
        	        	            ); 
        	        	        }


        	        	    }
        	        	    break;
        	        	case 2:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5744:6: SEMI
        	        	    {
        	        	         MATCHT(SEMI, &FOLLOW_SEMI_in_statement_activity20385);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulestatement_activityEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return ac;
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5747:4: 'join' e= expression SEMI
        	    {
        	         MATCHT(312, &FOLLOW_312_in_statement_activity20396);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        FOLLOWPUSH(FOLLOW_expression_in_statement_activity20401);
        	        e=expression(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	         MATCHT(SEMI, &FOLLOW_SEMI_in_statement_activity20404);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulestatement_activityEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ac;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             ac= NEW_STMT1(OP(JOIN), 
        	            e
        	            );
        	             
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto rulestatement_activityEx; /* Prevent compiler warnings */
    rulestatement_activityEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(210, statement_activity_StartIndex); }

    return ac;
}
/* $ANTLR end statement_activity */

/**
 * $ANTLR start statement_init_flow
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5753:1: statement_init_flow[ const sep::BF & flowTarget ] returns [ sep::BFCode ac ] : 'flow' bs= block_statement ;
 */
static sep::BFCode
statement_init_flow(pfmlParser ctx, const sep::BF & flowTarget)
{
    sep::BFCode ac;

    ANTLR3_UINT32 statement_init_flow_StartIndex;

    sep::BFCode bs;
    #undef	RETURN_TYPE_bs
    #define	RETURN_TYPE_bs sep::BFCode

    /* Initialize rule variables
     */
    statement_init_flow_StartIndex = INDEX();



    	if( flowTarget.is< sep::Machine >() )
    	{
    		PUSH_CTX_CPM( flowTarget.to_ptr< sep::Machine >() );
    	}

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(211)) )
    {
        {

            	if( flowTarget.is< sep::Machine >() )
            	{
            		POP_CTX;
            	}

        }
        {
        }



        return ac;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5767:2: ( 'flow' bs= block_statement )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5767:4: 'flow' bs= block_statement
        {
             MATCHT(284, &FOLLOW_284_in_statement_init_flow20434);
            if  (HASEXCEPTION())
            {
                goto rulestatement_init_flowEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            FOLLOWPUSH(FOLLOW_block_statement_in_statement_init_flow20438);
            bs=block_statement(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto rulestatement_init_flowEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            if ( BACKTRACKING==0 )
            {
                 ac= 
                bs
                ;
                 
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto rulestatement_init_flowEx; /* Prevent compiler warnings */
    rulestatement_init_flowEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
            else
            {
                {

                    	if( flowTarget.is< sep::Machine >() )
                    	{
                    		POP_CTX;
                    	}

                }
            }


    if ( BACKTRACKING>0 ) { MEMOIZE(211, statement_init_flow_StartIndex); }

    return ac;
}
/* $ANTLR end statement_init_flow */

/**
 * $ANTLR start statement_invoke_routine
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5775:1: statement_invoke_routine returns [ sep::BFCode ac ] : id= ID invoke_routine_params[ invokeRoutine ] ( invoke_routine_returns[ invokeRoutine ] )? SEMI ;
 */
static sep::BFCode
statement_invoke_routine(pfmlParser ctx)
{
    sep::BFCode ac;

    ANTLR3_UINT32 statement_invoke_routine_StartIndex;

    pANTLR3_COMMON_TOKEN    id;

    /* Initialize rule variables
     */
    statement_invoke_routine_StartIndex = INDEX();



    	sep::Routine * invokeRoutine = NULL;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(212)) )
    {
        {
        }



        return ac;
    }

    id       = NULL;

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5780:2: (id= ID invoke_routine_params[ invokeRoutine ] ( invoke_routine_returns[ invokeRoutine ] )? SEMI )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5780:4: id= ID invoke_routine_params[ invokeRoutine ] ( invoke_routine_returns[ invokeRoutine ] )? SEMI
        {
            id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_statement_invoke_routine20468);
            if  (HASEXCEPTION())
            {
                goto rulestatement_invoke_routineEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            if ( BACKTRACKING==0 )
            {

                	  	invokeRoutine = sep::Routine::newInvoke( _CPRMS_, STR((id->getText(id))->chars));

                	  	invokeRoutine->setModel(
                	  			sep::ParserUtil::getvarRoutine(STR((id->getText(id))->chars)) );
                	  
            }


            FOLLOWPUSH(FOLLOW_invoke_routine_params_in_statement_invoke_routine20479);
            invoke_routine_params(ctx, invokeRoutine);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto rulestatement_invoke_routineEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5789:7: ( invoke_routine_returns[ invokeRoutine ] )?
            {
                int alt488=2;
                switch ( LA(1) )
                {
                    case 163:
                    case 365:
                    	{
                    		alt488=1;
                    	}
                        break;
                }

                switch (alt488)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5789:9: invoke_routine_returns[ invokeRoutine ]
            	    {
            	        FOLLOWPUSH(FOLLOW_invoke_routine_returns_in_statement_invoke_routine20490);
            	        invoke_routine_returns(ctx, invokeRoutine);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulestatement_invoke_routineEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ac;
            	        }


            	    }
            	    break;

                }
            }

             MATCHT(SEMI, &FOLLOW_SEMI_in_statement_invoke_routine20502);
            if  (HASEXCEPTION())
            {
                goto rulestatement_invoke_routineEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            if ( BACKTRACKING==0 )
            {
                 ac= sep::ParserUtil::invokeRoutineStatement(invokeRoutine);
                 
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto rulestatement_invoke_routineEx; /* Prevent compiler warnings */
    rulestatement_invoke_routineEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(212, statement_invoke_routine_StartIndex); }

    return ac;
}
/* $ANTLR end statement_invoke_routine */

/**
 * $ANTLR start invoke_routine_params
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5796:1: invoke_routine_params[ sep::Routine * invokeRoutine ] : LPAREN (lp= labelled_argument ( COMMA lp= labelled_argument )* )? RPAREN ;
 */
static void
invoke_routine_params(pfmlParser ctx, sep::Routine * invokeRoutine)
{
    ANTLR3_UINT32 invoke_routine_params_StartIndex;

    fmlParser_labelled_argument_return lp;
    #undef	RETURN_TYPE_lp
    #define	RETURN_TYPE_lp fmlParser_labelled_argument_return

    /* Initialize rule variables
     */
    invoke_routine_params_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(213)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5797:2: ( LPAREN (lp= labelled_argument ( COMMA lp= labelled_argument )* )? RPAREN )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5797:4: LPAREN (lp= labelled_argument ( COMMA lp= labelled_argument )* )? RPAREN
        {
             MATCHT(LPAREN, &FOLLOW_LPAREN_in_invoke_routine_params20525);
            if  (HASEXCEPTION())
            {
                goto ruleinvoke_routine_paramsEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5798:4: (lp= labelled_argument ( COMMA lp= labelled_argument )* )?
            {
                int alt490=2;
                switch ( LA(1) )
                {
                    case BNOT:
                    case COLONx2:
                    case CharLiteral:
                    case DECR:
                    case DOLLAR_LCURLY:
                    case FloatLiteral:
                    case ID:
                    case INCR:
                    case IntegerLiteral:
                    case LBRACKET:
                    case LBRACKET_BAR:
                    case LCURLY:
                    case LNOT:
                    case LPAREN:
                    case LPAREN_INVOKE:
                    case MINUS:
                    case OP_POP:
                    case OP_TOP:
                    case PERCENT_LCURLY:
                    case PLUS:
                    case RationalLiteral:
                    case StringLiteral:
                    case 158:
                    case 159:
                    case 160:
                    case 161:
                    case 162:
                    case 237:
                    case 256:
                    case 265:
                    case 277:
                    case 280:
                    case 294:
                    case 313:
                    case 330:
                    case 331:
                    case 332:
                    case 343:
                    case 347:
                    case 372:
                    case 397:
                    	{
                    		alt490=1;
                    	}
                        break;
                }

                switch (alt490)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5798:6: lp= labelled_argument ( COMMA lp= labelled_argument )*
            	    {
            	        FOLLOWPUSH(FOLLOW_labelled_argument_in_invoke_routine_params20534);
            	        lp=labelled_argument(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleinvoke_routine_paramsEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {

            	            	    	invokeRoutine->appendParameter(lp.label
            	            , lp.arg
            	            );
            	            	    
            	        }


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5802:6: ( COMMA lp= labelled_argument )*

            	        for (;;)
            	        {
            	            int alt489=2;
            	            switch ( LA(1) )
            	            {
            	            case COMMA:
            	            	{
            	            		alt489=1;
            	            	}
            	                break;

            	            }

            	            switch (alt489)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5802:8: COMMA lp= labelled_argument
            	        	    {
            	        	         MATCHT(COMMA, &FOLLOW_COMMA_in_invoke_routine_params20550);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruleinvoke_routine_paramsEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	        FOLLOWPUSH(FOLLOW_labelled_argument_in_invoke_routine_params20559);
            	        	        lp=labelled_argument(ctx);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruleinvoke_routine_paramsEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {

            	        	            	    	invokeRoutine->appendParameter(lp.label
            	        	            , lp.arg
            	        	            );
            	        	            	    
            	        	        }


            	        	    }
            	        	    break;

            	        	default:
            	        	    goto loop489;	/* break out of the loop */
            	        	    break;
            	            }
            	        }
            	        loop489: ; /* Jump out to here if this rule does not match */


            	    }
            	    break;

                }
            }

             MATCHT(RPAREN, &FOLLOW_RPAREN_in_invoke_routine_params20585);
            if  (HASEXCEPTION())
            {
                goto ruleinvoke_routine_paramsEx;
            }
            if (HASFAILED())
            {
                return ;
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruleinvoke_routine_paramsEx; /* Prevent compiler warnings */
    ruleinvoke_routine_paramsEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(213, invoke_routine_params_StartIndex); }

    return ;
}
/* $ANTLR end invoke_routine_params */

/**
 * $ANTLR start invoke_routine_returns
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5813:1: invoke_routine_returns[ sep::Routine * invokeRoutine ] : ( '-->' | 'returns:' ) ( LPAREN lp= labelled_argument ( COMMA lp= labelled_argument )* RPAREN |lp= labelled_argument ) ;
 */
static void
invoke_routine_returns(pfmlParser ctx, sep::Routine * invokeRoutine)
{
    ANTLR3_UINT32 invoke_routine_returns_StartIndex;

    fmlParser_labelled_argument_return lp;
    #undef	RETURN_TYPE_lp
    #define	RETURN_TYPE_lp fmlParser_labelled_argument_return

    /* Initialize rule variables
     */
    invoke_routine_returns_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(214)) )
    {
        {
        }



        return ;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5814:2: ( ( '-->' | 'returns:' ) ( LPAREN lp= labelled_argument ( COMMA lp= labelled_argument )* RPAREN |lp= labelled_argument ) )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5814:4: ( '-->' | 'returns:' ) ( LPAREN lp= labelled_argument ( COMMA lp= labelled_argument )* RPAREN |lp= labelled_argument )
        {
            if ( LA(1) == 163 || LA(1) == 365 )
            {
                CONSUME();
                PERRORRECOVERY=ANTLR3_FALSE;
                FAILEDFLAG=ANTLR3_FALSE;

            }
            else
            {
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
                EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
                EXCEPTION->expectingSet = NULL;

                goto ruleinvoke_routine_returnsEx;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5815:4: ( LPAREN lp= labelled_argument ( COMMA lp= labelled_argument )* RPAREN |lp= labelled_argument )
            {
                int alt492=2;
                switch ( LA(1) )
                {
                case LPAREN:
                	{
                		{
                		    int LA492_1 = LA(2);
                		    if ( (synpred946_fml(ctx)))
                		    {
                		        alt492=1;
                		    }
                		    else if ( (ANTLR3_TRUE))
                		    {
                		        alt492=2;
                		    }
                		    else
                		    {
                		        if (BACKTRACKING>0)
                		        {
                		            FAILEDFLAG = ANTLR3_TRUE;
                		            return ;
                		        }


                		        CONSTRUCTEX();
                		        EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                		        EXCEPTION->message      = (void *)"";
                		        EXCEPTION->decisionNum  = 492;
                		        EXCEPTION->state        = 1;


                		        goto ruleinvoke_routine_returnsEx;

                		    }
                		}
                	}
                    break;
                case BNOT:
                case COLONx2:
                case CharLiteral:
                case DECR:
                case DOLLAR_LCURLY:
                case FloatLiteral:
                case ID:
                case INCR:
                case IntegerLiteral:
                case LBRACKET:
                case LBRACKET_BAR:
                case LCURLY:
                case LNOT:
                case LPAREN_INVOKE:
                case MINUS:
                case OP_POP:
                case OP_TOP:
                case PERCENT_LCURLY:
                case PLUS:
                case RationalLiteral:
                case StringLiteral:
                case 158:
                case 159:
                case 160:
                case 161:
                case 162:
                case 237:
                case 256:
                case 265:
                case 277:
                case 280:
                case 294:
                case 313:
                case 330:
                case 331:
                case 332:
                case 343:
                case 347:
                case 372:
                case 397:
                	{
                		alt492=2;
                	}
                    break;

                default:
                    if (BACKTRACKING>0)
                    {
                        FAILEDFLAG = ANTLR3_TRUE;
                        return ;
                    }

                    CONSTRUCTEX();
                    EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                    EXCEPTION->message      = (void *)"";
                    EXCEPTION->decisionNum  = 492;
                    EXCEPTION->state        = 0;


                    goto ruleinvoke_routine_returnsEx;

                }

                switch (alt492)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5815:6: LPAREN lp= labelled_argument ( COMMA lp= labelled_argument )* RPAREN
            	    {
            	         MATCHT(LPAREN, &FOLLOW_LPAREN_in_invoke_routine_returns20614);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleinvoke_routine_returnsEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        FOLLOWPUSH(FOLLOW_labelled_argument_in_invoke_routine_returns20623);
            	        lp=labelled_argument(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleinvoke_routine_returnsEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {

            	            	    	invokeRoutine->appendReturn(lp.label
            	            , lp.arg
            	            );
            	            	    
            	        }


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5820:6: ( COMMA lp= labelled_argument )*

            	        for (;;)
            	        {
            	            int alt491=2;
            	            switch ( LA(1) )
            	            {
            	            case COMMA:
            	            	{
            	            		alt491=1;
            	            	}
            	                break;

            	            }

            	            switch (alt491)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5820:8: COMMA lp= labelled_argument
            	        	    {
            	        	         MATCHT(COMMA, &FOLLOW_COMMA_in_invoke_routine_returns20639);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruleinvoke_routine_returnsEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	        FOLLOWPUSH(FOLLOW_labelled_argument_in_invoke_routine_returns20650);
            	        	        lp=labelled_argument(ctx);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruleinvoke_routine_returnsEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {

            	        	            	    	invokeRoutine->appendReturn(lp.label
            	        	            , lp.arg
            	        	            );
            	        	            	      
            	        	        }


            	        	    }
            	        	    break;

            	        	default:
            	        	    goto loop491;	/* break out of the loop */
            	        	    break;
            	            }
            	        }
            	        loop491: ; /* Jump out to here if this rule does not match */


            	         MATCHT(RPAREN, &FOLLOW_RPAREN_in_invoke_routine_returns20674);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleinvoke_routine_returnsEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5828:6: lp= labelled_argument
            	    {
            	        FOLLOWPUSH(FOLLOW_labelled_argument_in_invoke_routine_returns20684);
            	        lp=labelled_argument(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleinvoke_routine_returnsEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {

            	            	    	invokeRoutine->appendReturn(lp.label
            	            , lp.arg
            	            );
            	            	    
            	        }


            	    }
            	    break;

                }
            }

        }

    }

    // This is where rules clean up and exit
    //
    goto ruleinvoke_routine_returnsEx; /* Prevent compiler warnings */
    ruleinvoke_routine_returnsEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(214, invoke_routine_returns_StartIndex); }

    return ;
}
/* $ANTLR end invoke_routine_returns */

/**
 * $ANTLR start statement_moc
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5877:1: statement_moc returns [ sep::BFCode ac ] : 'step_mark' StringLiteral SEMI ;
 */
static sep::BFCode
statement_moc(pfmlParser ctx)
{
    sep::BFCode ac;

    ANTLR3_UINT32 statement_moc_StartIndex;

    pANTLR3_COMMON_TOKEN    StringLiteral12;

    /* Initialize rule variables
     */
    statement_moc_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(215)) )
    {
        {
        }



        return ac;
    }

    StringLiteral12       = NULL;

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5879:2: ( 'step_mark' StringLiteral SEMI )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5879:4: 'step_mark' StringLiteral SEMI
        {
             MATCHT(385, &FOLLOW_385_in_statement_moc20722);
            if  (HASEXCEPTION())
            {
                goto rulestatement_mocEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            StringLiteral12 = (pANTLR3_COMMON_TOKEN) MATCHT(StringLiteral, &FOLLOW_StringLiteral_in_statement_moc20725);
            if  (HASEXCEPTION())
            {
                goto rulestatement_mocEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


             MATCHT(SEMI, &FOLLOW_SEMI_in_statement_moc20728);
            if  (HASEXCEPTION())
            {
                goto rulestatement_mocEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            if ( BACKTRACKING==0 )
            {

                		ac= NEW_STMT1(OP(STEP_MARK),
                			NEW_STRING(STR((StringLiteral12->getText(StringLiteral12))->chars)));

                	
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto rulestatement_mocEx; /* Prevent compiler warnings */
    rulestatement_mocEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(215, statement_moc_StartIndex); }

    return ac;
}
/* $ANTLR end statement_moc */

/**
 * $ANTLR start expression
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5895:1: expression returns [ sep::BF bf ] : e= conditionalExpression ( ASSIGN e= expression | ASSIGN_MACRO e= expression | ASSIGN_AFTER e= expression | PLUS_ASSIGN e= expression | PLUS_ASSIGN_AFTER e= expression | MINUS_ASSIGN e= expression | MINUS_ASSIGN_AFTER e= expression | STAR_ASSIGN e= expression | STAR_ASSIGN_AFTER e= expression | DIV_ASSIGN e= expression | DIV_ASSIGN_AFTER e= expression | MOD_ASSIGN e= expression | MOD_ASSIGN_AFTER e= expression | LAND_ASSIGN e= expression | LAND_ASSIGN_AFTER e= expression | LOR_ASSIGN e= expression | LOR_ASSIGN_AFTER e= expression | BAND_ASSIGN e= expression | BAND_ASSIGN_AFTER e= expression | BOR_ASSIGN e= expression | BOR_ASSIGN_AFTER e= expression | BXOR_ASSIGN e= expression | BXOR_ASSIGN_AFTER e= expression | LSHIFT_ASSIGN e= expression | LSHIFT_ASSIGN_AFTER e= expression | RSHIFT_ASSIGN e= expression | RSHIFT_ASSIGN_AFTER e= expression | OP_PUSH e= expression | OP_ASSIGN_TOP e= expression | OP_POP e= expression )? ;
 */
static sep::BF
expression(pfmlParser ctx)
{
    sep::BF bf;

    ANTLR3_UINT32 expression_StartIndex;

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    /* Initialize rule variables
     */
    expression_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(216)) )
    {
        {
        }



        return bf;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5897:2: (e= conditionalExpression ( ASSIGN e= expression | ASSIGN_MACRO e= expression | ASSIGN_AFTER e= expression | PLUS_ASSIGN e= expression | PLUS_ASSIGN_AFTER e= expression | MINUS_ASSIGN e= expression | MINUS_ASSIGN_AFTER e= expression | STAR_ASSIGN e= expression | STAR_ASSIGN_AFTER e= expression | DIV_ASSIGN e= expression | DIV_ASSIGN_AFTER e= expression | MOD_ASSIGN e= expression | MOD_ASSIGN_AFTER e= expression | LAND_ASSIGN e= expression | LAND_ASSIGN_AFTER e= expression | LOR_ASSIGN e= expression | LOR_ASSIGN_AFTER e= expression | BAND_ASSIGN e= expression | BAND_ASSIGN_AFTER e= expression | BOR_ASSIGN e= expression | BOR_ASSIGN_AFTER e= expression | BXOR_ASSIGN e= expression | BXOR_ASSIGN_AFTER e= expression | LSHIFT_ASSIGN e= expression | LSHIFT_ASSIGN_AFTER e= expression | RSHIFT_ASSIGN e= expression | RSHIFT_ASSIGN_AFTER e= expression | OP_PUSH e= expression | OP_ASSIGN_TOP e= expression | OP_POP e= expression )? )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5897:4: e= conditionalExpression ( ASSIGN e= expression | ASSIGN_MACRO e= expression | ASSIGN_AFTER e= expression | PLUS_ASSIGN e= expression | PLUS_ASSIGN_AFTER e= expression | MINUS_ASSIGN e= expression | MINUS_ASSIGN_AFTER e= expression | STAR_ASSIGN e= expression | STAR_ASSIGN_AFTER e= expression | DIV_ASSIGN e= expression | DIV_ASSIGN_AFTER e= expression | MOD_ASSIGN e= expression | MOD_ASSIGN_AFTER e= expression | LAND_ASSIGN e= expression | LAND_ASSIGN_AFTER e= expression | LOR_ASSIGN e= expression | LOR_ASSIGN_AFTER e= expression | BAND_ASSIGN e= expression | BAND_ASSIGN_AFTER e= expression | BOR_ASSIGN e= expression | BOR_ASSIGN_AFTER e= expression | BXOR_ASSIGN e= expression | BXOR_ASSIGN_AFTER e= expression | LSHIFT_ASSIGN e= expression | LSHIFT_ASSIGN_AFTER e= expression | RSHIFT_ASSIGN e= expression | RSHIFT_ASSIGN_AFTER e= expression | OP_PUSH e= expression | OP_ASSIGN_TOP e= expression | OP_POP e= expression )?
        {
            FOLLOWPUSH(FOLLOW_conditionalExpression_in_expression20757);
            e=conditionalExpression(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruleexpressionEx;
            }
            if (HASFAILED())
            {
                return bf;
            }


            if ( BACKTRACKING==0 )
            {
                 bf= 
                e
                ;
                 
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5899:2: ( ASSIGN e= expression | ASSIGN_MACRO e= expression | ASSIGN_AFTER e= expression | PLUS_ASSIGN e= expression | PLUS_ASSIGN_AFTER e= expression | MINUS_ASSIGN e= expression | MINUS_ASSIGN_AFTER e= expression | STAR_ASSIGN e= expression | STAR_ASSIGN_AFTER e= expression | DIV_ASSIGN e= expression | DIV_ASSIGN_AFTER e= expression | MOD_ASSIGN e= expression | MOD_ASSIGN_AFTER e= expression | LAND_ASSIGN e= expression | LAND_ASSIGN_AFTER e= expression | LOR_ASSIGN e= expression | LOR_ASSIGN_AFTER e= expression | BAND_ASSIGN e= expression | BAND_ASSIGN_AFTER e= expression | BOR_ASSIGN e= expression | BOR_ASSIGN_AFTER e= expression | BXOR_ASSIGN e= expression | BXOR_ASSIGN_AFTER e= expression | LSHIFT_ASSIGN e= expression | LSHIFT_ASSIGN_AFTER e= expression | RSHIFT_ASSIGN e= expression | RSHIFT_ASSIGN_AFTER e= expression | OP_PUSH e= expression | OP_ASSIGN_TOP e= expression | OP_POP e= expression )?
            {
                int alt493=31;
                switch ( LA(1) )
                {
                    case ASSIGN:
                    	{
                    		{
                    		    int LA493_1 = LA(2);
                    		    if ( (synpred947_fml(ctx)))
                    		    {
                    		        alt493=1;
                    		    }
                    		}
                    	}
                        break;
                    case ASSIGN_MACRO:
                    	{
                    		{
                    		    int LA493_4 = LA(2);
                    		    if ( (synpred948_fml(ctx)))
                    		    {
                    		        alt493=2;
                    		    }
                    		}
                    	}
                        break;
                    case ASSIGN_AFTER:
                    	{
                    		{
                    		    int LA493_6 = LA(2);
                    		    if ( (synpred949_fml(ctx)))
                    		    {
                    		        alt493=3;
                    		    }
                    		}
                    	}
                        break;
                    case PLUS_ASSIGN:
                    	{
                    		{
                    		    int LA493_8 = LA(2);
                    		    if ( (synpred950_fml(ctx)))
                    		    {
                    		        alt493=4;
                    		    }
                    		}
                    	}
                        break;
                    case PLUS_ASSIGN_AFTER:
                    	{
                    		{
                    		    int LA493_10 = LA(2);
                    		    if ( (synpred951_fml(ctx)))
                    		    {
                    		        alt493=5;
                    		    }
                    		}
                    	}
                        break;
                    case MINUS_ASSIGN:
                    	{
                    		{
                    		    int LA493_12 = LA(2);
                    		    if ( (synpred952_fml(ctx)))
                    		    {
                    		        alt493=6;
                    		    }
                    		}
                    	}
                        break;
                    case MINUS_ASSIGN_AFTER:
                    	{
                    		{
                    		    int LA493_14 = LA(2);
                    		    if ( (synpred953_fml(ctx)))
                    		    {
                    		        alt493=7;
                    		    }
                    		}
                    	}
                        break;
                    case STAR_ASSIGN:
                    	{
                    		{
                    		    int LA493_16 = LA(2);
                    		    if ( (synpred954_fml(ctx)))
                    		    {
                    		        alt493=8;
                    		    }
                    		}
                    	}
                        break;
                    case STAR_ASSIGN_AFTER:
                    	{
                    		{
                    		    int LA493_18 = LA(2);
                    		    if ( (synpred955_fml(ctx)))
                    		    {
                    		        alt493=9;
                    		    }
                    		}
                    	}
                        break;
                    case DIV_ASSIGN:
                    	{
                    		{
                    		    int LA493_20 = LA(2);
                    		    if ( (synpred956_fml(ctx)))
                    		    {
                    		        alt493=10;
                    		    }
                    		}
                    	}
                        break;
                    case DIV_ASSIGN_AFTER:
                    	{
                    		{
                    		    int LA493_22 = LA(2);
                    		    if ( (synpred957_fml(ctx)))
                    		    {
                    		        alt493=11;
                    		    }
                    		}
                    	}
                        break;
                    case MOD_ASSIGN:
                    	{
                    		{
                    		    int LA493_24 = LA(2);
                    		    if ( (synpred958_fml(ctx)))
                    		    {
                    		        alt493=12;
                    		    }
                    		}
                    	}
                        break;
                    case MOD_ASSIGN_AFTER:
                    	{
                    		{
                    		    int LA493_26 = LA(2);
                    		    if ( (synpred959_fml(ctx)))
                    		    {
                    		        alt493=13;
                    		    }
                    		}
                    	}
                        break;
                    case LAND_ASSIGN:
                    	{
                    		{
                    		    int LA493_28 = LA(2);
                    		    if ( (synpred960_fml(ctx)))
                    		    {
                    		        alt493=14;
                    		    }
                    		}
                    	}
                        break;
                    case LAND_ASSIGN_AFTER:
                    	{
                    		{
                    		    int LA493_30 = LA(2);
                    		    if ( (synpred961_fml(ctx)))
                    		    {
                    		        alt493=15;
                    		    }
                    		}
                    	}
                        break;
                    case LOR_ASSIGN:
                    	{
                    		{
                    		    int LA493_32 = LA(2);
                    		    if ( (synpred962_fml(ctx)))
                    		    {
                    		        alt493=16;
                    		    }
                    		}
                    	}
                        break;
                    case LOR_ASSIGN_AFTER:
                    	{
                    		{
                    		    int LA493_34 = LA(2);
                    		    if ( (synpred963_fml(ctx)))
                    		    {
                    		        alt493=17;
                    		    }
                    		}
                    	}
                        break;
                    case BAND_ASSIGN:
                    	{
                    		{
                    		    int LA493_36 = LA(2);
                    		    if ( (synpred964_fml(ctx)))
                    		    {
                    		        alt493=18;
                    		    }
                    		}
                    	}
                        break;
                    case BAND_ASSIGN_AFTER:
                    	{
                    		{
                    		    int LA493_38 = LA(2);
                    		    if ( (synpred965_fml(ctx)))
                    		    {
                    		        alt493=19;
                    		    }
                    		}
                    	}
                        break;
                    case BOR_ASSIGN:
                    	{
                    		{
                    		    int LA493_40 = LA(2);
                    		    if ( (synpred966_fml(ctx)))
                    		    {
                    		        alt493=20;
                    		    }
                    		}
                    	}
                        break;
                    case BOR_ASSIGN_AFTER:
                    	{
                    		{
                    		    int LA493_42 = LA(2);
                    		    if ( (synpred967_fml(ctx)))
                    		    {
                    		        alt493=21;
                    		    }
                    		}
                    	}
                        break;
                    case BXOR_ASSIGN:
                    	{
                    		{
                    		    int LA493_44 = LA(2);
                    		    if ( (synpred968_fml(ctx)))
                    		    {
                    		        alt493=22;
                    		    }
                    		}
                    	}
                        break;
                    case BXOR_ASSIGN_AFTER:
                    	{
                    		{
                    		    int LA493_46 = LA(2);
                    		    if ( (synpred969_fml(ctx)))
                    		    {
                    		        alt493=23;
                    		    }
                    		}
                    	}
                        break;
                    case LSHIFT_ASSIGN:
                    	{
                    		{
                    		    int LA493_48 = LA(2);
                    		    if ( (synpred970_fml(ctx)))
                    		    {
                    		        alt493=24;
                    		    }
                    		}
                    	}
                        break;
                    case LSHIFT_ASSIGN_AFTER:
                    	{
                    		{
                    		    int LA493_50 = LA(2);
                    		    if ( (synpred971_fml(ctx)))
                    		    {
                    		        alt493=25;
                    		    }
                    		}
                    	}
                        break;
                    case RSHIFT_ASSIGN:
                    	{
                    		{
                    		    int LA493_52 = LA(2);
                    		    if ( (synpred972_fml(ctx)))
                    		    {
                    		        alt493=26;
                    		    }
                    		}
                    	}
                        break;
                    case RSHIFT_ASSIGN_AFTER:
                    	{
                    		{
                    		    int LA493_54 = LA(2);
                    		    if ( (synpred973_fml(ctx)))
                    		    {
                    		        alt493=27;
                    		    }
                    		}
                    	}
                        break;
                    case OP_PUSH:
                    	{
                    		{
                    		    int LA493_56 = LA(2);
                    		    if ( (synpred974_fml(ctx)))
                    		    {
                    		        alt493=28;
                    		    }
                    		}
                    	}
                        break;
                    case OP_ASSIGN_TOP:
                    	{
                    		{
                    		    int LA493_58 = LA(2);
                    		    if ( (synpred975_fml(ctx)))
                    		    {
                    		        alt493=29;
                    		    }
                    		}
                    	}
                        break;
                    case OP_POP:
                    	{
                    		{
                    		    int LA493_60 = LA(2);
                    		    if ( (synpred976_fml(ctx)))
                    		    {
                    		        alt493=30;
                    		    }
                    		}
                    	}
                        break;
                }

                switch (alt493)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5899:4: ASSIGN e= expression
            	    {
            	         MATCHT(ASSIGN, &FOLLOW_ASSIGN_in_expression20766);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_expression20771);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_CODE2(OP(ASSIGN), 
            	            bf
            	            , e
            	            );
            	             
            	        }


            	    }
            	    break;
            	case 2:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5902:4: ASSIGN_MACRO e= expression
            	    {
            	         MATCHT(ASSIGN_MACRO, &FOLLOW_ASSIGN_MACRO_in_expression20780);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_expression20785);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_CODE2(OP(ASSIGN_MACRO), 
            	            bf
            	            , e
            	            );
            	             
            	        }


            	    }
            	    break;
            	case 3:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5905:4: ASSIGN_AFTER e= expression
            	    {
            	         MATCHT(ASSIGN_AFTER, &FOLLOW_ASSIGN_AFTER_in_expression20794);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_expression20799);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_CODE2(OP(ASSIGN_AFTER), 
            	            bf
            	            , e
            	            );
            	             
            	        }


            	    }
            	    break;
            	case 4:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5908:4: PLUS_ASSIGN e= expression
            	    {
            	         MATCHT(PLUS_ASSIGN, &FOLLOW_PLUS_ASSIGN_in_expression20808);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_expression20813);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_STMT_ASSIGN_OP(OP(PLUS), 
            	            bf
            	            , e
            	            );
            	             
            	        }


            	    }
            	    break;
            	case 5:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5911:4: PLUS_ASSIGN_AFTER e= expression
            	    {
            	         MATCHT(PLUS_ASSIGN_AFTER, &FOLLOW_PLUS_ASSIGN_AFTER_in_expression20822);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_expression20827);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_STMT_ASSIGN_OP_AFTER(OP(PLUS), 
            	            bf
            	            , e
            	            );
            	             
            	        }


            	    }
            	    break;
            	case 6:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5914:4: MINUS_ASSIGN e= expression
            	    {
            	         MATCHT(MINUS_ASSIGN, &FOLLOW_MINUS_ASSIGN_in_expression20836);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_expression20841);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_STMT_ASSIGN_OP(OP(MINUS), 
            	            bf
            	            , e
            	            );
            	             
            	        }


            	    }
            	    break;
            	case 7:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5917:4: MINUS_ASSIGN_AFTER e= expression
            	    {
            	         MATCHT(MINUS_ASSIGN_AFTER, &FOLLOW_MINUS_ASSIGN_AFTER_in_expression20850);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_expression20855);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_STMT_ASSIGN_OP_AFTER(OP(MINUS), 
            	            bf
            	            , e
            	            );
            	             
            	        }


            	    }
            	    break;
            	case 8:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5920:4: STAR_ASSIGN e= expression
            	    {
            	         MATCHT(STAR_ASSIGN, &FOLLOW_STAR_ASSIGN_in_expression20864);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_expression20869);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_STMT_ASSIGN_OP(OP(MULT), 
            	            bf
            	            , e
            	            );
            	             
            	        }


            	    }
            	    break;
            	case 9:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5923:4: STAR_ASSIGN_AFTER e= expression
            	    {
            	         MATCHT(STAR_ASSIGN_AFTER, &FOLLOW_STAR_ASSIGN_AFTER_in_expression20878);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_expression20883);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_STMT_ASSIGN_OP_AFTER(OP(MULT), 
            	            bf
            	            , e
            	            );
            	             
            	        }


            	    }
            	    break;
            	case 10:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5926:4: DIV_ASSIGN e= expression
            	    {
            	         MATCHT(DIV_ASSIGN, &FOLLOW_DIV_ASSIGN_in_expression20892);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_expression20897);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_STMT_ASSIGN_OP(OP(DIV), 
            	            bf
            	            , e
            	            );
            	             
            	        }


            	    }
            	    break;
            	case 11:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5929:4: DIV_ASSIGN_AFTER e= expression
            	    {
            	         MATCHT(DIV_ASSIGN_AFTER, &FOLLOW_DIV_ASSIGN_AFTER_in_expression20906);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_expression20911);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_STMT_ASSIGN_OP_AFTER(OP(DIV), 
            	            bf
            	            , e
            	            );
            	             
            	        }


            	    }
            	    break;
            	case 12:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5932:4: MOD_ASSIGN e= expression
            	    {
            	         MATCHT(MOD_ASSIGN, &FOLLOW_MOD_ASSIGN_in_expression20920);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_expression20925);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_STMT_ASSIGN_OP(OP(MOD), 
            	            bf
            	            , e
            	            );
            	             
            	        }


            	    }
            	    break;
            	case 13:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5935:4: MOD_ASSIGN_AFTER e= expression
            	    {
            	         MATCHT(MOD_ASSIGN_AFTER, &FOLLOW_MOD_ASSIGN_AFTER_in_expression20934);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_expression20939);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_STMT_ASSIGN_OP_AFTER(OP(MOD), 
            	            bf
            	            , e
            	            );
            	             
            	        }


            	    }
            	    break;
            	case 14:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5938:4: LAND_ASSIGN e= expression
            	    {
            	         MATCHT(LAND_ASSIGN, &FOLLOW_LAND_ASSIGN_in_expression20948);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_expression20953);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_STMT_ASSIGN_OP(OP(AND), 
            	            bf
            	            , e
            	            );
            	             
            	        }


            	    }
            	    break;
            	case 15:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5941:4: LAND_ASSIGN_AFTER e= expression
            	    {
            	         MATCHT(LAND_ASSIGN_AFTER, &FOLLOW_LAND_ASSIGN_AFTER_in_expression20962);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_expression20967);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_STMT_ASSIGN_OP_AFTER(OP(AND), 
            	            bf
            	            , e
            	            );
            	             
            	        }


            	    }
            	    break;
            	case 16:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5944:4: LOR_ASSIGN e= expression
            	    {
            	         MATCHT(LOR_ASSIGN, &FOLLOW_LOR_ASSIGN_in_expression20976);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_expression20981);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_STMT_ASSIGN_OP(OP(OR), 
            	            bf
            	            , e
            	            );
            	             
            	        }


            	    }
            	    break;
            	case 17:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5947:4: LOR_ASSIGN_AFTER e= expression
            	    {
            	         MATCHT(LOR_ASSIGN_AFTER, &FOLLOW_LOR_ASSIGN_AFTER_in_expression20990);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_expression20995);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_STMT_ASSIGN_OP_AFTER(OP(OR), 
            	            bf
            	            , e
            	            );
            	             
            	        }


            	    }
            	    break;
            	case 18:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5950:4: BAND_ASSIGN e= expression
            	    {
            	         MATCHT(BAND_ASSIGN, &FOLLOW_BAND_ASSIGN_in_expression21004);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_expression21009);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_STMT_ASSIGN_OP(OP(BAND), 
            	            bf
            	            , e
            	            );
            	             
            	        }


            	    }
            	    break;
            	case 19:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5953:4: BAND_ASSIGN_AFTER e= expression
            	    {
            	         MATCHT(BAND_ASSIGN_AFTER, &FOLLOW_BAND_ASSIGN_AFTER_in_expression21018);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_expression21023);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_STMT_ASSIGN_OP_AFTER(OP(BAND), 
            	            bf
            	            , e
            	            );
            	             
            	        }


            	    }
            	    break;
            	case 20:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5956:4: BOR_ASSIGN e= expression
            	    {
            	         MATCHT(BOR_ASSIGN, &FOLLOW_BOR_ASSIGN_in_expression21032);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_expression21037);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_STMT_ASSIGN_OP(OP(BOR), 
            	            bf
            	            , e
            	            );
            	             
            	        }


            	    }
            	    break;
            	case 21:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5959:4: BOR_ASSIGN_AFTER e= expression
            	    {
            	         MATCHT(BOR_ASSIGN_AFTER, &FOLLOW_BOR_ASSIGN_AFTER_in_expression21046);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_expression21051);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_STMT_ASSIGN_OP_AFTER(OP(BOR), 
            	            bf
            	            , e
            	            );
            	             
            	        }


            	    }
            	    break;
            	case 22:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5962:4: BXOR_ASSIGN e= expression
            	    {
            	         MATCHT(BXOR_ASSIGN, &FOLLOW_BXOR_ASSIGN_in_expression21060);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_expression21065);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_STMT_ASSIGN_OP(OP(BXOR), 
            	            bf
            	            , e
            	            );
            	             
            	        }


            	    }
            	    break;
            	case 23:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5965:4: BXOR_ASSIGN_AFTER e= expression
            	    {
            	         MATCHT(BXOR_ASSIGN_AFTER, &FOLLOW_BXOR_ASSIGN_AFTER_in_expression21074);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_expression21079);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_STMT_ASSIGN_OP_AFTER(OP(BXOR), 
            	            bf
            	            , e
            	            );
            	             
            	        }


            	    }
            	    break;
            	case 24:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5968:4: LSHIFT_ASSIGN e= expression
            	    {
            	         MATCHT(LSHIFT_ASSIGN, &FOLLOW_LSHIFT_ASSIGN_in_expression21088);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_expression21093);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_STMT_ASSIGN_OP(OP(LSHIFT), 
            	            bf
            	            , e
            	            );
            	             
            	        }


            	    }
            	    break;
            	case 25:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5971:4: LSHIFT_ASSIGN_AFTER e= expression
            	    {
            	         MATCHT(LSHIFT_ASSIGN_AFTER, &FOLLOW_LSHIFT_ASSIGN_AFTER_in_expression21102);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_expression21107);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_STMT_ASSIGN_OP_AFTER(OP(LSHIFT), 
            	            bf
            	            , e
            	            );
            	             
            	        }


            	    }
            	    break;
            	case 26:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5974:4: RSHIFT_ASSIGN e= expression
            	    {
            	         MATCHT(RSHIFT_ASSIGN, &FOLLOW_RSHIFT_ASSIGN_in_expression21116);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_expression21121);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_STMT_ASSIGN_OP(OP(RSHIFT), 
            	            bf
            	            , e
            	            );
            	             
            	        }


            	    }
            	    break;
            	case 27:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5977:4: RSHIFT_ASSIGN_AFTER e= expression
            	    {
            	         MATCHT(RSHIFT_ASSIGN_AFTER, &FOLLOW_RSHIFT_ASSIGN_AFTER_in_expression21130);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_expression21135);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_STMT_ASSIGN_OP_AFTER(OP(RSHIFT), 
            	            bf
            	            , e
            	            );
            	             
            	        }


            	    }
            	    break;
            	case 28:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5980:4: OP_PUSH e= expression
            	    {
            	         MATCHT(OP_PUSH, &FOLLOW_OP_PUSH_in_expression21144);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_expression21149);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_CODE2(OP(PUSH), 
            	            bf
            	            , e
            	            );
            	             
            	        }


            	    }
            	    break;
            	case 29:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5983:4: OP_ASSIGN_TOP e= expression
            	    {
            	         MATCHT(OP_ASSIGN_TOP, &FOLLOW_OP_ASSIGN_TOP_in_expression21158);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_expression21163);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_CODE2(OP(ASSIGN_TOP), 
            	            bf
            	            , e
            	            );
            	             
            	        }


            	    }
            	    break;
            	case 30:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5986:4: OP_POP e= expression
            	    {
            	         MATCHT(OP_POP, &FOLLOW_OP_POP_in_expression21172);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_expression21177);
            	        e=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleexpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_CODE2(OP(POP), 
            	            bf
            	            , e
            	            );
            	             
            	        }


            	    }
            	    break;

                }
            }

        }

    }

    // This is where rules clean up and exit
    //
    goto ruleexpressionEx; /* Prevent compiler warnings */
    ruleexpressionEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(216, expression_StartIndex); }

    return bf;
}
/* $ANTLR end expression */

/**
 * $ANTLR start conditionalExpression
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5995:1: conditionalExpression returns [ sep::BF bf ] : e= scheduleExpression ( QUESTION th= expression COLON el= expression )? ;
 */
static sep::BF
conditionalExpression(pfmlParser ctx)
{
    sep::BF bf;

    ANTLR3_UINT32 conditionalExpression_StartIndex;

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    sep::BF th;
    #undef	RETURN_TYPE_th
    #define	RETURN_TYPE_th sep::BF

    sep::BF el;
    #undef	RETURN_TYPE_el
    #define	RETURN_TYPE_el sep::BF

    /* Initialize rule variables
     */
    conditionalExpression_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(217)) )
    {
        {
        }



        return bf;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5997:2: (e= scheduleExpression ( QUESTION th= expression COLON el= expression )? )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5997:4: e= scheduleExpression ( QUESTION th= expression COLON el= expression )?
        {
            FOLLOWPUSH(FOLLOW_scheduleExpression_in_conditionalExpression21205);
            e=scheduleExpression(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruleconditionalExpressionEx;
            }
            if (HASFAILED())
            {
                return bf;
            }


            if ( BACKTRACKING==0 )
            {
                 bf= 
                e
                ;
                 
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5998:4: ( QUESTION th= expression COLON el= expression )?
            {
                int alt494=2;
                switch ( LA(1) )
                {
                    case QUESTION:
                    	{
                    		{
                    		    int LA494_1 = LA(2);
                    		    if ( (synpred977_fml(ctx)))
                    		    {
                    		        alt494=1;
                    		    }
                    		}
                    	}
                        break;
                }

                switch (alt494)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5998:6: QUESTION th= expression COLON el= expression
            	    {
            	         MATCHT(QUESTION, &FOLLOW_QUESTION_in_conditionalExpression21215);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleconditionalExpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_conditionalExpression21220);
            	        th=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleconditionalExpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	         MATCHT(COLON, &FOLLOW_COLON_in_conditionalExpression21223);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleconditionalExpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_expression_in_conditionalExpression21228);
            	        el=expression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleconditionalExpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_CODE3(OP(IFE), 
            	            bf
            	            , th
            	            , el
            	            );
            	             
            	        }


            	    }
            	    break;

                }
            }

        }

    }

    // This is where rules clean up and exit
    //
    goto ruleconditionalExpressionEx; /* Prevent compiler warnings */
    ruleconditionalExpressionEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(217, conditionalExpression_StartIndex); }

    return bf;
}
/* $ANTLR end conditionalExpression */

/**
 * $ANTLR start scheduleExpression
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6003:1: scheduleExpression returns [ sep::BF bf ] : e= conditionalOrExpression ( (op= op_sequence |op= op_scheduling |op= op_concurrency ) e= conditionalOrExpression )* ;
 */
static sep::BF
scheduleExpression(pfmlParser ctx)
{
    sep::BF bf;

    ANTLR3_UINT32 scheduleExpression_StartIndex;

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    sep::Operator * op;
    #undef	RETURN_TYPE_op
    #define	RETURN_TYPE_op sep::Operator *

    /* Initialize rule variables
     */
    scheduleExpression_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(218)) )
    {
        {
        }



        return bf;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6005:2: (e= conditionalOrExpression ( (op= op_sequence |op= op_scheduling |op= op_concurrency ) e= conditionalOrExpression )* )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6005:4: e= conditionalOrExpression ( (op= op_sequence |op= op_scheduling |op= op_concurrency ) e= conditionalOrExpression )*
        {
            FOLLOWPUSH(FOLLOW_conditionalOrExpression_in_scheduleExpression21256);
            e=conditionalOrExpression(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto rulescheduleExpressionEx;
            }
            if (HASFAILED())
            {
                return bf;
            }


            if ( BACKTRACKING==0 )
            {
                 bf= 
                e
                ;
                 
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6006:4: ( (op= op_sequence |op= op_scheduling |op= op_concurrency ) e= conditionalOrExpression )*

            for (;;)
            {
                int alt496=2;
                switch ( LA(1) )
                {
                case OP_ATOMIC_SEQUENCE:
                case OP_CONCURRENCY_AND:
                case OP_CONCURRENCY_ASYNC:
                case OP_CONCURRENCY_INTERLEAVING:
                case OP_CONCURRENCY_OR:
                case OP_CONCURRENCY_PARALLEL:
                case OP_CONCURRENCY_RDV_AND:
                case OP_CONCURRENCY_RDV_ASYNC:
                case OP_CONCURRENCY_RDV_INTERLEAVING:
                case OP_CONCURRENCY_RDV_OR:
                case OP_CONCURRENCY_RDV_PARALLEL:
                case OP_NON_DETERMINISM:
                case OP_SCHEDULE_AND_THEN:
                case OP_SCHEDULE_GT:
                case OP_SCHEDULE_LT:
                case OP_SCHEDULE_OR_ELSE:
                case OP_SCHEDULE_XOR:
                case OP_SEQUENCE:
                case OP_SEQUENCE_SIDE:
                case OP_SEQUENCE_WEAK:
                	{
                		{
                		   /* dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState)
                		    */
                		    int LA496_1 = LA(2);
                		    if ( (synpred980_fml(ctx)))
                		    {
                		        alt496=1;
                		    }

                		}
                	}
                    break;

                }

                switch (alt496)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6006:6: (op= op_sequence |op= op_scheduling |op= op_concurrency ) e= conditionalOrExpression
            	    {
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6006:6: (op= op_sequence |op= op_scheduling |op= op_concurrency )
            	        {
            	            int alt495=3;
            	            switch ( LA(1) )
            	            {
            	            case OP_ATOMIC_SEQUENCE:
            	            case OP_SEQUENCE:
            	            case OP_SEQUENCE_SIDE:
            	            case OP_SEQUENCE_WEAK:
            	            	{
            	            		alt495=1;
            	            	}
            	                break;
            	            case OP_NON_DETERMINISM:
            	            case OP_SCHEDULE_AND_THEN:
            	            case OP_SCHEDULE_GT:
            	            case OP_SCHEDULE_LT:
            	            case OP_SCHEDULE_OR_ELSE:
            	            case OP_SCHEDULE_XOR:
            	            	{
            	            		alt495=2;
            	            	}
            	                break;
            	            case OP_CONCURRENCY_AND:
            	            case OP_CONCURRENCY_ASYNC:
            	            case OP_CONCURRENCY_INTERLEAVING:
            	            case OP_CONCURRENCY_OR:
            	            case OP_CONCURRENCY_PARALLEL:
            	            case OP_CONCURRENCY_RDV_AND:
            	            case OP_CONCURRENCY_RDV_ASYNC:
            	            case OP_CONCURRENCY_RDV_INTERLEAVING:
            	            case OP_CONCURRENCY_RDV_OR:
            	            case OP_CONCURRENCY_RDV_PARALLEL:
            	            	{
            	            		alt495=3;
            	            	}
            	                break;

            	            default:
            	                if (BACKTRACKING>0)
            	                {
            	                    FAILEDFLAG = ANTLR3_TRUE;
            	                    return bf;
            	                }

            	                CONSTRUCTEX();
            	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
            	                EXCEPTION->message      = (void *)"";
            	                EXCEPTION->decisionNum  = 495;
            	                EXCEPTION->state        = 0;


            	                goto rulescheduleExpressionEx;

            	            }

            	            switch (alt495)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6006:8: op= op_sequence
            	        	    {
            	        	        FOLLOWPUSH(FOLLOW_op_sequence_in_scheduleExpression21270);
            	        	        op=op_sequence(ctx);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto rulescheduleExpressionEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return bf;
            	        	        }


            	        	    }
            	        	    break;
            	        	case 2:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6006:27: op= op_scheduling
            	        	    {
            	        	        FOLLOWPUSH(FOLLOW_op_scheduling_in_scheduleExpression21278);
            	        	        op=op_scheduling(ctx);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto rulescheduleExpressionEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return bf;
            	        	        }


            	        	    }
            	        	    break;
            	        	case 3:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6006:48: op= op_concurrency
            	        	    {
            	        	        FOLLOWPUSH(FOLLOW_op_concurrency_in_scheduleExpression21286);
            	        	        op=op_concurrency(ctx);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto rulescheduleExpressionEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return bf;
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	        FOLLOWPUSH(FOLLOW_conditionalOrExpression_in_scheduleExpression21297);
            	        e=conditionalOrExpression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulescheduleExpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_CODE_FLAT(op, 
            	            bf
            	            , e
            	            );
            	             
            	        }


            	    }
            	    break;

            	default:
            	    goto loop496;	/* break out of the loop */
            	    break;
                }
            }
            loop496: ; /* Jump out to here if this rule does not match */


        }

    }

    // This is where rules clean up and exit
    //
    goto rulescheduleExpressionEx; /* Prevent compiler warnings */
    rulescheduleExpressionEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(218, scheduleExpression_StartIndex); }

    return bf;
}
/* $ANTLR end scheduleExpression */

/**
 * $ANTLR start conditionalOrExpression
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6011:1: conditionalOrExpression returns [ sep::BF bf ] : e= conditionalAndExpression ( LOR e= conditionalAndExpression )* ;
 */
static sep::BF
conditionalOrExpression(pfmlParser ctx)
{
    sep::BF bf;

    ANTLR3_UINT32 conditionalOrExpression_StartIndex;

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    /* Initialize rule variables
     */
    conditionalOrExpression_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(219)) )
    {
        {
        }



        return bf;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6013:2: (e= conditionalAndExpression ( LOR e= conditionalAndExpression )* )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6013:4: e= conditionalAndExpression ( LOR e= conditionalAndExpression )*
        {
            FOLLOWPUSH(FOLLOW_conditionalAndExpression_in_conditionalOrExpression21323);
            e=conditionalAndExpression(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruleconditionalOrExpressionEx;
            }
            if (HASFAILED())
            {
                return bf;
            }


            if ( BACKTRACKING==0 )
            {
                 bf= 
                e
                ;
                 
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6014:4: ( LOR e= conditionalAndExpression )*

            for (;;)
            {
                int alt497=2;
                switch ( LA(1) )
                {
                case LOR:
                	{
                		{
                		   /* dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState)
                		    */
                		    int LA497_1 = LA(2);
                		    if ( (synpred981_fml(ctx)))
                		    {
                		        alt497=1;
                		    }

                		}
                	}
                    break;

                }

                switch (alt497)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6014:6: LOR e= conditionalAndExpression
            	    {
            	         MATCHT(LOR, &FOLLOW_LOR_in_conditionalOrExpression21333);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleconditionalOrExpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_conditionalAndExpression_in_conditionalOrExpression21337);
            	        e=conditionalAndExpression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleconditionalOrExpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_CODE_FLAT(OP(OR), 
            	            bf
            	            , e
            	            );
            	             
            	        }


            	    }
            	    break;

            	default:
            	    goto loop497;	/* break out of the loop */
            	    break;
                }
            }
            loop497: ; /* Jump out to here if this rule does not match */


        }

    }

    // This is where rules clean up and exit
    //
    goto ruleconditionalOrExpressionEx; /* Prevent compiler warnings */
    ruleconditionalOrExpressionEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(219, conditionalOrExpression_StartIndex); }

    return bf;
}
/* $ANTLR end conditionalOrExpression */

/**
 * $ANTLR start conditionalAndExpression
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6019:1: conditionalAndExpression returns [ sep::BF bf ] : e= bitwiseOrExpression ( LAND e= bitwiseOrExpression )* ;
 */
static sep::BF
conditionalAndExpression(pfmlParser ctx)
{
    sep::BF bf;

    ANTLR3_UINT32 conditionalAndExpression_StartIndex;

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    /* Initialize rule variables
     */
    conditionalAndExpression_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(220)) )
    {
        {
        }



        return bf;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6021:2: (e= bitwiseOrExpression ( LAND e= bitwiseOrExpression )* )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6021:4: e= bitwiseOrExpression ( LAND e= bitwiseOrExpression )*
        {
            FOLLOWPUSH(FOLLOW_bitwiseOrExpression_in_conditionalAndExpression21365);
            e=bitwiseOrExpression(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruleconditionalAndExpressionEx;
            }
            if (HASFAILED())
            {
                return bf;
            }


            if ( BACKTRACKING==0 )
            {
                 bf= 
                e
                ;
                 
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6022:4: ( LAND e= bitwiseOrExpression )*

            for (;;)
            {
                int alt498=2;
                switch ( LA(1) )
                {
                case LAND:
                	{
                		{
                		   /* dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState)
                		    */
                		    int LA498_1 = LA(2);
                		    if ( (synpred982_fml(ctx)))
                		    {
                		        alt498=1;
                		    }

                		}
                	}
                    break;

                }

                switch (alt498)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6022:6: LAND e= bitwiseOrExpression
            	    {
            	         MATCHT(LAND, &FOLLOW_LAND_in_conditionalAndExpression21375);
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleconditionalAndExpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_bitwiseOrExpression_in_conditionalAndExpression21379);
            	        e=bitwiseOrExpression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleconditionalAndExpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_CODE_FLAT(OP(AND), 
            	            bf
            	            , e
            	            );
            	             
            	        }


            	    }
            	    break;

            	default:
            	    goto loop498;	/* break out of the loop */
            	    break;
                }
            }
            loop498: ; /* Jump out to here if this rule does not match */


        }

    }

    // This is where rules clean up and exit
    //
    goto ruleconditionalAndExpressionEx; /* Prevent compiler warnings */
    ruleconditionalAndExpressionEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(220, conditionalAndExpression_StartIndex); }

    return bf;
}
/* $ANTLR end conditionalAndExpression */

/**
 * $ANTLR start bitwiseOrExpression
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6027:1: bitwiseOrExpression returns [ sep::BF bf ] : e= bitwiseXorExpression ( BOR e= bitwiseXorExpression )* ;
 */
static sep::BF
bitwiseOrExpression(pfmlParser ctx)
{
    sep::BF bf;

    ANTLR3_UINT32 bitwiseOrExpression_StartIndex;

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    /* Initialize rule variables
     */
    bitwiseOrExpression_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(221)) )
    {
        {
        }



        return bf;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6029:2: (e= bitwiseXorExpression ( BOR e= bitwiseXorExpression )* )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6029:4: e= bitwiseXorExpression ( BOR e= bitwiseXorExpression )*
        {
            FOLLOWPUSH(FOLLOW_bitwiseXorExpression_in_bitwiseOrExpression21407);
            e=bitwiseXorExpression(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto rulebitwiseOrExpressionEx;
            }
            if (HASFAILED())
            {
                return bf;
            }


            if ( BACKTRACKING==0 )
            {
                 bf= 
                e
                ;
                 
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6030:4: ( BOR e= bitwiseXorExpression )*

            for (;;)
            {
                int alt499=2;
                switch ( LA(1) )
                {
                case BOR:
                	{
                		{
                		   /* dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState)
                		    */
                		    int LA499_1 = LA(2);
                		    if ( (synpred983_fml(ctx)))
                		    {
                		        alt499=1;
                		    }

                		}
                	}
                    break;

                }

                switch (alt499)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6030:6: BOR e= bitwiseXorExpression
            	    {
            	         MATCHT(BOR, &FOLLOW_BOR_in_bitwiseOrExpression21417);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulebitwiseOrExpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_bitwiseXorExpression_in_bitwiseOrExpression21421);
            	        e=bitwiseXorExpression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulebitwiseOrExpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_CODE_FLAT(OP(BOR), 
            	            bf
            	            , e
            	            );
            	             
            	        }


            	    }
            	    break;

            	default:
            	    goto loop499;	/* break out of the loop */
            	    break;
                }
            }
            loop499: ; /* Jump out to here if this rule does not match */


        }

    }

    // This is where rules clean up and exit
    //
    goto rulebitwiseOrExpressionEx; /* Prevent compiler warnings */
    rulebitwiseOrExpressionEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(221, bitwiseOrExpression_StartIndex); }

    return bf;
}
/* $ANTLR end bitwiseOrExpression */

/**
 * $ANTLR start bitwiseXorExpression
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6035:1: bitwiseXorExpression returns [ sep::BF bf ] : e= bitwiseAndExpression ( BXOR e= bitwiseAndExpression )* ;
 */
static sep::BF
bitwiseXorExpression(pfmlParser ctx)
{
    sep::BF bf;

    ANTLR3_UINT32 bitwiseXorExpression_StartIndex;

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    /* Initialize rule variables
     */
    bitwiseXorExpression_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(222)) )
    {
        {
        }



        return bf;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6037:2: (e= bitwiseAndExpression ( BXOR e= bitwiseAndExpression )* )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6037:4: e= bitwiseAndExpression ( BXOR e= bitwiseAndExpression )*
        {
            FOLLOWPUSH(FOLLOW_bitwiseAndExpression_in_bitwiseXorExpression21449);
            e=bitwiseAndExpression(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto rulebitwiseXorExpressionEx;
            }
            if (HASFAILED())
            {
                return bf;
            }


            if ( BACKTRACKING==0 )
            {
                 bf= 
                e
                ;
                 
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6038:4: ( BXOR e= bitwiseAndExpression )*

            for (;;)
            {
                int alt500=2;
                switch ( LA(1) )
                {
                case BXOR:
                	{
                		{
                		   /* dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState)
                		    */
                		    int LA500_1 = LA(2);
                		    if ( (synpred984_fml(ctx)))
                		    {
                		        alt500=1;
                		    }

                		}
                	}
                    break;

                }

                switch (alt500)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6038:6: BXOR e= bitwiseAndExpression
            	    {
            	         MATCHT(BXOR, &FOLLOW_BXOR_in_bitwiseXorExpression21459);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulebitwiseXorExpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_bitwiseAndExpression_in_bitwiseXorExpression21463);
            	        e=bitwiseAndExpression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulebitwiseXorExpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_CODE_FLAT(OP(BXOR), 
            	            bf
            	            , e
            	            );
            	             
            	        }


            	    }
            	    break;

            	default:
            	    goto loop500;	/* break out of the loop */
            	    break;
                }
            }
            loop500: ; /* Jump out to here if this rule does not match */


        }

    }

    // This is where rules clean up and exit
    //
    goto rulebitwiseXorExpressionEx; /* Prevent compiler warnings */
    rulebitwiseXorExpressionEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(222, bitwiseXorExpression_StartIndex); }

    return bf;
}
/* $ANTLR end bitwiseXorExpression */

/**
 * $ANTLR start bitwiseAndExpression
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6043:1: bitwiseAndExpression returns [ sep::BF bf ] : e= equalityExpression ( BAND e= equalityExpression )* ;
 */
static sep::BF
bitwiseAndExpression(pfmlParser ctx)
{
    sep::BF bf;

    ANTLR3_UINT32 bitwiseAndExpression_StartIndex;

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    /* Initialize rule variables
     */
    bitwiseAndExpression_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(223)) )
    {
        {
        }



        return bf;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6045:2: (e= equalityExpression ( BAND e= equalityExpression )* )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6045:4: e= equalityExpression ( BAND e= equalityExpression )*
        {
            FOLLOWPUSH(FOLLOW_equalityExpression_in_bitwiseAndExpression21491);
            e=equalityExpression(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto rulebitwiseAndExpressionEx;
            }
            if (HASFAILED())
            {
                return bf;
            }


            if ( BACKTRACKING==0 )
            {
                 bf= 
                e
                ;
                 
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6046:4: ( BAND e= equalityExpression )*

            for (;;)
            {
                int alt501=2;
                switch ( LA(1) )
                {
                case BAND:
                	{
                		{
                		   /* dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState)
                		    */
                		    int LA501_1 = LA(2);
                		    if ( (synpred985_fml(ctx)))
                		    {
                		        alt501=1;
                		    }

                		}
                	}
                    break;

                }

                switch (alt501)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6046:6: BAND e= equalityExpression
            	    {
            	         MATCHT(BAND, &FOLLOW_BAND_in_bitwiseAndExpression21501);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulebitwiseAndExpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_equalityExpression_in_bitwiseAndExpression21505);
            	        e=equalityExpression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulebitwiseAndExpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_CODE_FLAT(OP(BAND), 
            	            bf
            	            , e
            	            );
            	             
            	        }


            	    }
            	    break;

            	default:
            	    goto loop501;	/* break out of the loop */
            	    break;
                }
            }
            loop501: ; /* Jump out to here if this rule does not match */


        }

    }

    // This is where rules clean up and exit
    //
    goto rulebitwiseAndExpressionEx; /* Prevent compiler warnings */
    rulebitwiseAndExpressionEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(223, bitwiseAndExpression_StartIndex); }

    return bf;
}
/* $ANTLR end bitwiseAndExpression */

/**
 * $ANTLR start equalityExpression
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6051:1: equalityExpression returns [ sep::BF bf ] : e= relationalExpression (op= equalOp e= relationalExpression (op= equalOp e= relationalExpression )* )? ;
 */
static sep::BF
equalityExpression(pfmlParser ctx)
{
    sep::BF bf;

    ANTLR3_UINT32 equalityExpression_StartIndex;

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    sep::Operator * op;
    #undef	RETURN_TYPE_op
    #define	RETURN_TYPE_op sep::Operator *

    /* Initialize rule variables
     */
    equalityExpression_StartIndex = INDEX();



    	sep::BFCode eqExpr;
    	sep::BF rhs;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(224)) )
    {
        {
        }



        return bf;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6057:2: (e= relationalExpression (op= equalOp e= relationalExpression (op= equalOp e= relationalExpression )* )? )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6057:4: e= relationalExpression (op= equalOp e= relationalExpression (op= equalOp e= relationalExpression )* )?
        {
            FOLLOWPUSH(FOLLOW_relationalExpression_in_equalityExpression21537);
            e=relationalExpression(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruleequalityExpressionEx;
            }
            if (HASFAILED())
            {
                return bf;
            }


            if ( BACKTRACKING==0 )
            {
                 bf= 
                e
                ;
                 
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6058:4: (op= equalOp e= relationalExpression (op= equalOp e= relationalExpression )* )?
            {
                int alt503=2;
                switch ( LA(1) )
                {
                    case EQUAL:
                    case NEQUAL:
                    case NSEQUAL:
                    case SEQUAL:
                    	{
                    		{
                    		    int LA503_1 = LA(2);
                    		    if ( (synpred987_fml(ctx)))
                    		    {
                    		        alt503=1;
                    		    }
                    		}
                    	}
                        break;
                }

                switch (alt503)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6058:6: op= equalOp e= relationalExpression (op= equalOp e= relationalExpression )*
            	    {
            	        FOLLOWPUSH(FOLLOW_equalOp_in_equalityExpression21549);
            	        op=equalOp(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleequalityExpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_relationalExpression_in_equalityExpression21553);
            	        e=relationalExpression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleequalityExpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             eqExpr = NEW_CODE2(op, bf
            	            , e
            	            ); 
            	        }


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6060:6: (op= equalOp e= relationalExpression )*

            	        for (;;)
            	        {
            	            int alt502=2;
            	            switch ( LA(1) )
            	            {
            	            case EQUAL:
            	            case NEQUAL:
            	            case NSEQUAL:
            	            case SEQUAL:
            	            	{
            	            		{
            	            		   /* dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState)
            	            		    */
            	            		    int LA502_1 = LA(2);
            	            		    if ( (synpred986_fml(ctx)))
            	            		    {
            	            		        alt502=1;
            	            		    }

            	            		}
            	            	}
            	                break;

            	            }

            	            switch (alt502)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6060:8: op= equalOp e= relationalExpression
            	        	    {
            	        	        FOLLOWPUSH(FOLLOW_equalOp_in_equalityExpression21569);
            	        	        op=equalOp(ctx);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruleequalityExpressionEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return bf;
            	        	        }


            	        	        FOLLOWPUSH(FOLLOW_relationalExpression_in_equalityExpression21573);
            	        	        e=relationalExpression(ctx);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruleequalityExpressionEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return bf;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {

            	        	            	    	/*if( eqExpr.getOperator() == op )
            	        	            	    	{
            	        	            	    		eqExpr.append( e
            	        	             );
            	        	            	    	}
            	        	            	    	else*/ if( eqExpr.getOperator() == OP(AND) )
            	        	            	    	{
            	        	            	    		eqExpr.append( NEW_CODE2(op, rhs, e
            	        	            ) );
            	        	            	    	}
            	        	            	    	else
            	        	            	    	{
            	        	            	    		eqExpr = NEW_CODE2(OP(AND), eqExpr, NEW_CODE2(op, rhs, e
            	        	            ));
            	        	            	    	}

            	        	            	    	rhs = e
            	        	            ;
            	        	            	    
            	        	        }


            	        	    }
            	        	    break;

            	        	default:
            	        	    goto loop502;	/* break out of the loop */
            	        	    break;
            	            }
            	        }
            	        loop502: ; /* Jump out to here if this rule does not match */


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= eqExpr;
            	             
            	        }


            	    }
            	    break;

                }
            }

        }

    }

    // This is where rules clean up and exit
    //
    goto ruleequalityExpressionEx; /* Prevent compiler warnings */
    ruleequalityExpressionEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(224, equalityExpression_StartIndex); }

    return bf;
}
/* $ANTLR end equalityExpression */

/**
 * $ANTLR start equalOp
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6082:1: equalOp returns [ sep::Operator * op ] : ( EQUAL | NEQUAL | SEQUAL | NSEQUAL );
 */
static sep::Operator *
equalOp(pfmlParser ctx)
{
    sep::Operator * op;

    ANTLR3_UINT32 equalOp_StartIndex;

    /* Initialize rule variables
     */
    equalOp_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(225)) )
    {
        {
        }



        return op;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6084:2: ( EQUAL | NEQUAL | SEQUAL | NSEQUAL )

            ANTLR3_UINT32 alt504;

            alt504=4;

            switch ( LA(1) )
            {
            case EQUAL:
            	{
            		alt504=1;
            	}
                break;
            case NEQUAL:
            	{
            		alt504=2;
            	}
                break;
            case SEQUAL:
            	{
            		alt504=3;
            	}
                break;
            case NSEQUAL:
            	{
            		alt504=4;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return op;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 504;
                EXCEPTION->state        = 0;


                goto ruleequalOpEx;

            }

            switch (alt504)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6084:4: EQUAL
        	    {
        	         MATCHT(EQUAL, &FOLLOW_EQUAL_in_equalOp21614);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleequalOpEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op = OP(EQ);   
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6085:4: NEQUAL
        	    {
        	         MATCHT(NEQUAL, &FOLLOW_NEQUAL_in_equalOp21623);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleequalOpEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op = OP(NEQ);  
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6086:4: SEQUAL
        	    {
        	         MATCHT(SEQUAL, &FOLLOW_SEQUAL_in_equalOp21631);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleequalOpEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op = OP(SEQ);  
        	        }


        	    }
        	    break;
        	case 4:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6087:4: NSEQUAL
        	    {
        	         MATCHT(NSEQUAL, &FOLLOW_NSEQUAL_in_equalOp21639);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleequalOpEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op = OP(NSEQ); 
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruleequalOpEx; /* Prevent compiler warnings */
    ruleequalOpEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(225, equalOp_StartIndex); }

    return op;
}
/* $ANTLR end equalOp */

/**
 * $ANTLR start relationalExpression
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6091:1: relationalExpression returns [ sep::BF bf ] : e= shiftExpression (op= relationalOp e= shiftExpression (op= relationalOp e= shiftExpression )* )? ;
 */
static sep::BF
relationalExpression(pfmlParser ctx)
{
    sep::BF bf;

    ANTLR3_UINT32 relationalExpression_StartIndex;

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    sep::Operator * op;
    #undef	RETURN_TYPE_op
    #define	RETURN_TYPE_op sep::Operator *

    /* Initialize rule variables
     */
    relationalExpression_StartIndex = INDEX();



    	sep::BFCode relExpr;
    	sep::BF rhs;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(226)) )
    {
        {
        }



        return bf;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6097:2: (e= shiftExpression (op= relationalOp e= shiftExpression (op= relationalOp e= shiftExpression )* )? )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6097:4: e= shiftExpression (op= relationalOp e= shiftExpression (op= relationalOp e= shiftExpression )* )?
        {
            FOLLOWPUSH(FOLLOW_shiftExpression_in_relationalExpression21663);
            e=shiftExpression(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto rulerelationalExpressionEx;
            }
            if (HASFAILED())
            {
                return bf;
            }


            if ( BACKTRACKING==0 )
            {
                 bf= 
                e
                ;
                 
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6098:4: (op= relationalOp e= shiftExpression (op= relationalOp e= shiftExpression )* )?
            {
                int alt506=2;
                switch ( LA(1) )
                {
                    case GT:
                    case GTE:
                    case LTE:
                    case LT_:
                    case 295:
                    	{
                    		{
                    		    int LA506_1 = LA(2);
                    		    if ( (synpred992_fml(ctx)))
                    		    {
                    		        alt506=1;
                    		    }
                    		}
                    	}
                        break;
                }

                switch (alt506)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6098:6: op= relationalOp e= shiftExpression (op= relationalOp e= shiftExpression )*
            	    {
            	        FOLLOWPUSH(FOLLOW_relationalOp_in_relationalExpression21675);
            	        op=relationalOp(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulerelationalExpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_shiftExpression_in_relationalExpression21679);
            	        e=shiftExpression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulerelationalExpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             relExpr = NEW_CODE2(op, bf
            	            , rhs = e
            	            ); 
            	        }


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6100:6: (op= relationalOp e= shiftExpression )*

            	        for (;;)
            	        {
            	            int alt505=2;
            	            switch ( LA(1) )
            	            {
            	            case GT:
            	            case GTE:
            	            case LTE:
            	            case LT_:
            	            case 295:
            	            	{
            	            		{
            	            		   /* dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState)
            	            		    */
            	            		    int LA505_1 = LA(2);
            	            		    if ( (synpred991_fml(ctx)))
            	            		    {
            	            		        alt505=1;
            	            		    }

            	            		}
            	            	}
            	                break;

            	            }

            	            switch (alt505)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6100:8: op= relationalOp e= shiftExpression
            	        	    {
            	        	        FOLLOWPUSH(FOLLOW_relationalOp_in_relationalExpression21695);
            	        	        op=relationalOp(ctx);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto rulerelationalExpressionEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return bf;
            	        	        }


            	        	        FOLLOWPUSH(FOLLOW_shiftExpression_in_relationalExpression21699);
            	        	        e=shiftExpression(ctx);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto rulerelationalExpressionEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return bf;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {

            	        	            	    	/*if( relExpr.getOperator() == op )
            	        	            	    	{
            	        	            	    		relExpr.append( e
            	        	             );
            	        	            	    	}
            	        	            	    	else*/ if( relExpr.getOperator() == OP(AND) )
            	        	            	    	{
            	        	            	    		relExpr.append( NEW_CODE2(op, rhs, e
            	        	            ) );
            	        	            	    	}
            	        	            	    	else
            	        	            	    	{
            	        	            	    		relExpr = NEW_CODE2(OP(AND), relExpr, NEW_CODE2(op, rhs, e
            	        	            ));
            	        	            	    	}

            	        	            	    	rhs = e
            	        	            ;
            	        	            	    
            	        	        }


            	        	    }
            	        	    break;

            	        	default:
            	        	    goto loop505;	/* break out of the loop */
            	        	    break;
            	            }
            	        }
            	        loop505: ; /* Jump out to here if this rule does not match */


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= relExpr;
            	             
            	        }


            	    }
            	    break;

                }
            }

        }

    }

    // This is where rules clean up and exit
    //
    goto rulerelationalExpressionEx; /* Prevent compiler warnings */
    rulerelationalExpressionEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(226, relationalExpression_StartIndex); }

    return bf;
}
/* $ANTLR end relationalExpression */

/**
 * $ANTLR start relationalOp
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6122:1: relationalOp returns [ sep::Operator * op ] : ( LTE | GTE | LT_ | GT | 'in' );
 */
static sep::Operator *
relationalOp(pfmlParser ctx)
{
    sep::Operator * op;

    ANTLR3_UINT32 relationalOp_StartIndex;

    /* Initialize rule variables
     */
    relationalOp_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(227)) )
    {
        {
        }



        return op;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6124:2: ( LTE | GTE | LT_ | GT | 'in' )

            ANTLR3_UINT32 alt507;

            alt507=5;

            switch ( LA(1) )
            {
            case LTE:
            	{
            		alt507=1;
            	}
                break;
            case GTE:
            	{
            		alt507=2;
            	}
                break;
            case LT_:
            	{
            		alt507=3;
            	}
                break;
            case GT:
            	{
            		alt507=4;
            	}
                break;
            case 295:
            	{
            		alt507=5;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return op;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 507;
                EXCEPTION->state        = 0;


                goto rulerelationalOpEx;

            }

            switch (alt507)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6124:4: LTE
        	    {
        	         MATCHT(LTE, &FOLLOW_LTE_in_relationalOp21740);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulerelationalOpEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(LTE);
        	             
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6125:4: GTE
        	    {
        	         MATCHT(GTE, &FOLLOW_GTE_in_relationalOp21748);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulerelationalOpEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(GTE);
        	             
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6126:4: LT_
        	    {
        	         MATCHT(LT_, &FOLLOW_LT__in_relationalOp21756);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulerelationalOpEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(LT);
        	             
        	        }


        	    }
        	    break;
        	case 4:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6127:4: GT
        	    {
        	         MATCHT(GT, &FOLLOW_GT_in_relationalOp21764);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulerelationalOpEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(GT);
        	             
        	        }


        	    }
        	    break;
        	case 5:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6129:4: 'in'
        	    {
        	         MATCHT(295, &FOLLOW_295_in_relationalOp21774);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulerelationalOpEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(IN);
        	             
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto rulerelationalOpEx; /* Prevent compiler warnings */
    rulerelationalOpEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(227, relationalOp_StartIndex); }

    return op;
}
/* $ANTLR end relationalOp */

/**
 * $ANTLR start shiftExpression
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6139:1: shiftExpression returns [ sep::BF bf ] : e= additiveExpression (op= shiftOp e= additiveExpression )* ;
 */
static sep::BF
shiftExpression(pfmlParser ctx)
{
    sep::BF bf;

    ANTLR3_UINT32 shiftExpression_StartIndex;

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    sep::Operator * op;
    #undef	RETURN_TYPE_op
    #define	RETURN_TYPE_op sep::Operator *

    /* Initialize rule variables
     */
    shiftExpression_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(228)) )
    {
        {
        }



        return bf;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6141:2: (e= additiveExpression (op= shiftOp e= additiveExpression )* )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6141:4: e= additiveExpression (op= shiftOp e= additiveExpression )*
        {
            FOLLOWPUSH(FOLLOW_additiveExpression_in_shiftExpression21806);
            e=additiveExpression(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruleshiftExpressionEx;
            }
            if (HASFAILED())
            {
                return bf;
            }


            if ( BACKTRACKING==0 )
            {
                 bf= 
                e
                ;
                 
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6142:4: (op= shiftOp e= additiveExpression )*

            for (;;)
            {
                int alt508=2;
                switch ( LA(1) )
                {
                case LSHIFT:
                case RSHIFT:
                	{
                		{
                		   /* dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState)
                		    */
                		    int LA508_1 = LA(2);
                		    if ( (synpred997_fml(ctx)))
                		    {
                		        alt508=1;
                		    }

                		}
                	}
                    break;

                }

                switch (alt508)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6142:6: op= shiftOp e= additiveExpression
            	    {
            	        FOLLOWPUSH(FOLLOW_shiftOp_in_shiftExpression21818);
            	        op=shiftOp(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleshiftExpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        FOLLOWPUSH(FOLLOW_additiveExpression_in_shiftExpression21822);
            	        e=additiveExpression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleshiftExpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_CODE2(op, 
            	            bf
            	            , e
            	            );
            	             
            	        }


            	    }
            	    break;

            	default:
            	    goto loop508;	/* break out of the loop */
            	    break;
                }
            }
            loop508: ; /* Jump out to here if this rule does not match */


        }

    }

    // This is where rules clean up and exit
    //
    goto ruleshiftExpressionEx; /* Prevent compiler warnings */
    ruleshiftExpressionEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(228, shiftExpression_StartIndex); }

    return bf;
}
/* $ANTLR end shiftExpression */

/**
 * $ANTLR start shiftOp
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6148:1: shiftOp returns [ sep::Operator * op ] : ( LSHIFT | RSHIFT );
 */
static sep::Operator *
shiftOp(pfmlParser ctx)
{
    sep::Operator * op;

    ANTLR3_UINT32 shiftOp_StartIndex;

    /* Initialize rule variables
     */
    shiftOp_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(229)) )
    {
        {
        }



        return op;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6150:2: ( LSHIFT | RSHIFT )

            ANTLR3_UINT32 alt509;

            alt509=2;

            switch ( LA(1) )
            {
            case LSHIFT:
            	{
            		alt509=1;
            	}
                break;
            case RSHIFT:
            	{
            		alt509=2;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return op;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 509;
                EXCEPTION->state        = 0;


                goto ruleshiftOpEx;

            }

            switch (alt509)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6150:4: LSHIFT
        	    {
        	         MATCHT(LSHIFT, &FOLLOW_LSHIFT_in_shiftOp21849);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleshiftOpEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(LSHIFT);
        	             
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6151:4: RSHIFT
        	    {
        	         MATCHT(RSHIFT, &FOLLOW_RSHIFT_in_shiftOp21857);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleshiftOpEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return op;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             op= OP(RSHIFT);
        	             
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruleshiftOpEx; /* Prevent compiler warnings */
    ruleshiftOpEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(229, shiftOp_StartIndex); }

    return op;
}
/* $ANTLR end shiftOp */

/**
 * $ANTLR start additiveExpression
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6155:1: additiveExpression returns [ sep::BF bf ] : e= multiplicativeExpression ( ( PLUS | MINUS ) e= multiplicativeExpression )* ;
 */
static sep::BF
additiveExpression(pfmlParser ctx)
{
    sep::BF bf;

    ANTLR3_UINT32 additiveExpression_StartIndex;

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    /* Initialize rule variables
     */
    additiveExpression_StartIndex = INDEX();



    	sep::Operator * op = NULL;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(230)) )
    {
        {
        }



        return bf;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6160:2: (e= multiplicativeExpression ( ( PLUS | MINUS ) e= multiplicativeExpression )* )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6160:4: e= multiplicativeExpression ( ( PLUS | MINUS ) e= multiplicativeExpression )*
        {
            FOLLOWPUSH(FOLLOW_multiplicativeExpression_in_additiveExpression21882);
            e=multiplicativeExpression(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto ruleadditiveExpressionEx;
            }
            if (HASFAILED())
            {
                return bf;
            }


            if ( BACKTRACKING==0 )
            {
                 bf= 
                e
                ;
                 
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6161:4: ( ( PLUS | MINUS ) e= multiplicativeExpression )*

            for (;;)
            {
                int alt511=2;
                switch ( LA(1) )
                {
                case MINUS:
                case PLUS:
                	{
                		{
                		   /* dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState)
                		    */
                		    int LA511_1 = LA(2);
                		    if ( (synpred1000_fml(ctx)))
                		    {
                		        alt511=1;
                		    }

                		}
                	}
                    break;

                }

                switch (alt511)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6161:6: ( PLUS | MINUS ) e= multiplicativeExpression
            	    {
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6161:6: ( PLUS | MINUS )
            	        {
            	            int alt510=2;
            	            switch ( LA(1) )
            	            {
            	            case PLUS:
            	            	{
            	            		alt510=1;
            	            	}
            	                break;
            	            case MINUS:
            	            	{
            	            		alt510=2;
            	            	}
            	                break;

            	            default:
            	                if (BACKTRACKING>0)
            	                {
            	                    FAILEDFLAG = ANTLR3_TRUE;
            	                    return bf;
            	                }

            	                CONSTRUCTEX();
            	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
            	                EXCEPTION->message      = (void *)"";
            	                EXCEPTION->decisionNum  = 510;
            	                EXCEPTION->state        = 0;


            	                goto ruleadditiveExpressionEx;

            	            }

            	            switch (alt510)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6161:8: PLUS
            	        	    {
            	        	         MATCHT(PLUS, &FOLLOW_PLUS_in_additiveExpression21894);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruleadditiveExpressionEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return bf;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             op = OP(PLUS);  
            	        	        }


            	        	    }
            	        	    break;
            	        	case 2:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6162:8: MINUS
            	        	    {
            	        	         MATCHT(MINUS, &FOLLOW_MINUS_in_additiveExpression21906);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruleadditiveExpressionEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return bf;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             op = OP(MINUS); 
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	        FOLLOWPUSH(FOLLOW_multiplicativeExpression_in_additiveExpression21924);
            	        e=multiplicativeExpression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleadditiveExpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_CODE_FLAT(op, 
            	            bf
            	            , e
            	            );
            	             
            	        }


            	    }
            	    break;

            	default:
            	    goto loop511;	/* break out of the loop */
            	    break;
                }
            }
            loop511: ; /* Jump out to here if this rule does not match */


        }

    }

    // This is where rules clean up and exit
    //
    goto ruleadditiveExpressionEx; /* Prevent compiler warnings */
    ruleadditiveExpressionEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(230, additiveExpression_StartIndex); }

    return bf;
}
/* $ANTLR end additiveExpression */

/**
 * $ANTLR start multiplicativeExpression
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6169:1: multiplicativeExpression returns [ sep::BF bf ] : e= unaryExpression ( ( STAR | DIV | MOD ) e= unaryExpression )* ;
 */
static sep::BF
multiplicativeExpression(pfmlParser ctx)
{
    sep::BF bf;

    ANTLR3_UINT32 multiplicativeExpression_StartIndex;

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    /* Initialize rule variables
     */
    multiplicativeExpression_StartIndex = INDEX();



    	sep::Operator * op = NULL;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(231)) )
    {
        {
        }



        return bf;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6174:2: (e= unaryExpression ( ( STAR | DIV | MOD ) e= unaryExpression )* )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6174:4: e= unaryExpression ( ( STAR | DIV | MOD ) e= unaryExpression )*
        {
            FOLLOWPUSH(FOLLOW_unaryExpression_in_multiplicativeExpression21958);
            e=unaryExpression(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto rulemultiplicativeExpressionEx;
            }
            if (HASFAILED())
            {
                return bf;
            }


            if ( BACKTRACKING==0 )
            {
                 bf= 
                e
                ;
                 
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6175:4: ( ( STAR | DIV | MOD ) e= unaryExpression )*

            for (;;)
            {
                int alt513=2;
                switch ( LA(1) )
                {
                case DIV:
                case MOD:
                case STAR:
                	{
                		{
                		   /* dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState)
                		    */
                		    int LA513_1 = LA(2);
                		    if ( (synpred1003_fml(ctx)))
                		    {
                		        alt513=1;
                		    }

                		}
                	}
                    break;

                }

                switch (alt513)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6175:6: ( STAR | DIV | MOD ) e= unaryExpression
            	    {
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6175:6: ( STAR | DIV | MOD )
            	        {
            	            int alt512=3;
            	            switch ( LA(1) )
            	            {
            	            case STAR:
            	            	{
            	            		alt512=1;
            	            	}
            	                break;
            	            case DIV:
            	            	{
            	            		alt512=2;
            	            	}
            	                break;
            	            case MOD:
            	            	{
            	            		alt512=3;
            	            	}
            	                break;

            	            default:
            	                if (BACKTRACKING>0)
            	                {
            	                    FAILEDFLAG = ANTLR3_TRUE;
            	                    return bf;
            	                }

            	                CONSTRUCTEX();
            	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
            	                EXCEPTION->message      = (void *)"";
            	                EXCEPTION->decisionNum  = 512;
            	                EXCEPTION->state        = 0;


            	                goto rulemultiplicativeExpressionEx;

            	            }

            	            switch (alt512)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6175:8: STAR
            	        	    {
            	        	         MATCHT(STAR, &FOLLOW_STAR_in_multiplicativeExpression21970);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto rulemultiplicativeExpressionEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return bf;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             op = OP(MULT); 
            	        	        }


            	        	    }
            	        	    break;
            	        	case 2:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6176:8: DIV
            	        	    {
            	        	         MATCHT(DIV, &FOLLOW_DIV_in_multiplicativeExpression21981);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto rulemultiplicativeExpressionEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return bf;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             op = OP(DIV); 
            	        	        }


            	        	    }
            	        	    break;
            	        	case 3:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6177:8: MOD
            	        	    {
            	        	         MATCHT(MOD, &FOLLOW_MOD_in_multiplicativeExpression21993);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto rulemultiplicativeExpressionEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return bf;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {
            	        	             op = OP(MOD); 
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	        FOLLOWPUSH(FOLLOW_unaryExpression_in_multiplicativeExpression22012);
            	        e=unaryExpression(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulemultiplicativeExpressionEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {
            	             bf= NEW_CODE_FLAT(op, 
            	            bf
            	            , e
            	            );
            	             
            	        }


            	    }
            	    break;

            	default:
            	    goto loop513;	/* break out of the loop */
            	    break;
                }
            }
            loop513: ; /* Jump out to here if this rule does not match */


        }

    }

    // This is where rules clean up and exit
    //
    goto rulemultiplicativeExpressionEx; /* Prevent compiler warnings */
    rulemultiplicativeExpressionEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(231, multiplicativeExpression_StartIndex); }

    return bf;
}
/* $ANTLR end multiplicativeExpression */

/**
 * $ANTLR start unaryExpression
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6188:1: unaryExpression returns [ sep::BF bf ] : ( PLUS e= unaryExpression | MINUS e= unaryExpression | INCR e= unaryExpression | DECR e= unaryExpression | LNOT e= unaryExpression | BNOT e= unaryExpression | OP_POP e= unaryExpression | OP_TOP e= unaryExpression |c= prefix_expression |c= expression_invoke |c= expression_activity_new |c= expression_com |c= expression_guard |c= expression_ite |c= expression_lambda |e= ctorExpression |e= primary ( INCR | DECR )? |l= literal |q= quote_expression |q= meta_eval_expression | LPAREN e= expression RPAREN |e= collection_of_expression );
 */
static sep::BF
unaryExpression(pfmlParser ctx)
{
    sep::BF bf;

    ANTLR3_UINT32 unaryExpression_StartIndex;

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    sep::BFCode c;
    #undef	RETURN_TYPE_c
    #define	RETURN_TYPE_c sep::BFCode

    sep::BF l;
    #undef	RETURN_TYPE_l
    #define	RETURN_TYPE_l sep::BF

    sep::BFCode q;
    #undef	RETURN_TYPE_q
    #define	RETURN_TYPE_q sep::BFCode

    /* Initialize rule variables
     */
    unaryExpression_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(232)) )
    {
        {
        }



        return bf;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6190:2: ( PLUS e= unaryExpression | MINUS e= unaryExpression | INCR e= unaryExpression | DECR e= unaryExpression | LNOT e= unaryExpression | BNOT e= unaryExpression | OP_POP e= unaryExpression | OP_TOP e= unaryExpression |c= prefix_expression |c= expression_invoke |c= expression_activity_new |c= expression_com |c= expression_guard |c= expression_ite |c= expression_lambda |e= ctorExpression |e= primary ( INCR | DECR )? |l= literal |q= quote_expression |q= meta_eval_expression | LPAREN e= expression RPAREN |e= collection_of_expression )

            ANTLR3_UINT32 alt515;

            alt515=22;

            switch ( LA(1) )
            {
            case PLUS:
            	{
            		alt515=1;
            	}
                break;
            case MINUS:
            	{
            		alt515=2;
            	}
                break;
            case INCR:
            	{
            		alt515=3;
            	}
                break;
            case DECR:
            	{
            		alt515=4;
            	}
                break;
            case LNOT:
            	{
            		alt515=5;
            	}
                break;
            case BNOT:
            	{
            		alt515=6;
            	}
                break;
            case OP_POP:
            	{
            		alt515=7;
            	}
                break;
            case OP_TOP:
            	{
            		alt515=8;
            	}
                break;
            case DOLLAR_LCURLY:
            	{
            		alt515=9;
            	}
                break;
            case LPAREN_INVOKE:
            	{
            		alt515=10;
            	}
                break;
            case 330:
            	{
            		alt515=11;
            	}
                break;
            case 237:
            case 347:
            	{
            		alt515=12;
            	}
                break;
            case 256:
            	{
            		alt515=13;
            	}
                break;
            case 294:
            	{
            		alt515=14;
            	}
                break;
            case 313:
            	{
            		alt515=15;
            	}
                break;
            case 265:
            	{
            		alt515=16;
            	}
                break;
            case COLONx2:
            case ID:
            	{
            		alt515=17;
            	}
                break;
            case CharLiteral:
            case FloatLiteral:
            case IntegerLiteral:
            case RationalLiteral:
            case StringLiteral:
            case 158:
            case 159:
            case 160:
            case 161:
            case 162:
            case 277:
            case 280:
            case 331:
            case 332:
            case 343:
            case 372:
            case 397:
            	{
            		alt515=18;
            	}
                break;
            case PERCENT_LCURLY:
            	{
            		alt515=19;
            	}
                break;
            case LBRACKET_BAR:
            	{
            		alt515=20;
            	}
                break;
            case LPAREN:
            	{
            		alt515=21;
            	}
                break;
            case LBRACKET:
            case LCURLY:
            	{
            		alt515=22;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return bf;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 515;
                EXCEPTION->state        = 0;


                goto ruleunaryExpressionEx;

            }

            switch (alt515)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6190:4: PLUS e= unaryExpression
        	    {
        	         MATCHT(PLUS, &FOLLOW_PLUS_in_unaryExpression22042);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleunaryExpressionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        FOLLOWPUSH(FOLLOW_unaryExpression_in_unaryExpression22047);
        	        e=unaryExpression(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleunaryExpressionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= 
        	            e
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6193:4: MINUS e= unaryExpression
        	    {
        	         MATCHT(MINUS, &FOLLOW_MINUS_in_unaryExpression22056);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleunaryExpressionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        FOLLOWPUSH(FOLLOW_unaryExpression_in_unaryExpression22060);
        	        e=unaryExpression(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleunaryExpressionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= new_uminus_expr(
        	            e
        	            );
        	             
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6196:4: INCR e= unaryExpression
        	    {
        	         MATCHT(INCR, &FOLLOW_INCR_in_unaryExpression22069);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleunaryExpressionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        FOLLOWPUSH(FOLLOW_unaryExpression_in_unaryExpression22074);
        	        e=unaryExpression(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleunaryExpressionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= NEW_STMT_ASSIGN_OP(OP(PLUS),
        	            		
        	            e
        	            , sep::ExpressionConstant::INTEGER_ONE);
        	             
        	        }


        	    }
        	    break;
        	case 4:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6199:4: DECR e= unaryExpression
        	    {
        	         MATCHT(DECR, &FOLLOW_DECR_in_unaryExpression22082);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleunaryExpressionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        FOLLOWPUSH(FOLLOW_unaryExpression_in_unaryExpression22087);
        	        e=unaryExpression(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleunaryExpressionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= NEW_STMT_ASSIGN_OP(OP(PLUS), 
        	            e
        	            ,
        	            		sep::ExpressionConstant::INTEGER_MINUS_ONE);
        	             
        	        }


        	    }
        	    break;
        	case 5:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6203:4: LNOT e= unaryExpression
        	    {
        	         MATCHT(LNOT, &FOLLOW_LNOT_in_unaryExpression22096);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleunaryExpressionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        FOLLOWPUSH(FOLLOW_unaryExpression_in_unaryExpression22100);
        	        e=unaryExpression(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleunaryExpressionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= new_not_expr(
        	            e
        	            );
        	             
        	        }


        	    }
        	    break;
        	case 6:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6206:4: BNOT e= unaryExpression
        	    {
        	         MATCHT(BNOT, &FOLLOW_BNOT_in_unaryExpression22109);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleunaryExpressionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        FOLLOWPUSH(FOLLOW_unaryExpression_in_unaryExpression22113);
        	        e=unaryExpression(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleunaryExpressionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= NEW_CODE1(OP(BNOT), 
        	            e
        	            );
        	             
        	        }


        	    }
        	    break;
        	case 7:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6209:4: OP_POP e= unaryExpression
        	    {
        	         MATCHT(OP_POP, &FOLLOW_OP_POP_in_unaryExpression22122);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleunaryExpressionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        FOLLOWPUSH(FOLLOW_unaryExpression_in_unaryExpression22128);
        	        e=unaryExpression(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleunaryExpressionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= NEW_CODE1(OP(POP), 
        	            e
        	            );
        	             
        	        }


        	    }
        	    break;
        	case 8:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6212:4: OP_TOP e= unaryExpression
        	    {
        	         MATCHT(OP_TOP, &FOLLOW_OP_TOP_in_unaryExpression22137);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleunaryExpressionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        FOLLOWPUSH(FOLLOW_unaryExpression_in_unaryExpression22143);
        	        e=unaryExpression(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleunaryExpressionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= NEW_CODE1(OP(TOP), 
        	            e
        	            );
        	             
        	        }


        	    }
        	    break;
        	case 9:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6219:4: c= prefix_expression
        	    {
        	        FOLLOWPUSH(FOLLOW_prefix_expression_in_unaryExpression22158);
        	        c=prefix_expression(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleunaryExpressionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= 
        	            c
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 10:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6221:4: c= expression_invoke
        	    {
        	        FOLLOWPUSH(FOLLOW_expression_invoke_in_unaryExpression22178);
        	        c=expression_invoke(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleunaryExpressionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= 
        	            c
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 11:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6223:4: c= expression_activity_new
        	    {
        	        FOLLOWPUSH(FOLLOW_expression_activity_new_in_unaryExpression22198);
        	        c=expression_activity_new(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleunaryExpressionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= 
        	            c
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 12:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6226:4: c= expression_com
        	    {
        	        FOLLOWPUSH(FOLLOW_expression_com_in_unaryExpression22213);
        	        c=expression_com(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleunaryExpressionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= 
        	            c
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 13:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6227:4: c= expression_guard
        	    {
        	        FOLLOWPUSH(FOLLOW_expression_guard_in_unaryExpression22235);
        	        c=expression_guard(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleunaryExpressionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= 
        	            c
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 14:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6228:4: c= expression_ite
        	    {
        	        FOLLOWPUSH(FOLLOW_expression_ite_in_unaryExpression22255);
        	        c=expression_ite(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleunaryExpressionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= 
        	            c
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 15:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6229:4: c= expression_lambda
        	    {
        	        FOLLOWPUSH(FOLLOW_expression_lambda_in_unaryExpression22277);
        	        c=expression_lambda(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleunaryExpressionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= 
        	            c
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 16:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6235:4: e= ctorExpression
        	    {
        	        FOLLOWPUSH(FOLLOW_ctorExpression_in_unaryExpression22301);
        	        e=ctorExpression(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleunaryExpressionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= 
        	            e
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 17:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6237:4: e= primary ( INCR | DECR )?
        	    {
        	        FOLLOWPUSH(FOLLOW_primary_in_unaryExpression22324);
        	        e=primary(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleunaryExpressionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= 
        	            e
        	            ;
        	             
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6238:4: ( INCR | DECR )?
        	        {
        	            int alt514=3;
        	            switch ( LA(1) )
        	            {
        	                case INCR:
        	                	{
        	                		{
        	                		    int LA514_1 = LA(2);
        	                		    if ( (synpred1020_fml(ctx)))
        	                		    {
        	                		        alt514=1;
        	                		    }
        	                		}
        	                	}
        	                    break;
        	                case DECR:
        	                	{
        	                		{
        	                		    int LA514_4 = LA(2);
        	                		    if ( (synpred1021_fml(ctx)))
        	                		    {
        	                		        alt514=2;
        	                		    }
        	                		}
        	                	}
        	                    break;
        	            }

        	            switch (alt514)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6238:6: INCR
        	        	    {
        	        	         MATCHT(INCR, &FOLLOW_INCR_in_unaryExpression22353);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruleunaryExpressionEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return bf;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             bf= NEW_STMT_ASSIGN_OP_AFTER(OP(PLUS), 
        	        	            e
        	        	            ,
        	        	            			sep::ExpressionConstant::INTEGER_ONE);
        	        	             
        	        	        }


        	        	    }
        	        	    break;
        	        	case 2:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6241:6: DECR
        	        	    {
        	        	         MATCHT(DECR, &FOLLOW_DECR_in_unaryExpression22364);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruleunaryExpressionEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return bf;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             bf= NEW_STMT_ASSIGN_OP_AFTER(OP(PLUS), 
        	        	            e
        	        	            ,
        	        	            			sep::ExpressionConstant::INTEGER_MINUS_ONE);
        	        	             
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	    }
        	    break;
        	case 18:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6246:4: l= literal
        	    {
        	        FOLLOWPUSH(FOLLOW_literal_in_unaryExpression22382);
        	        l=literal(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleunaryExpressionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= 
        	            l
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 19:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6248:4: q= quote_expression
        	    {
        	        FOLLOWPUSH(FOLLOW_quote_expression_in_unaryExpression22412);
        	        q=quote_expression(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleunaryExpressionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= 
        	            q
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 20:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6250:4: q= meta_eval_expression
        	    {
        	        FOLLOWPUSH(FOLLOW_meta_eval_expression_in_unaryExpression22433);
        	        q=meta_eval_expression(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleunaryExpressionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= 
        	            q
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 21:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6252:4: LPAREN e= expression RPAREN
        	    {
        	         MATCHT(LPAREN, &FOLLOW_LPAREN_in_unaryExpression22448);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleunaryExpressionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        FOLLOWPUSH(FOLLOW_expression_in_unaryExpression22453);
        	        e=expression(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleunaryExpressionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	         MATCHT(RPAREN, &FOLLOW_RPAREN_in_unaryExpression22456);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleunaryExpressionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= 
        	            e
        	            ;
        	             
        	        }


        	    }
        	    break;
        	case 22:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6254:4: e= collection_of_expression
        	    {
        	        FOLLOWPUSH(FOLLOW_collection_of_expression_in_unaryExpression22467);
        	        e=collection_of_expression(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleunaryExpressionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= 
        	            e
        	            ;
        	             
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruleunaryExpressionEx; /* Prevent compiler warnings */
    ruleunaryExpressionEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(232, unaryExpression_StartIndex); }

    return bf;
}
/* $ANTLR end unaryExpression */

/**
 * $ANTLR start ctorExpression
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6258:1: ctorExpression returns [ sep::BFCode ctor ] : 'ctor' LT_ tv= type_var GT LPAREN e= expression RPAREN ;
 */
static sep::BFCode
ctorExpression(pfmlParser ctx)
{
    sep::BFCode ctor;

    ANTLR3_UINT32 ctorExpression_StartIndex;

    sep::BF tv;
    #undef	RETURN_TYPE_tv
    #define	RETURN_TYPE_tv sep::BF

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    /* Initialize rule variables
     */
    ctorExpression_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(233)) )
    {
        {
        }



        return ctor;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6260:2: ( 'ctor' LT_ tv= type_var GT LPAREN e= expression RPAREN )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6260:4: 'ctor' LT_ tv= type_var GT LPAREN e= expression RPAREN
        {
             MATCHT(265, &FOLLOW_265_in_ctorExpression22488);
            if  (HASEXCEPTION())
            {
                goto rulectorExpressionEx;
            }
            if (HASFAILED())
            {
                return ctor;
            }


             MATCHT(LT_, &FOLLOW_LT__in_ctorExpression22490);
            if  (HASEXCEPTION())
            {
                goto rulectorExpressionEx;
            }
            if (HASFAILED())
            {
                return ctor;
            }


            FOLLOWPUSH(FOLLOW_type_var_in_ctorExpression22495);
            tv=type_var(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto rulectorExpressionEx;
            }
            if (HASFAILED())
            {
                return ctor;
            }


             MATCHT(GT, &FOLLOW_GT_in_ctorExpression22498);
            if  (HASEXCEPTION())
            {
                goto rulectorExpressionEx;
            }
            if (HASFAILED())
            {
                return ctor;
            }


             MATCHT(LPAREN, &FOLLOW_LPAREN_in_ctorExpression22501);
            if  (HASEXCEPTION())
            {
                goto rulectorExpressionEx;
            }
            if (HASFAILED())
            {
                return ctor;
            }


            FOLLOWPUSH(FOLLOW_expression_in_ctorExpression22506);
            e=expression(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto rulectorExpressionEx;
            }
            if (HASFAILED())
            {
                return ctor;
            }


             MATCHT(RPAREN, &FOLLOW_RPAREN_in_ctorExpression22509);
            if  (HASEXCEPTION())
            {
                goto rulectorExpressionEx;
            }
            if (HASFAILED())
            {
                return ctor;
            }


            if ( BACKTRACKING==0 )
            {
                 ctor= NEW_CODE2(OP(CTOR), 
                tv
                , e
                );
                 
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto rulectorExpressionEx; /* Prevent compiler warnings */
    rulectorExpressionEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(233, ctorExpression_StartIndex); }

    return ctor;
}
/* $ANTLR end ctorExpression */

/**
 * $ANTLR start quote_expression
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6280:1: quote_expression returns [ sep::BFCode ac ] : PERCENT_LCURLY e= expression RCURLY_PERCENT ;
 */
static sep::BFCode
quote_expression(pfmlParser ctx)
{
    sep::BFCode ac;

    ANTLR3_UINT32 quote_expression_StartIndex;

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    /* Initialize rule variables
     */
    quote_expression_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(234)) )
    {
        {
        }



        return ac;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6282:2: ( PERCENT_LCURLY e= expression RCURLY_PERCENT )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6282:4: PERCENT_LCURLY e= expression RCURLY_PERCENT
        {
             MATCHT(PERCENT_LCURLY, &FOLLOW_PERCENT_LCURLY_in_quote_expression22532);
            if  (HASEXCEPTION())
            {
                goto rulequote_expressionEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            FOLLOWPUSH(FOLLOW_expression_in_quote_expression22537);
            e=expression(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto rulequote_expressionEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


             MATCHT(RCURLY_PERCENT, &FOLLOW_RCURLY_PERCENT_in_quote_expression22540);
            if  (HASEXCEPTION())
            {
                goto rulequote_expressionEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            if ( BACKTRACKING==0 )
            {
                 ac= NEW_STMT1(OP(QUOTE), 
                e
                );
                 
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto rulequote_expressionEx; /* Prevent compiler warnings */
    rulequote_expressionEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(234, quote_expression_StartIndex); }

    return ac;
}
/* $ANTLR end quote_expression */

/**
 * $ANTLR start meta_eval_expression
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6286:1: meta_eval_expression returns [ sep::BFCode ac ] : LBRACKET_BAR e= expression BAR_RBRACKET ;
 */
static sep::BFCode
meta_eval_expression(pfmlParser ctx)
{
    sep::BFCode ac;

    ANTLR3_UINT32 meta_eval_expression_StartIndex;

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    /* Initialize rule variables
     */
    meta_eval_expression_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(235)) )
    {
        {
        }



        return ac;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6288:2: ( LBRACKET_BAR e= expression BAR_RBRACKET )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6288:4: LBRACKET_BAR e= expression BAR_RBRACKET
        {
             MATCHT(LBRACKET_BAR, &FOLLOW_LBRACKET_BAR_in_meta_eval_expression22559);
            if  (HASEXCEPTION())
            {
                goto rulemeta_eval_expressionEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            FOLLOWPUSH(FOLLOW_expression_in_meta_eval_expression22564);
            e=expression(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto rulemeta_eval_expressionEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


             MATCHT(BAR_RBRACKET, &FOLLOW_BAR_RBRACKET_in_meta_eval_expression22567);
            if  (HASEXCEPTION())
            {
                goto rulemeta_eval_expressionEx;
            }
            if (HASFAILED())
            {
                return ac;
            }


            if ( BACKTRACKING==0 )
            {
                 ac= NEW_STMT1(OP(META_EVAL), 
                e
                );
                 
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto rulemeta_eval_expressionEx; /* Prevent compiler warnings */
    rulemeta_eval_expressionEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(235, meta_eval_expression_StartIndex); }

    return ac;
}
/* $ANTLR end meta_eval_expression */

/**
 * $ANTLR start primary
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6366:1: primary returns [ sep::BF bf ] : (id= ID ( ( LPAREN )=>p= primary_invoke[ STR($id.text->chars) ] | ( DOT | LBRACKET )=>p= primary_ufid[ STR($id.text->chars) ] | ( COLONx2 )=>p= primary_ufi[ STR($id.text->chars) ] )? |p= primary_ufi[ \"\" ] );
 */
static sep::BF
primary(pfmlParser ctx)
{
    sep::BF bf;

    ANTLR3_UINT32 primary_StartIndex;

    pANTLR3_COMMON_TOKEN    id;
    sep::BF p;
    #undef	RETURN_TYPE_p
    #define	RETURN_TYPE_p sep::BF

    /* Initialize rule variables
     */
    primary_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(236)) )
    {
        {
        }



        return bf;
    }

    id       = NULL;

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6368:2: (id= ID ( ( LPAREN )=>p= primary_invoke[ STR($id.text->chars) ] | ( DOT | LBRACKET )=>p= primary_ufid[ STR($id.text->chars) ] | ( COLONx2 )=>p= primary_ufi[ STR($id.text->chars) ] )? |p= primary_ufi[ \"\" ] )

            ANTLR3_UINT32 alt517;

            alt517=2;

            switch ( LA(1) )
            {
            case ID:
            	{
            		alt517=1;
            	}
                break;
            case COLONx2:
            	{
            		alt517=2;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return bf;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 517;
                EXCEPTION->state        = 0;


                goto ruleprimaryEx;

            }

            switch (alt517)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6368:4: id= ID ( ( LPAREN )=>p= primary_invoke[ STR($id.text->chars) ] | ( DOT | LBRACKET )=>p= primary_ufid[ STR($id.text->chars) ] | ( COLONx2 )=>p= primary_ufi[ STR($id.text->chars) ] )?
        	    {
        	        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_primary22594);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleprimaryEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6369:4: ( ( LPAREN )=>p= primary_invoke[ STR($id.text->chars) ] | ( DOT | LBRACKET )=>p= primary_ufid[ STR($id.text->chars) ] | ( COLONx2 )=>p= primary_ufi[ STR($id.text->chars) ] )?
        	        {
        	            int alt516=4;
        	            {
        	                int LA516_0 = LA(1);
        	                if ( (LA516_0 == LPAREN))
        	                {
        	                    {
        	                        int LA516_1 = LA(2);
        	                        if ( (synpred1027_fml(ctx)))
        	                        {
        	                            alt516=1;
        	                        }
        	                    }
        	                }
        	                else if ( (synpred1029_fml(ctx)) && (LA516_0 == DOT))
        	                {
        	                    alt516=2;
        	                }
        	                else if ( (LA516_0 == LBRACKET))
        	                {
        	                    {
        	                        int LA516_3 = LA(2);
        	                        if ( (synpred1029_fml(ctx)))
        	                        {
        	                            alt516=2;
        	                        }
        	                    }
        	                }
        	                else if ( (LA516_0 == COLONx2))
        	                {
        	                    {
        	                        int LA516_4 = LA(2);
        	                        if ( (synpred1030_fml(ctx)))
        	                        {
        	                            alt516=3;
        	                        }
        	                    }
        	                }
        	            }
        	            switch (alt516)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6369:6: ( LPAREN )=>p= primary_invoke[ STR($id.text->chars) ]
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_primary_invoke_in_primary22619);
        	        	        p=primary_invoke(ctx, STR((id->getText(id))->chars));

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruleprimaryEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return bf;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             bf= 
        	        	            p
        	        	            ;
        	        	             
        	        	        }


        	        	    }
        	        	    break;
        	        	case 2:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6372:6: ( DOT | LBRACKET )=>p= primary_ufid[ STR($id.text->chars) ]
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_primary_ufid_in_primary22649);
        	        	        p=primary_ufid(ctx, STR((id->getText(id))->chars));

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruleprimaryEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return bf;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             bf= 
        	        	            p
        	        	            ;
        	        	             
        	        	        }


        	        	    }
        	        	    break;
        	        	case 3:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6374:6: ( COLONx2 )=>p= primary_ufi[ STR($id.text->chars) ]
        	        	    {
        	        	        FOLLOWPUSH(FOLLOW_primary_ufi_in_primary22681);
        	        	        p=primary_ufi(ctx, STR((id->getText(id))->chars));

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruleprimaryEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return bf;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             bf= 
        	        	            p
        	        	            ;
        	        	             
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	        if ( BACKTRACKING==0 )
        	        {

        	            		if( bf
        	            .invalid() )
        	            		{
        	            			if( (bf= sep::ParserUtil::getObjectByNameID(
        	            					STR((id->getText(id))->chars))).invalid() )
        	            			{
        	            			  	
        	            bf
        	             = NEW_ID( STR((id->getText(id))->chars));

        	            			}
        	            		}
        	            	  
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6388:4: p= primary_ufi[ \"\" ]
        	    {
        	        FOLLOWPUSH(FOLLOW_primary_ufi_in_primary22708);
        	        p=primary_ufi(ctx, "");

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleprimaryEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= 
        	            p
        	            ;
        	             
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruleprimaryEx; /* Prevent compiler warnings */
    ruleprimaryEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(236, primary_StartIndex); }

    return bf;
}
/* $ANTLR end primary */

/**
 * $ANTLR start primary_ufid
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6392:1: primary_ufid[ const std::string & mainId ] returns [ sep::BF bf ] : ( ( DOT id= ID ) | ( LBRACKET e= expression RBRACKET ) )+ ;
 */
static sep::BF
primary_ufid(pfmlParser ctx, const std::string & mainId)
{
    sep::BF bf;

    ANTLR3_UINT32 primary_ufid_StartIndex;

    pANTLR3_COMMON_TOKEN    id;
    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    /* Initialize rule variables
     */
    primary_ufid_StartIndex = INDEX();



    	sep::UniFormIdentifier * ufi = new sep::UniFormIdentifier(false);
    	sep::BF bfUfi( ufi );// for automatic destruction of << UFI >> if need

    	if( (bf= sep::ParserUtil::getObjectByNameID(mainId)).valid() )
    	{
    	  	ufi->appendField( 
    bf
     );

    	}
    	else
    	{
    	  	ufi->appendField( mainId );
    	}

    	bf= bfUfi;


    	sep::avm_size_t countID = 1;
    	bool isnotEXPR  = true;

    	SAVE_RULE_BEGIN_LOCATION;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(237)) )
    {
        {
        }



        return bf;
    }

    id       = NULL;

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6414:2: ( ( ( DOT id= ID ) | ( LBRACKET e= expression RBRACKET ) )+ )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6414:4: ( ( DOT id= ID ) | ( LBRACKET e= expression RBRACKET ) )+
        {
            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6414:4: ( ( DOT id= ID ) | ( LBRACKET e= expression RBRACKET ) )+
            {
                int cnt518=0;

                for (;;)
                {
                    int alt518=3;
            	switch ( LA(1) )
            	{
            	case DOT:
            		{
            			alt518=1;
            		}
            	    break;
            	case LBRACKET:
            		{
            			{
            			   /* dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState)
            			    */
            			    int LA518_2 = LA(2);
            			    if ( (synpred1033_fml(ctx)))
            			    {
            			        alt518=2;
            			    }

            			}
            		}
            	    break;

            	}

            	switch (alt518)
            	{
            	    case 1:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6414:6: ( DOT id= ID )
            	        {
            	            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6414:6: ( DOT id= ID )
            	            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6414:8: DOT id= ID
            	            {
            	                 MATCHT(DOT, &FOLLOW_DOT_in_primary_ufid22738);
            	                if  (HASEXCEPTION())
            	                {
            	                    goto ruleprimary_ufidEx;
            	                }
            	                if (HASFAILED())
            	                {
            	                    return bf;
            	                }


            	                id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_primary_ufid22742);
            	                if  (HASEXCEPTION())
            	                {
            	                    goto ruleprimary_ufidEx;
            	                }
            	                if (HASFAILED())
            	                {
            	                    return bf;
            	                }


            	                if ( BACKTRACKING==0 )
            	                {
            	                     ufi->appendField( STR((id->getText(id))->chars) );  ++countID; 
            	                }


            	            }


            	        }
            	        break;
            	    case 2:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6417:6: ( LBRACKET e= expression RBRACKET )
            	        {
            	            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6417:6: ( LBRACKET e= expression RBRACKET )
            	            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6417:8: LBRACKET e= expression RBRACKET
            	            {
            	                 MATCHT(LBRACKET, &FOLLOW_LBRACKET_in_primary_ufid22761);
            	                if  (HASEXCEPTION())
            	                {
            	                    goto ruleprimary_ufidEx;
            	                }
            	                if (HASFAILED())
            	                {
            	                    return bf;
            	                }


            	                FOLLOWPUSH(FOLLOW_expression_in_primary_ufid22766);
            	                e=expression(ctx);

            	                FOLLOWPOP();
            	                if  (HASEXCEPTION())
            	                {
            	                    goto ruleprimary_ufidEx;
            	                }
            	                if (HASFAILED())
            	                {
            	                    return bf;
            	                }


            	                 MATCHT(RBRACKET, &FOLLOW_RBRACKET_in_primary_ufid22769);
            	                if  (HASEXCEPTION())
            	                {
            	                    goto ruleprimary_ufidEx;
            	                }
            	                if (HASFAILED())
            	                {
            	                    return bf;
            	                }


            	                if ( BACKTRACKING==0 )
            	                {
            	                     ufi->appendIndex( e
            	                     );  isnotEXPR = false; 
            	                }


            	            }


            	        }
            	        break;

            	    default:

            		if ( cnt518 >= 1 )
            		{
            		    goto loop518;
            		}
            		if (BACKTRACKING>0)
            		{
            		    FAILEDFLAG = ANTLR3_TRUE;
            		    return bf;
            		}

            		/* mismatchedSetEx()
            		 */
            		CONSTRUCTEX();
            		EXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
            		EXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;


            		goto ruleprimary_ufidEx;
            	}
            	cnt518++;
                }
                loop518: ;	/* Jump to here if this rule does not match */
            }

            if ( BACKTRACKING==0 )
            {

                		if( isnotEXPR )
                		{
                			if( (bf= sep::ParserUtil::getvar(ufi->str(), countID)).invalid() )
                			{
                				
                bf
                 = bfUfi;

                				SET_RULE_LOCATION( ufi );
                			}
                		}
                	
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruleprimary_ufidEx; /* Prevent compiler warnings */
    ruleprimary_ufidEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(237, primary_ufid_StartIndex); }

    return bf;
}
/* $ANTLR end primary_ufid */

/**
 * $ANTLR start primary_ufi
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6435:1: primary_ufi[ const std::string & locatorId ] returns [ sep::BF bf ] : COLONx2 id= ID ( ( DOT id= ID ) | ( LBRACKET e= expression RBRACKET ) )+ ;
 */
static sep::BF
primary_ufi(pfmlParser ctx, const std::string & locatorId)
{
    sep::BF bf;

    ANTLR3_UINT32 primary_ufi_StartIndex;

    pANTLR3_COMMON_TOKEN    id;
    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    /* Initialize rule variables
     */
    primary_ufi_StartIndex = INDEX();



    	sep::UniFormIdentifier * ufi =
    			new sep::UniFormIdentifier(not locatorId.empty());
    	sep::BF bfUfi( ufi );// for automatic destruction of << UFI >> if need

    	if( not locatorId.empty() )
    	{
    		ufi->setLocator( locatorId );
    	}

    	bf= bfUfi;


    	sep::avm_size_t countID = 1;
    	bool isnotEXPR  = true;

    	SAVE_RULE_BEGIN_LOCATION;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(238)) )
    {
        {
        }



        return bf;
    }

    id       = NULL;

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6454:2: ( COLONx2 id= ID ( ( DOT id= ID ) | ( LBRACKET e= expression RBRACKET ) )+ )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6454:4: COLONx2 id= ID ( ( DOT id= ID ) | ( LBRACKET e= expression RBRACKET ) )+
        {
             MATCHT(COLONx2, &FOLLOW_COLONx2_in_primary_ufi22815);
            if  (HASEXCEPTION())
            {
                goto ruleprimary_ufiEx;
            }
            if (HASFAILED())
            {
                return bf;
            }


            id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_primary_ufi22819);
            if  (HASEXCEPTION())
            {
                goto ruleprimary_ufiEx;
            }
            if (HASFAILED())
            {
                return bf;
            }


            if ( BACKTRACKING==0 )
            {

                		if( (bf= sep::ParserUtil::getObjectByNameID(STR((id->getText(id))->chars))).valid() )
                		{
                		  	ufi->appendField( 
                bf
                 );

                		}
                		else
                		{
                		  	ufi->appendField( STR((id->getText(id))->chars) );
                		}
                	  
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6466:4: ( ( DOT id= ID ) | ( LBRACKET e= expression RBRACKET ) )+
            {
                int cnt519=0;

                for (;;)
                {
                    int alt519=3;
            	switch ( LA(1) )
            	{
            	case DOT:
            		{
            			alt519=1;
            		}
            	    break;
            	case LBRACKET:
            		{
            			{
            			   /* dfaLoopbackState(k,edges,eotPredictsAlt,description,stateNumber,semPredState)
            			    */
            			    int LA519_2 = LA(2);
            			    if ( (synpred1035_fml(ctx)))
            			    {
            			        alt519=2;
            			    }

            			}
            		}
            	    break;

            	}

            	switch (alt519)
            	{
            	    case 1:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6466:6: ( DOT id= ID )
            	        {
            	            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6466:6: ( DOT id= ID )
            	            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6466:8: DOT id= ID
            	            {
            	                 MATCHT(DOT, &FOLLOW_DOT_in_primary_ufi22834);
            	                if  (HASEXCEPTION())
            	                {
            	                    goto ruleprimary_ufiEx;
            	                }
            	                if (HASFAILED())
            	                {
            	                    return bf;
            	                }


            	                id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_primary_ufi22838);
            	                if  (HASEXCEPTION())
            	                {
            	                    goto ruleprimary_ufiEx;
            	                }
            	                if (HASFAILED())
            	                {
            	                    return bf;
            	                }


            	                if ( BACKTRACKING==0 )
            	                {
            	                     ufi->appendField( STR((id->getText(id))->chars) );  ++countID; 
            	                }


            	            }


            	        }
            	        break;
            	    case 2:
            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6469:6: ( LBRACKET e= expression RBRACKET )
            	        {
            	            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6469:6: ( LBRACKET e= expression RBRACKET )
            	            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6469:8: LBRACKET e= expression RBRACKET
            	            {
            	                 MATCHT(LBRACKET, &FOLLOW_LBRACKET_in_primary_ufi22857);
            	                if  (HASEXCEPTION())
            	                {
            	                    goto ruleprimary_ufiEx;
            	                }
            	                if (HASFAILED())
            	                {
            	                    return bf;
            	                }


            	                FOLLOWPUSH(FOLLOW_expression_in_primary_ufi22862);
            	                e=expression(ctx);

            	                FOLLOWPOP();
            	                if  (HASEXCEPTION())
            	                {
            	                    goto ruleprimary_ufiEx;
            	                }
            	                if (HASFAILED())
            	                {
            	                    return bf;
            	                }


            	                 MATCHT(RBRACKET, &FOLLOW_RBRACKET_in_primary_ufi22865);
            	                if  (HASEXCEPTION())
            	                {
            	                    goto ruleprimary_ufiEx;
            	                }
            	                if (HASFAILED())
            	                {
            	                    return bf;
            	                }


            	                if ( BACKTRACKING==0 )
            	                {
            	                     ufi->appendIndex( e
            	                     );  isnotEXPR = false; 
            	                }


            	            }


            	        }
            	        break;

            	    default:

            		if ( cnt519 >= 1 )
            		{
            		    goto loop519;
            		}
            		if (BACKTRACKING>0)
            		{
            		    FAILEDFLAG = ANTLR3_TRUE;
            		    return bf;
            		}

            		/* mismatchedSetEx()
            		 */
            		CONSTRUCTEX();
            		EXCEPTION->type = ANTLR3_EARLY_EXIT_EXCEPTION;
            		EXCEPTION->name = (void *)ANTLR3_EARLY_EXIT_NAME;


            		goto ruleprimary_ufiEx;
            	}
            	cnt519++;
                }
                loop519: ;	/* Jump to here if this rule does not match */
            }

            if ( BACKTRACKING==0 )
            {

                		if( isnotEXPR )
                		{
                			if( (bf= sep::ParserUtil::getvar(ufi->str(), countID)).invalid() )
                			{
                				
                bf
                 = bfUfi;

                				SET_RULE_LOCATION( ufi );
                			}
                		}
                	
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruleprimary_ufiEx; /* Prevent compiler warnings */
    ruleprimary_ufiEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(238, primary_ufi_StartIndex); }

    return bf;
}
/* $ANTLR end primary_ufi */

/**
 * $ANTLR start primary_invoke
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6486:1: primary_invoke[ const std::string & mainId ] returns [ sep::BF bf ] : LPAREN (lp= labelled_argument ( COMMA lp= labelled_argument )* )? RPAREN ;
 */
static sep::BF
primary_invoke(pfmlParser ctx, const std::string & mainId)
{
    sep::BF bf;

    ANTLR3_UINT32 primary_invoke_StartIndex;

    fmlParser_labelled_argument_return lp;
    #undef	RETURN_TYPE_lp
    #define	RETURN_TYPE_lp fmlParser_labelled_argument_return

    /* Initialize rule variables
     */
    primary_invoke_StartIndex = INDEX();



    	sep::Routine * invokeRoutine = sep::Routine::newInvoke( _CPRMS_, mainId);

    	invokeRoutine->setModel( sep::ParserUtil::getvarRoutine(mainId) );

    	SAVE_RULE_BEGIN_LOCATION;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(239)) )
    {
        {

            	SET_RULE_LOCATION( invokeRoutine );

        }
        {
        }



        return bf;
    }

    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6499:2: ( LPAREN (lp= labelled_argument ( COMMA lp= labelled_argument )* )? RPAREN )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6499:4: LPAREN (lp= labelled_argument ( COMMA lp= labelled_argument )* )? RPAREN
        {
             MATCHT(LPAREN, &FOLLOW_LPAREN_in_primary_invoke22915);
            if  (HASEXCEPTION())
            {
                goto ruleprimary_invokeEx;
            }
            if (HASFAILED())
            {
                return bf;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6500:4: (lp= labelled_argument ( COMMA lp= labelled_argument )* )?
            {
                int alt521=2;
                switch ( LA(1) )
                {
                    case BNOT:
                    case COLONx2:
                    case CharLiteral:
                    case DECR:
                    case DOLLAR_LCURLY:
                    case FloatLiteral:
                    case ID:
                    case INCR:
                    case IntegerLiteral:
                    case LBRACKET:
                    case LBRACKET_BAR:
                    case LCURLY:
                    case LNOT:
                    case LPAREN:
                    case LPAREN_INVOKE:
                    case MINUS:
                    case OP_POP:
                    case OP_TOP:
                    case PERCENT_LCURLY:
                    case PLUS:
                    case RationalLiteral:
                    case StringLiteral:
                    case 158:
                    case 159:
                    case 160:
                    case 161:
                    case 162:
                    case 237:
                    case 256:
                    case 265:
                    case 277:
                    case 280:
                    case 294:
                    case 313:
                    case 330:
                    case 331:
                    case 332:
                    case 343:
                    case 347:
                    case 372:
                    case 397:
                    	{
                    		alt521=1;
                    	}
                        break;
                }

                switch (alt521)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6500:6: lp= labelled_argument ( COMMA lp= labelled_argument )*
            	    {
            	        FOLLOWPUSH(FOLLOW_labelled_argument_in_primary_invoke22924);
            	        lp=labelled_argument(ctx);

            	        FOLLOWPOP();
            	        if  (HASEXCEPTION())
            	        {
            	            goto ruleprimary_invokeEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return bf;
            	        }


            	        if ( BACKTRACKING==0 )
            	        {

            	            	    	invokeRoutine->appendParameter(lp.label
            	            , lp.arg
            	            );
            	            	    
            	        }


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6504:6: ( COMMA lp= labelled_argument )*

            	        for (;;)
            	        {
            	            int alt520=2;
            	            switch ( LA(1) )
            	            {
            	            case COMMA:
            	            	{
            	            		alt520=1;
            	            	}
            	                break;

            	            }

            	            switch (alt520)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6504:8: COMMA lp= labelled_argument
            	        	    {
            	        	         MATCHT(COMMA, &FOLLOW_COMMA_in_primary_invoke22940);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruleprimary_invokeEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return bf;
            	        	        }


            	        	        FOLLOWPUSH(FOLLOW_labelled_argument_in_primary_invoke22949);
            	        	        lp=labelled_argument(ctx);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto ruleprimary_invokeEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return bf;
            	        	        }


            	        	        if ( BACKTRACKING==0 )
            	        	        {

            	        	            	    	invokeRoutine->appendParameter(lp.label
            	        	            , lp.arg
            	        	            );
            	        	            	    
            	        	        }


            	        	    }
            	        	    break;

            	        	default:
            	        	    goto loop520;	/* break out of the loop */
            	        	    break;
            	            }
            	        }
            	        loop520: ; /* Jump out to here if this rule does not match */


            	    }
            	    break;

                }
            }

             MATCHT(RPAREN, &FOLLOW_RPAREN_in_primary_invoke22975);
            if  (HASEXCEPTION())
            {
                goto ruleprimary_invokeEx;
            }
            if (HASFAILED())
            {
                return bf;
            }


            if ( BACKTRACKING==0 )
            {
                 bf= sep::ParserUtil::invokeRoutineExpression(invokeRoutine);
                 
            }


        }

    }

    // This is where rules clean up and exit
    //
    goto ruleprimary_invokeEx; /* Prevent compiler warnings */
    ruleprimary_invokeEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
            else
            {
                {

                    	SET_RULE_LOCATION( invokeRoutine );

                }
            }


    if ( BACKTRACKING>0 ) { MEMOIZE(239, primary_invoke_StartIndex); }

    return bf;
}
/* $ANTLR end primary_invoke */

/**
 * $ANTLR start literal
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6517:1: literal returns [ sep::BF bf ] : ( IntegerLiteral | RationalLiteral | FloatLiteral | CharLiteral | StringLiteral | 'true' | 'false' | 'self' | 'parent' | 'env' | '$this' | '$self' | '$parent' | '$super' | '$env' | 'null<' ( 'machine' | 'channel' | 'port' | 'signal' | 'message' | 'buffer' ) GT | 'null' );
 */
static sep::BF
literal(pfmlParser ctx)
{
    sep::BF bf;

    ANTLR3_UINT32 literal_StartIndex;

    pANTLR3_COMMON_TOKEN    IntegerLiteral13;
    pANTLR3_COMMON_TOKEN    RationalLiteral14;
    pANTLR3_COMMON_TOKEN    FloatLiteral15;
    pANTLR3_COMMON_TOKEN    CharLiteral16;
    pANTLR3_COMMON_TOKEN    StringLiteral17;

    /* Initialize rule variables
     */
    literal_StartIndex = INDEX();


    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(240)) )
    {
        {
        }



        return bf;
    }

    IntegerLiteral13       = NULL;
    RationalLiteral14       = NULL;
    FloatLiteral15       = NULL;
    CharLiteral16       = NULL;
    StringLiteral17       = NULL;

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6519:2: ( IntegerLiteral | RationalLiteral | FloatLiteral | CharLiteral | StringLiteral | 'true' | 'false' | 'self' | 'parent' | 'env' | '$this' | '$self' | '$parent' | '$super' | '$env' | 'null<' ( 'machine' | 'channel' | 'port' | 'signal' | 'message' | 'buffer' ) GT | 'null' )

            ANTLR3_UINT32 alt523;

            alt523=17;

            switch ( LA(1) )
            {
            case IntegerLiteral:
            	{
            		alt523=1;
            	}
                break;
            case RationalLiteral:
            	{
            		alt523=2;
            	}
                break;
            case FloatLiteral:
            	{
            		alt523=3;
            	}
                break;
            case CharLiteral:
            	{
            		alt523=4;
            	}
                break;
            case StringLiteral:
            	{
            		alt523=5;
            	}
                break;
            case 397:
            	{
            		alt523=6;
            	}
                break;
            case 280:
            	{
            		alt523=7;
            	}
                break;
            case 372:
            	{
            		alt523=8;
            	}
                break;
            case 343:
            	{
            		alt523=9;
            	}
                break;
            case 277:
            	{
            		alt523=10;
            	}
                break;
            case 162:
            	{
            		alt523=11;
            	}
                break;
            case 160:
            	{
            		alt523=12;
            	}
                break;
            case 159:
            	{
            		alt523=13;
            	}
                break;
            case 161:
            	{
            		alt523=14;
            	}
                break;
            case 158:
            	{
            		alt523=15;
            	}
                break;
            case 332:
            	{
            		alt523=16;
            	}
                break;
            case 331:
            	{
            		alt523=17;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return bf;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 523;
                EXCEPTION->state        = 0;


                goto ruleliteralEx;

            }

            switch (alt523)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6519:4: IntegerLiteral
        	    {
        	        IntegerLiteral13 = (pANTLR3_COMMON_TOKEN) MATCHT(IntegerLiteral, &FOLLOW_IntegerLiteral_in_literal22997);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleliteralEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= NEW_INTEGER(STR((IntegerLiteral13->getText(IntegerLiteral13))->chars));
        	               
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6520:4: RationalLiteral
        	    {
        	        RationalLiteral14 = (pANTLR3_COMMON_TOKEN) MATCHT(RationalLiteral, &FOLLOW_RationalLiteral_in_literal23005);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleliteralEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= NEW_RATIONAL(STR((RationalLiteral14->getText(RationalLiteral14))->chars));
        	             
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6521:4: FloatLiteral
        	    {
        	        FloatLiteral15 = (pANTLR3_COMMON_TOKEN) MATCHT(FloatLiteral, &FOLLOW_FloatLiteral_in_literal23012);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleliteralEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= NEW_FLOAT(STR((FloatLiteral15->getText(FloatLiteral15))->chars));
        	                   
        	        }


        	    }
        	    break;
        	case 4:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6523:4: CharLiteral
        	    {
        	        CharLiteral16 = (pANTLR3_COMMON_TOKEN) MATCHT(CharLiteral, &FOLLOW_CharLiteral_in_literal23023);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleliteralEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= NEW_CHAR(STR((CharLiteral16->getText(CharLiteral16))->chars));
        	                 
        	        }


        	    }
        	    break;
        	case 5:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6524:4: StringLiteral
        	    {
        	        StringLiteral17 = (pANTLR3_COMMON_TOKEN) MATCHT(StringLiteral, &FOLLOW_StringLiteral_in_literal23034);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleliteralEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= NEW_STRING(STR((StringLiteral17->getText(StringLiteral17))->chars));
        	             
        	        }


        	    }
        	    break;
        	case 6:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6526:4: 'true'
        	    {
        	         MATCHT(397, &FOLLOW_397_in_literal23044);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleliteralEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= NEW_BOOL(true);
        	              
        	        }


        	    }
        	    break;
        	case 7:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6527:4: 'false'
        	    {
        	         MATCHT(280, &FOLLOW_280_in_literal23053);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleliteralEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= NEW_BOOL(false);
        	             
        	        }


        	    }
        	    break;
        	case 8:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6529:4: 'self'
        	    {
        	         MATCHT(372, &FOLLOW_372_in_literal23062);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleliteralEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= sep::ExecutableLib::MACHINE_SELF;
        	                    
        	        }


        	    }
        	    break;
        	case 9:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6530:4: 'parent'
        	    {
        	         MATCHT(343, &FOLLOW_343_in_literal23071);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleliteralEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= sep::ExecutableLib::MACHINE_PARENT;
        	                  
        	        }


        	    }
        	    break;
        	case 10:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6531:4: 'env'
        	    {
        	         MATCHT(277, &FOLLOW_277_in_literal23078);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleliteralEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= sep::ExecutableLib::MACHINE_ENVIRONMENT;
        	             
        	        }


        	    }
        	    break;
        	case 11:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6533:4: '$this'
        	    {
        	         MATCHT(162, &FOLLOW_162_in_literal23089);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleliteralEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= sep::ExecutableLib::MACHINE_SELF;
        	                    
        	        }


        	    }
        	    break;
        	case 12:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6534:4: '$self'
        	    {
        	         MATCHT(160, &FOLLOW_160_in_literal23098);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleliteralEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= sep::ExecutableLib::MACHINE_SELF;
        	                    
        	        }


        	    }
        	    break;
        	case 13:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6535:4: '$parent'
        	    {
        	         MATCHT(159, &FOLLOW_159_in_literal23107);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleliteralEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= sep::ExecutableLib::MACHINE_PARENT;
        	                  
        	        }


        	    }
        	    break;
        	case 14:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6536:4: '$super'
        	    {
        	         MATCHT(161, &FOLLOW_161_in_literal23114);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleliteralEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= sep::ExecutableLib::MACHINE_PARENT;
        	                  
        	        }


        	    }
        	    break;
        	case 15:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6537:4: '$env'
        	    {
        	         MATCHT(158, &FOLLOW_158_in_literal23122);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleliteralEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= sep::ExecutableLib::MACHINE_ENVIRONMENT;
        	             
        	        }


        	    }
        	    break;
        	case 16:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6539:4: 'null<' ( 'machine' | 'channel' | 'port' | 'signal' | 'message' | 'buffer' ) GT
        	    {
        	         MATCHT(332, &FOLLOW_332_in_literal23133);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleliteralEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6540:5: ( 'machine' | 'channel' | 'port' | 'signal' | 'message' | 'buffer' )
        	        {
        	            int alt522=6;
        	            switch ( LA(1) )
        	            {
        	            case 317:
        	            	{
        	            		alt522=1;
        	            	}
        	                break;
        	            case 253:
        	            	{
        	            		alt522=2;
        	            	}
        	                break;
        	            case 344:
        	            	{
        	            		alt522=3;
        	            	}
        	                break;
        	            case 374:
        	            	{
        	            		alt522=4;
        	            	}
        	                break;
        	            case 320:
        	            	{
        	            		alt522=5;
        	            	}
        	                break;
        	            case 249:
        	            	{
        	            		alt522=6;
        	            	}
        	                break;

        	            default:
        	                if (BACKTRACKING>0)
        	                {
        	                    FAILEDFLAG = ANTLR3_TRUE;
        	                    return bf;
        	                }

        	                CONSTRUCTEX();
        	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
        	                EXCEPTION->message      = (void *)"";
        	                EXCEPTION->decisionNum  = 522;
        	                EXCEPTION->state        = 0;


        	                goto ruleliteralEx;

        	            }

        	            switch (alt522)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6540:7: 'machine'
        	        	    {
        	        	         MATCHT(317, &FOLLOW_317_in_literal23141);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruleliteralEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return bf;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             bf= sep::ExecutableLib::MACHINE_NULL;
        	        	             
        	        	        }


        	        	    }
        	        	    break;
        	        	case 2:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6541:7: 'channel'
        	        	    {
        	        	         MATCHT(253, &FOLLOW_253_in_literal23152);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruleliteralEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return bf;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             bf= sep::ExecutableLib::CHANNEL_NIL;
        	        	                
        	        	        }


        	        	    }
        	        	    break;
        	        	case 3:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6542:7: 'port'
        	        	    {
        	        	         MATCHT(344, &FOLLOW_344_in_literal23163);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruleliteralEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return bf;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             bf= sep::ExecutableLib::PORT_NIL;
        	        	                
        	        	        }


        	        	    }
        	        	    break;
        	        	case 4:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6543:7: 'signal'
        	        	    {
        	        	         MATCHT(374, &FOLLOW_374_in_literal23177);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruleliteralEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return bf;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             bf= sep::ExecutableLib::PORT_NIL;
        	        	                
        	        	        }


        	        	    }
        	        	    break;
        	        	case 5:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6544:7: 'message'
        	        	    {
        	        	         MATCHT(320, &FOLLOW_320_in_literal23189);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruleliteralEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return bf;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             bf= sep::ExecutableLib::PORT_NIL;
        	        	                
        	        	        }


        	        	    }
        	        	    break;
        	        	case 6:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6545:7: 'buffer'
        	        	    {
        	        	         MATCHT(249, &FOLLOW_249_in_literal23200);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto ruleliteralEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return bf;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             bf= sep::ExecutableLib::BUFFER_NIL;
        	        	                
        	        	        }


        	        	    }
        	        	    break;

        	            }
        	        }

        	         MATCHT(GT, &FOLLOW_GT_in_literal23212);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleliteralEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	    }
        	    break;
        	case 17:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6547:4: 'null'
        	    {
        	         MATCHT(331, &FOLLOW_331_in_literal23217);
        	        if  (HASEXCEPTION())
        	        {
        	            goto ruleliteralEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= sep::BF::REF_NULL;
        	             
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto ruleliteralEx; /* Prevent compiler warnings */
    ruleliteralEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(240, literal_StartIndex); }

    return bf;
}
/* $ANTLR end literal */

/**
 * $ANTLR start collection_of_expression
 * /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6552:1: collection_of_expression returns [ sep::BF bf ] : ( LCURLY e= expression ( COMMA e= expression )* RCURLY | LBRACKET e= expression ( COMMA e= expression )* RBRACKET );
 */
static sep::BF
collection_of_expression(pfmlParser ctx)
{
    sep::BF bf;

    ANTLR3_UINT32 collection_of_expression_StartIndex;

    sep::BF e;
    #undef	RETURN_TYPE_e
    #define	RETURN_TYPE_e sep::BF

    /* Initialize rule variables
     */
    collection_of_expression_StartIndex = INDEX();



    	sep::BFVector values;

    if ( (BACKTRACKING>0) && (HAVEPARSEDRULE(241)) )
    {
        {
        }



        return bf;
    }

    {
        {
            //  /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6557:2: ( LCURLY e= expression ( COMMA e= expression )* RCURLY | LBRACKET e= expression ( COMMA e= expression )* RBRACKET )

            ANTLR3_UINT32 alt526;

            alt526=2;

            switch ( LA(1) )
            {
            case LCURLY:
            	{
            		alt526=1;
            	}
                break;
            case LBRACKET:
            	{
            		alt526=2;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return bf;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 526;
                EXCEPTION->state        = 0;


                goto rulecollection_of_expressionEx;

            }

            switch (alt526)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6557:4: LCURLY e= expression ( COMMA e= expression )* RCURLY
        	    {
        	         MATCHT(LCURLY, &FOLLOW_LCURLY_in_collection_of_expression23246);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulecollection_of_expressionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        FOLLOWPUSH(FOLLOW_expression_in_collection_of_expression23255);
        	        e=expression(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulecollection_of_expressionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             values.append(e
        	            ); 
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6559:6: ( COMMA e= expression )*

        	        for (;;)
        	        {
        	            int alt524=2;
        	            switch ( LA(1) )
        	            {
        	            case COMMA:
        	            	{
        	            		alt524=1;
        	            	}
        	                break;

        	            }

        	            switch (alt524)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6559:8: COMMA e= expression
        	        	    {
        	        	         MATCHT(COMMA, &FOLLOW_COMMA_in_collection_of_expression23275);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulecollection_of_expressionEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return bf;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_expression_in_collection_of_expression23279);
        	        	        e=expression(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulecollection_of_expressionEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return bf;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             values.append(e
        	        	            ); 
        	        	        }


        	        	    }
        	        	    break;

        	        	default:
        	        	    goto loop524;	/* break out of the loop */
        	        	    break;
        	            }
        	        }
        	        loop524: ; /* Jump out to here if this rule does not match */


        	         MATCHT(RCURLY, &FOLLOW_RCURLY_in_collection_of_expression23290);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulecollection_of_expressionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	              bf= sep::BuiltinArray::create(values);
        	             
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6563:4: LBRACKET e= expression ( COMMA e= expression )* RBRACKET
        	    {
        	         MATCHT(LBRACKET, &FOLLOW_LBRACKET_in_collection_of_expression23301);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulecollection_of_expressionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        FOLLOWPUSH(FOLLOW_expression_in_collection_of_expression23310);
        	        e=expression(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulecollection_of_expressionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             values.append(e
        	            ); 
        	        }


        	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6565:6: ( COMMA e= expression )*

        	        for (;;)
        	        {
        	            int alt525=2;
        	            switch ( LA(1) )
        	            {
        	            case COMMA:
        	            	{
        	            		alt525=1;
        	            	}
        	                break;

        	            }

        	            switch (alt525)
        	            {
        	        	case 1:
        	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6565:8: COMMA e= expression
        	        	    {
        	        	         MATCHT(COMMA, &FOLLOW_COMMA_in_collection_of_expression23330);
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulecollection_of_expressionEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return bf;
        	        	        }


        	        	        FOLLOWPUSH(FOLLOW_expression_in_collection_of_expression23334);
        	        	        e=expression(ctx);

        	        	        FOLLOWPOP();
        	        	        if  (HASEXCEPTION())
        	        	        {
        	        	            goto rulecollection_of_expressionEx;
        	        	        }
        	        	        if (HASFAILED())
        	        	        {
        	        	            return bf;
        	        	        }


        	        	        if ( BACKTRACKING==0 )
        	        	        {
        	        	             values.append(e
        	        	            ); 
        	        	        }


        	        	    }
        	        	    break;

        	        	default:
        	        	    goto loop525;	/* break out of the loop */
        	        	    break;
        	            }
        	        }
        	        loop525: ; /* Jump out to here if this rule does not match */


        	         MATCHT(RBRACKET, &FOLLOW_RBRACKET_in_collection_of_expression23345);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulecollection_of_expressionEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return bf;
        	        }


        	        if ( BACKTRACKING==0 )
        	        {
        	             bf= sep::BuiltinArray::create(values);
        	             
        	        }


        	    }
        	    break;

            }
        }
    }

    // This is where rules clean up and exit
    //
    goto rulecollection_of_expressionEx; /* Prevent compiler warnings */
    rulecollection_of_expressionEx: ;

            if (HASEXCEPTION())
            {
                PREPORTERROR();
                PRECOVER();
            }
    if ( BACKTRACKING>0 ) { MEMOIZE(241, collection_of_expression_StartIndex); }

    return bf;
}
/* $ANTLR end collection_of_expression */

// $ANTLR start synpred21_fml
static void synpred21_fml_fragment(pfmlParser ctx )
{
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:720:6: ( 'unsafe' )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:720:6: 'unsafe'
    {
         MATCHT(406, &FOLLOW_406_in_synpred21_fml531);
        if  (HASEXCEPTION())
        {
            goto rulesynpred21_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred21_fmlEx; /* Prevent compiler warnings */
rulesynpred21_fmlEx: ;

}
// $ANTLR end synpred21_fml

// $ANTLR start synpred56_fml
static void synpred56_fml_fragment(pfmlParser ctx )
{
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:820:6: ( 'model' )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:820:6: 'model'
    {
         MATCHT(322, &FOLLOW_322_in_synpred56_fml1127);
        if  (HASEXCEPTION())
        {
            goto rulesynpred56_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred56_fmlEx; /* Prevent compiler warnings */
rulesynpred56_fmlEx: ;

}
// $ANTLR end synpred56_fml

// $ANTLR start synpred57_fml
static void synpred57_fml_fragment(pfmlParser ctx )
{
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:821:6: ( 'prototype' )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:821:6: 'prototype'
    {
         MATCHT(353, &FOLLOW_353_in_synpred57_fml1144);
        if  (HASEXCEPTION())
        {
            goto rulesynpred57_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred57_fmlEx; /* Prevent compiler warnings */
rulesynpred57_fmlEx: ;

}
// $ANTLR end synpred57_fml

// $ANTLR start synpred58_fml
static void synpred58_fml_fragment(pfmlParser ctx )
{
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:823:6: ( 'dynamic' )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:823:6: 'dynamic'
    {
         MATCHT(272, &FOLLOW_272_in_synpred58_fml1158);
        if  (HASEXCEPTION())
        {
            goto rulesynpred58_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred58_fmlEx; /* Prevent compiler warnings */
rulesynpred58_fmlEx: ;

}
// $ANTLR end synpred58_fml

// $ANTLR start synpred59_fml
static void synpred59_fml_fragment(pfmlParser ctx )
{
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:832:6: ( 'unsafe' )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:832:6: 'unsafe'
    {
         MATCHT(406, &FOLLOW_406_in_synpred59_fml1181);
        if  (HASEXCEPTION())
        {
            goto rulesynpred59_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred59_fmlEx; /* Prevent compiler warnings */
rulesynpred59_fmlEx: ;

}
// $ANTLR end synpred59_fml

// $ANTLR start synpred60_fml
static void synpred60_fml_fragment(pfmlParser ctx )
{
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:834:6: ( 'timed' )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:834:6: 'timed'
    {
         MATCHT(393, &FOLLOW_393_in_synpred60_fml1198);
        if  (HASEXCEPTION())
        {
            goto rulesynpred60_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred60_fmlEx; /* Prevent compiler warnings */
rulesynpred60_fmlEx: ;

}
// $ANTLR end synpred60_fml

// $ANTLR start synpred61_fml
static void synpred61_fml_fragment(pfmlParser ctx )
{
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:835:6: ( 'input_enabled' )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:835:6: 'input_enabled'
    {
         MATCHT(306, &FOLLOW_306_in_synpred61_fml1215);
        if  (HASEXCEPTION())
        {
            goto rulesynpred61_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred61_fmlEx; /* Prevent compiler warnings */
rulesynpred61_fmlEx: ;

}
// $ANTLR end synpred61_fml

// $ANTLR start synpred62_fml
static void synpred62_fml_fragment(pfmlParser ctx )
{
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:836:6: ( 'lifeline' )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:836:6: 'lifeline'
    {
         MATCHT(314, &FOLLOW_314_in_synpred62_fml1224);
        if  (HASEXCEPTION())
        {
            goto rulesynpred62_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred62_fmlEx; /* Prevent compiler warnings */
rulesynpred62_fmlEx: ;

}
// $ANTLR end synpred62_fml

// $ANTLR start synpred95_fml
static void synpred95_fml_fragment(pfmlParser ctx )
{
	pANTLR3_COMMON_TOKEN    id;

	id       = NULL;

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:995:6: ( ( DOT | COLONx2 ) id= ID )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:995:6: ( DOT | COLONx2 ) id= ID
    {
        if ( LA(1) == COLONx2 || LA(1) == DOT )
        {
            CONSUME();
            PERRORRECOVERY=ANTLR3_FALSE;
            FAILEDFLAG=ANTLR3_FALSE;

        }
        else
        {
            if (BACKTRACKING>0)
            {
                FAILEDFLAG = ANTLR3_TRUE;
                return ;
            }

            CONSTRUCTEX();
            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
            EXCEPTION->expectingSet = NULL;

            goto rulesynpred95_fmlEx;
        }


        id = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_synpred95_fml1893);
        if  (HASEXCEPTION())
        {
            goto rulesynpred95_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred95_fmlEx; /* Prevent compiler warnings */
rulesynpred95_fmlEx: ;

}
// $ANTLR end synpred95_fml

// $ANTLR start synpred115_fml
static void synpred115_fml_fragment(pfmlParser ctx )
{
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1205:6: ( type_var COLON )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1205:8: type_var COLON
    {
        FOLLOWPUSH(FOLLOW_type_var_in_synpred115_fml2387);
        type_var(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred115_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


         MATCHT(COLON, &FOLLOW_COLON_in_synpred115_fml2389);
        if  (HASEXCEPTION())
        {
            goto rulesynpred115_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred115_fmlEx; /* Prevent compiler warnings */
rulesynpred115_fmlEx: ;

}
// $ANTLR end synpred115_fml

// $ANTLR start synpred126_fml
static void synpred126_fml_fragment(pfmlParser ctx )
{
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1276:6: ( type_var COLON )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1276:8: type_var COLON
    {
        FOLLOWPUSH(FOLLOW_type_var_in_synpred126_fml2689);
        type_var(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred126_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


         MATCHT(COLON, &FOLLOW_COLON_in_synpred126_fml2691);
        if  (HASEXCEPTION())
        {
            goto rulesynpred126_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred126_fmlEx; /* Prevent compiler warnings */
rulesynpred126_fmlEx: ;

}
// $ANTLR end synpred126_fml

// $ANTLR start synpred127_fml
static void synpred127_fml_fragment(pfmlParser ctx )
{
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1301:6: ( def_body_machine_using_section_predicat )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1301:8: def_body_machine_using_section_predicat
    {
        FOLLOWPUSH(FOLLOW_def_body_machine_using_section_predicat_in_synpred127_fml2764);
        def_body_machine_using_section_predicat(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred127_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred127_fmlEx; /* Prevent compiler warnings */
rulesynpred127_fmlEx: ;

}
// $ANTLR end synpred127_fml

// $ANTLR start synpred138_fml
static void synpred138_fml_fragment(pfmlParser ctx )
{
	sep::Modifier m;
	#undef	RETURN_TYPE_m
	#define	RETURN_TYPE_m sep::Modifier

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1338:5: (m= modifier_declaration )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1338:5: m= modifier_declaration
    {
        FOLLOWPUSH(FOLLOW_modifier_declaration_in_synpred138_fml2939);
        m=modifier_declaration(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred138_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred138_fmlEx; /* Prevent compiler warnings */
rulesynpred138_fmlEx: ;

}
// $ANTLR end synpred138_fml

// $ANTLR start synpred153_fml
static void synpred153_fml_fragment(pfmlParser ctx )
{
	fmlParser_executable_modifier_specifier_return ms;
	#undef	RETURN_TYPE_ms
	#define	RETURN_TYPE_ms fmlParser_executable_modifier_specifier_return

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1404:6: (ms= executable_modifier_specifier )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1404:6: ms= executable_modifier_specifier
    {
        FOLLOWPUSH(FOLLOW_executable_modifier_specifier_in_synpred153_fml3199);
        ms=executable_modifier_specifier(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred153_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred153_fmlEx; /* Prevent compiler warnings */
rulesynpred153_fmlEx: ;

}
// $ANTLR end synpred153_fml

// $ANTLR start synpred170_fml
static void synpred170_fml_fragment(pfmlParser ctx )
{
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1534:4: ( lvalue op_assign_param )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:1534:6: lvalue op_assign_param
    {
        FOLLOWPUSH(FOLLOW_lvalue_in_synpred170_fml3645);
        lvalue(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred170_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_op_assign_param_in_synpred170_fml3648);
        op_assign_param(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred170_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred170_fmlEx; /* Prevent compiler warnings */
rulesynpred170_fmlEx: ;

}
// $ANTLR end synpred170_fml

// $ANTLR start synpred296_fml
static void synpred296_fml_fragment(pfmlParser ctx )
{
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2223:6: ( def_body_machine_using_section_predicat )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2223:8: def_body_machine_using_section_predicat
    {
        FOLLOWPUSH(FOLLOW_def_body_machine_using_section_predicat_in_synpred296_fml5973);
        def_body_machine_using_section_predicat(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred296_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred296_fmlEx; /* Prevent compiler warnings */
rulesynpred296_fmlEx: ;

}
// $ANTLR end synpred296_fml

// $ANTLR start synpred304_fml
static void synpred304_fml_fragment(pfmlParser ctx )
{
	sep::Modifier m;
	#undef	RETURN_TYPE_m
	#define	RETURN_TYPE_m sep::Modifier

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2254:5: (m= modifier_declaration )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2254:5: m= modifier_declaration
    {
        FOLLOWPUSH(FOLLOW_modifier_declaration_in_synpred304_fml6112);
        m=modifier_declaration(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred304_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred304_fmlEx; /* Prevent compiler warnings */
rulesynpred304_fmlEx: ;

}
// $ANTLR end synpred304_fml

// $ANTLR start synpred324_fml
static void synpred324_fml_fragment(pfmlParser ctx )
{
	sep::Transition::moc_kind_t kt;
	#undef	RETURN_TYPE_kt
	#define	RETURN_TYPE_kt sep::Transition::moc_kind_t

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2370:4: ( ( 'moc:' )? kt= moc_transition_attribute )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2370:4: ( 'moc:' )? kt= moc_transition_attribute
    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2370:4: ( 'moc:' )?
        {
            int alt568=2;
            switch ( LA(1) )
            {
                case 321:
                	{
                		alt568=1;
                	}
                    break;
            }

            switch (alt568)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2370:6: 'moc:'
        	    {
        	         MATCHT(321, &FOLLOW_321_in_synpred324_fml6520);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesynpred324_fmlEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;

            }
        }

        FOLLOWPUSH(FOLLOW_moc_transition_attribute_in_synpred324_fml6527);
        kt=moc_transition_attribute(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred324_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred324_fmlEx; /* Prevent compiler warnings */
rulesynpred324_fmlEx: ;

}
// $ANTLR end synpred324_fml

// $ANTLR start synpred326_fml
static void synpred326_fml_fragment(pfmlParser ctx )
{
	sep::avm_size_t n;
	#undef	RETURN_TYPE_n
	#define	RETURN_TYPE_n sep::avm_size_t

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2373:4: ( ( 'prior:' )? n= integer_constant )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2373:4: ( 'prior:' )? n= integer_constant
    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2373:4: ( 'prior:' )?
        {
            int alt569=2;
            switch ( LA(1) )
            {
                case 348:
                	{
                		alt569=1;
                	}
                    break;
            }

            switch (alt569)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2373:6: 'prior:'
        	    {
        	         MATCHT(348, &FOLLOW_348_in_synpred326_fml6538);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesynpred326_fmlEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;

            }
        }

        FOLLOWPUSH(FOLLOW_integer_constant_in_synpred326_fml6545);
        n=integer_constant(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred326_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred326_fmlEx; /* Prevent compiler warnings */
rulesynpred326_fmlEx: ;

}
// $ANTLR end synpred326_fml

// $ANTLR start synpred329_fml
static void synpred329_fml_fragment(pfmlParser ctx )
{
	sep::BF tid;
	#undef	RETURN_TYPE_tid
	#define	RETURN_TYPE_tid sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2383:6: ( ( '-->' )? tid= target_state_id SEMI )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2383:6: ( '-->' )? tid= target_state_id SEMI
    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2383:6: ( '-->' )?
        {
            int alt570=2;
            switch ( LA(1) )
            {
                case 163:
                	{
                		alt570=1;
                	}
                    break;
            }

            switch (alt570)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2383:8: '-->'
        	    {
        	         MATCHT(163, &FOLLOW_163_in_synpred329_fml6600);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesynpred329_fmlEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;

            }
        }

        FOLLOWPUSH(FOLLOW_target_state_id_in_synpred329_fml6612);
        tid=target_state_id(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred329_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


         MATCHT(SEMI, &FOLLOW_SEMI_in_synpred329_fml6629);
        if  (HASEXCEPTION())
        {
            goto rulesynpred329_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred329_fmlEx; /* Prevent compiler warnings */
rulesynpred329_fmlEx: ;

}
// $ANTLR end synpred329_fml

// $ANTLR start synpred340_fml
static void synpred340_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2429:5: (e= expression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2429:5: e= expression
    {
        FOLLOWPUSH(FOLLOW_expression_in_synpred340_fml6840);
        e=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred340_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred340_fmlEx; /* Prevent compiler warnings */
rulesynpred340_fmlEx: ;

}
// $ANTLR end synpred340_fml

// $ANTLR start synpred341_fml
static void synpred341_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2432:5: ( LBRACKET e= expression RBRACKET )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2432:5: LBRACKET e= expression RBRACKET
    {
         MATCHT(LBRACKET, &FOLLOW_LBRACKET_in_synpred341_fml6851);
        if  (HASEXCEPTION())
        {
            goto rulesynpred341_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_expression_in_synpred341_fml6855);
        e=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred341_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


         MATCHT(RBRACKET, &FOLLOW_RBRACKET_in_synpred341_fml6857);
        if  (HASEXCEPTION())
        {
            goto rulesynpred341_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred341_fmlEx; /* Prevent compiler warnings */
rulesynpred341_fmlEx: ;

}
// $ANTLR end synpred341_fml

// $ANTLR start synpred343_fml
static void synpred343_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2442:5: (e= expression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2442:5: e= expression
    {
        FOLLOWPUSH(FOLLOW_expression_in_synpred343_fml6900);
        e=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred343_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred343_fmlEx; /* Prevent compiler warnings */
rulesynpred343_fmlEx: ;

}
// $ANTLR end synpred343_fml

// $ANTLR start synpred344_fml
static void synpred344_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2445:5: ( LCURLY e= expression RCURLY )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2445:5: LCURLY e= expression RCURLY
    {
         MATCHT(LCURLY, &FOLLOW_LCURLY_in_synpred344_fml6911);
        if  (HASEXCEPTION())
        {
            goto rulesynpred344_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_expression_in_synpred344_fml6915);
        e=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred344_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


         MATCHT(RCURLY, &FOLLOW_RCURLY_in_synpred344_fml6917);
        if  (HASEXCEPTION())
        {
            goto rulesynpred344_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred344_fmlEx; /* Prevent compiler warnings */
rulesynpred344_fmlEx: ;

}
// $ANTLR end synpred344_fml

// $ANTLR start synpred366_fml
static void synpred366_fml_fragment(pfmlParser ctx )
{
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2528:4: ( def_body_machine_using_section_header_predicat )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2528:6: def_body_machine_using_section_header_predicat
    {
        FOLLOWPUSH(FOLLOW_def_body_machine_using_section_header_predicat_in_synpred366_fml7316);
        def_body_machine_using_section_header_predicat(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred366_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred366_fmlEx; /* Prevent compiler warnings */
rulesynpred366_fmlEx: ;

}
// $ANTLR end synpred366_fml

// $ANTLR start synpred370_fml
static void synpred370_fml_fragment(pfmlParser ctx )
{
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2540:4: ( def_body_machine_using_section_import_predicat )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2540:6: def_body_machine_using_section_import_predicat
    {
        FOLLOWPUSH(FOLLOW_def_body_machine_using_section_import_predicat_in_synpred370_fml7380);
        def_body_machine_using_section_import_predicat(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred370_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred370_fmlEx; /* Prevent compiler warnings */
rulesynpred370_fmlEx: ;

}
// $ANTLR end synpred370_fml

// $ANTLR start synpred373_fml
static void synpred373_fml_fragment(pfmlParser ctx )
{
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2550:4: ( def_body_machine_using_section_parameter_predicat )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2550:6: def_body_machine_using_section_parameter_predicat
    {
        FOLLOWPUSH(FOLLOW_def_body_machine_using_section_parameter_predicat_in_synpred373_fml7432);
        def_body_machine_using_section_parameter_predicat(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred373_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred373_fmlEx; /* Prevent compiler warnings */
rulesynpred373_fmlEx: ;

}
// $ANTLR end synpred373_fml

// $ANTLR start synpred375_fml
static void synpred375_fml_fragment(pfmlParser ctx )
{
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2558:4: ( def_body_machine_using_section_property_predicat )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2558:6: def_body_machine_using_section_property_predicat
    {
        FOLLOWPUSH(FOLLOW_def_body_machine_using_section_property_predicat_in_synpred375_fml7472);
        def_body_machine_using_section_property_predicat(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred375_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred375_fmlEx; /* Prevent compiler warnings */
rulesynpred375_fmlEx: ;

}
// $ANTLR end synpred375_fml

// $ANTLR start synpred407_fml
static void synpred407_fml_fragment(pfmlParser ctx )
{
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2695:4: ( ID COLON )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2695:6: ID COLON
    {
         MATCHT(ID, &FOLLOW_ID_in_synpred407_fml7922);
        if  (HASEXCEPTION())
        {
            goto rulesynpred407_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


         MATCHT(COLON, &FOLLOW_COLON_in_synpred407_fml7924);
        if  (HASEXCEPTION())
        {
            goto rulesynpred407_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred407_fmlEx; /* Prevent compiler warnings */
rulesynpred407_fmlEx: ;

}
// $ANTLR end synpred407_fml

// $ANTLR start synpred412_fml
static void synpred412_fml_fragment(pfmlParser ctx )
{
	fmlParser_labelled_argument_return lp;
	#undef	RETURN_TYPE_lp
	#define	RETURN_TYPE_lp fmlParser_labelled_argument_return

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2749:6: ( LPAREN lp= labelled_argument ( COMMA lp= labelled_argument )* RPAREN )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2749:6: LPAREN lp= labelled_argument ( COMMA lp= labelled_argument )* RPAREN
    {
         MATCHT(LPAREN, &FOLLOW_LPAREN_in_synpred412_fml8076);
        if  (HASEXCEPTION())
        {
            goto rulesynpred412_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_labelled_argument_in_synpred412_fml8085);
        lp=labelled_argument(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred412_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2755:6: ( COMMA lp= labelled_argument )*

        for (;;)
        {
            int alt581=2;
            switch ( LA(1) )
            {
            case COMMA:
            	{
            		alt581=1;
            	}
                break;

            }

            switch (alt581)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2755:8: COMMA lp= labelled_argument
        	    {
        	         MATCHT(COMMA, &FOLLOW_COMMA_in_synpred412_fml8101);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesynpred412_fmlEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_labelled_argument_in_synpred412_fml8112);
        	        lp=labelled_argument(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesynpred412_fmlEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;

        	default:
        	    goto loop581;	/* break out of the loop */
        	    break;
            }
        }
        loop581: ; /* Jump out to here if this rule does not match */


         MATCHT(RPAREN, &FOLLOW_RPAREN_in_synpred412_fml8136);
        if  (HASEXCEPTION())
        {
            goto rulesynpred412_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred412_fmlEx; /* Prevent compiler warnings */
rulesynpred412_fmlEx: ;

}
// $ANTLR end synpred412_fml

// $ANTLR start synpred417_fml
static void synpred417_fml_fragment(pfmlParser ctx )
{
	fmlParser_labelled_argument_return lp;
	#undef	RETURN_TYPE_lp
	#define	RETURN_TYPE_lp fmlParser_labelled_argument_return

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2848:6: ( LPAREN lp= labelled_argument ( COMMA lp= labelled_argument )* RPAREN )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2848:6: LPAREN lp= labelled_argument ( COMMA lp= labelled_argument )* RPAREN
    {
         MATCHT(LPAREN, &FOLLOW_LPAREN_in_synpred417_fml8265);
        if  (HASEXCEPTION())
        {
            goto rulesynpred417_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_labelled_argument_in_synpred417_fml8274);
        lp=labelled_argument(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred417_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2854:6: ( COMMA lp= labelled_argument )*

        for (;;)
        {
            int alt583=2;
            switch ( LA(1) )
            {
            case COMMA:
            	{
            		alt583=1;
            	}
                break;

            }

            switch (alt583)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2854:8: COMMA lp= labelled_argument
        	    {
        	         MATCHT(COMMA, &FOLLOW_COMMA_in_synpred417_fml8290);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesynpred417_fmlEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_labelled_argument_in_synpred417_fml8301);
        	        lp=labelled_argument(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesynpred417_fmlEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;

        	default:
        	    goto loop583;	/* break out of the loop */
        	    break;
            }
        }
        loop583: ; /* Jump out to here if this rule does not match */


         MATCHT(RPAREN, &FOLLOW_RPAREN_in_synpred417_fml8325);
        if  (HASEXCEPTION())
        {
            goto rulesynpred417_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred417_fmlEx; /* Prevent compiler warnings */
rulesynpred417_fmlEx: ;

}
// $ANTLR end synpred417_fml

// $ANTLR start synpred419_fml
static void synpred419_fml_fragment(pfmlParser ctx )
{
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2897:4: ( ID )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2897:6: ID
    {
         MATCHT(ID, &FOLLOW_ID_in_synpred419_fml8407);
        if  (HASEXCEPTION())
        {
            goto rulesynpred419_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred419_fmlEx; /* Prevent compiler warnings */
rulesynpred419_fmlEx: ;

}
// $ANTLR end synpred419_fml

// $ANTLR start synpred426_fml
static void synpred426_fml_fragment(pfmlParser ctx )
{
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2927:6: ( ID )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2927:8: ID
    {
         MATCHT(ID, &FOLLOW_ID_in_synpred426_fml8542);
        if  (HASEXCEPTION())
        {
            goto rulesynpred426_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred426_fmlEx; /* Prevent compiler warnings */
rulesynpred426_fmlEx: ;

}
// $ANTLR end synpred426_fml

// $ANTLR start synpred431_fml
static void synpred431_fml_fragment(pfmlParser ctx )
{
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2972:4: ( ID )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:2972:6: ID
    {
         MATCHT(ID, &FOLLOW_ID_in_synpred431_fml8689);
        if  (HASEXCEPTION())
        {
            goto rulesynpred431_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred431_fmlEx; /* Prevent compiler warnings */
rulesynpred431_fmlEx: ;

}
// $ANTLR end synpred431_fml

// $ANTLR start synpred438_fml
static void synpred438_fml_fragment(pfmlParser ctx )
{
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3002:6: ( ID )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3002:8: ID
    {
         MATCHT(ID, &FOLLOW_ID_in_synpred438_fml8824);
        if  (HASEXCEPTION())
        {
            goto rulesynpred438_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred438_fmlEx; /* Prevent compiler warnings */
rulesynpred438_fmlEx: ;

}
// $ANTLR end synpred438_fml

// $ANTLR start synpred446_fml
static void synpred446_fml_fragment(pfmlParser ctx )
{
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3057:6: ( type_var COLON )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3057:8: type_var COLON
    {
        FOLLOWPUSH(FOLLOW_type_var_in_synpred446_fml9031);
        type_var(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred446_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


         MATCHT(COLON, &FOLLOW_COLON_in_synpred446_fml9033);
        if  (HASEXCEPTION())
        {
            goto rulesynpred446_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred446_fmlEx; /* Prevent compiler warnings */
rulesynpred446_fmlEx: ;

}
// $ANTLR end synpred446_fml

// $ANTLR start synpred493_fml
static void synpred493_fml_fragment(pfmlParser ctx )
{
	sep::BF btv;
	#undef	RETURN_TYPE_btv
	#define	RETURN_TYPE_btv sep::BF

	sep::avm_size_t sz;
	#undef	RETURN_TYPE_sz
	#define	RETURN_TYPE_sz sep::avm_size_t

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3435:8: ( (btv= base_type_var ( COMMA ( 'size:' )? (sz= integer_constant | STAR ) )? ) )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3435:8: (btv= base_type_var ( COMMA ( 'size:' )? (sz= integer_constant | STAR ) )? )
    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3435:8: (btv= base_type_var ( COMMA ( 'size:' )? (sz= integer_constant | STAR ) )? )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3435:10: btv= base_type_var ( COMMA ( 'size:' )? (sz= integer_constant | STAR ) )?
        {
            FOLLOWPUSH(FOLLOW_base_type_var_in_synpred493_fml10287);
            btv=base_type_var(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto rulesynpred493_fmlEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3436:10: ( COMMA ( 'size:' )? (sz= integer_constant | STAR ) )?
            {
                int alt620=2;
                switch ( LA(1) )
                {
                    case COMMA:
                    	{
                    		alt620=1;
                    	}
                        break;
                }

                switch (alt620)
                {
            	case 1:
            	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3436:12: COMMA ( 'size:' )? (sz= integer_constant | STAR )
            	    {
            	         MATCHT(COMMA, &FOLLOW_COMMA_in_synpred493_fml10303);
            	        if  (HASEXCEPTION())
            	        {
            	            goto rulesynpred493_fmlEx;
            	        }
            	        if (HASFAILED())
            	        {
            	            return ;
            	        }


            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3436:19: ( 'size:' )?
            	        {
            	            int alt618=2;
            	            switch ( LA(1) )
            	            {
            	                case 375:
            	                	{
            	                		alt618=1;
            	                	}
            	                    break;
            	            }

            	            switch (alt618)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3436:21: 'size:'
            	        	    {
            	        	         MATCHT(375, &FOLLOW_375_in_synpred493_fml10308);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto rulesynpred493_fmlEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3437:12: (sz= integer_constant | STAR )
            	        {
            	            int alt619=2;
            	            switch ( LA(1) )
            	            {
            	            case ID:
            	            case IntegerLiteral:
            	            	{
            	            		alt619=1;
            	            	}
            	                break;
            	            case STAR:
            	            	{
            	            		alt619=2;
            	            	}
            	                break;

            	            default:
            	                if (BACKTRACKING>0)
            	                {
            	                    FAILEDFLAG = ANTLR3_TRUE;
            	                    return ;
            	                }

            	                CONSTRUCTEX();
            	                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
            	                EXCEPTION->message      = (void *)"";
            	                EXCEPTION->decisionNum  = 619;
            	                EXCEPTION->state        = 0;


            	                goto rulesynpred493_fmlEx;

            	            }

            	            switch (alt619)
            	            {
            	        	case 1:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3437:14: sz= integer_constant
            	        	    {
            	        	        FOLLOWPUSH(FOLLOW_integer_constant_in_synpred493_fml10328);
            	        	        sz=integer_constant(ctx);

            	        	        FOLLOWPOP();
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto rulesynpred493_fmlEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	    }
            	        	    break;
            	        	case 2:
            	        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3438:14: STAR
            	        	    {
            	        	         MATCHT(STAR, &FOLLOW_STAR_in_synpred493_fml10345);
            	        	        if  (HASEXCEPTION())
            	        	        {
            	        	            goto rulesynpred493_fmlEx;
            	        	        }
            	        	        if (HASFAILED())
            	        	        {
            	        	            return ;
            	        	        }


            	        	    }
            	        	    break;

            	            }
            	        }

            	    }
            	    break;

                }
            }

        }


    }

// This is where rules clean up and exit
//
goto rulesynpred493_fmlEx; /* Prevent compiler warnings */
rulesynpred493_fmlEx: ;

}
// $ANTLR end synpred493_fml

// $ANTLR start synpred514_fml
static void synpred514_fml_fragment(pfmlParser ctx )
{
	int bfs;
	#undef	RETURN_TYPE_bfs
	#define	RETURN_TYPE_bfs int

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3506:6: (bfs= bit_field_size )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3506:6: bfs= bit_field_size
    {
        FOLLOWPUSH(FOLLOW_bit_field_size_in_synpred514_fml10755);
        bfs=bit_field_size(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred514_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred514_fmlEx; /* Prevent compiler warnings */
rulesynpred514_fmlEx: ;

}
// $ANTLR end synpred514_fml

// $ANTLR start synpred517_fml
static void synpred517_fml_fragment(pfmlParser ctx )
{
	int bfs;
	#undef	RETURN_TYPE_bfs
	#define	RETURN_TYPE_bfs int

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3511:6: (bfs= bit_field_size )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3511:6: bfs= bit_field_size
    {
        FOLLOWPUSH(FOLLOW_bit_field_size_in_synpred517_fml10794);
        bfs=bit_field_size(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred517_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred517_fmlEx; /* Prevent compiler warnings */
rulesynpred517_fmlEx: ;

}
// $ANTLR end synpred517_fml

// $ANTLR start synpred520_fml
static void synpred520_fml_fragment(pfmlParser ctx )
{
	int bfs;
	#undef	RETURN_TYPE_bfs
	#define	RETURN_TYPE_bfs int

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3516:6: (bfs= bit_field_size )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3516:6: bfs= bit_field_size
    {
        FOLLOWPUSH(FOLLOW_bit_field_size_in_synpred520_fml10831);
        bfs=bit_field_size(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred520_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred520_fmlEx; /* Prevent compiler warnings */
rulesynpred520_fmlEx: ;

}
// $ANTLR end synpred520_fml

// $ANTLR start synpred531_fml
static void synpred531_fml_fragment(pfmlParser ctx )
{
	int bfs;
	#undef	RETURN_TYPE_bfs
	#define	RETURN_TYPE_bfs int

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3533:6: (bfs= bit_field_size )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3533:6: bfs= bit_field_size
    {
        FOLLOWPUSH(FOLLOW_bit_field_size_in_synpred531_fml10968);
        bfs=bit_field_size(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred531_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred531_fmlEx; /* Prevent compiler warnings */
rulesynpred531_fmlEx: ;

}
// $ANTLR end synpred531_fml

// $ANTLR start synpred535_fml
static void synpred535_fml_fragment(pfmlParser ctx )
{
	int bfs;
	#undef	RETURN_TYPE_bfs
	#define	RETURN_TYPE_bfs int

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3546:6: (bfs= bit_field_size )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3546:6: bfs= bit_field_size
    {
        FOLLOWPUSH(FOLLOW_bit_field_size_in_synpred535_fml11020);
        bfs=bit_field_size(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred535_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred535_fmlEx; /* Prevent compiler warnings */
rulesynpred535_fmlEx: ;

}
// $ANTLR end synpred535_fml

// $ANTLR start synpred537_fml
static void synpred537_fml_fragment(pfmlParser ctx )
{
	int bfs;
	#undef	RETURN_TYPE_bfs
	#define	RETURN_TYPE_bfs int

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3551:6: (bfs= bit_field_size )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3551:6: bfs= bit_field_size
    {
        FOLLOWPUSH(FOLLOW_bit_field_size_in_synpred537_fml11051);
        bfs=bit_field_size(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred537_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred537_fmlEx; /* Prevent compiler warnings */
rulesynpred537_fmlEx: ;

}
// $ANTLR end synpred537_fml

// $ANTLR start synpred539_fml
static void synpred539_fml_fragment(pfmlParser ctx )
{
	fmlParser_string_field_size_return sfs;
	#undef	RETURN_TYPE_sfs
	#define	RETURN_TYPE_sfs fmlParser_string_field_size_return

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3556:6: (sfs= string_field_size )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3556:6: sfs= string_field_size
    {
        FOLLOWPUSH(FOLLOW_string_field_size_in_synpred539_fml11080);
        sfs=string_field_size(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred539_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred539_fmlEx; /* Prevent compiler warnings */
rulesynpred539_fmlEx: ;

}
// $ANTLR end synpred539_fml

// $ANTLR start synpred555_fml
static void synpred555_fml_fragment(pfmlParser ctx )
{
	sep::avm_size_t n;
	#undef	RETURN_TYPE_n
	#define	RETURN_TYPE_n sep::avm_size_t

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3601:6: ( ( COMMA | DOTDOT ) n= integer_constant )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3601:6: ( COMMA | DOTDOT ) n= integer_constant
    {
        if ( LA(1) == COMMA || LA(1) == DOTDOT )
        {
            CONSUME();
            PERRORRECOVERY=ANTLR3_FALSE;
            FAILEDFLAG=ANTLR3_FALSE;

        }
        else
        {
            if (BACKTRACKING>0)
            {
                FAILEDFLAG = ANTLR3_TRUE;
                return ;
            }

            CONSTRUCTEX();
            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
            EXCEPTION->expectingSet = NULL;

            goto rulesynpred555_fmlEx;
        }


        FOLLOWPUSH(FOLLOW_integer_constant_in_synpred555_fml11374);
        n=integer_constant(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred555_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred555_fmlEx; /* Prevent compiler warnings */
rulesynpred555_fmlEx: ;

}
// $ANTLR end synpred555_fml

// $ANTLR start synpred559_fml
static void synpred559_fml_fragment(pfmlParser ctx )
{
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3645:6: ( type_var ID )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3645:8: type_var ID
    {
        FOLLOWPUSH(FOLLOW_type_var_in_synpred559_fml11507);
        type_var(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred559_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


         MATCHT(ID, &FOLLOW_ID_in_synpred559_fml11509);
        if  (HASEXCEPTION())
        {
            goto rulesynpred559_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred559_fmlEx; /* Prevent compiler warnings */
rulesynpred559_fmlEx: ;

}
// $ANTLR end synpred559_fml

// $ANTLR start synpred574_fml
static void synpred574_fml_fragment(pfmlParser ctx )
{
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3790:52: ( type_var )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3790:52: type_var
    {
        FOLLOWPUSH(FOLLOW_type_var_in_synpred574_fml12057);
        type_var(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred574_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred574_fmlEx; /* Prevent compiler warnings */
rulesynpred574_fmlEx: ;

}
// $ANTLR end synpred574_fml

// $ANTLR start synpred609_fml
static void synpred609_fml_fragment(pfmlParser ctx )
{
	sep::avm_size_t sz;
	#undef	RETURN_TYPE_sz
	#define	RETURN_TYPE_sz sep::avm_size_t

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3951:5: ( COMMA sz= integer_constant )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:3951:5: COMMA sz= integer_constant
    {
         MATCHT(COMMA, &FOLLOW_COMMA_in_synpred609_fml12775);
        if  (HASEXCEPTION())
        {
            goto rulesynpred609_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_integer_constant_in_synpred609_fml12780);
        sz=integer_constant(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred609_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred609_fmlEx; /* Prevent compiler warnings */
rulesynpred609_fmlEx: ;

}
// $ANTLR end synpred609_fml

// $ANTLR start synpred636_fml
static void synpred636_fml_fragment(pfmlParser ctx )
{
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4124:6: ( ( modifier_param )? type_var ID )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4124:8: ( modifier_param )? type_var ID
    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4124:8: ( modifier_param )?
        {
            int alt655=2;
            switch ( LA(1) )
            {
                case ASSIGN_REF:
                case BAND:
                case LTE:
                case 164:
                case 166:
                case 243:
                case 262:
                case 282:
                case 295:
                case 298:
                case 305:
                case 318:
                case 335:
                case 341:
                case 361:
                case 364:
                	{
                		alt655=1;
                	}
                    break;
            }

            switch (alt655)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4124:8: modifier_param
        	    {
        	        FOLLOWPUSH(FOLLOW_modifier_param_in_synpred636_fml13291);
        	        modifier_param(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesynpred636_fmlEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;

            }
        }

        FOLLOWPUSH(FOLLOW_type_var_in_synpred636_fml13295);
        type_var(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred636_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


         MATCHT(ID, &FOLLOW_ID_in_synpred636_fml13297);
        if  (HASEXCEPTION())
        {
            goto rulesynpred636_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred636_fmlEx; /* Prevent compiler warnings */
rulesynpred636_fmlEx: ;

}
// $ANTLR end synpred636_fml

// $ANTLR start synpred643_fml
static void synpred643_fml_fragment(pfmlParser ctx )
{
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4205:6: ( ( modifier_param )? type_var ID )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4205:8: ( modifier_param )? type_var ID
    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4205:8: ( modifier_param )?
        {
            int alt657=2;
            switch ( LA(1) )
            {
                case ASSIGN_REF:
                case BAND:
                case LTE:
                case 164:
                case 166:
                case 243:
                case 262:
                case 282:
                case 295:
                case 298:
                case 305:
                case 318:
                case 335:
                case 341:
                case 361:
                case 364:
                	{
                		alt657=1;
                	}
                    break;
            }

            switch (alt657)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4205:8: modifier_param
        	    {
        	        FOLLOWPUSH(FOLLOW_modifier_param_in_synpred643_fml13470);
        	        modifier_param(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesynpred643_fmlEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;

            }
        }

        FOLLOWPUSH(FOLLOW_type_var_in_synpred643_fml13474);
        type_var(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred643_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


         MATCHT(ID, &FOLLOW_ID_in_synpred643_fml13476);
        if  (HASEXCEPTION())
        {
            goto rulesynpred643_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred643_fmlEx; /* Prevent compiler warnings */
rulesynpred643_fmlEx: ;

}
// $ANTLR end synpred643_fml

// $ANTLR start synpred705_fml
static void synpred705_fml_fragment(pfmlParser ctx )
{
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4535:4: ( qualifiedNameID '->' )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4535:6: qualifiedNameID '->'
    {
        FOLLOWPUSH(FOLLOW_qualifiedNameID_in_synpred705_fml14773);
        qualifiedNameID(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred705_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


         MATCHT(164, &FOLLOW_164_in_synpred705_fml14775);
        if  (HASEXCEPTION())
        {
            goto rulesynpred705_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred705_fmlEx; /* Prevent compiler warnings */
rulesynpred705_fmlEx: ;

}
// $ANTLR end synpred705_fml

// $ANTLR start synpred709_fml
static void synpred709_fml_fragment(pfmlParser ctx )
{
	sep::BFCode s;
	#undef	RETURN_TYPE_s
	#define	RETURN_TYPE_s sep::BFCode

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4606:4: (s= statement_assign )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4606:4: s= statement_assign
    {
        FOLLOWPUSH(FOLLOW_statement_assign_in_synpred709_fml14981);
        s=statement_assign(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred709_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred709_fmlEx; /* Prevent compiler warnings */
rulesynpred709_fmlEx: ;

}
// $ANTLR end synpred709_fml

// $ANTLR start synpred714_fml
static void synpred714_fml_fragment(pfmlParser ctx )
{
	sep::BFCode s;
	#undef	RETURN_TYPE_s
	#define	RETURN_TYPE_s sep::BFCode

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4614:4: (s= statement_invoke_routine )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4614:4: s= statement_invoke_routine
    {
        FOLLOWPUSH(FOLLOW_statement_invoke_routine_in_synpred714_fml15083);
        s=statement_invoke_routine(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred714_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred714_fmlEx; /* Prevent compiler warnings */
rulesynpred714_fmlEx: ;

}
// $ANTLR end synpred714_fml

// $ANTLR start synpred778_fml
static void synpred778_fml_fragment(pfmlParser ctx )
{
	sep::BFCode ps;
	#undef	RETURN_TYPE_ps
	#define	RETURN_TYPE_ps sep::BFCode

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4763:8: (ps= prefix_statement )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4763:8: ps= prefix_statement
    {
        FOLLOWPUSH(FOLLOW_prefix_statement_in_synpred778_fml16346);
        ps=prefix_statement(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred778_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred778_fmlEx; /* Prevent compiler warnings */
rulesynpred778_fmlEx: ;

}
// $ANTLR end synpred778_fml

// $ANTLR start synpred779_fml
static void synpred779_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4764:8: (e= unaryExpression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4764:8: e= unaryExpression
    {
        FOLLOWPUSH(FOLLOW_unaryExpression_in_synpred779_fml16367);
        e=unaryExpression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred779_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred779_fmlEx; /* Prevent compiler warnings */
rulesynpred779_fmlEx: ;

}
// $ANTLR end synpred779_fml

// $ANTLR start synpred780_fml
static void synpred780_fml_fragment(pfmlParser ctx )
{
	sep::BFCode ps;
	#undef	RETURN_TYPE_ps
	#define	RETURN_TYPE_ps sep::BFCode

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4772:8: (ps= prefix_expression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4772:8: ps= prefix_expression
    {
        FOLLOWPUSH(FOLLOW_prefix_expression_in_synpred780_fml16426);
        ps=prefix_expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred780_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred780_fmlEx; /* Prevent compiler warnings */
rulesynpred780_fmlEx: ;

}
// $ANTLR end synpred780_fml

// $ANTLR start synpred781_fml
static void synpred781_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4773:8: (e= unaryExpression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4773:8: e= unaryExpression
    {
        FOLLOWPUSH(FOLLOW_unaryExpression_in_synpred781_fml16446);
        e=unaryExpression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred781_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred781_fmlEx; /* Prevent compiler warnings */
rulesynpred781_fmlEx: ;

}
// $ANTLR end synpred781_fml

// $ANTLR start synpred802_fml
static void synpred802_fml_fragment(pfmlParser ctx )
{
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4914:6: ( LPAREN )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4914:8: LPAREN
    {
         MATCHT(LPAREN, &FOLLOW_LPAREN_in_synpred802_fml17087);
        if  (HASEXCEPTION())
        {
            goto rulesynpred802_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred802_fmlEx; /* Prevent compiler warnings */
rulesynpred802_fmlEx: ;

}
// $ANTLR end synpred802_fml

// $ANTLR start synpred804_fml
static void synpred804_fml_fragment(pfmlParser ctx )
{
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4919:6: ( LCURLY )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:4919:8: LCURLY
    {
         MATCHT(LCURLY, &FOLLOW_LCURLY_in_synpred804_fml17130);
        if  (HASEXCEPTION())
        {
            goto rulesynpred804_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred804_fmlEx; /* Prevent compiler warnings */
rulesynpred804_fmlEx: ;

}
// $ANTLR end synpred804_fml

// $ANTLR start synpred861_fml
static void synpred861_fml_fragment(pfmlParser ctx )
{
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5320:8: ( 'env' )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5320:8: 'env'
    {
         MATCHT(277, &FOLLOW_277_in_synpred861_fml18455);
        if  (HASEXCEPTION())
        {
            goto rulesynpred861_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred861_fmlEx; /* Prevent compiler warnings */
rulesynpred861_fmlEx: ;

}
// $ANTLR end synpred861_fml

// $ANTLR start synpred872_fml
static void synpred872_fml_fragment(pfmlParser ctx )
{
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5370:8: ( 'env' )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5370:8: 'env'
    {
         MATCHT(277, &FOLLOW_277_in_synpred872_fml18685);
        if  (HASEXCEPTION())
        {
            goto rulesynpred872_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred872_fmlEx; /* Prevent compiler warnings */
rulesynpred872_fmlEx: ;

}
// $ANTLR end synpred872_fml

// $ANTLR start synpred891_fml
static void synpred891_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

	sep::BFCode bs;
	#undef	RETURN_TYPE_bs
	#define	RETURN_TYPE_bs sep::BFCode

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5515:6: ( ( 'elseif' | 'else' 'if' ) e= expression bs= block_statement )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5515:6: ( 'elseif' | 'else' 'if' ) e= expression bs= block_statement
    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5515:6: ( 'elseif' | 'else' 'if' )
        {
            int alt693=2;
            switch ( LA(1) )
            {
            case 274:
            	{
            		alt693=1;
            	}
                break;
            case 273:
            	{
            		alt693=2;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 693;
                EXCEPTION->state        = 0;


                goto rulesynpred891_fmlEx;

            }

            switch (alt693)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5515:8: 'elseif'
        	    {
        	         MATCHT(274, &FOLLOW_274_in_synpred891_fml19245);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesynpred891_fmlEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5515:19: 'else' 'if'
        	    {
        	         MATCHT(273, &FOLLOW_273_in_synpred891_fml19249);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesynpred891_fmlEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	         MATCHT(294, &FOLLOW_294_in_synpred891_fml19251);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesynpred891_fmlEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;

            }
        }

        FOLLOWPUSH(FOLLOW_expression_in_synpred891_fml19258);
        e=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred891_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_block_statement_in_synpred891_fml19263);
        bs=block_statement(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred891_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred891_fmlEx; /* Prevent compiler warnings */
rulesynpred891_fmlEx: ;

}
// $ANTLR end synpred891_fml

// $ANTLR start synpred894_fml
static void synpred894_fml_fragment(pfmlParser ctx )
{
	sep::BF c;
	#undef	RETURN_TYPE_c
	#define	RETURN_TYPE_c sep::BF

	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5540:6: ( ( 'elseif' | 'else' 'if' ) c= expression LCURLY e= expression RCURLY )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5540:6: ( 'elseif' | 'else' 'if' ) c= expression LCURLY e= expression RCURLY
    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5540:6: ( 'elseif' | 'else' 'if' )
        {
            int alt694=2;
            switch ( LA(1) )
            {
            case 274:
            	{
            		alt694=1;
            	}
                break;
            case 273:
            	{
            		alt694=2;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 694;
                EXCEPTION->state        = 0;


                goto rulesynpred894_fmlEx;

            }

            switch (alt694)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5540:8: 'elseif'
        	    {
        	         MATCHT(274, &FOLLOW_274_in_synpred894_fml19350);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesynpred894_fmlEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5540:19: 'else' 'if'
        	    {
        	         MATCHT(273, &FOLLOW_273_in_synpred894_fml19354);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesynpred894_fmlEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	         MATCHT(294, &FOLLOW_294_in_synpred894_fml19356);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesynpred894_fmlEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;

            }
        }

        FOLLOWPUSH(FOLLOW_expression_in_synpred894_fml19362);
        c=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred894_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


         MATCHT(LCURLY, &FOLLOW_LCURLY_in_synpred894_fml19365);
        if  (HASEXCEPTION())
        {
            goto rulesynpred894_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_expression_in_synpred894_fml19370);
        e=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred894_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


         MATCHT(RCURLY, &FOLLOW_RCURLY_in_synpred894_fml19373);
        if  (HASEXCEPTION())
        {
            goto rulesynpred894_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred894_fmlEx; /* Prevent compiler warnings */
rulesynpred894_fmlEx: ;

}
// $ANTLR end synpred894_fml

// $ANTLR start synpred896_fml
static void synpred896_fml_fragment(pfmlParser ctx )
{
	sep::BFCode isa;
	#undef	RETURN_TYPE_isa
	#define	RETURN_TYPE_isa sep::BFCode

	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

	sep::BFCode sai;
	#undef	RETURN_TYPE_sai
	#define	RETURN_TYPE_sai sep::BFCode

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5574:6: (isa= for_assign_header SEMI e= expression SEMI sai= for_assign_header )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5574:6: isa= for_assign_header SEMI e= expression SEMI sai= for_assign_header
    {
        FOLLOWPUSH(FOLLOW_for_assign_header_in_synpred896_fml19460);
        isa=for_assign_header(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred896_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


         MATCHT(SEMI, &FOLLOW_SEMI_in_synpred896_fml19463);
        if  (HASEXCEPTION())
        {
            goto rulesynpred896_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_expression_in_synpred896_fml19468);
        e=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred896_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


         MATCHT(SEMI, &FOLLOW_SEMI_in_synpred896_fml19471);
        if  (HASEXCEPTION())
        {
            goto rulesynpred896_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_for_assign_header_in_synpred896_fml19476);
        sai=for_assign_header(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred896_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred896_fmlEx; /* Prevent compiler warnings */
rulesynpred896_fmlEx: ;

}
// $ANTLR end synpred896_fml

// $ANTLR start synpred897_fml
static void synpred897_fml_fragment(pfmlParser ctx )
{
	sep::BFCode isa;
	#undef	RETURN_TYPE_isa
	#define	RETURN_TYPE_isa sep::BFCode

	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

	sep::BFCode sai;
	#undef	RETURN_TYPE_sai
	#define	RETURN_TYPE_sai sep::BFCode

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5577:6: ( LPAREN isa= for_assign_header SEMI e= expression SEMI sai= for_assign_header RPAREN )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5577:6: LPAREN isa= for_assign_header SEMI e= expression SEMI sai= for_assign_header RPAREN
    {
         MATCHT(LPAREN, &FOLLOW_LPAREN_in_synpred897_fml19495);
        if  (HASEXCEPTION())
        {
            goto rulesynpred897_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_for_assign_header_in_synpred897_fml19506);
        isa=for_assign_header(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred897_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


         MATCHT(SEMI, &FOLLOW_SEMI_in_synpred897_fml19509);
        if  (HASEXCEPTION())
        {
            goto rulesynpred897_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_expression_in_synpred897_fml19514);
        e=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred897_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


         MATCHT(SEMI, &FOLLOW_SEMI_in_synpred897_fml19517);
        if  (HASEXCEPTION())
        {
            goto rulesynpred897_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_for_assign_header_in_synpred897_fml19522);
        sai=for_assign_header(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred897_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


         MATCHT(RPAREN, &FOLLOW_RPAREN_in_synpred897_fml19529);
        if  (HASEXCEPTION())
        {
            goto rulesynpred897_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred897_fmlEx; /* Prevent compiler warnings */
rulesynpred897_fmlEx: ;

}
// $ANTLR end synpred897_fml

// $ANTLR start synpred898_fml
static void synpred898_fml_fragment(pfmlParser ctx )
{
	sep::BF lv;
	#undef	RETURN_TYPE_lv
	#define	RETURN_TYPE_lv sep::BF

	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5582:6: (lv= lvalue COLON e= expression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5582:6: lv= lvalue COLON e= expression
    {
        FOLLOWPUSH(FOLLOW_lvalue_in_synpred898_fml19550);
        lv=lvalue(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred898_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


         MATCHT(COLON, &FOLLOW_COLON_in_synpred898_fml19553);
        if  (HASEXCEPTION())
        {
            goto rulesynpred898_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_expression_in_synpred898_fml19558);
        e=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred898_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred898_fmlEx; /* Prevent compiler warnings */
rulesynpred898_fmlEx: ;

}
// $ANTLR end synpred898_fml

// $ANTLR start synpred946_fml
static void synpred946_fml_fragment(pfmlParser ctx )
{
	fmlParser_labelled_argument_return lp;
	#undef	RETURN_TYPE_lp
	#define	RETURN_TYPE_lp fmlParser_labelled_argument_return

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5815:6: ( LPAREN lp= labelled_argument ( COMMA lp= labelled_argument )* RPAREN )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5815:6: LPAREN lp= labelled_argument ( COMMA lp= labelled_argument )* RPAREN
    {
         MATCHT(LPAREN, &FOLLOW_LPAREN_in_synpred946_fml20614);
        if  (HASEXCEPTION())
        {
            goto rulesynpred946_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_labelled_argument_in_synpred946_fml20623);
        lp=labelled_argument(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred946_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5820:6: ( COMMA lp= labelled_argument )*

        for (;;)
        {
            int alt706=2;
            switch ( LA(1) )
            {
            case COMMA:
            	{
            		alt706=1;
            	}
                break;

            }

            switch (alt706)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5820:8: COMMA lp= labelled_argument
        	    {
        	         MATCHT(COMMA, &FOLLOW_COMMA_in_synpred946_fml20639);
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesynpred946_fmlEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_labelled_argument_in_synpred946_fml20650);
        	        lp=labelled_argument(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesynpred946_fmlEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;

        	default:
        	    goto loop706;	/* break out of the loop */
        	    break;
            }
        }
        loop706: ; /* Jump out to here if this rule does not match */


         MATCHT(RPAREN, &FOLLOW_RPAREN_in_synpred946_fml20674);
        if  (HASEXCEPTION())
        {
            goto rulesynpred946_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred946_fmlEx; /* Prevent compiler warnings */
rulesynpred946_fmlEx: ;

}
// $ANTLR end synpred946_fml

// $ANTLR start synpred947_fml
static void synpred947_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5899:4: ( ASSIGN e= expression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5899:4: ASSIGN e= expression
    {
         MATCHT(ASSIGN, &FOLLOW_ASSIGN_in_synpred947_fml20766);
        if  (HASEXCEPTION())
        {
            goto rulesynpred947_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_expression_in_synpred947_fml20771);
        e=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred947_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred947_fmlEx; /* Prevent compiler warnings */
rulesynpred947_fmlEx: ;

}
// $ANTLR end synpred947_fml

// $ANTLR start synpred948_fml
static void synpred948_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5902:4: ( ASSIGN_MACRO e= expression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5902:4: ASSIGN_MACRO e= expression
    {
         MATCHT(ASSIGN_MACRO, &FOLLOW_ASSIGN_MACRO_in_synpred948_fml20780);
        if  (HASEXCEPTION())
        {
            goto rulesynpred948_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_expression_in_synpred948_fml20785);
        e=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred948_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred948_fmlEx; /* Prevent compiler warnings */
rulesynpred948_fmlEx: ;

}
// $ANTLR end synpred948_fml

// $ANTLR start synpred949_fml
static void synpred949_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5905:4: ( ASSIGN_AFTER e= expression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5905:4: ASSIGN_AFTER e= expression
    {
         MATCHT(ASSIGN_AFTER, &FOLLOW_ASSIGN_AFTER_in_synpred949_fml20794);
        if  (HASEXCEPTION())
        {
            goto rulesynpred949_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_expression_in_synpred949_fml20799);
        e=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred949_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred949_fmlEx; /* Prevent compiler warnings */
rulesynpred949_fmlEx: ;

}
// $ANTLR end synpred949_fml

// $ANTLR start synpred950_fml
static void synpred950_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5908:4: ( PLUS_ASSIGN e= expression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5908:4: PLUS_ASSIGN e= expression
    {
         MATCHT(PLUS_ASSIGN, &FOLLOW_PLUS_ASSIGN_in_synpred950_fml20808);
        if  (HASEXCEPTION())
        {
            goto rulesynpred950_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_expression_in_synpred950_fml20813);
        e=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred950_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred950_fmlEx; /* Prevent compiler warnings */
rulesynpred950_fmlEx: ;

}
// $ANTLR end synpred950_fml

// $ANTLR start synpred951_fml
static void synpred951_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5911:4: ( PLUS_ASSIGN_AFTER e= expression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5911:4: PLUS_ASSIGN_AFTER e= expression
    {
         MATCHT(PLUS_ASSIGN_AFTER, &FOLLOW_PLUS_ASSIGN_AFTER_in_synpred951_fml20822);
        if  (HASEXCEPTION())
        {
            goto rulesynpred951_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_expression_in_synpred951_fml20827);
        e=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred951_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred951_fmlEx; /* Prevent compiler warnings */
rulesynpred951_fmlEx: ;

}
// $ANTLR end synpred951_fml

// $ANTLR start synpred952_fml
static void synpred952_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5914:4: ( MINUS_ASSIGN e= expression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5914:4: MINUS_ASSIGN e= expression
    {
         MATCHT(MINUS_ASSIGN, &FOLLOW_MINUS_ASSIGN_in_synpred952_fml20836);
        if  (HASEXCEPTION())
        {
            goto rulesynpred952_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_expression_in_synpred952_fml20841);
        e=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred952_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred952_fmlEx; /* Prevent compiler warnings */
rulesynpred952_fmlEx: ;

}
// $ANTLR end synpred952_fml

// $ANTLR start synpred953_fml
static void synpred953_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5917:4: ( MINUS_ASSIGN_AFTER e= expression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5917:4: MINUS_ASSIGN_AFTER e= expression
    {
         MATCHT(MINUS_ASSIGN_AFTER, &FOLLOW_MINUS_ASSIGN_AFTER_in_synpred953_fml20850);
        if  (HASEXCEPTION())
        {
            goto rulesynpred953_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_expression_in_synpred953_fml20855);
        e=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred953_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred953_fmlEx; /* Prevent compiler warnings */
rulesynpred953_fmlEx: ;

}
// $ANTLR end synpred953_fml

// $ANTLR start synpred954_fml
static void synpred954_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5920:4: ( STAR_ASSIGN e= expression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5920:4: STAR_ASSIGN e= expression
    {
         MATCHT(STAR_ASSIGN, &FOLLOW_STAR_ASSIGN_in_synpred954_fml20864);
        if  (HASEXCEPTION())
        {
            goto rulesynpred954_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_expression_in_synpred954_fml20869);
        e=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred954_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred954_fmlEx; /* Prevent compiler warnings */
rulesynpred954_fmlEx: ;

}
// $ANTLR end synpred954_fml

// $ANTLR start synpred955_fml
static void synpred955_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5923:4: ( STAR_ASSIGN_AFTER e= expression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5923:4: STAR_ASSIGN_AFTER e= expression
    {
         MATCHT(STAR_ASSIGN_AFTER, &FOLLOW_STAR_ASSIGN_AFTER_in_synpred955_fml20878);
        if  (HASEXCEPTION())
        {
            goto rulesynpred955_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_expression_in_synpred955_fml20883);
        e=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred955_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred955_fmlEx; /* Prevent compiler warnings */
rulesynpred955_fmlEx: ;

}
// $ANTLR end synpred955_fml

// $ANTLR start synpred956_fml
static void synpred956_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5926:4: ( DIV_ASSIGN e= expression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5926:4: DIV_ASSIGN e= expression
    {
         MATCHT(DIV_ASSIGN, &FOLLOW_DIV_ASSIGN_in_synpred956_fml20892);
        if  (HASEXCEPTION())
        {
            goto rulesynpred956_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_expression_in_synpred956_fml20897);
        e=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred956_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred956_fmlEx; /* Prevent compiler warnings */
rulesynpred956_fmlEx: ;

}
// $ANTLR end synpred956_fml

// $ANTLR start synpred957_fml
static void synpred957_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5929:4: ( DIV_ASSIGN_AFTER e= expression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5929:4: DIV_ASSIGN_AFTER e= expression
    {
         MATCHT(DIV_ASSIGN_AFTER, &FOLLOW_DIV_ASSIGN_AFTER_in_synpred957_fml20906);
        if  (HASEXCEPTION())
        {
            goto rulesynpred957_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_expression_in_synpred957_fml20911);
        e=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred957_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred957_fmlEx; /* Prevent compiler warnings */
rulesynpred957_fmlEx: ;

}
// $ANTLR end synpred957_fml

// $ANTLR start synpred958_fml
static void synpred958_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5932:4: ( MOD_ASSIGN e= expression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5932:4: MOD_ASSIGN e= expression
    {
         MATCHT(MOD_ASSIGN, &FOLLOW_MOD_ASSIGN_in_synpred958_fml20920);
        if  (HASEXCEPTION())
        {
            goto rulesynpred958_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_expression_in_synpred958_fml20925);
        e=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred958_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred958_fmlEx; /* Prevent compiler warnings */
rulesynpred958_fmlEx: ;

}
// $ANTLR end synpred958_fml

// $ANTLR start synpred959_fml
static void synpred959_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5935:4: ( MOD_ASSIGN_AFTER e= expression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5935:4: MOD_ASSIGN_AFTER e= expression
    {
         MATCHT(MOD_ASSIGN_AFTER, &FOLLOW_MOD_ASSIGN_AFTER_in_synpred959_fml20934);
        if  (HASEXCEPTION())
        {
            goto rulesynpred959_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_expression_in_synpred959_fml20939);
        e=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred959_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred959_fmlEx; /* Prevent compiler warnings */
rulesynpred959_fmlEx: ;

}
// $ANTLR end synpred959_fml

// $ANTLR start synpred960_fml
static void synpred960_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5938:4: ( LAND_ASSIGN e= expression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5938:4: LAND_ASSIGN e= expression
    {
         MATCHT(LAND_ASSIGN, &FOLLOW_LAND_ASSIGN_in_synpred960_fml20948);
        if  (HASEXCEPTION())
        {
            goto rulesynpred960_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_expression_in_synpred960_fml20953);
        e=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred960_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred960_fmlEx; /* Prevent compiler warnings */
rulesynpred960_fmlEx: ;

}
// $ANTLR end synpred960_fml

// $ANTLR start synpred961_fml
static void synpred961_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5941:4: ( LAND_ASSIGN_AFTER e= expression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5941:4: LAND_ASSIGN_AFTER e= expression
    {
         MATCHT(LAND_ASSIGN_AFTER, &FOLLOW_LAND_ASSIGN_AFTER_in_synpred961_fml20962);
        if  (HASEXCEPTION())
        {
            goto rulesynpred961_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_expression_in_synpred961_fml20967);
        e=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred961_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred961_fmlEx; /* Prevent compiler warnings */
rulesynpred961_fmlEx: ;

}
// $ANTLR end synpred961_fml

// $ANTLR start synpred962_fml
static void synpred962_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5944:4: ( LOR_ASSIGN e= expression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5944:4: LOR_ASSIGN e= expression
    {
         MATCHT(LOR_ASSIGN, &FOLLOW_LOR_ASSIGN_in_synpred962_fml20976);
        if  (HASEXCEPTION())
        {
            goto rulesynpred962_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_expression_in_synpred962_fml20981);
        e=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred962_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred962_fmlEx; /* Prevent compiler warnings */
rulesynpred962_fmlEx: ;

}
// $ANTLR end synpred962_fml

// $ANTLR start synpred963_fml
static void synpred963_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5947:4: ( LOR_ASSIGN_AFTER e= expression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5947:4: LOR_ASSIGN_AFTER e= expression
    {
         MATCHT(LOR_ASSIGN_AFTER, &FOLLOW_LOR_ASSIGN_AFTER_in_synpred963_fml20990);
        if  (HASEXCEPTION())
        {
            goto rulesynpred963_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_expression_in_synpred963_fml20995);
        e=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred963_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred963_fmlEx; /* Prevent compiler warnings */
rulesynpred963_fmlEx: ;

}
// $ANTLR end synpred963_fml

// $ANTLR start synpred964_fml
static void synpred964_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5950:4: ( BAND_ASSIGN e= expression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5950:4: BAND_ASSIGN e= expression
    {
         MATCHT(BAND_ASSIGN, &FOLLOW_BAND_ASSIGN_in_synpred964_fml21004);
        if  (HASEXCEPTION())
        {
            goto rulesynpred964_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_expression_in_synpred964_fml21009);
        e=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred964_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred964_fmlEx; /* Prevent compiler warnings */
rulesynpred964_fmlEx: ;

}
// $ANTLR end synpred964_fml

// $ANTLR start synpred965_fml
static void synpred965_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5953:4: ( BAND_ASSIGN_AFTER e= expression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5953:4: BAND_ASSIGN_AFTER e= expression
    {
         MATCHT(BAND_ASSIGN_AFTER, &FOLLOW_BAND_ASSIGN_AFTER_in_synpred965_fml21018);
        if  (HASEXCEPTION())
        {
            goto rulesynpred965_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_expression_in_synpred965_fml21023);
        e=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred965_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred965_fmlEx; /* Prevent compiler warnings */
rulesynpred965_fmlEx: ;

}
// $ANTLR end synpred965_fml

// $ANTLR start synpred966_fml
static void synpred966_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5956:4: ( BOR_ASSIGN e= expression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5956:4: BOR_ASSIGN e= expression
    {
         MATCHT(BOR_ASSIGN, &FOLLOW_BOR_ASSIGN_in_synpred966_fml21032);
        if  (HASEXCEPTION())
        {
            goto rulesynpred966_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_expression_in_synpred966_fml21037);
        e=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred966_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred966_fmlEx; /* Prevent compiler warnings */
rulesynpred966_fmlEx: ;

}
// $ANTLR end synpred966_fml

// $ANTLR start synpred967_fml
static void synpred967_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5959:4: ( BOR_ASSIGN_AFTER e= expression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5959:4: BOR_ASSIGN_AFTER e= expression
    {
         MATCHT(BOR_ASSIGN_AFTER, &FOLLOW_BOR_ASSIGN_AFTER_in_synpred967_fml21046);
        if  (HASEXCEPTION())
        {
            goto rulesynpred967_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_expression_in_synpred967_fml21051);
        e=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred967_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred967_fmlEx; /* Prevent compiler warnings */
rulesynpred967_fmlEx: ;

}
// $ANTLR end synpred967_fml

// $ANTLR start synpred968_fml
static void synpred968_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5962:4: ( BXOR_ASSIGN e= expression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5962:4: BXOR_ASSIGN e= expression
    {
         MATCHT(BXOR_ASSIGN, &FOLLOW_BXOR_ASSIGN_in_synpred968_fml21060);
        if  (HASEXCEPTION())
        {
            goto rulesynpred968_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_expression_in_synpred968_fml21065);
        e=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred968_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred968_fmlEx; /* Prevent compiler warnings */
rulesynpred968_fmlEx: ;

}
// $ANTLR end synpred968_fml

// $ANTLR start synpred969_fml
static void synpred969_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5965:4: ( BXOR_ASSIGN_AFTER e= expression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5965:4: BXOR_ASSIGN_AFTER e= expression
    {
         MATCHT(BXOR_ASSIGN_AFTER, &FOLLOW_BXOR_ASSIGN_AFTER_in_synpred969_fml21074);
        if  (HASEXCEPTION())
        {
            goto rulesynpred969_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_expression_in_synpred969_fml21079);
        e=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred969_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred969_fmlEx; /* Prevent compiler warnings */
rulesynpred969_fmlEx: ;

}
// $ANTLR end synpred969_fml

// $ANTLR start synpred970_fml
static void synpred970_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5968:4: ( LSHIFT_ASSIGN e= expression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5968:4: LSHIFT_ASSIGN e= expression
    {
         MATCHT(LSHIFT_ASSIGN, &FOLLOW_LSHIFT_ASSIGN_in_synpred970_fml21088);
        if  (HASEXCEPTION())
        {
            goto rulesynpred970_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_expression_in_synpred970_fml21093);
        e=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred970_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred970_fmlEx; /* Prevent compiler warnings */
rulesynpred970_fmlEx: ;

}
// $ANTLR end synpred970_fml

// $ANTLR start synpred971_fml
static void synpred971_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5971:4: ( LSHIFT_ASSIGN_AFTER e= expression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5971:4: LSHIFT_ASSIGN_AFTER e= expression
    {
         MATCHT(LSHIFT_ASSIGN_AFTER, &FOLLOW_LSHIFT_ASSIGN_AFTER_in_synpred971_fml21102);
        if  (HASEXCEPTION())
        {
            goto rulesynpred971_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_expression_in_synpred971_fml21107);
        e=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred971_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred971_fmlEx; /* Prevent compiler warnings */
rulesynpred971_fmlEx: ;

}
// $ANTLR end synpred971_fml

// $ANTLR start synpred972_fml
static void synpred972_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5974:4: ( RSHIFT_ASSIGN e= expression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5974:4: RSHIFT_ASSIGN e= expression
    {
         MATCHT(RSHIFT_ASSIGN, &FOLLOW_RSHIFT_ASSIGN_in_synpred972_fml21116);
        if  (HASEXCEPTION())
        {
            goto rulesynpred972_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_expression_in_synpred972_fml21121);
        e=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred972_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred972_fmlEx; /* Prevent compiler warnings */
rulesynpred972_fmlEx: ;

}
// $ANTLR end synpred972_fml

// $ANTLR start synpred973_fml
static void synpred973_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5977:4: ( RSHIFT_ASSIGN_AFTER e= expression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5977:4: RSHIFT_ASSIGN_AFTER e= expression
    {
         MATCHT(RSHIFT_ASSIGN_AFTER, &FOLLOW_RSHIFT_ASSIGN_AFTER_in_synpred973_fml21130);
        if  (HASEXCEPTION())
        {
            goto rulesynpred973_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_expression_in_synpred973_fml21135);
        e=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred973_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred973_fmlEx; /* Prevent compiler warnings */
rulesynpred973_fmlEx: ;

}
// $ANTLR end synpred973_fml

// $ANTLR start synpred974_fml
static void synpred974_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5980:4: ( OP_PUSH e= expression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5980:4: OP_PUSH e= expression
    {
         MATCHT(OP_PUSH, &FOLLOW_OP_PUSH_in_synpred974_fml21144);
        if  (HASEXCEPTION())
        {
            goto rulesynpred974_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_expression_in_synpred974_fml21149);
        e=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred974_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred974_fmlEx; /* Prevent compiler warnings */
rulesynpred974_fmlEx: ;

}
// $ANTLR end synpred974_fml

// $ANTLR start synpred975_fml
static void synpred975_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5983:4: ( OP_ASSIGN_TOP e= expression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5983:4: OP_ASSIGN_TOP e= expression
    {
         MATCHT(OP_ASSIGN_TOP, &FOLLOW_OP_ASSIGN_TOP_in_synpred975_fml21158);
        if  (HASEXCEPTION())
        {
            goto rulesynpred975_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_expression_in_synpred975_fml21163);
        e=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred975_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred975_fmlEx; /* Prevent compiler warnings */
rulesynpred975_fmlEx: ;

}
// $ANTLR end synpred975_fml

// $ANTLR start synpred976_fml
static void synpred976_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5986:4: ( OP_POP e= expression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5986:4: OP_POP e= expression
    {
         MATCHT(OP_POP, &FOLLOW_OP_POP_in_synpred976_fml21172);
        if  (HASEXCEPTION())
        {
            goto rulesynpred976_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_expression_in_synpred976_fml21177);
        e=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred976_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred976_fmlEx; /* Prevent compiler warnings */
rulesynpred976_fmlEx: ;

}
// $ANTLR end synpred976_fml

// $ANTLR start synpred977_fml
static void synpred977_fml_fragment(pfmlParser ctx )
{
	sep::BF th;
	#undef	RETURN_TYPE_th
	#define	RETURN_TYPE_th sep::BF

	sep::BF el;
	#undef	RETURN_TYPE_el
	#define	RETURN_TYPE_el sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5998:6: ( QUESTION th= expression COLON el= expression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:5998:6: QUESTION th= expression COLON el= expression
    {
         MATCHT(QUESTION, &FOLLOW_QUESTION_in_synpred977_fml21215);
        if  (HASEXCEPTION())
        {
            goto rulesynpred977_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_expression_in_synpred977_fml21220);
        th=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred977_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


         MATCHT(COLON, &FOLLOW_COLON_in_synpred977_fml21223);
        if  (HASEXCEPTION())
        {
            goto rulesynpred977_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_expression_in_synpred977_fml21228);
        el=expression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred977_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred977_fmlEx; /* Prevent compiler warnings */
rulesynpred977_fmlEx: ;

}
// $ANTLR end synpred977_fml

// $ANTLR start synpred980_fml
static void synpred980_fml_fragment(pfmlParser ctx )
{
	sep::Operator * op;
	#undef	RETURN_TYPE_op
	#define	RETURN_TYPE_op sep::Operator *

	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6006:6: ( (op= op_sequence |op= op_scheduling |op= op_concurrency ) e= conditionalOrExpression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6006:6: (op= op_sequence |op= op_scheduling |op= op_concurrency ) e= conditionalOrExpression
    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6006:6: (op= op_sequence |op= op_scheduling |op= op_concurrency )
        {
            int alt707=3;
            switch ( LA(1) )
            {
            case OP_ATOMIC_SEQUENCE:
            case OP_SEQUENCE:
            case OP_SEQUENCE_SIDE:
            case OP_SEQUENCE_WEAK:
            	{
            		alt707=1;
            	}
                break;
            case OP_NON_DETERMINISM:
            case OP_SCHEDULE_AND_THEN:
            case OP_SCHEDULE_GT:
            case OP_SCHEDULE_LT:
            case OP_SCHEDULE_OR_ELSE:
            case OP_SCHEDULE_XOR:
            	{
            		alt707=2;
            	}
                break;
            case OP_CONCURRENCY_AND:
            case OP_CONCURRENCY_ASYNC:
            case OP_CONCURRENCY_INTERLEAVING:
            case OP_CONCURRENCY_OR:
            case OP_CONCURRENCY_PARALLEL:
            case OP_CONCURRENCY_RDV_AND:
            case OP_CONCURRENCY_RDV_ASYNC:
            case OP_CONCURRENCY_RDV_INTERLEAVING:
            case OP_CONCURRENCY_RDV_OR:
            case OP_CONCURRENCY_RDV_PARALLEL:
            	{
            		alt707=3;
            	}
                break;

            default:
                if (BACKTRACKING>0)
                {
                    FAILEDFLAG = ANTLR3_TRUE;
                    return ;
                }

                CONSTRUCTEX();
                EXCEPTION->type         = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
                EXCEPTION->message      = (void *)"";
                EXCEPTION->decisionNum  = 707;
                EXCEPTION->state        = 0;


                goto rulesynpred980_fmlEx;

            }

            switch (alt707)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6006:8: op= op_sequence
        	    {
        	        FOLLOWPUSH(FOLLOW_op_sequence_in_synpred980_fml21270);
        	        op=op_sequence(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesynpred980_fmlEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 2:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6006:27: op= op_scheduling
        	    {
        	        FOLLOWPUSH(FOLLOW_op_scheduling_in_synpred980_fml21278);
        	        op=op_scheduling(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesynpred980_fmlEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;
        	case 3:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6006:48: op= op_concurrency
        	    {
        	        FOLLOWPUSH(FOLLOW_op_concurrency_in_synpred980_fml21286);
        	        op=op_concurrency(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesynpred980_fmlEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;

            }
        }

        FOLLOWPUSH(FOLLOW_conditionalOrExpression_in_synpred980_fml21297);
        e=conditionalOrExpression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred980_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred980_fmlEx; /* Prevent compiler warnings */
rulesynpred980_fmlEx: ;

}
// $ANTLR end synpred980_fml

// $ANTLR start synpred981_fml
static void synpred981_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6014:6: ( LOR e= conditionalAndExpression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6014:6: LOR e= conditionalAndExpression
    {
         MATCHT(LOR, &FOLLOW_LOR_in_synpred981_fml21333);
        if  (HASEXCEPTION())
        {
            goto rulesynpred981_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_conditionalAndExpression_in_synpred981_fml21337);
        e=conditionalAndExpression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred981_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred981_fmlEx; /* Prevent compiler warnings */
rulesynpred981_fmlEx: ;

}
// $ANTLR end synpred981_fml

// $ANTLR start synpred982_fml
static void synpred982_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6022:6: ( LAND e= bitwiseOrExpression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6022:6: LAND e= bitwiseOrExpression
    {
         MATCHT(LAND, &FOLLOW_LAND_in_synpred982_fml21375);
        if  (HASEXCEPTION())
        {
            goto rulesynpred982_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_bitwiseOrExpression_in_synpred982_fml21379);
        e=bitwiseOrExpression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred982_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred982_fmlEx; /* Prevent compiler warnings */
rulesynpred982_fmlEx: ;

}
// $ANTLR end synpred982_fml

// $ANTLR start synpred983_fml
static void synpred983_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6030:6: ( BOR e= bitwiseXorExpression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6030:6: BOR e= bitwiseXorExpression
    {
         MATCHT(BOR, &FOLLOW_BOR_in_synpred983_fml21417);
        if  (HASEXCEPTION())
        {
            goto rulesynpred983_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_bitwiseXorExpression_in_synpred983_fml21421);
        e=bitwiseXorExpression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred983_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred983_fmlEx; /* Prevent compiler warnings */
rulesynpred983_fmlEx: ;

}
// $ANTLR end synpred983_fml

// $ANTLR start synpred984_fml
static void synpred984_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6038:6: ( BXOR e= bitwiseAndExpression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6038:6: BXOR e= bitwiseAndExpression
    {
         MATCHT(BXOR, &FOLLOW_BXOR_in_synpred984_fml21459);
        if  (HASEXCEPTION())
        {
            goto rulesynpred984_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_bitwiseAndExpression_in_synpred984_fml21463);
        e=bitwiseAndExpression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred984_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred984_fmlEx; /* Prevent compiler warnings */
rulesynpred984_fmlEx: ;

}
// $ANTLR end synpred984_fml

// $ANTLR start synpred985_fml
static void synpred985_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6046:6: ( BAND e= equalityExpression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6046:6: BAND e= equalityExpression
    {
         MATCHT(BAND, &FOLLOW_BAND_in_synpred985_fml21501);
        if  (HASEXCEPTION())
        {
            goto rulesynpred985_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_equalityExpression_in_synpred985_fml21505);
        e=equalityExpression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred985_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred985_fmlEx; /* Prevent compiler warnings */
rulesynpred985_fmlEx: ;

}
// $ANTLR end synpred985_fml

// $ANTLR start synpred986_fml
static void synpred986_fml_fragment(pfmlParser ctx )
{
	sep::Operator * op;
	#undef	RETURN_TYPE_op
	#define	RETURN_TYPE_op sep::Operator *

	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6060:8: (op= equalOp e= relationalExpression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6060:8: op= equalOp e= relationalExpression
    {
        FOLLOWPUSH(FOLLOW_equalOp_in_synpred986_fml21569);
        op=equalOp(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred986_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_relationalExpression_in_synpred986_fml21573);
        e=relationalExpression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred986_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred986_fmlEx; /* Prevent compiler warnings */
rulesynpred986_fmlEx: ;

}
// $ANTLR end synpred986_fml

// $ANTLR start synpred987_fml
static void synpred987_fml_fragment(pfmlParser ctx )
{
	sep::Operator * op;
	#undef	RETURN_TYPE_op
	#define	RETURN_TYPE_op sep::Operator *

	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6058:6: (op= equalOp e= relationalExpression (op= equalOp e= relationalExpression )* )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6058:6: op= equalOp e= relationalExpression (op= equalOp e= relationalExpression )*
    {
        FOLLOWPUSH(FOLLOW_equalOp_in_synpred987_fml21549);
        op=equalOp(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred987_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_relationalExpression_in_synpred987_fml21553);
        e=relationalExpression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred987_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6060:6: (op= equalOp e= relationalExpression )*

        for (;;)
        {
            int alt708=2;
            switch ( LA(1) )
            {
            case EQUAL:
            case NEQUAL:
            case NSEQUAL:
            case SEQUAL:
            	{
            		alt708=1;
            	}
                break;

            }

            switch (alt708)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6060:8: op= equalOp e= relationalExpression
        	    {
        	        FOLLOWPUSH(FOLLOW_equalOp_in_synpred987_fml21569);
        	        op=equalOp(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesynpred987_fmlEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_relationalExpression_in_synpred987_fml21573);
        	        e=relationalExpression(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesynpred987_fmlEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;

        	default:
        	    goto loop708;	/* break out of the loop */
        	    break;
            }
        }
        loop708: ; /* Jump out to here if this rule does not match */


    }

// This is where rules clean up and exit
//
goto rulesynpred987_fmlEx; /* Prevent compiler warnings */
rulesynpred987_fmlEx: ;

}
// $ANTLR end synpred987_fml

// $ANTLR start synpred991_fml
static void synpred991_fml_fragment(pfmlParser ctx )
{
	sep::Operator * op;
	#undef	RETURN_TYPE_op
	#define	RETURN_TYPE_op sep::Operator *

	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6100:8: (op= relationalOp e= shiftExpression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6100:8: op= relationalOp e= shiftExpression
    {
        FOLLOWPUSH(FOLLOW_relationalOp_in_synpred991_fml21695);
        op=relationalOp(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred991_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_shiftExpression_in_synpred991_fml21699);
        e=shiftExpression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred991_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred991_fmlEx; /* Prevent compiler warnings */
rulesynpred991_fmlEx: ;

}
// $ANTLR end synpred991_fml

// $ANTLR start synpred992_fml
static void synpred992_fml_fragment(pfmlParser ctx )
{
	sep::Operator * op;
	#undef	RETURN_TYPE_op
	#define	RETURN_TYPE_op sep::Operator *

	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6098:6: (op= relationalOp e= shiftExpression (op= relationalOp e= shiftExpression )* )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6098:6: op= relationalOp e= shiftExpression (op= relationalOp e= shiftExpression )*
    {
        FOLLOWPUSH(FOLLOW_relationalOp_in_synpred992_fml21675);
        op=relationalOp(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred992_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_shiftExpression_in_synpred992_fml21679);
        e=shiftExpression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred992_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6100:6: (op= relationalOp e= shiftExpression )*

        for (;;)
        {
            int alt709=2;
            switch ( LA(1) )
            {
            case GT:
            case GTE:
            case LTE:
            case LT_:
            case 295:
            	{
            		alt709=1;
            	}
                break;

            }

            switch (alt709)
            {
        	case 1:
        	    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6100:8: op= relationalOp e= shiftExpression
        	    {
        	        FOLLOWPUSH(FOLLOW_relationalOp_in_synpred992_fml21695);
        	        op=relationalOp(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesynpred992_fmlEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	        FOLLOWPUSH(FOLLOW_shiftExpression_in_synpred992_fml21699);
        	        e=shiftExpression(ctx);

        	        FOLLOWPOP();
        	        if  (HASEXCEPTION())
        	        {
        	            goto rulesynpred992_fmlEx;
        	        }
        	        if (HASFAILED())
        	        {
        	            return ;
        	        }


        	    }
        	    break;

        	default:
        	    goto loop709;	/* break out of the loop */
        	    break;
            }
        }
        loop709: ; /* Jump out to here if this rule does not match */


    }

// This is where rules clean up and exit
//
goto rulesynpred992_fmlEx; /* Prevent compiler warnings */
rulesynpred992_fmlEx: ;

}
// $ANTLR end synpred992_fml

// $ANTLR start synpred997_fml
static void synpred997_fml_fragment(pfmlParser ctx )
{
	sep::Operator * op;
	#undef	RETURN_TYPE_op
	#define	RETURN_TYPE_op sep::Operator *

	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6142:6: (op= shiftOp e= additiveExpression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6142:6: op= shiftOp e= additiveExpression
    {
        FOLLOWPUSH(FOLLOW_shiftOp_in_synpred997_fml21818);
        op=shiftOp(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred997_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


        FOLLOWPUSH(FOLLOW_additiveExpression_in_synpred997_fml21822);
        e=additiveExpression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred997_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred997_fmlEx; /* Prevent compiler warnings */
rulesynpred997_fmlEx: ;

}
// $ANTLR end synpred997_fml

// $ANTLR start synpred1000_fml
static void synpred1000_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6161:6: ( ( PLUS | MINUS ) e= multiplicativeExpression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6161:6: ( PLUS | MINUS ) e= multiplicativeExpression
    {
        if ( LA(1) == MINUS || LA(1) == PLUS )
        {
            CONSUME();
            PERRORRECOVERY=ANTLR3_FALSE;
            FAILEDFLAG=ANTLR3_FALSE;

        }
        else
        {
            if (BACKTRACKING>0)
            {
                FAILEDFLAG = ANTLR3_TRUE;
                return ;
            }

            CONSTRUCTEX();
            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
            EXCEPTION->expectingSet = NULL;

            goto rulesynpred1000_fmlEx;
        }


        FOLLOWPUSH(FOLLOW_multiplicativeExpression_in_synpred1000_fml21924);
        e=multiplicativeExpression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred1000_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred1000_fmlEx; /* Prevent compiler warnings */
rulesynpred1000_fmlEx: ;

}
// $ANTLR end synpred1000_fml

// $ANTLR start synpred1003_fml
static void synpred1003_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6175:6: ( ( STAR | DIV | MOD ) e= unaryExpression )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6175:6: ( STAR | DIV | MOD ) e= unaryExpression
    {
        if ( LA(1) == DIV || LA(1) == MOD || LA(1) == STAR )
        {
            CONSUME();
            PERRORRECOVERY=ANTLR3_FALSE;
            FAILEDFLAG=ANTLR3_FALSE;

        }
        else
        {
            if (BACKTRACKING>0)
            {
                FAILEDFLAG = ANTLR3_TRUE;
                return ;
            }

            CONSTRUCTEX();
            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
            EXCEPTION->expectingSet = NULL;

            goto rulesynpred1003_fmlEx;
        }


        FOLLOWPUSH(FOLLOW_unaryExpression_in_synpred1003_fml22012);
        e=unaryExpression(ctx);

        FOLLOWPOP();
        if  (HASEXCEPTION())
        {
            goto rulesynpred1003_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred1003_fmlEx; /* Prevent compiler warnings */
rulesynpred1003_fmlEx: ;

}
// $ANTLR end synpred1003_fml

// $ANTLR start synpred1020_fml
static void synpred1020_fml_fragment(pfmlParser ctx )
{
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6238:6: ( INCR )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6238:6: INCR
    {
         MATCHT(INCR, &FOLLOW_INCR_in_synpred1020_fml22353);
        if  (HASEXCEPTION())
        {
            goto rulesynpred1020_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred1020_fmlEx; /* Prevent compiler warnings */
rulesynpred1020_fmlEx: ;

}
// $ANTLR end synpred1020_fml

// $ANTLR start synpred1021_fml
static void synpred1021_fml_fragment(pfmlParser ctx )
{
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6241:6: ( DECR )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6241:6: DECR
    {
         MATCHT(DECR, &FOLLOW_DECR_in_synpred1021_fml22364);
        if  (HASEXCEPTION())
        {
            goto rulesynpred1021_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred1021_fmlEx; /* Prevent compiler warnings */
rulesynpred1021_fmlEx: ;

}
// $ANTLR end synpred1021_fml

// $ANTLR start synpred1027_fml
static void synpred1027_fml_fragment(pfmlParser ctx )
{
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6369:6: ( LPAREN )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6369:8: LPAREN
    {
         MATCHT(LPAREN, &FOLLOW_LPAREN_in_synpred1027_fml22603);
        if  (HASEXCEPTION())
        {
            goto rulesynpred1027_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred1027_fmlEx; /* Prevent compiler warnings */
rulesynpred1027_fmlEx: ;

}
// $ANTLR end synpred1027_fml

// $ANTLR start synpred1029_fml
static void synpred1029_fml_fragment(pfmlParser ctx )
{
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6372:6: ( DOT | LBRACKET )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:
    {
        if ( LA(1) == DOT || LA(1) == LBRACKET )
        {
            CONSUME();
            PERRORRECOVERY=ANTLR3_FALSE;
            FAILEDFLAG=ANTLR3_FALSE;

        }
        else
        {
            if (BACKTRACKING>0)
            {
                FAILEDFLAG = ANTLR3_TRUE;
                return ;
            }

            CONSTRUCTEX();
            EXCEPTION->type         = ANTLR3_MISMATCHED_SET_EXCEPTION;
            EXCEPTION->name         = (void *)ANTLR3_MISMATCHED_SET_NAME;
            EXCEPTION->expectingSet = NULL;

            goto rulesynpred1029_fmlEx;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred1029_fmlEx; /* Prevent compiler warnings */
rulesynpred1029_fmlEx: ;

}
// $ANTLR end synpred1029_fml

// $ANTLR start synpred1030_fml
static void synpred1030_fml_fragment(pfmlParser ctx )
{
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6374:6: ( COLONx2 )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6374:8: COLONx2
    {
         MATCHT(COLONx2, &FOLLOW_COLONx2_in_synpred1030_fml22666);
        if  (HASEXCEPTION())
        {
            goto rulesynpred1030_fmlEx;
        }
        if (HASFAILED())
        {
            return ;
        }


    }

// This is where rules clean up and exit
//
goto rulesynpred1030_fmlEx; /* Prevent compiler warnings */
rulesynpred1030_fmlEx: ;

}
// $ANTLR end synpred1030_fml

// $ANTLR start synpred1033_fml
static void synpred1033_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6417:6: ( ( LBRACKET e= expression RBRACKET ) )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6417:6: ( LBRACKET e= expression RBRACKET )
    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6417:6: ( LBRACKET e= expression RBRACKET )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6417:8: LBRACKET e= expression RBRACKET
        {
             MATCHT(LBRACKET, &FOLLOW_LBRACKET_in_synpred1033_fml22761);
            if  (HASEXCEPTION())
            {
                goto rulesynpred1033_fmlEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            FOLLOWPUSH(FOLLOW_expression_in_synpred1033_fml22766);
            e=expression(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto rulesynpred1033_fmlEx;
            }
            if (HASFAILED())
            {
                return ;
            }


             MATCHT(RBRACKET, &FOLLOW_RBRACKET_in_synpred1033_fml22769);
            if  (HASEXCEPTION())
            {
                goto rulesynpred1033_fmlEx;
            }
            if (HASFAILED())
            {
                return ;
            }


        }


    }

// This is where rules clean up and exit
//
goto rulesynpred1033_fmlEx; /* Prevent compiler warnings */
rulesynpred1033_fmlEx: ;

}
// $ANTLR end synpred1033_fml

// $ANTLR start synpred1035_fml
static void synpred1035_fml_fragment(pfmlParser ctx )
{
	sep::BF e;
	#undef	RETURN_TYPE_e
	#define	RETURN_TYPE_e sep::BF

    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6469:6: ( ( LBRACKET e= expression RBRACKET ) )
    // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6469:6: ( LBRACKET e= expression RBRACKET )
    {
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6469:6: ( LBRACKET e= expression RBRACKET )
        // /home/lapitre_is148245/git/org.eclipse.efm-symbex/org.eclipse.efm.symbex/src/parser/model/fml.g:6469:8: LBRACKET e= expression RBRACKET
        {
             MATCHT(LBRACKET, &FOLLOW_LBRACKET_in_synpred1035_fml22857);
            if  (HASEXCEPTION())
            {
                goto rulesynpred1035_fmlEx;
            }
            if (HASFAILED())
            {
                return ;
            }


            FOLLOWPUSH(FOLLOW_expression_in_synpred1035_fml22862);
            e=expression(ctx);

            FOLLOWPOP();
            if  (HASEXCEPTION())
            {
                goto rulesynpred1035_fmlEx;
            }
            if (HASFAILED())
            {
                return ;
            }


             MATCHT(RBRACKET, &FOLLOW_RBRACKET_in_synpred1035_fml22865);
            if  (HASEXCEPTION())
            {
                goto rulesynpred1035_fmlEx;
            }
            if (HASFAILED())
            {
                return ;
            }


        }


    }

// This is where rules clean up and exit
//
goto rulesynpred1035_fmlEx; /* Prevent compiler warnings */
rulesynpred1035_fmlEx: ;

}
// $ANTLR end synpred1035_fml
/* End of parsing rules
 * ==============================================
 */

/* ==============================================
 * Syntactic predicates
 */
static ANTLR3_BOOLEAN synpred962_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred962_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred997_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred997_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred21_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred21_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred970_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred970_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred407_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred407_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred539_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred539_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred326_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred326_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred431_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred431_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred1003_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred1003_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred344_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred344_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred636_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred636_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred954_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred954_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred891_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred891_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred804_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred804_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred537_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred537_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred987_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred987_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred520_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred520_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred555_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred555_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred56_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred56_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred62_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred62_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred1021_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred1021_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred956_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred956_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred324_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred324_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred417_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred417_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred960_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred960_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred705_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred705_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred340_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred340_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred969_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred969_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred370_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred370_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred115_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred115_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred446_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred446_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred985_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred985_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred972_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred972_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred514_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred514_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred802_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred802_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred58_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred58_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred778_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred778_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred517_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred517_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred984_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred984_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred991_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred991_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred967_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred967_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred974_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred974_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred61_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred61_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred126_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred126_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred419_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred419_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred957_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred957_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred897_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred897_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred948_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred948_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred965_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred965_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred329_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred329_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred982_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred982_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred952_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred952_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred980_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred980_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred950_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred950_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred963_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred963_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred976_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred976_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred709_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred709_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred1030_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred1030_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred412_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred412_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred946_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred946_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred959_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred959_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred1000_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred1000_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred438_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred438_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred1029_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred1029_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred971_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred971_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred57_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred57_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred872_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred872_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred1020_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred1020_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred1027_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred1027_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred961_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred961_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred643_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred643_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred953_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred953_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred609_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred609_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred343_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred343_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred986_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred986_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred574_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred574_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred973_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred973_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred59_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred59_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred1035_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred1035_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred493_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred493_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred779_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred779_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred781_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred781_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred366_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred366_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred341_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred341_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred531_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred531_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred955_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred955_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred968_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred968_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred975_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred975_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred60_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred60_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred127_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred127_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred958_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred958_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred861_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred861_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred949_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred949_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred1033_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred1033_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred559_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred559_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred153_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred153_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred894_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred894_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred304_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred304_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred983_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred983_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred373_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred373_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred966_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred966_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred170_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred170_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred992_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred992_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred95_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred95_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred780_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred780_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred981_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred981_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred375_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred375_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred138_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred138_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred898_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred898_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred426_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred426_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred714_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred714_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred535_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred535_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred896_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred896_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred296_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred296_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred947_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred947_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred977_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred977_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred964_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred964_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}
static ANTLR3_BOOLEAN synpred951_fml(pfmlParser ctx)
{
    ANTLR3_MARKER   start;
    ANTLR3_BOOLEAN  success;

    BACKTRACKING++;
    start	= MARK();
    synpred951_fml_fragment(ctx);	    // can never throw exception
    success	= !(FAILEDFLAG);
    REWIND(start);
    BACKTRACKING--;
    FAILEDFLAG	= ANTLR3_FALSE;
    return success;
}

/* End of syntactic predicates
 * ==============================================
 */






/* End of code
 * =============================================================================
 */
