Come è questa grammatica LL (1)?


12

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

S→AaAb∣BbBa
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 → εS→AaAb
S→BbBa
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 0S→∙AaAbS→∙BbBaA→∙B→∙A⟹1B⟹5
state 1S→A∙aAba⟹2
state 2S→Aa∙AbA→∙A⟹3
state 3S→AaA∙bb⟹4
state 4S→AaAb∙b
state 5S→B∙bBab⟹6
state 6S→Bb∙BaB→∙B⟹7
state 7S→BbB∙aa⟹8
state 8S→BbBa∙

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. A⇒aA⇒bFIRST⁡(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)∩FOLLOW⁡A)=∅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.