Wie ist diese Grammatik LL (1)?

11

Dies ist eine Frage aus dem Drachenbuch. Das ist die Grammatik:

S.EINeinEINbB.bB.ein
B εEINε
B.ε

In der Frage wird gefragt, wie gezeigt werden kann, dass es sich um LL (1) handelt, nicht jedoch um SLR (1).

Um zu beweisen, dass es sich um LL (1) handelt, habe ich versucht, die Analysetabelle zu erstellen, aber ich erhalte mehrere Produktionen in einer Zelle, was ein Widerspruch ist.

Bitte sagen Sie, wie ist dieses LL (1) und wie kann man es beweisen?

Vinayak Garg
quelle
6
Ich bin nicht sehr vertraut mit Grammatiken, aber es scheint, dass die Sprache dieser Grammatik endlich ist. L.={einb,bein}}
Nejc
@Nejc: Ja, das scheint so!
Vinayak Garg

Antworten:

11

Lassen Sie uns zunächst Ihren Produktionen eine Nummer geben.

1 2 S B b B a 3 A ε 4 B εS.EINeinEINb
S.B.bB.ein
EINε
B.ε

Berechnen wir zuerst die ersten und folgen wir den Mengen. Für kleine Beispiele wie diese reicht es aus, die Intuition für diese Mengen zu verwenden.

FIRST(S)={a,b}FIRST(A)={}FIRST(B)={}FOLLOW(A)={a,b}FOLLOW(B)={ein,b}}

Berechnen wir nun die -Tabelle. Wenn wir keine Konflikte bekommen, lautet die Grammatik per Definition L L ( 1 ) .L.L.(1)L.L.(1)

    a | b |
-----------
S | 1 | 2 |
A | 3 | 3 |
B | 4 | 4 |

Da es keine Konflikte gibt, lautet die Grammatik .L.L.(1)

Nun zur Tabelle . Zuerst der L R ( 0 ) Automat.S.L.R.(1)L.R.(0)

Zustand 0S.EINeinEINbS.B.bB.einEINB.EIN1B.5
Zustand 1S.EINeinEINbein2
Zustand 2S.EINeinEINbEINEIN3
Zustand 3S.EINeinEINbb4
Zustand 4S.EINeinEINbb
Zustand 5S.B.bB.einb6
Zustand 6S.B.bB.einB.B.7
Zustand 7S.B.bB.einein8
Zustand 8S.B.bB.ein

Und dann die Tabelle (ich nehme an, auf S kann alles folgen).S.L.R.(1)S.

    a     | b     | A | B |
---------------------------
0 | R3/R4 | R3/R4 | 1 | 5 |
1 | S2    |       |   |   |
2 | R3    | R3    | 3 |   |
3 |       | S4    |   |   |
4 | R1    | R1    |   |   |
5 |       | S4    |   |   |
6 | R4    | R4    |   | 7 |
7 | S8    |       |   |   |
8 | R2    | R2    |   |   |

Es gibt Konflikte im Zustand 0, daher ist die Grammatik nicht . Beachten Sie, dass bei Verwendung von L A L R ( 1 ) beide Konflikte korrekt gelöst würden: Im Zustand 0 auf Lookahead würde ein L A L R ( 1 ) R3 und auf Lookahead b R4 annehmen.S.L.R.(1)L.EINL.R.(1)ein L.EINL.R.(1)b

Dies wirft die interessante Frage auf, ob es eine Grammatik gibt, die aber nicht L A L R ( 1 ) ist , was der Fall ist, aber nicht leicht zu finden ist.L.L.(1)L.EINL.R.(1)

Alex ten Brink
quelle
Vielen Dank! Ich hatte First & Follow korrekt erstellt, aber beim Erstellen der Tabelle einen Fehler gemacht.
Vinayak Garg
10

Wenn Sie nicht gefragt werden, müssen Sie die LL (1) -Tabelle nicht erstellen, um zu beweisen, dass es sich um eine LL (1) -Grammatik handelt. Sie berechnen einfach die FIRST / FOLLOW-Sätze wie Alex:

ZUERST(S.)=ein,bZUERST(EIN)=εZUERST(B.)=εFOLGEN(EIN)=ein,bFOLGEN(B.)=ein,b

Und dann muss eine LL (1) -Grammatik per Definition:

  1. Wenn und A b zwei verschiedene Regeln der Grammatik sind, sollte es sein, dass FIRST ( a ) FIRST ( b ) = . Daher haben die beiden Mengen kein gemeinsames Element.EINeinEINbZUERST(ein)ZUERST(b)=
  2. Wenn für jeden Nicht-Terminal - Symbol haben Sie Á * ε , dann sollte es sein , dass FIRST ( A ) FOLLOW ( A ) = . Wenn für ein nicht-terminales Symbol eine Nullproduktion vorliegt, können die Sätze FIRST und FOLLOW kein gemeinsames Element haben.EINΑεZUERST(EIN)FOLGEN(EIN)=

Also, für die gegebene Grammatik:

  1. Wir haben seitZUERST(EINeinEINb)ZUERST(B.bB.ein)= während FIRST ( B b B a ) = { b } und sie haben keine gemeinsame Elemente.ZUERST(EINeinEINb)={ein}}FIRST(BbBa)={b}
  2. da ERSTER ( A ) = { a , b }, während FOLGEN ( A ) = und jetzt ERSTER ( B )FIRST(A)FOLLOWA)=FIRST(A)={a,b}FOLLOW(A)= seit FIRST ( B ) = { ε } während FOLLOW ( B ) = {FIRST(B)FOLLOW(B)=FIRST(B)={ε} .FOLLOW(B)={a,b}

Die SLR (1) -Analyse finde ich einwandfrei!

Ethan
quelle
Herzlich willkommen! Um diese Antwort zu verbessern, wenden Sie Ihre Angaben nicht auf die vorliegende Grammatik an.
Raphael
Froh hier zu sein!! Beantwortete Ihre Anfrage und ich glaube, ich habe eine gründliche Erklärung gegeben!
Ethan
Vielen Dank! Beachten Sie, dass wir hier LaTeX verwenden können, da ich es für Ihre Mathematik bearbeitet habe.
Raphael
Wow, danke! Das ist eine großartige Erklärung. Aber ich denke, es gibt einen Fehler in der Anwendung. Ist nicht zuerst (A) = {epsilon}? Ich denke, Sie haben das ERSTE und das FOLGENDE getauscht.
Vinayak Garg
FIRST (A) ist in der Tat epsilon, aber da Sie die FIRST-Menge des gesamten rechten Mitglieds berechnen möchten, zeigt A -> ε nur, dass wir eine leere Produktion haben und das erste Terminal-Symbol, das Sie sehen (und daher die FIRST-Menge davon) Terminalsymbol a. Hoffe das hat geholfen!
Ethan
0

Suchen Sie nach einer ausreichenden Bedingung, die eine Grammatik LL (1) ergibt (Hinweis: Schauen Sie sich die ERSTEN Sätze an).

Suchen Sie nach einer erforderlichen Bedingung, die alle SLR (1) -Grammatiken erfüllen müssen (Hinweis: Sehen Sie sich die FOLLOW-Sätze an).

Ein Programmierer
quelle