2016-09-30 10 views
2

私はexpressionを持っています。これは他のトップレベルのもののコレクションです。 expressionにはmathがあり、それはexpression (op) expressionです。これで、私はルールのAntlrでいつ/何故相互左回帰が起こるのですか?

次のセットは、相互に左再帰[表現、数学】しかし

compileUnit : expression EOF; 

expression 
    : parens                
    | operation               
    | math 
    | variable               
    | number                
    | comparisonGroup             
    ; 

math : expression op=(ADD | SUBSTRACT | MULTIPLY | DIVIDE) expression  #mathExpression; 

あります!

これはされていないproblem-

expression 
    : parens                
    | operation               
    | expression op=(ADD | SUBSTRACT | MULTIPLY | DIVIDE) expression 
    | variable               
    | number                
    | comparisonGroup             
    ; 

をどちらもこれがある - !

math : op=(ADD | SUBSTRACT | MULTIPLY | DIVIDE) expression expression  #mathExpression; 

、なぜそれが私の最初のコードブロックは、他の2つの例とは異なる挙動するのですか?

答えて

3

Antlr4は直接的な左回帰を扱うことができますが、間接的な左回帰は扱えません。左回帰規則は「代替の左端に直接的または間接的に自己を呼び出す」という規則として定義されています。最初の例では、#mathExpression代替がexpressionルールのうち、独立mathルールに織り込まれているように、左ダイレクト再帰間接なり、

すなわち、ルール「は互いに左再帰的」です。

第2および第3の例で実現されたように、典型的な解決策は、単純な間接的な左回帰規則を単一の規則で組み合わせることです。

+0

最初の例は直接左回帰を示していませんが、これも問題になりますか?私はTDARを持っていないが、私はそれを取得しなければならないかもしれない。 –

+0

Antlr4は再帰が「左端の*自体を呼び出す」という直接的な左回帰を扱うことができます。 'math'ルールは、左端の*別の*ルールを参照しているので、間接的な左回帰を作成します。 TDARを強くお勧めします。 – GRosenberg

+0

https://youtu.be/q8p1voEiu8Q?t=38m32sを見ました。私は "それはちょうど今のところそれです"と大丈夫です。うまくいけば、TDARを読んだ後で、すべてのことが*どのように働くのかを理解するでしょう。 ありがとうございます。 –

関連する問題