这个问题多次发生在我身上。 我没有完全理解这个问题。 我的语法如下:
grammar Syntax;
options {
language = Java;
backtrack = true;
}
rule: ('syntax' (INTEGER | HEX) ';')? (structure | packet)+;
structure: ('struct' | 'structure')? field;
packet: 'packet'? NAME '{' field+ '}';
field: NAME (':' | '=' | ':=' | '->')? value ';';
value: (TYPE (MULT (INTEGER | HEX))?);
MULT: 'x' | 'X';
INTEGER: ('0'..'9')+;
HEX: '0x' ('0'..'9' | 'A'..'F' | 'a'..'f');
TYPE: ('unsigned'? 'byte' | 'short' | 'int16' | 'int8')
| 'int' | 'int32'
| 'long' | 'int64'
| 'char' | 'char8' | 'char16' | 'unicode'
| 'utf' | 'utf8' | 'utf16';
NAME: ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '_' | '0'..'9')*;
WHITESPACE: ( ' ' | '\n' | '\r' | '\f' | '\t')+{$channel = HIDDEN;} ;
测试用例如下所示:
syntax 1;
packet a
{
a int;
b byte;
d byte x 10;
c int x b;
}
现在错误是:
答案 0 :(得分:3)
ANTLRWorks(ANTLR Eclipse IDE也使用)的解释器无法处理谓词或嵌入式(Java)代码。启用全局回溯 1 (如果可能,应该避免!)会导致所有解析器规则在它们前面获得谓词(因此错误“不能处理谓词“)。
此外,翻译很不错:我不推荐使用它。使用ANTLRWorks的调试器,它很棒,并且还将编译和运行语法中的任何嵌入式(Java)代码。我相信ANTLR Eclipse IDE也有来自ANTLRWorks的这个调试器。
1 http://www.antlr.org/wiki/display/ANTLR3/How+to+remove+global+backtracking+from+your+grammar