Tabelle LALR Costruzione delle tabelle LALR Metodo LALR Introduciamo lultimo metodo di costruzione di tabelle per il parsing LR Nome: lookahead-LR abbreviato.

Slides:



Advertisements
Presentazioni simili
Misure ed Errori Prof Valerio CURCIO.
Advertisements

Metodo di Calcolo Numerico per Equazioni differenziali Ordinarie
LR Parser II Parte Giuseppe Morelli.
I Linguaggi di programmazione
Equazioni e calcoli chimici
INFORMATICA Altre Istruzioni di I/O
Gli Elementi di Euclide
Gestione della memoria centrale
Sintassi (prima parte)
LR Parser Giuseppe Morelli. La maggior parte dei parser Bottom-Up è costituita dai cosiddetti parser LR(k) dove: L indica il verso dellanalisi della stringa.
Parser Bottom UP Giuseppe Morelli. Parser Bottom UP Un parser Bottom Up lavora costruendo il corrispondente albero di parsing per una data stringa di.
Linguaggi Regolari e Linguaggi Liberi
Viable Prefixes, conflitti e formato delle tabelle per il parsing LR
Costruzione delle tabelle di parsing LR canoniche
Costruzione di tabelle di Parsing SLR
Capitolo 8 Sistemi lineari.
Algoritmi e Programmazione
Precorsi di Informatica Dott. Antonio Cisternino Settembre 2003
Generalità Linguaggio e Macchina Astratta
TW Analisi dei documenti n Classificazione dei componenti n Selezione dei componenti, costruzione della gerarchia, dei blocchi informativi e degli elementi.
Algoritmi e Dimostrazioni Stefano Berardi
Esercitazioni su circuiti combinatori
Argomenti dalla linea dei comandi Gli argomenti possono essere passati a qualsiasi funzione di un programma, compresa la main(), direttamente dalla linea.
Iterazione enumerativa (for)
Macchine non completamente specificate
Computational Learning Theory and PAC learning
GLI INSIEMI.
Algoritmi e Strutture Dati (Mod. B)
STATISTICA a.a PARAMETRO t DI STUDENT
Il Linguaggio Macchina
1 Implementazione di Linguaggi 2 PARTE 4 Implementazione di Linguaggi 2 PARTE 4 Massimo Ancona DISI Università di Genova Testo: A.V. Aho, R. Sethi, J.D.Ullman.
1 Implementazione di Linguaggi 2 PARTE 4 Implementazione di Linguaggi 2 PARTE 4 Massimo Ancona DISI Università di Genova Testo: A.V. Aho, R. Sethi, J.D.Ullman.
Semantica di Tarski.
INSIEMI NUMERABILI L’analisi matematica introduce il concetto di insieme numerabile come insieme i cui elementi possono essere “contati” ossia che possiede.
LINGUAGGI DI PROGRAMMAZIONE
MOLTIPLICAZIONE COMBINATORIA
I primi insiemi che si incontrano in matematica sono quelli dei numeri;  daremo qui una breve descrizione dei principali insiemi numerici, delle loro operazioni.
Metodo della moltiplicazione
Sei pronto a “magnarteli”?
Cap. 13 Cerchio e circonferenza
3/29/2017 Minimizzazione.
Di Luca Santucci 5° Programmatori
BIOINFO3 - Lezione PARSING RISULTATI DI BLAST Nella lezione di ieri abbiamo visto come automatizzare lesecuzione di BLAST. Oggi proviamo.
BIOINFO3 - Lezione 201 Come in ogni corso di introduzione ad un linguaggio di programmazione, proviamo a scrivere lormai celebre primo programma di prova.
BIOINFO3 - Lezione 211 INPUT La lettura di un input dallo standard input (tastiera) si effettua utilizzando lespressione. Quando il programma incontra.
BIOINFO3 - Lezione 15 ISTRUZIONI
Commenti alle Attività Generiche. Attività Generiche (Pressman) Principali: Comunicazioni; Pianificazione; Modellazione; Costruzione, Dispiegamento Collaterali:
Commenti all’esempio del treno Nell’esempio del treno si è iniziato dalle attività generiche che tipicamente servono per portare a termine i compiti iniziali.
Commenti all’esempio del treno Nell’esempio del treno si è iniziato dalle attività generiche e/o attività operative che tipicamente costituiscono i passi.
La rappresentazione delle informazioni in un computer Seconda parte.
Logica Lezione Nov 2013.
L'apprendistato al senso dei simboli in algebra LEZIONE 3 L'apprendistato al senso dei simboli in algebra 3.1.
Informatica 3 V anno.
Misure ed Errori.
Capitolo 13 Cammini minimi: Ordinamento topologico Algoritmi e Strutture Dati.
13 ottobre Decisioni F. Bombi 13 ottobre 2002.
Ancora sulla shell. Shell e comandi La shell e' un programma che interpreta i comandi dell'utente. I comandi possono essere dati da terminale, oppure.
liceo Lioy e liceo Pigafetta, 10 febbraio 2011
Grammatiche non contestuali (1)
Macchine di Turing (1) Il modello di base ha un controllo finito, un nastro di input diviso in celle e una testa di lettura che esamina una cella alla.
Capitolo 13 Cammini minimi Algoritmi e Strutture Dati.
Progettazione di una base di dati relazionale Terza forma normale.
L’ELABORATORE ELETTRONICO uno strumento in grado di eseguire insiemi di azioni (“mosse”) elementari le azioni vengono eseguite su oggetti (dati) per produrre.
Automi temporizzati.
Problemi, algoritmi e programmazione
Divisione tra un polinomio ed un binomio Regola di Ruffini
Parsing ricorsivo discendente Il parsing ricorsivo discendente (recursive descent parsing) è un metodo di tipo top-down che può essere facilmente codificato.
Gli strumenti di misura
Corso di Chimica Generale ed Inorganica ESERCITAZIONE N°1.
Algoritmi Avanzati a.a.2013/2014 Prof.ssa Rossella Petreschi Albero ricoprente di costo minimo Lezione n°12.
Transcript della presentazione:

Tabelle LALR Costruzione delle tabelle LALR

Metodo LALR Introduciamo lultimo metodo di costruzione di tabelle per il parsing LR Nome: lookahead-LR abbreviato in LALR Questo metodo è usato spesso dato che le tabelle che si ottengono sono sensibilmente più piccole di quelle ottenute con lLR canonico I tipici costrutti dei linguaggi di programmazione possono venire facilmente catturati da una grammatica LALR

Metodo LALR Lo stesso discorso valeva anche per le grammatiche SLR Tuttavia ci sono un certo numero di costrutti per i quali è meglio usare grammatiche LALR Le tabelle SLR e LALR hanno sempre lo stesso numero di stati Numero: alcune centinaia di stati per un linguaggio tipo il Pascal Per lo stesso linguaggio una tabella LR canonica ha alcune migliaia di stati

Idea Consideriamo la grammatica usata come esempio per illustrare la costruzione di tabelle LR canoniche: S S CC C cC | d

Idea Alcuni insiemi di item LR(1) che abbiamo costruito per questa grammatica avevano lo stesso insieme di item LR(0) ma differivano per i simboli di lookahead I 4 = {[C d, c], [C d, d] } I 7 = {[C d, $]}

Idea Osserviamo meglio il comportamento di questi due stati durante il parsing La grammatica genera il linguaggio c*dc*d Durante la lettura di un input cc cdcc cd il parser fa lo shift di tutto il primo gruppo di c e della prima d che le segue entrando nello stato 4 dopo aver letto questa d A questo punto il parser ordina una riduzione con C d se il simbolo successivo è c o d

Idea È giusto: sia c che d possono essere linizio di c*d Daltra parte, se $ segue la prima d cè un errore: ad esempio la stringa ccd non è nel linguaggio E giustamente lo stato 4 segnala errore se il simbolo di input è $

Idea Dopo la prima d il parser appila tutte le c seguenti e anche la seconda d entrando infine nello stato 7 A questo punto il simbolo di input deve essere $ altrimenti la stringa data non è nel linguaggio (errore) È giusto che lo stato 7 comandi una riduzione con C d se linput è $ e dia errore se linput è c o d.

Idea Rimpiazziamo ora gli insiemi I 4 e I 7 con un unico insieme di item LR(1) I 47 I 47 è lunione degli item di I 4 e di I 7 I 47 = C d, c/d/$ goto(I i,d)=I 47 per i=0,2,3,6 Le azioni dello stato 47 sono: riduci con C d per ogni input

Conseguenze Il parser così modificato si comporta quasi allo stesso modo di quello di partenza Potrebbe ridurre con C d in alcune circostanze nelle quali il parser originale avrebbe segnalato un errore (es: ccd o ccdcdc) Lerrore però viene comunque rilevato in seguito (in effetti prima che venga appilato un altro simbolo terminale sullo stack)

In generale Cerchiamo gli insiemi di item LR(1) che hanno lo stesso core, cioè lo stesso insieme di prime componenti Accorpiamo gli insiemi di item LR(1) con lo stesso core in un unico insieme di item LR(1) Nellesempio precedente I 4 e I 7 avevano lo stesso core C d

