這是一個來自Antlr superfluous Predicate required?的後續問題,我以簡化的方式說明了我的問題,但無法在此解決。
我有以下語法,當我刪除{true}?=>
謂詞時,文本不再被識別。輸入字符串是MODULE main LTLSPEC H {} {} {o} FALSE;
。請注意,尾部;
未標記爲EOC,而是標記爲IGNORE。當我將{true}?=>
添加到EOC規則;
被標記爲EOC時。
我從antlr-v3.3和v3.4的命令行嘗試了這一點,沒有區別。在此先感謝,我感謝您的幫助。antlr gated predicate
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();}
;
只需掃視你的語法,我已經看到兩個錯誤:一''^在'module'規則而沒有'輸出= AST'存在於選項, '規範'規則以'-'(減號)結尾。 – 2012-07-10 14:03:13
對不起。將代碼複製到stackoverflow後,我刪除了樹重寫,並忘記了這些。 – 2012-07-10 14:16:48