Come è questa grammatica LL (1)?


12

Questa è una domanda dal Libro del Drago. Questa è la grammatica:

SAaAbBbBa
Aε
Bε

La domanda chiede come mostrare che è LL (1) ma non SLR (1).

Per dimostrare che è LL (1), ho provato a costruire la sua tabella di analisi, ma sto ottenendo più produzioni in una cella, il che è contraddizione.

Si prega di dire come è questo LL (1) e come dimostrarlo?


6
Non ho molta familiarità con le grammatiche, ma sembra che il linguaggio di questa grammatica sia finito. L={ab,ba}
Nejc

@Nejc: Sì, sembra così!
Vinayak Garg,

Risposte:


11

Innanzitutto, diamo un numero alle tue produzioni.

1 2 S B b B a 3 A ε 4 B εSAaAb
SBbBa
Aε
Bε

Calcoliamo il primo e seguiamo prima i set. Per piccoli esempi come questi, è sufficiente usare l'intuizione su questi insiemi.

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

Ora calcoliamo la tabella . Per definizione, se non otteniamo conflitti, la grammatica è L L ( 1 ) .LL(1)LL(1)

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

Poiché non ci sono conflitti, la grammatica è .LL(1)

Ora per la tabella . Innanzitutto, l' automa L R ( 0 ) .SLR(1)LR(0)

state 0SAaAbSBbBaABA1B5
state 1SAaAba2
state 2SAaAbAA3
state 3SAaAbb4
state 4SAaAbb
state 5SBbBab6
state 6SBbBaBB7
state 7SBbBaa8
state 8SBbBa

E poi la tabella (suppongo che S possa essere seguito da qualsiasi cosa).SLR(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    |   |   |

Ci sono conflitti nello stato 0, quindi la grammatica non è . Si noti che se si utilizzasse L A L R ( 1 ) , entrambi i conflitti verrebbero risolti correttamente: nello stato 0 su lookahead un L A L R ( 1 ) prenderebbe R3 e su lookahead b richiederebbe R4.SLR(1)LALR(1)a LALR(1)b

LL(1)LALR(1)


Grazie! Avevo costruito correttamente il First & Follow, ma ho fatto un errore nel costruire il tavolo.
Vinayak Garg,

10

Se non viene richiesto, non è necessario costruire la tabella LL (1) per dimostrare che si tratta di una grammatica LL (1). Devi solo calcolare i set FIRST / FOLLOW come ha fatto Alex:

FIRST(S)=a,bFIRST(A)=εFIRST(B)=εFOLLOW(A)=a,bFOLLOW(B)=a,b

E poi, per definizione, una grammatica LL (1) deve:

  1. AaAbFIRST(a)FIRST(b)=
  2. AΑεFIRST(A)FOLLOW(A)=

Quindi, per la grammatica data:

  1. FIRST(AaAb)FIRST(BbBa)=FIRST(AaAb)={a}FIRST(BbBa)={b}
  2. FIRST(A)FOLLOWA)=FIRST(A)={a,b}FOLLOW(A)=FIRST(B)FOLLOW(B)=FIRST(B)={ε}FOLLOW(B)={a,b}

Per quanto riguarda l'analisi SLR (1) penso che sia impeccabile!


Benvenuto! Per migliorare questa risposta, perché non applichi ciò che dichiari alla grammatica attuale?
Raffaello

Felice di essere qui !! Ho risposto alla tua richiesta e penso di aver dato una spiegazione approfondita!
Ethan,

Grazie! Nota che possiamo usare LaTeX qui, come ho fatto per modificare la tua matematica.
Raffaello

Wow grazie! questa è un'ottima spiegazione Ma penso che ci sia qualche errore nell'applicazione. First (A) = {epsilon} non è? Penso che tu abbia scambiato il PRIMO e il SEGUENTE.
Vinayak Garg,

FIRST (A) è effettivamente epsilon ma dato che stai cercando di calcolare il PRIMO set di tutto il membro giusto, A -> ε mostra solo che abbiamo una produzione vuota e il primo simbolo terminale che vedi (e quindi il PRIMO set di esso) è simbolo terminale a. Spero che questo abbia aiutato!
Ethan,

0

Cerca una condizione sufficiente che crei una grammatica LL (1) (suggerimento: guarda i PRIMI set).

Cerca una condizione necessaria che tutte le grammatiche SLR (1) devono soddisfare (suggerimento: guarda i seguenti insiemi).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.