Antlr 3无法处理语法谓词

时间:2012-04-29 10:23:56

标签: java syntax antlr predicate antlr3

这个问题多次发生在我身上。 我没有完全理解这个问题。 我的语法如下:

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;
}

现在错误是:

errors

1 个答案:

答案 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