次の文法の LALR(1) パーサーを作成しようとしていて、シフト/リデュースの競合を見つけようとしています。
S := expr
expr := lval | ID '[' expr ']' OF expr
lval := ID | lval '[' expr ']'
そのため、パーサーは文字列 "ID[ID]" を正しく解析できません。私の質問は、
- そのような非 LALR(1) 文法を LALR(1) 文法に変換する一般的な方法はありますか?
- 2 つの文法がまったく同じ言語を生成し、一方が LALR(1) ではないことがわかっている場合、もう一方が LALR(1) であるかどうかを知ることができますか?
上記の文法は一例に過ぎません。私が本当に知りたいのは、これらの文法の問題を解決する一般的な方法です。提案や読書の推奨事項は大歓迎です。
前もって感謝します。