2016-03-31 15 views
1

だから私は、私は、問題を示すために、同じくらい私ができるように文法をストリップダウンしているANTLR 4にかなり新しいです:私は奇妙なを取得abc and d:使用した場合antlr 4が私のトークンを期待どおりに上回らないのはなぜですか?

grammar DumbGrammar; 

equation 
    : expression (AND expression)* 
    ; 

expression 
    : ID 
    ; 


ID : LETTER(LETTER|DIGIT)* ; 

AND: 'and'; 

LETTER: [a-zA-Z_]; 
DIGIT : [0-9]; 
WS : [ \r\n\t] + -> channel (HIDDEN); 

この文法を、サンプルテキストを使用(IntelliJのとANTLR4は、プラグインを使用して)以下に示すように、予期しない構造を持つツリー:

enter image description here

私は単にAND: '&&';を読み、その後、入力としてabc && dを提出する端末ルールAND: 'and';を変更した場合、私は元として、以下のツリーを取得pected:

enter image description here

私はそれが正しく"and"を解析されていない理由を把握することはできませんが、正しく'&&'を解析ありません。

答えて

3

入力"and"IDトークンとしてトークン化されています。 IDANDの両方が入力"and"と一致するため、ANTLRはどのトークンを選択するかを決定する必要があります。 ANDの前に定義されているので、IDが必要です。

ソリューション:IDANDを定義します。

AND: 'and'; 

ID : LETTER(LETTER|DIGIT)* ; 
+0

うわー!痛いほど明白!ありがとう!! :) – shuri17

+0

問題はありません。 –

+0

ID == 'andy'が動作するかどうかを確認してください。 'と'トークンをIDルールに含める必要があります。したがって、 'と'の部分文字列を含むIDでも同様に動作します。 – Divisadero

関連する問題