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を有効にすると (可能であれば避けるべきです!)、すべてのパーサー ルールがその前に述語を取得します (したがって、「述語をまだ処理できません」というエラーが発生します)。

その上、インタプリタにはかなりバグがあります。使用はお勧めしません。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 に答える