Costruzione delle tabelle di parsing LR canoniche

Slides:



Advertisements
Presentazioni simili
LR Parser II Parte Giuseppe Morelli.
Advertisements

Automi finiti deterministici (DFA) (1)
Automi temporizzati.
Macchine di Turing e ricorsività generale
Sintassi (prima parte)
Analizzatori Sintattici con Cup Giuseppe Morelli.
Traduttore diretto dalla sintassi (seconda 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
Tabelle LALR Costruzione delle tabelle LALR Metodo LALR Introduciamo lultimo metodo di costruzione di tabelle per il parsing LR Nome: lookahead-LR abbreviato.
Costruzione di tabelle di Parsing SLR
Traduzione guidata dalla sintassi
Capitolo 8 Sistemi lineari.
Algoritmi e Programmazione
Precorsi di Informatica Dott. Antonio Cisternino Settembre 2003
Sistemi di Lindenmayer
1 Linguaggi di Programmazione - elementi Corso di Laurea in Informatica (AA 2005/2006) Gabriella Pasi e Carla Simone
1 Il punto di vista Un sistema è una parte del mondo che una persona o un gruppo di persone, durante un certo intervallo di tempo, sceglie di considerare.
Hash Tables Indirizzamento diretto Tabelle Hash Risoluzioni di collisioni Indirizzamento aperto.
Reaching Definitions. Tino CortesiTecniche di Analisi di Programmi 2 Reaching definitions Dato un punto del programma, quali sono i comandi di assegnamento.
Università degli Studi di Roma Tor Vergata
Iterazione enumerativa (for)
Elementi di Matematica
Macchine non completamente specificate
TEORIA RAPPRESENTAZIONALE DELLA MISURA
Analisi e sintesi di circuiti combinatori
Analisi e Sintesi di circuiti sequenziali
U V U V (a) |cfc|=2 prima e dopo (b) |cfc|=2 prima e |cfc|=1 dopo
GLI INSIEMI.
EQUAZIONI DI PRIMO GRADO
Algoritmi e Strutture Dati (Mod. A)
Teoria degli INSIEMI A cura Prof. Salvatore MENNITI.
Analisi e Sintesi di circuiti sequenziali. Definizione Una macchina sequenziale é un sistema nel quale, detto I(t) l'insieme degli ingressi in t, O(t)
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.
Procedure e funzioni nei linguaggi di alto livello Lab Programmazione - turno /2006.
Semantica per formule di un linguaggio proposizionale p.9 della dispensa.
Corso di Matematica Discreta cont. 2
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
IL GIOCO DELLA LOGICA.
Fondamenti di Comunicazione Digitale
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
IF & ELSE. Alcune volte javascript richiede l'abilità di distinguere tra differenti possibilità.
ESTENSIONI SEMPLICI e TEOREMA DELL’ELEMENTO PRIMITIVO
Un problema Progettare un programma per calcolare se un qualsiasi altro programma contiene un ciclo infinito –Ciclo infinito: per esempio, eseguire le.
13 ottobre Decisioni F. Bombi 13 ottobre 2002.
Automi a pila (1) Un automa a pila (PDA) è M = (Q, S, G, d, q0, Z0, F) dove: Q insieme finito di stati S alfabeto finito di input 3. G alfabeto di pila.
Grammatiche Grammatiche libere da contesto Grammatiche regolari
Capitolo 10 Tecniche algoritmiche Algoritmi e Strutture Dati.
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.
public class volume { public static void main (String[] args) { final double bott_vol =2.0; final double latt_vol = 0.355; int bott_num = 4; int latt_num.
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.
Espressioni regolari (1)
Automi temporizzati.
In generale, con il termine di grammatica si intende un formalismo che permette di definire un insieme di stringhe mediante l’imposizione di un particolare.
Le quattro operazioni.
Indecidibilità Limiti della calcolabilità Pigreco-day 14 marzo 2014 Matematica e Incertezza Prof. Antonio Iarlori Mathesis Lanciano-Ortona.
Operazioni con gli insiemi
Analisi matematica Introduzione ai limiti
Linguaggi e Grammatiche Alfabeto : insieme non vuoto di elementi detti simboli A = { a, b, c } Stringa : sequenza di simboli di un alfabeto ab abc abcab.
Linguaggi, stringhe e alfabeti. Linguaggi e grammatiche Un linguaggio è un sistema di comunicazione tra persone che permette di trasmettere informazioni.
Parsing ricorsivo discendente Il parsing ricorsivo discendente (recursive descent parsing) è un metodo di tipo top-down che può essere facilmente codificato.
GLI INSIEMI per la classe 1ai Prof: Paolo Govoni
Logica Lezione 8, DISTRIBUIRE COMPITO 1.
Logica Lezione 11, Annuncio Non si terrà la lezione di Lunedì 16 Marzo.
Transcript della presentazione:

Costruzione delle tabelle di parsing LR canoniche Tabelle LR Costruzione delle tabelle di parsing LR canoniche

Precisiamo il problema di SLR In uno stato i la tabella indica una riduzione con una produzione A   se l’insieme di item Ii contiene l’item A e il simbolo corrente è un aFOLLOW(A) Tuttavia, in alcune situazioni, quando lo stato i appare in testa allo stack, il viable prefix  sullo stack non può essere seguito da a in nessuna forma sentenziale destra Quindi la riduzione A   sarebbe sbagliata con l’input a

Esempio Riconsideriamo la grammatica degli assegnamenti e delle espressioni di identificatori e puntatori Nello stato 2 c’era un item RL (che corrisponde alla A di cui sopra) e il segno = apparteneva a FOLLOW(R) (= corrisponde alla a di cui sopra) Ma non c’è nessuna forma sentenziale destra della grammatica che inizia per R=  Quindi, nello stato 2, non dovrebbe essere indicata una riduzione sul simbolo =

Soluzione Aggiungiamo informazione agli stati Ogni stato deve contenere, oltre agli item validi, anche i simboli di input che possono seguire una handle  per la quale è possibile una riduzione ad A Gli item sono ridefiniti: sono coppie [A, a] dove A è una produzione e a è un simbolo terminale oppure $

Item LR(1) Questi item che contengono anche un simbolo terminale sono chiamati item LR(1) (1 indica che si considera un simbolo di lookahead, cioè la seconda componente è un solo simbolo) Il lookahead non ha effetti in un item [A, a] dove   , ma se l’item è della forma [A, a] allora si esegue una riduzione solo se il simbolo di lookahead è a In altre parole non riduciamo più per tutti i simboli di FOLLOW(A), ma per un sottoinsieme (anche proprio) di questi

Item LR(1) validi Formalmente, diciamo che un item LR(1) [A, a] è valido per un viable prefix  se e solo se c’è una derivazione S*rmAw rmw dove  =  o a è il primo simbolo di w oppure w= e a=$

Esempio Consideriamo la seguente grammatica: S  BB B  aB | b La seguente è una derivazione rightmost: S *rm aaBab rm aaaBab L’item [B  a • B, a] è valido per un viable prefix  = aaa sostituendo =aa, A = B, w = ab,  = a e  = B nella definizione

Costruzione degli item LR(1) La costruzione degli insiemi di item LR(1) validi è essenzialmente la stessa che per la costruzione canonica LR(0) Quello che cambiano sono le funzioni closure e goto.

Closure Consideriamo un item [A  B, a] nell’insieme degli item validi per un viable prefix =. Per la validità, esiste una derivazione rightmost S * Aax  Bax Supponiamo che ax derivi una stringa di terminali by Allora, per ogni produzione B  , abbiamo una derivazione rightmost S * Bby  by Cioè, l’item [B ,b] è valido per il viable prefix 

Closure Il b in questione potrebbe essere il primo carattere derivato da , oppure, se *, b potrebbe essere la a Per trattare uniformemente tutti i casi basta dire che b può essere un qualsiasi terminale in FIRST(ax)= FIRST(a)

Calcolo di closure(I) a partire da I begin closure(I) := I; repeat for each item [AB, a]  I, each produzione B in G’, and each terminale b  FIRST(a) tale che [B  , b]  I do aggiungi [B  , b] a closure(I); until nessun nuovo item può essere aggiunto; end;

Esempio S’  S S  CC C  cC | d Per calcolare closure({[S’  •S, $]}) facciamo il match dell’unico item con il template [AB, a]. Otteniamo A = S’, =, B= S, = , a = $. Si ha FIRST(a)=FIRST($)={$} Quindi aggiungiamo solo l’item [S  •CC, $]

Esempio Continuiamo a chiudere aggiungendo tutti gli item [C  •, b] con b  FIRST(C$) Si ha che FIRST(C$)={c,d} Quindi aggiungiamo i seguenti item: [C  •cC, c] [C  •cC, d] [C  •d, c] [C  •d, d] Il calcolo termina dato che non c’è nessun nuovo item che fa match con il template

Esempio I0: [S’  •S, $] [S  •CC, $] [C  •cC, c] [C  •cC, d] [C  •d, c] [C  •d, d] Abbreviazioni: I0: S’  •S, $ S  •CC, $ C  •cC, c/d C  •d, c/d

Funzione goto function goto(I,X); begin sia J l’insieme di item della forma [A X, a] tali che [A X, a] I return closure(J); end;

Calcolo degli item LR(1) Utilizziamo la stessa identica procedura che abbiamo visto per la collezione canonica LR(0), ma con le funzioni closure e goto nuove Anche qui il risultato è un automa deterministico i cui stati sono insiemi di item LR(1) Continuiamo con l’esempio

Esempio Calcoliamo tutti i goto per lo stato 0 Possiamo vedere il tutto come la costruzione di un automa: goto(I0,X) è lo stato a cui si arriva partendo da 0 e facendo una transizione etichettata X goto(I0, S) = closure({[S’  S•, $]})= {[S’  S•, $]} = I1

Esempio goto(I0,C) = closure({[S CC, $]}) = {[S CC, $], [C cC, $], [C d, $]} = I2 goto(I0,c) = closure({[C cC, c], [CcC, d]})= C cC, c/d C  cC, c/d C  d, c/d = I3

Esempio goto(I0,d) = closure({[C  d, c/d]}) = C  d, c/d = I4 Abbiamo finito di calcolare le “transizioni uscenti” da I0, passiamo ad I1 = {[S’  S•, $]} Per I1 non c’è nessuno goto Passiamo a I2

Esempio goto(I2,C) = closure({[SCC, $]}) = {[SCC, $]} = I5 goto(I2,c) = closure({[CcC, $]}) = CcC, $ C cC, $ C d, $ = I6 goto(I2,d) = {[C d, $]} = I7 Si noti che I7 differisce da I4 solo nelle seconde componenti

Esempio Questo fenomeno è tipico per gli insiemi di item LR(1) Data una certa grammatica, ogni insieme della collezione canonica LR(0) corrisponde in generale all’insieme di insiemi di item LR(1) che hanno la stessa prima componente, ma seconde componenti diverse

Esempio goto(I3,C) = CcC, c/d = I8 goto(I3,c) = closure({[C cC, c/d}) = I3 goto(I3,d) = C d, c/d = I4 goto(I6,C) = {C cC, $} = I9 goto(I6,c) = I6 goto(I6,d) = I7

Costruzione della tabella LR Il procedimento è lo stesso che per la costruzione della tabellaSLR, anzi, è più semplice: per le riduzioni dobbiamo guardare il simbolo di lookahead dell’item e non tutti i simboli di FOLLOW(A) se A è la parte sinistra della produzione con cui ridurre

Algoritmo Costruisci C = {I0,I1,...,In }, la collezione di item LR(1) Lo stato i del parser LR è costruito a partire da Ii. Le azioni di parsing per lo stato i sono determinate come segue: Se [A  a, b]  Ii e goto(Ii,a) = Ij, allora poni action[i,a]:= “shift j” (a è terminale!) Se [S’S, $]  Ii, allora poni action[i,$] := “accept” Se [A  , a]  Ii, allora poni action[i,a] := “reduce A  ”

Algoritmo Come nel caso SLR, la parte goto della tabella LR è data dalla funzione goto Tutte le entrate vuote corrispondono a “error” Lo stato iniziale del parser LR è quello costruito dall’insieme che contiene l’item [S’S, $] (I0) La tabella così formata si chiama tabella di parsing LR(1) canonica

Tabella e conflitti Se nella tabella non ci sono entrate multidefinite allora la grammatica è analizzabile LR(1) (1) è sottinteso quando diciamo solo LR Un parser LR che utilizza questa tabella si chiama parser LR(1) canonico

Esempio Numeriamo le produzioni della grammatica seguendo l’ordine naturale 0) S’  S 1) S  CC 2) C  cC 3) C  d Riempiamo la tabella

Tabella LR(1) canonica STATO action goto c d $ S C s3 s4 1 2 acc s6 s7 s3 s4 1 2 acc s6 s7 5 3 8 4 r3 r1 6 9 7 r2

Considerazioni Ogni grammatica SLR(1) è anche LR(1), ma per una grammatica SLR(1) il parser LR canonico può avere molti più stati rispetto a quelli del parser SLR Ad esempio, la grammatica che abbiamo usato come esempio è SLR e un parser SLR per la stessa ha 7 stati invece dei 10 del parser LR canonico appena costruito