2016-07-06 3 views
0

私の文法で整数を定義しようとすると少し苦労しています。パーサルールに独自の数値リテラルがある場合、ANTLR4は整数を解析できません

のは、私はこの小さな文法を持っているとしましょう:

grammar Hello; 
r : 'hello' INTEGER; 
INTEGER : [0-9]+ ; 
WS : [ \t\r\n]+ -> skip ; 

を、私はそれを正しく解析し

hello 5 

を入力した場合。

ただし、トークン '5'を定義する追加のパーサールール(使用されていなくても)がある場合、 私はもう前の例を解析できません。

ので、この文法:

hello 5 

grammar Hello; 
r : 'hello' INTEGER; 
unusedRule: 'hi' '5'; 
INTEGER : [0-9]+ ; 
WS : [ \t\r\n]+ -> skip ; 

はもう解析されません。それは私に次のエラーを与えます:

Hello::r:1:6: mismatched input '5' expecting INTEGER 

どのようにこれを回避できますか?

答えて

0

ANTLRは部分項の暗黙的なレクサー・トークンを作成し

unusedRule: 'hi' '5'; 

ようにあなたがパーサー規則を定義します。それらはレクサーで自動的に作成されるため、レクサールールの優先順位評価のどこに座っているかを制御することはできません。

したがって、ベスト・ポリシーはになりません。パーサー・ルールでリテラルを使用します。常に明示的にトークンを定義します。

+0

ご協力いただきありがとうございます。私の文法はどういう意味でしょうか?すべての数字(1つ、2つ、3つ、...)のためのレクサールールがありますか? –

関連する問題