2016-12-07 10 views
0
私はルールの

Antlr4:ルールの次のセットは、相互に左再帰

次のセットをANDORでシンプルな文法をdescribleが、次のエラーで失敗しようとしています

があります相互左再帰

文法は以下の通りです:

expr: 
    NAME | 
    and | 
    or; 

and: 
    expr AND expr; 

or: 
    expr OR expr; 

NAME : 'A' .. 'B' + ; 
OR: 'OR' | '|'; 
AND: 'AND' | '&'; 

を同時に、次の文法

expr: 
    NAME | 
    expr AND expr | 
    expr OR expr; 

NAME : 'A' .. 'B' + ; 
OR: 'OR' | '|'; 
AND: 'AND' | '&'; 

をコンパイルします。

なぜですか?

答えて

1

ANTLR4は(既に以前のバージョンの改良である)のみ直接左再帰をサポートします。 。ANTLR4が唯一の直接左再帰をサポートしています。それはあなたが例えばルールaは、代替の最初のルールとしてaを使用するルールbを使用しています(単一のルールではなく、複数のルールの上に再帰を残していることができ

+0

しかし、私は、ANDやORのような各演算に適切なノードを持つ必要があります。 1つのルールがすべてのルールを解析する場合、これはどのように可能ですか? – Dims

+0

既存の文法(例:https://github.com/antlr/grammars-v4)を見ることで、多くのことを学ぶことができます。左の再帰的なパーツが単一のルールになるようにルールを定義することも、非再帰的な方法で行うこともできます。 –

0

は、すでに述べたように意味します。あなたの生成の訪問者やリスナーにdistictionを作るための選択肢にラベルを付けることができます。

expr 
: NAME   #NameExpr 
| expr AND expr #AndExpr 
| expr OR expr #OrExpr 
; 

NAME : 'A' .. 'B' + ; 
OR : 'OR' | '|'; 
AND : 'AND' | '&'; 

'A'..'Z'+は、あなたがこれを行うことができV4で、古いv3の構文であることに注意してください:[A-Z]+

を参照してください。https://github.com/antlr/antlr4/blob/master/doc/parser-rules.md#alternative-labels

関連する問題