Suggerimenti





Esercizio1a

Strutturare le frasi in una forma piu' conveniente per generarle come: L = {r a x t b | x isin L}. Allo scopo si rifletta sul significato di a*i* e i*. Esercizio2a Le produzioni hanno schemi piuttosto noti, tuttavia utilizzano anche mutua ricorsione: la si elimini anzitutto. Esercizio3a Si identifichino i sottolinguaggi la composizione delle cui stringhe forma le frasi del linguaggio richiesto. Vediamo allora, il linguaggio formato dagli alberi etichettati che associeremo alla categoria sintattica: T. Quindi quello delle liste non vuote di alberi (categoria sintattica L), e quello delle etichette. Infine le foreste che includono la foresta vuota Esercizio4a Facile strutturare le frasi in modo da definire una grammatica non ambigua per il linguaggio. Piu' complesso strutturare le frasi affinche' la grammatica definita sia analizzabile in modo lineare. Ma questo e' trattato nella parte b, dove scopriremo che il linguaggio non ha grammatiche LL.
Qui osserviamo che una soluzione semplice e' strutturare le frasi come formate da un prefisso che e' una stringa non vuota di simboli "a". Il suffisso sara' una stringa del linguaggio {an bn | n>=0}
 
Esercizio5a Ancora piu' semplice dell'esercizio2a. Si elimini anzitutto la mutua ricorsione. Esercizio6a Molta attenzione alla lettura del linguaggio: e' facile qui incorrere nella stesura di una grammatica ambigua. Il linguaggio si compone di due classi di stringhe: quelle che hanno come prefisso un numero dispari di u e quelle che hanno un numero pari di u (incluso 0). I suffissi sono nelle due classi ben diversi. Una prima soluzione potrebbe trattare separatamente i due sottolinguaggi, con una categoria sintattica D per la prima classe ed una P per la seconda. E' una grammatica non adatta ad una analisi LL, ma questo lo vedremo nell'esercizio6b. Esercizio7a Ancora piu' semplice dell'esercizio3a. Esercizio8a Ricordiamoci che queste frasi possono avere qualunque lunghezza. Si eviti di usare l'operatore stella di Kleene e si includa la lista vuota. Esercizio9a Ancora piu' semplice di esercizio6a. Infatti, ad un'attenta lettura, il linguaggio e' {ai bi dk | i,k >=0} Esercizio10a Simile all'esercizio2a. Se non lo avete svolto: fatelo, controllatene la soluzione, tornate all'esercizio10a, datene una soluzione e confrontatela con quella proposta. Esercizio11a La struttura delle frasi non presenta difficolta' maggiori del noto linguaggio {ai a bi | n>=0, a isin L'} per qualche linguaggio L' context free. Nel nostro caso poi, L' ha struttura delle frasi del tutto analoga. L'unica attenzione e' al vincolo che i e j non sia entrambi 0. Come esprimerlo? Domandatevi quali frasi sono escluse con tale vincolo. Esercizio12a Simile all'esercizio2a. Se non lo avete svolto: fatelo, controllatene la soluzione, tornate all'esercizio12a, datene una soluzione e confrontatela con quella proposta Esercizio13a Simile all'esercizio2a. Se non lo avete svolto: fatelo, controllatene la soluzione, tornate all'esercizio13a, datene una soluzione e confrontatela con quella proposta. Ricordate solo di canonizzare e ordinare le produzioni per evidenziare un eventuale uso di mutua ricorsione (che dovra' essere rimossa). Esercizio14a Simile all'esercizio2a. Se non lo avete svolto: fatelo, controllatene la soluzione, tornate all'esercizio13a, datene una soluzione e confrontatela con quella proposta Esercizio15a Presenta difficolta' simili all'esercizio11a. Anche qui l'unica attenzione e' al vincolo su i e j: in questo caso i diverso da j. Altro suggerimento: affrontate prima l'esercizio11a, datene una soluzione, confrontatela con quella proposta, e solo dopo, tornate all'esercizio15a. Esercizio16a Il linguaggio e' un banale linguaggio finito: potete elencarne le poche frasi Esercizio17a Il linguaggio e' un banale linguaggio finito: potete elencarne le quattro frasi  

 
 

Esercizio1b

Considereremo anzitutto la grammatica proposta come soluzione all'esercizio1a. Esaminandola anzitutto rispetto ad una analisi SLR, la piu' semplice tra gli LR.
Allo scopo dovremo generare la collezione canonica LR(0) della grammatica aumentata.
Esercizio2b
Una dimostrazione puo' facilmente essere ottenuta costruendo una collezione canonica (preferibilemente LR(0) piu' semplice e con pochi stati, prima di addentrarci nelle piu' impegnative LR(1)) e mostrando che essa non contiene stati con conflitti.
Esercizio3b
 
