代入を式として扱うために Tiny Language の文法を拡張しようとしています。したがって、次のように書くことは有効です
a = b = 1; // -> a = (b = 1)
a = 2 * (b = 1); // contrived but valid
a = 1 = 2; // invalid
割り当ては、2 つの側面で他の演算子とは異なります。これは右結合 (大したことではありません) であり、左辺は変数でなければなりません。だから私はこのように文法を変更しました
statement: assignmentExpr | functionCall ...;
assignmentExpr: Identifier indexes? '=' expression;
expression: assignmentExpr | condExpr;
非 LL(*) 決定が含まれているため、機能しません。私もこの変種を試しました:
assignmentExpr: Identifier indexes? '=' (expression | condExpr);
しかし、同じエラーが発生しました。私は、に興味を持っています
- この特定の質問
- 非 LL(*) 決定を伴う文法が与えられた場合、問題を引き起こす 2 つのパスを見つける方法
- 修正方法