最初に:Actipro SyntaxEditorのLL(*)パーサーを使用します。ただし、これはどのLL(k)パーサーにも当てはまります。
私は現在、(ECMA-262リファレンスを使用して)Javascriptの有効なLL(k)文法を書き込もうとしています。左再帰を理解することは時々問題ありませんが、この問題の解決策を見つけるために壁にぶつかっています。(そして、私がこれに3日間ノンストップで取り組んできたので、焦点を失ったかもしれません)
さて、解決策の例:
このルールを取ります:
BitwiseORExpression :
BitwiseXORExpression
BitwiseORExpression | BitwiseXORExpression
これは文字通り次のようになります。
expBitwiseOR.Production = expBitwiseXOR | expBitwiseOR + @bitwiseOrSign + expBitwiseXOR;
左再帰を避けるために:
expBitwiseOR.Production = expBitwiseXOR + ( @bitwiseOrSign + expBitwiseXOR ).ZeroOrMore();
十分に単純です。しかし、私は次のようなより複雑なルールに固執しています。
MemberExpression :
PrimaryExpression
FunctionExpression
MemberExpression [ Expression ]
MemberExpression . IdentifierName
new MemberExpression Arguments
私はいくつかのことを試しましたが、その中にはある種の作業(つまり、「動作する」が、本来の動作ではない)とそうでないもの(つまり、左再帰)があります。私は正直なところ、完全な答えや完全な解決策を望んでいませんが、複雑なルールなどでこの問題を回避する方法について誰かが考えているかもしれません。
これをActiproパーサーの適切な構文に入れる必要もありません。モックアップコードは引き続き役立ちます。