私は楽しみのためにGLRを書いています(前回の試行以来、いくつかのことを理解したためです)。パーサーは現在機能しており、曖昧性解消ルールを実装しています。私はうまくいくように見える方法で優先順位を処理しています。今、私は結合性に関して少し途方に暮れています。
私はこのような文法を持っているとしましょう:
E <- E '+' E (rule 1)
E <- E '-' E (rule 2)
E <- '0' (rule 3)
E <- '1' (rule 4)
ルール1)と2)の優先順位が同じで、結合性が残っている場合。
結合性の処理がない場合、文字列「1-1+0」は2つの解析ツリーを生成します。
1 2
/ \ / \
/ \ / \
2 3 4 1
| \ | \
4 4 4 3
ここで、数字は削減に使用されるルールを示します。正しい解析ツリーは最初のものであるため、これだけを保持したいと思います。
結合法則の侵害をアルゴリズムで効率的に検出する方法を考えています。
私が試したアプローチの1つは、最初のツリーの最上位ノードで、ルール2がルール1の子のリストのルール3の左側にあるのに対し、2番目のツリーではルール1がルール4の右側にあることを確認することでした。 2と1は左結合です。最初のツリーのみを保持します。
しかし、これは、より複雑な例ではそれほど遠くはありませんでした。このソリューションの制限は、別のツリーとの比較に基づいてのみツリーを破棄できることです。
このアプローチの洗練されたバージョンを使用して解決策を見つけることができると思いますか?標準的な方法は何ですか?