Occorre osservare che una tale grammatica forse l'abbiamo gia' definita come soluzione alla parte (a) dell'esercizio. Quindi si tratta con argomentazioni simili
a quelle fatte nelle considerazioni1 dell'esercizio2b, che tale grammatica e' adatta per l'analisi LR o viceversa no: in questo caso modificarla perche' lo sia.
Quindi produrre la collezione degli stati LALR(1) e verificare l'assenza di conflitti.
Esercizio4b
 
Nella parte a) dell'esercizio abbiamo gia' definito una grammatica non ambigua: Ebbene vediamo come sempre (considerazioni1 dell'esercizio2b) anzitutto, se tale grammatica e' anche adatta ad una analisi LR: Scopriremo di no. Dall'analisi delle cause di tale risultato negativo, vedremo come sia possibile definire una nuova grammatica per il linguaggio analizzabile SLR(1).
Esercizio5b
 
Si deve scoprire che la grammatica non e' SLR. Tuttavia e' LALR quindi analizzabile LR.
Esercizio7b
Possiamo partire dalla grammatica non ambigua definita nella parte (a) e studiarne le caratteristiche LL.
Esercizio10b
L'analisi delle espressioni di insieme ottenute per la definizione del linguaggio non ci inducono a ritenere la grammatica ambigua. Procediamo allora con l'analisi LR.
Dopo un'esame delle produzioni della grammatica per prevedere la presenza di eventuali conflitti SLR, si puo' procedere allo sviluppo sistematico della collezione LR(0) oppure LR(1).
Esercizio14b
 
La grammatica non e' LL(k) per nessun k. Nella soluzione data si giunge a questa conclusione con semplici osservazioni e con una dimostrazione.


Esercizio15b
 

Potremmo partire dalla grammatica non ambigua e context-free data nella parte (a), ed esaminarla per un'analisi LR. Troveremmo che tale grammatica non e' nemmeno LR(K). Una piu' attenta osservazione delle ragioni di tale falimento dovrebbero farci osservare strette analogie tra il linguaggio di questo esercizio e il linguaggio dell'esercizio 4. Se non avete affrontato l'esercizio4b: prima risolvete quello e poi affrontate questo. In analogia alla soluzione per 4b anche qui introdurremo una grammatica, differente da quella data nella parte (a), ma analizzabile LR. La nuova grammatica struttura le frasi del linguaggio in modo tale che le frasi della forma:
    (aa)n+m bm, sia riconosciute come strutturate in (aa)n (aa)m bm riducendo anzitutto, la parte (aa)m bm, ovvero la stinga (aa)n deve essere ridotta dopo e formare viable prefix a maniglie per (aa)m bm: esattamente come nella soluzione dell'eserczio4b.


Esercizio16b

Chiediamoci intanto se sia LL(1): verifichiamo, direttamente sulle produzioni della grammatica, le due semplici regole. Dovremmo scoprire che la grammatica e' LL(1) e, calcolate le funzioni first e follow, la relativa tabella di analisi LL e' immediata.
Esercizio17b
Chiediamoci intanto se sia LL(1): verifichiamo, direttamente sulle produzioni della grammatica, le due semplici regole. Dovremmo scoprire che la grammatica e' LL(1) e, calcolate le funzioni first e follow, la relativa tabella di analisi LL e' immediata.

  Esercizio1c
Considereremo anzitutto la grammatica proposta come soluzione all'esercizio1a. Esaminandola rispetto alla presenza di: a) stella di Klenee, b) fattori, c) ricorsione sinistra. Sappiamo, infatti, che se una di tali condizioni occorre la grammatica non e' LL(1) ed allora occorre generare una nuova grammatica possibilmente trasformando la corrente rimuovendo la condizione violata.
Nell'ipotesi che nessuna di a), b), c), si presenti occorre verificare le proprieta' LL(1), basate sul calcolo dei first (o inizi) e dei follow (o seguiti).
La nostra grammatica soddisfa. Quindi generiamo la tabella applicando le note regole
Esercizio2c
Occorre mostrare che esiste almeno un K>=0 tale che per ogni sentenziale sinistra aAb tutte le produzioni applicabili A::=gi (in una d. sinistra) sono tali che prese a coppie, ovvero per i diverso da j, firstk(gib) ha intersezione vuota con firstk(gjb). Nel nostro caso, dobbiamo vedere che cio' e' falso almeno per sentenziale sinistra S: per essa, per ogni K, esistono due produzioni che rendono falsa tale condizione. Completate la dimostrazione.
Esercizio4c
Mentre non esiste grammatica LL(1), un analizzatore LL(1) esiste.
Esercizio5c
Occorre mostrare che esiste almeno un K>=0 tale che per ogni sentenziale sinistra aAb tutte le produzioni applicabili A::=gi (in una d. sinistra) sono tali che prese a coppie, ovvero per i diverso da j, firstk(gib) ha intersezione vuota con firstk(gjb). Nel nostro caso, dobbiamo vedere che cio' e' falso almeno per sentenziale sinistra S: per essa, per ogni K, esistono due produzioni che rendono falsa tale condizione. Completate la dimostrazione.
Esercizio10c
Dobbiamo procedere come nell'esercizio5c. Nel nostro caso, dobbiamo vedere che esiste una sentenziale sinistra tale che: per ogni K, esistono due produzioni che rendono falsa tale condizione. Completate la dimostrazione.
 
Esercizio14c
 
La dimostrazione data per la parte (b) dell'esercizio fornisce una dimostrazione valida anche per questa parte.
 
Esercizio15c
 
Non siamo in grado di esprimere una grammatica LL per linguaggi {an bm | n>m}.
Esercizio16c
Dobbiamo calcolare la collezione LR(0). Calcolandola correttamente dovremmo scoprire un conflitto reduce/reduce.
Conclusione: ci troviamo di fronte a una grammatica per un linguaggio finito. La grammatica e' LL(1) ma non SLR(1).
Esercizio17c
Dobbiamo calcolare la collezione LR(0). Calcolandola correttamente dovremmo scoprire un conflitto reduce/reduce.
Come in esercizio16, ci troviamo di fronte a una grammatica LL(1) ma non SLR(1). Qui tuttavia la situazione e' piu' interessante.


 
 
 

Esercizio2d

La grammatica data struttura le frasi in modo infelice per un'analisi LL, infatti esaminando le produzioni per S o l'espressione di insieme (vedi soluzione2a) ottenuta per il linguaggio vediamo che produzioni differenti derivano frasi differenti (altrimenti avremmo ambiguita') ma con prefisso identico. Occorre individuare una grammatica che per tutte le frasi con identico prefisso utilizzi una identica derivazione sinistra, derivazione che cambiera' solo sulla base dei differenti suffissi delle frasi.
Esercizio5d
 
Si deve scoprire che e' possibile definire una grammatica LL(1) per il linguaggio. Tale grammatica e' ottenuta per tarsformazioni conservative della grammatica (quali, rimpiazzamenti di non terminali con la loro definizione, fattorizzazione, rimozione di ricorsione sinistra, etc...).
Esercizio10d
 
Banale trovare una grammatica per il linguaggio che sia analizzabile LL(1): se ne dia una.


Esercizio14d
 

Occore rimuovere l'ambiguita'.
Esercizio16d
Dobbiamo calcolare la collezione LR(1) e, contestualmente alla generazione dei vari stati, accorpare stati con kernel identici. Non dovremo trovare alcun conflitto e dalla collezione LALR e immediato costruire la relativa tabella di analisi.


Esercizio17d

Dobbiamo calcolare la collezione LR(1) operando come nell'esercizio16d. Qui tuttavia dovremmo scoprire che accorpando due stati della collezione aventi stesso kernel si ha un conflitto reduce/reduce. Notiamo anche che tale conflitto non permane se tali stati sono trattati come stati diversi, come avviene in LR(1).
Conclusione: ci troviamo di fronte a una grammatica per un linguaggio finito. La grammatica e' LL(1) ma non SLR(1), non e' LALR(1), e' tuttavia LR(1)




 

Esercizio16e

L'analizzatore LALR(1) gia' fornisce un analizzatore LR(1).


Esercizio17e

Calcolata la collezione LR(1) si nota la mancanza di conflitti e si puo' costruire facilmente la relativa tabella di analisi.
Notate: per un linguaggio cosi' banale nessuno si sognerebbe di ricorrere ad una grammatica di questo tipo. Tuttavia e' facile convincersi che semplici modifiche delle produzioni possono condurre ad una grammatica con caratteristiche di analisi del tutto analoghe alla grammatica originale, ma generante un linguaggio non banale. Potete tentare.

 
 
  
Ultimo aggiornamento 2 Marzo 2001