To pytanie z Dragon Book. Oto gramatyka:
Pytanie dotyczy tego, jak pokazać, że jest to LL (1), ale nie SLR (1).
Aby udowodnić, że jest to LL (1), próbowałem zbudować jego tabelę analizującą, ale otrzymuję wiele produkcji w komórce, co jest sprzecznością.
Powiedz, jak to jest LL (1) i jak to udowodnić?
formal-grammars
compilers
parsers
Vinayak Garg
źródło
źródło
Odpowiedzi:
Po pierwsze, dajmy swoim produkcjom numer.
Obliczmy pierwszy i najpierw wykonajmy zestawy. W przypadku takich małych przykładów wystarczy intuicyjna obsługa tych zestawów.
Teraz obliczmy tabelę . Z definicji, jeśli nie dostaniemy konfliktów, gramatyka to .LL(1) LL(1)
Ponieważ nie ma konfliktów, gramatyka to .LL(1)
Teraz tabela . Po pierwsze, automat .SLR(1) LR(0)
And then theSLR(1) table (I assume S can be followed by anything).
There are conflicts in state 0, so the grammar is notSLR(1) . Note that if LALR(1) was used instead, then both conflicts would be resolved correctly: in state 0 on lookahead a LALR(1) would take R3 and on lookahead b it would take R4.
This gives rise to the interesting question whether there is a grammar that isLL(1) but not LALR(1) , which is the case but not easy to find an example of.
źródło
If you are not asked, you don't have to construct the LL(1) table to prove that it is an LL(1) grammar. You just compute the FIRST/FOLLOW sets as Alex did:
And then, by definition an LL(1) grammar has to:
So, for the given grammar:
As for the SLR(1) analysis I think it is flawless!
źródło
Search for a sufficient condition which makes a grammar LL(1) (hint: look at the FIRST sets).
Search for a needed condition which all SLR(1) grammars must meet (hint: look at the FOLLOW sets).
źródło