0

这个问题在我身上出现过很多次。我不完全理解这个问题。我的语法如下所示:

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

现在错误是:

错误

4

1 回答 1

3

ANTLRWorks 的解释器(ANTLR Eclipse IDE 也使用)无法处理谓词或嵌入式(Java)代码。启用全局回溯1(应该避免,如果可能的话!)会导致所有解析器规则在它们前面获取谓词(因此错误"can't deal with predicates yet")。

此外,解释器相当有问题:我不建议使用它。使用 ANTLRWorks 的调试器,它很棒,而且还可以编译和运行语法中的任何嵌入式 (Java) 代码。我相信 ANTLR Eclipse IDE 也有来自 ANTLRWorks 的调试器。

1 http://www.antlr.org/wiki/display/ANTLR3/How+to+remove+global+backtracking+from+your+grammar

于 2012-04-29T17:21:19.147 回答