2012-04-29 9 views
0

この問題は何度も起こりました。 私は完全に問題を完全に理解していません。 私の構文は次のようになります。Antlr 3は構文述語を扱うことができません

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

TheBreadCatが、私はANTLRについて何も知りませんが、これはhttp://www.antlr.org/pipermail/antlr-interest/2009-February/033062.html示唆多分あなた」実際のパーサを生成/コンパイル/実行するのではなく、ANTLRworksインタプリタを使用します。インタープリタは言語のすべての機能を実装しません。 –

+0

( 'backtrack = true'は述語を自動的に挿入することで実装されているようです) –

+1

Gareth McCaughan、私はeclipseプラグインの組み込みのインタプリタを使用しています。しかし、私は実際のテストケースを試みようとします。 – NullData

答えて

3

ANTLRWorksの通訳(どのANTLR Eclipse IDEでも使用)は述語や埋め込み(Java)コードに対処できません。グローバルバックトラックを有効にする(可能であれば避ける必要があります)は、すべてのパーサールールの前に述語を取得します(したがって、エラーは「述語はまだ処理できません」)。

さらに、通訳者はかなりバギーです。私はそれを使用することをお勧めしません。 ANTLRWorksのデバッガを使用すると素晴らしいですし、文法の中に埋め込まれた(Java)コードをコンパイルして実行します。 ANTLR Eclipse IDEには、ANTLRWorksのこのデバッガも含まれていると思います。

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

関連する問題