文法が解析テーブル操作なしでLR(1)であるかどうかを理解するための練習が必要です。文法がLR(1)であるかどうかを理解する
文法が続いている:あなたは後ろのトリックが何であるかを
S -> Aa | Bb
A -> aAb | ab
B -> aBbb | abb
知っていますか?
おかげで、:)
文法が解析テーブル操作なしでLR(1)であるかどうかを理解するための練習が必要です。文法がLR(1)であるかどうかを理解する
文法が続いている:あなたは後ろのトリックが何であるかを
S -> Aa | Bb
A -> aAb | ab
B -> aBbb | abb
知っていますか?
おかげで、:)
あなたはLR(1)パーサだとあなただけのb
の先読みとaab
を読んだことをことを想像してみてください。 (私は知っている、あなたはおそらく "男、私はいつも私に起こる!"と思っている)あなたはここで正確に何をすべきですか?
文法を見て、あなたが同時にA
ためとB
のためのプロダクションルールを検討する必要があるとしているので、初期生産は、Aa
またはBb
であったかどうかわかりません。 A
オプションを見ると、A
→ ab
を減らすことができます。先読みがb
であり、これは拡張時にab
と表示されたときに見いだすことができるためですA
があります(ルールはA
なので、再帰的に展開されたA
の後にはb
が続きます)。それは減らすように指示します。一方、B
のオプションを見てください。 とそれに続くb
が表示されている場合は、「ああ、その2番目のb
はaabb
になるでしょう。B
→ abb
これは私がやりたいことなので、 m LR(1)パーサー。それはシフトするように指示します。その時点で、バム!シフト/リダクションの競合があるので、ほとんど確実にLR(1)文法を持たないでしょう。
これは実際には起こりますか?さて、私たちは本当にaab
を読み、先読みとしてb
を見なかったかどうかを確認したいLR(1)を、設定セットを構築手放す:
Initial State
S' -> .S [$]
S -> .Aa [$]
S -> .Bb [$]
A -> .aAb [a]
A -> .ab [a]
B -> .aBbb [b]
B -> .abb [b]
State after reading a
A -> a.Ab [a]
A -> a.b [a]
A -> .aAb [b]
A -> .ab [b]
B -> a.Bbb [b]
B -> a.bb [b]
B -> .aBbb [b]
B -> .abb [b]
State after reading aa
A -> a.Ab [b]
A -> a.b [b]
A -> .aAb [b]
A -> .ab [b]
B -> a.Bbb [b]
B -> a.bb [b]
B -> .aBbb [b]
B -> .abb [b]
State after reading aab
A -> ab. [b]
B -> ab.b [b]
をそしてちょっと!私たちが話していたシフト/減少の競合があります。最初の項目はbで減少しますが、2番目の項目はbで減少します。だからそこに行く!私たちの直感は、これがLR(1)文法ではないと考えるように導いてくれました。テーブルを見ると、証拠はデータによってサポートされています。
これを試してみるとどうでしょうか?まあ、一般的に、これを行うのはかなり難しいです。少なくとも私の主な手がかりは、パーサーがある時点でA
かB
のいずれかを望んでいるかどうかを推測しなければならないということですが、それは結局のところb
の数です。パーサーは、ab
が好きか、A
が好きか、それともabb
が好きか、B
とするかどうかを判断する必要がありましたが、決定する前にb
の両方を見ることはできません。それで私は、いくつかの再帰が起こっていることを知るのに十分なことが分かったところで(何故ならば、末尾のb
が問題を引き起こすように)、再帰が異なる場所を見つけるために何らかの矛盾を見つけたいと思った2つの制作ルール