In generale Ad esempio anche gli insiemi I 3 ed I 6 dellesempio precedente hanno lo stesso core {C c C, C cC, C d} Anche I 8 ed I 9 hanno lo stesso core {C cC } In generale un core è un insieme di item LR(0)

In generale Il core di goto(I,X) dipende solo dal core di I Questo significa che i goto degli stati accorpati possono essere anche essi accorpati Quindi non cè problema nella ridefinizione della funzione goto La tabella action va modificata in accordo ai nuovi item LR(1) (con gli accorpamenti)

Conseguenze Supponiamo di avere una grammatica LR(1) I suoi insiemi di item LR(1) non producono conflitti Se accorpiamo gli insiemi con lo stesso core ci dovremmo aspettare che i nuovi insiemi producano conflitti E invece non è così, almeno per i conflitti shift/reduce

Conseguenze Supponiamo infatti di avere un conflitto shift/reduce in uno stato accorpato Più precisamente cè un item [A, a] che indica una riduzione per a e anche un item [B a, b] che invece indica uno shift per a Se questo è vero allora almeno un insieme di item (non accorpato) aveva nel core litem [A, a] e, visto che il core deve essere uguale per tutti gli stati che sono stati accorpati, anche un item [B a, c] per qualche c

Conseguenze Ma questo significherebbe che cera lo stesso conflitto anche sullinsieme di item LR(1) di partenza Ciò non è possibile perché siamo partiti dallipotesi che la grammatica fosse LR(1) Quindi laccorpamento non produrrà mai conflitti shift/reduce

Conseguenze Tuttavia è possibile che laccorpamento provochi conflitti reduce/reduce Esempio: S S aAd | bBd | aBe | bAe A c B c

Questa grammatica genera le quattro stringhe acd, ace, bcd, bce La grammatica è LR(1) Costruendo gli insiemi di item LR(1) si trova {[A c, d], [B c, e} i cui item sono validi per il viable prefix ac {[A c, e], [B c, d} i cui item sono validi per il viable prefix bc Nessun conflitto

Esempio Proviamo ad accorpare gli stati e vediamo se la grammatica è LALR {[A c, d/e], [B c, d/e]} Conflitto reduce/reduce: sugli input d ed viene indicato di ridurre sia con A c che con B c Quindi la grammatica è LR(1), ma non è LALR

Costruzione tabella LALR Esistono due modi Il primo, che faremo, è basato sulla costruzione preliminare degli item LR(1) e successivo accorpamento È il metodo più semplice, ma anche il più costoso Il secondo, che non faremo, genera direttamente gli stati del parser LALR senza passare per gli stati del parser LR

Algoritmo Input: una grammatica aumentata G Output: le funzioni action e goto della tabella di parsing LALR 1. Costruisci C={I 0,...,I n }, la collezione di insiemi di item LR(1) 2. Per ogni core degli insiemi di item LR(1) accorpa tutti gli insiemi con quel core nello stesso insieme

Algoritmo 3. Sia C={J 0,...,J m } la collezione risultante. I valori della tabella action per lo stato i sono costruiti a partire dallinsieme J i utilizzando lo stesso algoritmo visto per la tabella LR canonica. Se ci sono conflitti allora la grammatica non è LALR(1)

Algoritmo 4. La tabella goto è costruita come segue: Sia J lunione di uno o più insiemi di item LR(1): J = I 1 I 2... I k Allora i core di goto(I 1,X), goto(I 2,X),...,goto(I k,X) sono gli stessi, dato che I 1, I 2,...,I k hanno lo stesso core Sia K lunione di insiemi di item che hanno lo stesso core di goto(I 1,X) Allora goto(J,X)=K

Esempio Riprendiamo la gram\matica per c*dc*d che abbiamo usato per illustrare la costruzione della tabella LR canonica Abbiamo visto sopra che si possono accorpare gli stati 4 e 7 Inoltre accorpiamo 3 e 6 E anche 8 e 9

Esempio I 47 = C d, c/d/$ I 36 = C c C, c/d/$ C cC, c/d/$ C d, c/d/$ I 89 = C cC, c/d/$

Tabella LALR STATOactiongoto cd$SC 0s36s4712 1acc 2s36s475 36s36s r3 5r1 89r2

Considerazioni Se presentiamo al parser LALR una stringa corretta (nel nostro esempio una stringa di c*dc*d) il parser LALR esegue esattamente le stesse mosse del parser LR canonico Se presentiamo una stringa che non appartiene al linguaggio i due parser hanno un comportamento differente, ma entrambi segnalano lerrore Provare con linput ccd$