antlr gated predicate
===

This is a follow-up question from http://stackoverflow.com/questions/11400921/antlr-superfluous-predicate-required where I stated my problem in a simplified way, however it could not be solved there.  
I have the following grammar and when I delete the `{true}?=>` predicates, the text is not recognized anymore. The input string is `MODULE main LTLSPEC H {} {} {o} FALSE;`. Note that the trailing `;` is not tokenized as EOC, but as IGNORE. When I add `{true}?=>` to the EOC rule `;` is tokenized as EOC.  
I tried this from command-line with antlr-v3.3 and v3.4 without difference. Thanks in advance, I appreciate your help.

    grammar NusmvInput;
    
    options {
      language = Java;
    }    
    @parser::members{
    public static void main(String[] args) throws Exception {
        NusmvInputLexer lexer = new NusmvInputLexer(new ANTLRStringStream("MODULE main LTLSPEC H {} {} {o} FALSE;"));
        NusmvInputParser parser = new NusmvInputParser(new CommonTokenStream(lexer));
        parser.specification();
      }
    }    
    @lexer::members{
        private boolean inLTL = false;
    } 
    
    specification : 
         module+ EOF -
         ;
    module : 
        MODULE^ module_decl    
        ;
        
    module_decl : 
        NAME parameter_list ;
    parameter_list 
        : ( LP (parameter ( COMMA parameter )*)? RP )?
        ;    
    parameter
        : (NAME | INTEGER )
        ;    
    /**************
    *** LEXER
    **************/
    COMMA
        :{!inLTL}?=> ','
        ; 
    OTHER 
        : {!inLTL}?=>( '&' | '|' | 'xor' | 'xnor' | '=' | '!' |
         '<' | '>' | '-' | '+' | '*' | '/' |
          'mod' | '[' | ']' | '?')
          ;     
    RCP
          : {!inLTL}?=>'}'
          ;      
    LCP
          : {!inLTL}?=>'{'
          ;
    LP 
        : {!inLTL}?=>'('
        ;
    RP 
        : {!inLTL}?=>')'
        ;   
    MODULE
        : {true}?=> 'MODULE' {inLTL = false;}
        ;
    LTLSPEC
        : {true}?=> 'LTLSPEC' 
        {inLTL = true; skip(); }
        ;  
    EOC 
        : ';' 
        {
            if (inLTL){
                inLTL = false;
                skip();
            }
        }
        ;   
    WS 
        : (' ' | '\t' | '\n' | '\r')+ {$channel = HIDDEN;} 
        ;
    COMMENT 
        :  '--' .* ('\n' | '\r') {$channel = HIDDEN;} 
        ; 
    INTEGER 
        : {!inLTL}?=> ('0'..'9')+
        ;
    NAME 
        :{!inLTL}?=> ('A'..'Z' | 'a'..'z') ('a'..'z' | 'A'..'Z' | '0'..'9' | '_' | '$' | '#' | '-')*
        ;
    IGNORE
        : {inLTL}?=> . {skip();}
        ;

