antlr选通谓词

antlr选通谓词,antlr,predicate,Antlr,Predicate,这是一个后续问题,我用一种简化的方式陈述了我的问题,但无法在那里解决。 我有以下语法,当我删除{true}?=>谓词时,文本不再被识别。输入字符串为modulemain LTLSPEC H{}{}{o}FALSE。请注意,后面的没有标记为EOC,而是标记为IGNORE。当我将{true}?=>添加到EOC规则时标记为EOC。 我使用antlr-v3.3和v3.4从命令行尝试了这一点,没有任何区别。提前谢谢,我感谢你的帮助 grammar NusmvInput; options { lang

这是一个后续问题,我用一种简化的方式陈述了我的问题,但无法在那里解决。
我有以下语法,当我删除
{true}?=>
谓词时,文本不再被识别。输入字符串为
modulemain LTLSPEC H{}{}{o}FALSE。请注意,后面的
没有标记为EOC,而是标记为IGNORE。当我将
{true}?=>
添加到EOC规则
标记为EOC。
我使用antlr-v3.3和v3.4从命令行尝试了这一点,没有任何区别。提前谢谢,我感谢你的帮助

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();}
    ;
语法输入;
选择权{
语言=Java;
}    
@解析器::成员{
公共静态void main(字符串[]args)引发异常{
NusmvInputLexer lexer=新的NusmvInputLexer(新的AntlStringStream(“模块主LTLSPEC H{}{}{o}FALSE;”);
NusmvInputParser parser=新的NusmvInputParser(新的CommonTokenStream(lexer));
parser.specification();
}
}    
@lexer::成员{
私有布尔inLTL=false;
} 
规范:
模块+EOF
;
模块:
模块decl
;
模块名称:
名称参数列表;
参数列表
:(LP(参数(逗号参数)*)?RP?
;    
参数
:(名称|整数)
;    
/**************
***雷克瑟
**************/
逗号
:{!inLTL}?=>,'
; 
其他
:{!inLTL}?=>('&'|'|'|'|'异或'|'xnor'|'='|'!'|
'' | '-' | '+' | '*' | '/' |
“mod'|'['|']'|'?')
;     
RCP
:{!inLTL}?=>'}'
;      
LCP
:{!inLTL}?=>“{”
;
LP
:{!inLTL}?=>'('
;
反相
:{!inLTL}?=>')”
;   
模块
:{true}?=>'模块'{inLTL=false;}
;
LTLSPEC
:{true}?=>“LTLSPEC”
{inLTL=true;skip();}
;  
平等机会委员会
: ';' 
{
如果(inLTL){
inLTL=假;
跳过();
}
}
;   
WS
:(“”|’\t’|’\n’|’\r’+{$channel=HIDDEN;}
;
评论
:'--'.*('\n'|'\r'){$channel=HIDDEN;}
; 
整数
:{!inLTL}?=>('0'..'9')+
;
名称
:{!inLTL}?=>('A'.'Z'.'A'.'Z')('A'.'Z'.'A'.'A'.'Z'.'0'.'9'.''.'美元'.''.'.'.''.'-'))*
;
忽略
:{inLTL}?=>。{skip();}
;

似乎在
模块
LTLSPEC
之前没有谓词,
名称
优先于它们,即使这些标记是在
名称
标记之前定义的。这是设计还是错误,我不知道

然而,您试图解决这个问题的方法似乎相当复杂。据我所知,您似乎希望忽略(或跳过)以
LTLSPEC
开头并以分号结尾的输入。为什么不改为这样做:

specification  : module+ EOF;
module         : MODULE module_decl;
module_decl    : NAME parameter_list;
parameter_list : (LP (parameter ( COMMA parameter )*)? RP)?;    
parameter      : (NAME | INTEGER);    

MODULE  : 'MODULE';
LTLSPEC : 'LTLSPEC' ~';'* ';' {skip();};
COMMA   : ','; 
OTHER   : ( '&' | '|' | 'xor' | 'xnor' | '=' | '!' |
            '<' | '>' | '-' | '+' | '*' | '/' |
           'mod' | '[' | ']' | '?')
        ;     
RCP     : '}';      
LCP     : '{';
LP      : '(';
RP      : ')';   
EOC     : ';';   
WS      : (' ' | '\t' | '\n' | '\r')+ {$channel = HIDDEN;};
COMMENT : '--' .* ('\n' | '\r') {$channel = HIDDEN;}; 
INTEGER : ('0'..'9')+;
NAME    : ('A'..'Z' | 'a'..'z') ('a'..'z' | 'A'..'Z' | '0'..'9' | '_' | '$' | '#' | '-')*;
规格:模块+EOF;
模块:模块decl;
模块名称:名称参数列表;
参数列表:(LP(参数(逗号参数)*)?RP)?;
参数:(名称|整数);
模块:'模块';
LTLSPEC:'LTLSPEC'~';'*';'{skip();};
逗号:',';
其他:(“&”|“|”|“异或”|“xnor”|“=”|“!”|
'' | '-' | '+' | '*' | '/' |
“mod'|'['|']'|'?')
;     
RCP:'}';
立法会议员:{};
LP:'(';
RP:')';
平机会:“;”;
WS:(“”|’\t’|’\n’|’\r’+{$channel=HIDDEN;};
注释:'--'.*('\n'|'\r'){$channel=HIDDEN;};
整数:('0'..'9')+;
名称:('A'.'Z'.'A'.'Z')('A'.'Z'.'A'.'Z'.'0'.'9'.'.'.'$'.'.'.''.-')*;

似乎在
模块
LTLSPEC
之前没有谓词,
名称
优先于它们,即使这些标记是在
名称
标记之前定义的。这是设计还是错误,我不知道

然而,您试图解决这个问题的方法似乎相当复杂。据我所知,您似乎希望忽略(或跳过)以
LTLSPEC
开头并以分号结尾的输入。为什么不改为这样做:

specification  : module+ EOF;
module         : MODULE module_decl;
module_decl    : NAME parameter_list;
parameter_list : (LP (parameter ( COMMA parameter )*)? RP)?;    
parameter      : (NAME | INTEGER);    

MODULE  : 'MODULE';
LTLSPEC : 'LTLSPEC' ~';'* ';' {skip();};
COMMA   : ','; 
OTHER   : ( '&' | '|' | 'xor' | 'xnor' | '=' | '!' |
            '<' | '>' | '-' | '+' | '*' | '/' |
           'mod' | '[' | ']' | '?')
        ;     
RCP     : '}';      
LCP     : '{';
LP      : '(';
RP      : ')';   
EOC     : ';';   
WS      : (' ' | '\t' | '\n' | '\r')+ {$channel = HIDDEN;};
COMMENT : '--' .* ('\n' | '\r') {$channel = HIDDEN;}; 
INTEGER : ('0'..'9')+;
NAME    : ('A'..'Z' | 'a'..'z') ('a'..'z' | 'A'..'Z' | '0'..'9' | '_' | '$' | '#' | '-')*;
规格:模块+EOF;
模块:模块decl;
模块名称:名称参数列表;
参数列表:(LP(参数(逗号参数)*)?RP)?;
参数:(名称|整数);
模块:'模块';
LTLSPEC:'LTLSPEC'~';'*';'{skip();};
逗号:',';
其他:(“&”|“|”|“异或”|“xnor”|“=”|“!”|
'' | '-' | '+' | '*' | '/' |
“mod'|'['|']'|'?')
;     
RCP:'}';
立法会议员:{};
LP:'(';
RP:')';
平机会:“;”;
WS:(“”|’\t’|’\n’|’\r’+{$channel=HIDDEN;};
注释:'--'.*('\n'|'\r'){$channel=HIDDEN;};
整数:('0'..'9')+;
名称:('A'.'Z'.'A'.'Z')('A'.'Z'.'A'.'Z'.'0'.'9'.'.'.'$'.'.'.''.-')*;

只要浏览一下语法,我就已经看到了两个错误:
模块中的
^
规则,而选项中没有
output=AST
,而
规范以
-
规则结尾(减号)签名。对此表示抱歉。我在将代码复制到stackoverflow后删除了树重写,并忘记了这些。只需浏览一下您的语法,我就已经看到了两个错误:
模块
规则中有一个
^
,而选项中没有
输出=AST
,而
规范
规则以一个
-
结尾(减号)符号。很抱歉。我在将代码复制到stackoverflow后删除了树重写,并忘记了这些。从本例中您无法看到它,但是
LTLSPEC
可以通过
完成。也可以通过
MODULE
或其他
LTLSPEC
完成。当我尝试类似
(~(MODULE | LTLSPEC))*
奇怪的是它不起作用,但是现在不记得错误了。我想如果我在完成
LTLSPEC
-部分人工
END
-标记之前添加任何内容,然后:
LTLSPEC:'LTLSPEC'~END*我基本上可以接受你的建议{