Sei sulla pagina 1di 48

1

ANALISI SEMANTICA E
TRADUZIONE
Grammatiche ad attributi
Semantica
La semantica, come la sintassi, costituita da un insieme di regole
che associano un significato ai costituenti lessicali e sintattici del
linguaggio.
Il significato dellintera frase viene quindi ottenuto con un
processo compositivo, unendo il significato dei suoi costituenti.
Le regole semantiche possono essere fornite seguendo diversi
modelli:
Semantica operazionale
Semantica denotazionale
Il particolare tipo di regole semantiche che costituiscono
largomento del corso sono note sotto il nome di grammatica ad
attributi, ed senza dubbio il pi diffuso nel campo dei linguaggi
di programmazione.
2
Un metodo di definizione del linguaggio si dice
semantico se soddisfa uno o pi dei seguenti criteri:
Il metodo diverso da quello delle grammatiche
formali di Chomsky, ed in particolare dalle sintassi
libere.
Il metodo basato sulla composizione di funzioni aventi
domini e codomini arbitrari, in contrasto con i metodi
sintattici che trattano unicamente le stringhe per mezzo
delle operazioni della teoria dei linguaggi formali
(concatenamento, ripetizione, sostituzione di stringhe).
Primo approccio
Sono classificati semantici i fondati su regole di riscrittura pi
potenti di quelle libere.
Nella classificazione di Chomsky delle sintassi, le regole del tipo
0 permettono di esprimere ogni linguaggio computabile, in
quanto noto che tali sintassi definiscono la classe degli insiemi
ricorsivamente numerabili.
concettualmente possibile descrivere il significato di qualsiasi linguaggio
artificiale mediante una sintassi le cui regole hanno una forma pi generale
di quelle libere.
In pratica tale sistema sarebbe difficilissimo da progettare, illeggibile e
praticamente inutilizzabile.
Allo stato attuale delle conoscenze si pu dire che il rapporto
costo-benefici del formalismo sintattico raggiunge lottimo con le
sintassi libere, ma peggiora rapidamente quando si tenta di
estenderlo verso modelli pi complessi.
3
Secondo approccio
Nella semantica si sfruttano meccanismi definitori pi generali di quelli basati
sulla manipolazione delle stringhe
La semantica raggiunge il suo potere espressivo grazie allimpiego
dellaritmetica e al ricorso a strutture-dati pi ricche delle stringhe: le
tabelle,liste, insiemi, relazioni, ecc. comunemente impiegati dallingegneria del
software.
Esempio: la tabella dei nomi delle variabili usate in un programma con le loro propriet.
Per costruire e consultare tali strutture, che costituiscono il dominio semantico
del linguaggio, si usano delle funzioni (dette semantiche), scritte in un
opportuno linguaggio algoritmico, che spesso viene scelto tra i linguaggi
programmativi pi diffusi.
Le funzioni semantiche sono raggruppate in gruppi di regole che
riflettono strettamente la struttura della sintassi
Il potere espressivo ottenuto grazie al libero uso delle strutture-
dati e delle funzioni semantiche offusca il carattere
rigorosamente formale del modello semantico, che va considerato
un buon compromesso tra il rigore formale della sintassi e la
tecnica della programmazione.
Traduzione
Sarebbe difficile progettare in modo globale un algoritmo di
traduzione di un linguaggio complesso senza prima analizzare
la frase sorgente nei suoi costituenti definiti dalla sintassi.
Lanalisi sintattica riduce la complessit del problema del
calcolo della traduzione, decomponendolo in sottoproblemi pi
semplici.
Per ogni costituente della frase sorgente il traduttore esegue le
azioni appropriate per preparare la traduzione, azioni che
consistono nel raccogliere certe informazioni (ad es. le tabelle
dei simboli), nel fare dei controlli semantici, o nellemettere
certe parti della frase pozzo.
In altre parole il lavoro del traduttore modularizzato
secondo la struttura descritta dallalbero sintattico della frase.
Perci questo tipo di traduttori detto guidato dalla sintassi.
4
Organizzazione del traduttore
Per il traduttore sia efficace, necessario che
la sintassi sia strutturalmente adeguata, nel senso che ogni
sottoalbero deve permettere il calcolo di una parte significativa
della traduzione.
Le grammatiche ad attributi sono la tecnica per eccellenza per
sfruttare la struttura sintattica nel calcolare la traduzione o il
significato di una frase.
Le regole semantiche della grammatica sono definite in
corrispondenza delle produzioni sintattiche e gli attributi
semantici sono associati ai simboli nonterminali e terminali della
sintassi.
Sintassi e semantica hanno allora esattamente la stessa
modularit.
Vi sono altri approcci per formalizzare la semantica che pure
sfruttano la struttura sintattica.
metodo denotazionale: esprime il significato della frase come
composizione di funzioni matematiche.
Traduzioni puramente sintattiche
Un caso molto particolare di traduzione compositiva quello dei
cosiddetti schemi sintattici di traduzione, un formalismo puramente
sintattico per definire una funzione dal linguaggio sorgente al
pozzo.
Anche se gli schemi sintattici non dispongono della capacit
algoritmica necessaria per i casi reali, essi sono interessanti come
modello semplice ed elegante della traduzione.
Uno schema di traduzione un sistema formale che accoppia
due sintassi libere, la sintassi-sorgente e la sintassi-pozzo,
ottenendo cos una corrispondenza i sottoalberi da esse generati,
e quindi anche tra le frasi del linguaggio-sorgente L e quelle del
linguaggio pozzo L'.
5
Traduzione puramente sintattica
Siano E e A gli gli alfabeti sorgente e pozzo, e sia x e L _ E* una una
frase sorgente.
Allora la traduzione di x una stringa y che viene detta immagine nella
traduzione.
L'insieme di tali coppie (x, y) costituisce una relazione
t _ (E* x A*)
Detta relazione di traduzione.
Il linguaggio pozzo L' l'insieme delle stringhe y _ A*) tali che per qualche
stringa x e L sia (x, y) e t
Se poi ogni frase sorgente ammette una sola immagine, la traduzione
diventa una funzione (ad un solo valore)
t : L L
Si pu scrivere con notazione funzionale y= t(x).
Definizione
Uno schema di traduzione puramente sintattico costituito dalla
sintassi-sorgente G= (V,E, P, S) e dalla sintassi pozzo G'= (V,A,
P', S), aventi lo stesso alfabeto nonterminale V, e da una
corrispondenza biunivoca tra le produzioni P e P', con le seguenti
propriet:
Siano (Ao) eP e (A|) e P le produzioni corrispondenti.
Allora I nonterminali presenti in o e | devono
essere gli stessi
comparire lo stesso numero di volte
comparire nello stesso ordine.
6
Esempio
Sorgente Pozzo
A aCD A bCD
C D C bDe
C b C ca
D DaCD D DCD
D c D f
A aCD aDD aDaCDD acaCDD acabDD
acabcD acabcc
A bCD bbDeD bbCDDeD bbCfDeD bbcafDeD
bbcaffeD bbcaffef
Esempio
La sintassi-sorgente espressioni aritmetiche, linguaggio pozzo espressioni
nella forma polacca postfissa, nella quale noto che gli operatori seguono
i loro argomenti.
Un esempio di traduzione :
v * v *(v+v) v v mult v v add mult
dove gli alfabeti sorgente e pozzo sono
E = { v, ' (' , ' )' , +,*} e A = {v, add, mult}
Lo schema di traduzione definito dalle seguenti coppie di produzioni:
1. E E + T E E T add
2. E T E T
3. T T * F T T F mult
4. T F T F
5. F ( E ) F E
6. F v F v
7
Limiti
sono insiti nel fatto che, per costruire la stringa
pozzo, si possono soltanto applicare delle
semplici operazioni di spostamento dei terminali-
sorgente e di cancellazione o sostituzione di essi
con i terminali dell'alfabeto pozzo.
In tale modo ad esempio sarebbe impossibile
definire la traduzione che converte un numero
dalla rappresentazione in base due a quella in
base dieci.
Per realizzare si possono utilizzare le
grammatiche ad attributi
Traduzione syntax direct
Ambito: traduzione di linguaggi guidata dalle grammatiche
context- free
Traduzione: una mappatura (mapping ) dell'input
nell'output
Definizione syntax-directed: un formalismo per
specificare come si traduce un costrutto di un ling. di progr.
in termini di attributi associati ai suoi componenti sintattici
Schema di traduzione una notazione pi procedurale
(implementativa) per specificare come si traduce un
costrutto di un ling. di progr.
8
Traduzione syntax direct
approccio classico (due passate):
1. si sintetizza l'albero sintattico (struttura dati) nella fase di
analisi sintattica
2. si utilizza l'albero sintattico per la sintesi dell'output
approccio semplificato (una passata):
1. si sintetizza l'output direttamente durante l'analisi
sintattica, senza costruire l'albero sintattico
l'approccio semplificato ad una passata funziona solo
nei casi semplici" di traduzione e, pi in generale, di
elaborazione dell'input invece, costruendo l'albero
sintattico e visitandolo successivamente si pu
implementare un insieme molto pi grande di funzioni
di traduzione e di elaborazione
Come opera una definizione syntax-
directed:
traduzione senza albero sintattico = analisi sintattica dell'input
e sintesi dell'output in una sola passata
pertanto, la traduzione deve avvenire durante l'analisi sintattica
occorre modificare l'analizzatore sintattico, aggiungendo istruzioni
che permettano la sintesi dell'output in parallelo all'analisi dell'input
NOTA BENE: gli analizzatori sintattici LL e LR visti in precedenza
NON generano l'albero sintattico
9
si parla di traduzione guidata dalla sintassi nei casi in cui
possibile definire il processo di sintesi dell'output (traduzione)
sulla base della struttura sintattica dell'input
in altre parole, in questi casi l'operazione di traduzione
fortemente legata alla sintassi dell'input, pertanto la traduzione
puo essere definita in modo parallelo" alla definizione della
sintassi dell'input
in moltissime applicazioni informatiche la funzione di traduzione
(o di elaborazione) guidata dalla sintassi
nel seguito trattiamo solo funzioni di traduzione guidate dalla
sintassi
anche per traduzioni guidate dalla sintassi, si pu avere la
necessit di costruire l'albero sintattico (due passate distinte per
analisi sintattica e sintesi dell'output) oppure no (una sola
passata per analisi sintattica e sintesi dell'output)
per la traduzione guidata dalla sintassi viene definita
una estensione del formalismo delle grammatiche non
contestuali: le grammatiche ad attributi
le grammatiche ad attributi estendono le grammatiche
non contestuali introducendo le nozioni di:
attributi associati ai simboli (terminali e non terminali) della
grammatica
azioni semantiche e regole semantiche, che affiancano le
regole sintattiche della grammatica
10
nelle grammatiche ad attributi:
ogni simbolo terminale o non terminale pu avere uno o pi
attributi
attributo = propriet associata al simbolo, che pu essere
letta o assegnata dalle azioni semantiche ( = variabile di
un linguaggio di programmazione)
ad ogni regola di produzione (regola sintattica) pu essere
associata una regola semantica
regola semantica = sequenza di azioni semantiche
azione semantica = azione in grado di assegnare valori agli
attributi e di avere altri effetti ( = istruzione di un
linguaggio di programmazione)
gli attributi sono usati per rappresentare un
significato" che viene associato ai simboli sintattici
signicato = valore (numero, stringa, struttura dati, ecc.)
che assume l'attributo
le azioni semantiche sono il meccanismo che effettua il
calcolo di tali valori, e che quindi calcola tale
significato"
possiamo effettuare la traduzione utilizzando attributi e
azioni semantiche, se assegnamo come significato" di
un simbolo la traduzione della parte di stringa di input
che tale simbolo rappresenta nell'albero sintattico
11
esempio:
in una grammatica per espressioni aritmetiche sui numeri
interi, possiamo associare un attributo di tipo intero ad ogni
simbolo non terminale della grammatica
possiamo poi definire delle azioni semantiche in modo tale
che il valoredi ogni attributo corrisponda al valore della
sottoespressione associata al corrispondente simbolo non
terminale
pertanto: valore dell'attributo associato alla radice
dell'albero sintattico = valore dell'intera espressione
aritmetica
Grammatiche ad attributi
Una grammatica ad attributi H costituita dalle seguenti entit.
1. Una sintassi libera G = (V,E, P, S), dove V il vocabolario nonterminale, E,
quello terminale, P linsieme delle produzioni e S lassioma. Spesso conviene
imporre che lassioma non figuri in alcuna parte destra di produzione.
2. Un insieme di simboli, gli attributi (semantici), associati ai simboli nonterminali ed
eventualmente ai terminali.
Lattributo o associato al (non)terminale D si indica con o of D. Linsieme degli
attributi dei nonterminali spartito in due insiemi tra loro disgiunti detti
attributi sintetizzati e attributi ereditati.
Gli attributi dei terminali sono detti lessicali.
3. Per ogni attributo o specificato un dominio, linsieme dei valori che esso pu
assumere.
4. Un insieme reg(H) di regole (semantiche). Ogni regola associata ad una
produzione, ed in generale una produzione p ha pi regole indicate come
reg(p).
12
Cosa sono gli attributi
Ogni attributo pu rappresentare
qualunque cosa vogliamo: stringhe, numeri,
tipi, locazioni di memoria, etc.
Il valore di ogni attributo ad ogni nodo
determinato da una regola semantica
associata alla produzione che si usa nel
nodo annotated (decorated) parse tree:
un parse tree che mostra i valori
degli attributi (dei simboli) per ciascun
nodo
Definizioni guidate dalla sintassi
gli attributi si distinguono in:
attributi sintetizzati: sono gli attributi il cui valore dipende solo dai valori
degli attributi presenti nel sottoalbero del nodo dell'albero sintattico a
cui sono associati
attributi ereditati: sono gli attributi il cui valore dipende solo dai valori
degli attributi presenti nei nodi predecessori e nei nodi fratelli del nodo
dell'albero sintattico a cui sono associati
gli attributi sintetizzati realizzano un flusso informativo ascendente
nell'albero sintattico (dalle foglie verso la radice)
gli attributi ereditati realizzano un flusso informativo discendente (dalla
radice verso le foglie) e laterale (da sinistra verso destra e viceversa)
nell'albero sintattico
13
Forma di una definizione
In un syntax-directed definition, ogni produzione A associata
con un insieme di regole semantiche di forma
b=f(c
1
,c
2
,,c
n
) dove f una funzione, e b
b un attributo sintetizzato di A e c
1
,c
2
,,c
n
sono attributi dei
simboli della grammatiche presenti nella produzione A.
oppure
b un attributo ereditato del simbolo sella grammatica in (nella
parte destra della produzione), e c
1
,c
2
,,c
n
sono attributi dei simboli
della grammatiche nella produzione A.
Regole semantiche
l'esecuzione di una regola semantica avviene in parallelo
all'applicazione della corrispondente regola sintattica
nell'analisi sintattica
pertanto, l'ordine di applicazione delle regole semantiche
conseguenza dell'ordine di applicazione delle regole di
produzione nell'analisi sintattica
in particolare, dato un certo ordine di applicazione, le istruzioni
che nelle regole semantiche effettuano la valutazione degli
attributi potrebbero non essere eseguibili in modo corretto
ad esempio, pu accadere che in una azione semantica si tenti
di leggere il valore di un attributo non ancora assegnato
questo problema, noto come problema della valutazione degli
attributi, e un problema fondamentale per il trattamento
automatico delle grammatiche ad attributi
14
Regole semantiche
La valutazione pu avere anche side-effects
(effetti collaterali) come la stampa di valori o
laggiornamento di una veriabile globale
In una definizione guidata dalla sintassi si
assume che i simboli terminali abbiano solo
attributi sintetizzati
I valori per questi attributi sono in genere
forniti dallanalizzatore lessicale
Il simbolo iniziale, se non diversamente
specificato, non ha attributi ereditati
Esempio
ll calcolo del valore decimale di un numero frazionario in base due (D.
Knuth 1968)
Lesempio mostra il ruolo degli attributi ereditati, e la loro sostituibilit con
gli attributi sintetizzati.
Il linguaggio sintatticamente definito dallespressione regolare L= {
0,1}*. {0, 1}* da interpretare come un numero binario con il punto che
separa la parte intera da quella frazionaria.
Ad es. il significato di 1101.01 il numero 13,25
Sintassi
1. num str . str
2. str str bit
3. str bit
4. bit 0
5. bit 1
num lassioma, str definisce la stringa binaria della parte intera e
frazionaria, che composta di bit.
15
Grammatica ad attributi (1)
Grammatica ad attributi (1)
1. num str
1
. str
2
f of str
1
:= 0
f of str
2
:= - l of str
2
v of num= v of str
1
+v of str
2
2. str
0
str
1
bit f of str
1
:= f of str
0
+1
f of bit := f of str
l of str
0
:= l of str
1
+ 1
v of str
0
:= v of str
1
+ v of bit
3. str bit f of bit:= f of str
l of str := 1
v of str := v of bit
4. bit 0 v of bit := 0
5. bit 1 v of bit := 2
f of bit
16
Grammatica ad attributi (2)
1. num str1 . str2
v of num= v of str1 +v of str2 * 2
-l of str2
2. str0 str1 bit
v of str0 := 2* v of str1 +v of bit
l of str0 := l of str1 + 1
3. str bit
v of str := v of bit
l of str := 1
4. bit 0 v of bit := 0
5. bit 1 v of bit := 1
Annotated Parse Tree
Albero sintattico annotato o Albero sintattico
decorato: albero sintattico contenente I valori
degli attributi.
Annotazione o decorazione dellalbero sintattico:
processo di calcolo degli attributi
17
Esempio
PRODUZIONE REGOLE SEMANTICHE
L E n print(E.val)
E E
1
+ T E.val := E
1
.val T.val
E T E.val := T.val
T T
1
* F T.val := T
1
.val F.val
T F T.val := F.val
F ( E ) F.val := E.val
F digit F.val := digit.lexval
Esempio: spiegazioni
La grammatica genera le espressioni aritmetiche tra
cifre seguite dal carattere n di newline
Ogni simbolo non terminale ha un attributo
sintetizzato val
Il simbolo terminale digit ha un attributo sintetizzato
il cui valore si assume essere fornito
dallanalizzatore lessicale
La regola associata al simbolo iniziale L una
procedura che stampa un valore intero (side-effect)
mentre tutte le altre regole servono per il calcolo
del valore degli attributi
18
Annotated Parse Tree -- Example
Input: 5+3*4
L
E.val=17 return
E.val=5 + T.val=12
T.val=5 T.val=3 * F.val=4
F.val=5 F.val=3 digit.lexval=4
digit.lexval=5 digit.lexval=3
Syntax-Directed Definition
Esempio2
Production Semantic Rules
E E
1
+ T E.loc=newtemp(),
E.code = E
1
.code || T.code || add E
1
.loc,T.loc,E.loc
E T E.loc = T.loc, E.code=T.code
T T
1
* F T.loc=newtemp(),
T.code = T
1
.code || F.code || mult T
1
.loc,F.loc,T.loc
T F T.loc = F.loc, T.code=F.code
F ( E ) F.loc = E.loc, F.code=E.code
F id F.loc = id.name, F.code=
I simboli E, T, e F sono associati con gli attibuti sintetizzati
loc e code.
Il token id ha un attributo sintetizzato name (si assume che
lanalizzatore lessicale si occupi di tale valore)
Si assume che || e loperatore di concatenazione di
stringhe.
19
Syntax-Directed Definition
Inherited Attributes
Production Semantic Rules
D T L L.in = T.type
T int T.type = integer
T real T.type = real
L L
1
id L
1
.in = L.in, addtype(id.entry,L.in)
L id addtype(id.entry,L.in)
Il simbolo T associato con un attributo sintetizzato type.
IL simbolo L associato con un attributo ereditato in.
Calcolo degli attributi
Lordine di calcolo degli attributi dipende dal grafo
delle dipendenze creato sulla base delle regole
semantiche
20
Dipendenze funzionali e circolarit
Lattributo definito da una regola dipende dagli argomenti
della funzione semantica, dando luogo ad una relazione di
dipendenza funzionale tra lattributo definito ed ognuno dei
suoi argomenti.
E la regola
Data la produzione
Si definisce dipendenza funzionale
Grafo delle dipendenze (Dependency
Graph)
Si definisce relazione di dipendenza funzionale della produzione p
lunione relazioni dip
p,o,k
per tutte le regole reg(p)
dip
p,
=
reg(p)
dip
p,o,k
una relazione binaria definita su un insieme pu essere visualizzata
come un grafo
i nodi sono gli elementi dellinsieme
un arco n1 n2 indica la relazione tra n1 ed n2.
Grafo dip
p
delle dipendenze funzionali della produzione p e il
grafo che ha come nodi gli attributi attr(p) e presenta larco | of
Dj o of D
k
se o of D
j
argomento di una funzione semantica
associata a p che calcola | of D
k
.
21
Grafo delle dipendenze (Dependency
Graph)
E' un grafo orientato aciclico che illustra le interdipendenze tra gli
attributi dei nodi del parse-tree
Per costruire il grafo delle dipendenze per un parse- tree occorre
prima mettere tutte le regole semantiche nella forma
b := f( c
1
,c
2
,... c
k
)
anche quelle che consistono di una chiamata di procedura
(introducendo un attributo fittizio)
Il grafo ha un nodo per ogni attributo.
Se l'attributo b dipende dall'attributo c b = f ( c .........) ci sar un
arco da c a b b c
Se un attributo b in un nodo dipende da un attributo c allora la regola
semantica per b deve essere valutata dopo la regola semantica che
definisce c
Esempio Grammatica 1
22
Circolarit delle definizioni semantiche
Una frase di un linguaggio deve avere un ben preciso
significato, quindi essenziale che la grammatica
determini, per ogni albero, una e una sola soluzione
per gli attributi, una volta fissati i valori iniziali degli
attributi lessicali.
Il grafo delle dipendenze funzionali dip
p
di una
produzione aciclico se non contiene alcun circuito
(orientato).
lalbero semantico t aciclico se il grafo delle
dipendenze funzionali dip(t) privo di circuiti.
Una grammatica ad attributi aciclica se per ogni
albero sintattico il corrispondente albero semantico
aciclico.
Verifica di aciclicita
Il grafo di una produzione contiene un numero
ridotto di nodi e di archi, semplice controllare ad
occhio che sia aciclico.
Se in qualcuno dei grafi dipp delle produzioni vi
fosse una circolarit certamente esisterebbe in T(G)
un albero t il cui grafo dip(t) presenterebbe la
stessa circolarit.
Non vero il viceversa
23
Propriet 1
Se per un albero t il grafo delle dipendenze
funzionali dip(t) aciclico, il sistema delle equazioni
semantiche dellalbero ammette una e una sola
soluzione.
Propriet 1: Dimostrazione.
Le incognite sono gli attributi dei nodi di t. Per ogni incognita
esiste una e una sola equazione che le assegna un valore. Se
dip(t) non ha cicli i nodi del grafo, ossia le incognite, possono
essere ordinati topologicamente ottenendo un ordinamento
totale:
a1 := f1
a2 := f2
.......
am := fm
dove fj la regola che assegna il valore allattributo aj . La
sequenza di istruzioni tale che tutti gli argomenti di una
regola sono definiti da regole precedenti, quindi sono di
valore noto.
Poich il programma non contiene istruzioni di salto, ogni riga
viene eseguita una sola volta, quindi ogni incognita riceve un
solo valore.
24
Algoritmo
1. Ordina topologicamente gli attributi di t
rispetto al grafo dip(t) e scrivi nellordine
le regole che li calcolano.
2. Esegui nellordine le regole semantiche.
Algoritmo
Inconventi dellalgoritmo sono
la necessit di calcolare lordinamento topologico di t,
operazione che richiede una complessit di calcolo O(m)
dove m il numero dei nodi di dip(t),
Ogni nodo sintattico dellalbero viene attraversato tante
volte quanti sono i suoi attributi, e in generale tali
attraversamenti non sono contigui nellordinamento
topologico, con un conseguente lavoro di spostamento
sullalbero.
Come miglioramento si introdurranno pi avanti certe
sottoclassi delle grammatiche in cui le dipendenze funzionali
consentono la valutazione degli attributi con un numero pi
ridotto di attraversamenti dei nodi sintattici.
25
Equivalenza forte e debole
Due grammatiche ad attributi H e H aventi la stessa sintassi G
sono equivalenti in senso forte se esse definiscono la stessa
traduzione, ossia Tf (H) = Tf(H')
Due grammatiche ad attributi H e H' aventi sintassi G e G' sono
equivalenti in senso debole seesse definiscono la stessa
traduzione, ossia Td(H) = Td(H')
Due classi di grammatiche hanno lo stesso potere espressivo (in
senso forte o debole) se per ogni grammatica di una classe
esiste nellaltra classe una grammatica equivalente (in senso
forte o debole).
Propriet
Propriet 2
La classe delle grammatiche elementari ha lo stesso
potere espressivo della classe delle grammatiche con
attributi ereditati e sintetizzati.
26
Metodi di valutazione degli
attributi semantici
Il problema della valutazione semantica consiste nel calcolare i
valori degli attributi in tutti i nodi di un albero sintattico dato.
Tali valori sono la soluzione del sistema delle equazioni determinate
dalle regole semantiche, riportate su ogni nodo dellalbero,
soluzione che esiste ed unica se la grammatica aciclica.
Caratteristiche del metodo di calcolo:
generalit del metodo: la capacit di trattare grammatiche ad attributi di
tipo pi generale;
efficienza di calcolo del valutatore: tempo di calcolo (o memoria);
possibilit di accorpare lanalisi sintattica e valutazione degli attributi;
incrementalit nel calcolo degli attributi di fronte a modifiche della frase (o
dellalbero) da analizzare: una modifica non richiede di rifare da zero la
valutazione;
complessit della costruzione del valutatore.
Ordine di valutazione
I numeri dellesempio sulle dichiarazioni sono un ordinamento
topologico
Se scriviamo in ordine le regole semantiche otteniamo il
seguente programma:
a4 := real;
a5:= a4;
addtype(id
3
.entry, a5);
a7:= a5;
addtype(id
2
.entry, a7);
a9:= a7;
addtype(id
1
.entry, a9);
La valutazione degli attributi
sintetizzati dei simboli terminali
non viene considerata
Infatti questi valori sono gi
disponibili dallanalisi lessicale
27
Ordinamento topologico
Si ordinano topologicamente (rispetto alla
relazione di dipendenza funzionale) le
comparse degli attributi nell' albero
Si applicano in tale ordine le funzioni
semantiche, si cos sicuri di rispettare la
condizione fondamentale che il calcolo di un
attributo sia preceduto dalla valutazione di
tutti i suoi argomenti.
Tra i tanti ordinamenti topologici possibili, sono
da preferire quelli che meglio rispondono alle
esigenze applicative
Schedulazione
La schedulazione e pu avvenire in diversi momenti:
Statica: al momento della costruzione del valutatore. e dipende
da H ma non da t, in quanto la scelta del prossimo attributo da
calcolare codificata nel programma del valutatore. Un caso
particolarmente semplice quello in cui lordine lo stesso per
ogni produzione della sintassi (schedulazione fissa).
Dinamica: lordinamento topologico viene calcolato di volta in
volta per lalbero t.
esempio utilizzando un algoritmo parallelo seguente che associa
un processo ad ogni comparsa di un attributo
28
Definizione degli attributi
Syntax-directed definitions sono utilizzate per specificare
traduzioni syntax-directed.
La creazione di un traduttore per un definizione syntax-directed
pu essere difficile.
Per valutare le regole semantiche durante il parsing (compilatori a
singolo passo) si possono utilizzare due sottoclassi di syntax-
directed definitions:
S-Attributed Definitions: solo attributi sintetizzati
L-Attributed Definitions: attributi ereditati e attributi
sintetizzti dipendenti dalla parte sinistra.
L-Attributed Definitions
Una definzione syntax-directed di tipo L (L-
attributed) se ogni attributo di X
j
, con 1sjsn, nella
RHS di
A X
1
X
2
...X
n
dipende solo da:
1. Gli attributi dei simboli X
1
,...,X
j-1
della parte sinistra di
X
j
nella produzione e
2. Gli attributi ereditati di A
Una grammatica del tipo L risulta necessariamente
aciclica. Infatti immediato vedere che il grafo delle
dipendenze di ogni produzione aciclico.
29
Analizzatori a singolo passo
Nelle traduzioni pi semplici si riesce a calcolare il significato di una frase
con un solo attraversamento dellalbero, ottenendo cos la massima
efficienza possibile. Si presentano qui le condizioni che assicurano la
calcolabilit degli attributi mediante una passata discendente da sinistra a
destra o destrorsa (ordine anche detto anticipato o preordine).
Il metodo qui esposto rientra come caso particolare in quelli ad una
scansione (one-sweep) pi avanti descritti, che permettono ordini di visita
anche non rivolti da sinistra a destra.
Le grammatiche che permettono la valutazione con una visita destrorsa in
profondit sono ora caratterizzate mediante una condizione nota come L
(che sta per "left to right").
Una definizione che non di tipo L
produzioni regole semantiche
A L M L.in=l(A.i), M.in=m(L.s), A.s=f(M.s)
A Q R R.in=r(A.in), Q.in=q(R.s), A.s=f(Q.s)
La grammatica non di tipo L perch la regola Q.in=q(R.s) viola
le restrizioni di tipo L
Q.in deve essere valutato prima che noi entriamo in Q poich esso
un attributo ereditato
Ma il valore di Q.in dipende da R.s che sar disponibile alla fine
di R. Cosi, non sar possibile valutare Q.in prima di entrare in Q.
30
Grammatiche di tipo L
Data una grammatica della classe L facile
esprimere lalgoritmo di calcolo sotto forma di
procedure a discesa ricorsiva.
Sia p: D
0
D
1
D
2
... D
r
la produzione nel nodo n
0.
Si definisce per ogni produzione p, una procedura
Discendente_p con il compito di calcolare gli attributi
sint(n
0
);
essa ha come parametri dingresso il sottoalbero
radicato in n
0
e gli attributi ered(n
0
).
Grammatiche di tipo L
void Discendente_p (in n
0
: nodo, ered(n
0
) : out sint(n
0
) ) {
for k:=1 to r {
if (Dk nonterminale) {
<calcola ered(nk) eseguendo le funzioni semantiche
corrispondenti>
-- sia qk la produzione del nodo nk ;
Discendente_ qk (nk, ered(nk); sint(nk)) -- chiamata che
ricorsivamente calcola sint(nk)
} }
calcola sint(n0) eseguendo le funzioni semantiche corrispondenti>
}
31
Top-Down Evaluation (of S-Attributed Definitions)
Productions Semantic Rules
A B print(B.n0), print(B.n1)
B 0 B
1
B.n0=B
1
.n0+1, B.n1=B
1
.n1
B 1 B
1
B.n0=B
1
.n0, B.n1=B
1
.n1+1
B c B.n0=0, B.n1=0
Dove B ha due attributi sintetizzati (n0 e n1).
Valutazione Top-Down (di attributi S)
In un parser ricorsivo discendente ogni non terminale
corrisponde ad una.
void A() { B();} A B
void B() {
if (currtoken=0) { nexttoken(); B(); } B 0 B
else if (currtoken=1) { nexttoken; B(); } B 1 B
else if (currtoken=$) {} // $ fine stringa B c
else error(unexpected token);
}
32
Valutazione Top-Down (di attributi
S)
void A() {
int n0,n1;
B(out n0,out n1);
print(n0); print(n1);
}
void B(out int n0, out int n1) {
if (currtoken=0)
{int a,b; nexttoken(); B(out a, out b); n0=a+1; n1=b;}
else if (currtoken=1)
{ int a,b; nexttoken(); B(out a, ref b); n0=a; n1=b+1; }
else if (currtoken=$) {n0=0; n1=0; } // $ fine stringa
else error(unexpected token);
}
Analizzatori a singolo passo Bottom-
Up Uso delle grammatiche S
Mettere il valore dellattributo sintetizzato del simbolo della grammtica in una
pila in parallelo.
Quando un entry della pila del parser un simbolo X (terminale o
non-terminale), il correspondente entry dello stack parallelo conterra
lattribuyo sintetizzato del simbolo X.
Il valore dellattributo viene valutato durante la riduzione.
A XYZ A.a=f(X.x,Y.y,Z.z) dove tutti gli attributi sono sintetizzati.
stack parallel-stack
top
top
Z
Y
X
.
Z.z
Y.y
X.x
.
A
.
A.a
.
33
Bottom-Up Eval. of S-Attributed Definitions
Production Semantic Rules
L E return print(val[top-1])
E E
1
+ T val[ntop] = val[top-2] + val[top]
E T
T T
1
* F val[ntop] = val[top-2] * val[top]
T F
F ( E ) val[ntop] = val[top-1]
F digit
Ad ogni spostamento di digit, il valore digit.lexval sar inserito in val-stack
(stack parallelo).
Per gli altri spostamenti, inserire un simbolo qualsiasi in val-stack poich tutti
gli altri terminali non hanno attributi (lo stack pointer di val-stack deve essere
incrementato).
Canonical LR(0) Collection for The Grammar
L.L
L .Er
E .E+T
E .T
T .T*F
T .F
F .(E)
F .d
LL.
L E.r
E E.+T
E T.
T T.*F
T F.
F (.E)
E .E+T
E .T
T .T*F
T .F
F .(E)
F .d
F d.
L Er.
E E+.T
T .T*F
T .F
F .(E)
F .d
T T*.F
F .(E)
F .d
F (E.)
E E.+T
E E+T.
T T.*F
T T*F.
F (E).
I
0
:
I
1
:
I
2
:
I
4
:
I
3
:
I
5
:
I
6
:
I
7
:
I
12
:
I
11
:
I
10
:
I
9
:
I
13
:
I
8
:
r
L
E
E
T
T
T
F
F
F
F
(
(
(
(
d
d
d
d
)
*
+
+
*
6
3
5
4
6
6
5
5
8
9
4
34
Bottom-Up Evaluation -- Esempio
stack val-stack input action semantic rule
0 5+3*4r s6 d.lexval(5) into val-stack
0d6 5 +3*4r Fd F.val=d.lexval do nothing
0F4 5 +3*4r TF T.val=F.val do nothing
0T3 5 +3*4r ET E.val=T.val do nothing
0E2 5 +3*4r s8 push empty slot into val-stack
0E2+8 5- 3*4r s6 d.lexval(3) into val-stack
0E2+8d6 5-3 *4r Fd F.val=d.lexval do nothing
0E2+8F4 5-3 *4r TF T.val=F.val do nothing
0E2+8T11 5-3 *4r s9 push empty slot into val-stack
0E2+8T11*9 5-3- 4r s6 d.lexval(4) into val-stack
0E2+8T11*9d6 5-3-4 r Fd F.val=d.lexval do nothing
0E2+8T11*9F12 5-3-4 r TT*F T.val=T
1
.val*F.val
0E2+8T11 5-12 r EE+T E.val=E
1
.val*T.val
0E2 17 r s7 push empty slot into val-stack
0E2r7 17- $ LEr print(17), pop empty slot from val-stack
0L1 17 $ acc
5+3*4r
Schema di traduzione
In una syntax-directed definition, noi non diciamo niente circa la lordine di
valutazione delle regole semantiche
Un translation scheme una grammatica di tipo 2 nella quale:
Gli attributi sono associati con i simboli della grammartica
e
Le azioni semantiche sono incluse fra parentesi {} e insirite
nella parte destra delle produzioni.
Ex: A { ... } X { ... } Y { ... }
Semantic Actions
35
Schema di traduzione
Quando si progetta uno schema di traduzione, alcune
restrizioni dovrebbero essere osservate per assicurare che il
valore si un attributo sia disponibile quando una azione
samantica si riferisce a tale attributo
Queste restrizioni (grammatiche L) assicurano che una azione
semantica non si riferisca ad un attributo non ancora
computato.
In uno schema di traduzione useremo il termine semantic action
piuttosto che semantic rule utilizzato nella syntax-directed
definitions.
Schema di traduzione per attributi S
Se la syntax-directed definition di tipo S il corrispondente schema di traduzione
si ricava semplicemente.
Ogni regola semantica associata ad una syntax-directed definition con attributi S
sara inserita come azione semantica alla fine della parte destra della prodeuzione
associata
Production Semantic Rule
E E
1
+ T E.val = E
1
.val + T.val syntax directed definition

E E
1
+ T { E.val = E
1
.val + T.val } corresponding translation scheme
36
Esempio di schema di traduzione
Un semplice schema di traduzione che converte espressioni infisse nella
corrispondente espressione postfissa
E T R
R + T { print(+) } R
1
R c
T id { print(id.name) }
a+b+c ab+c+
Espressione infissa Espressione postfissa
Schema di traduzione
Lattraversamento depth first dellalbero sintattico (eseguendo le azioni
semantiche in ordine) produrra la rappresentazione postfissa della espressione
infissa
E
T
R
R
R
T
T
+ id
id
id
c
+
{print(a)
}
{print(+)}
{print(b)}
{print(+)}
{print(c)}
37
Attributi ereditati in uno schema di traduzione
Se in uno schema di traduzione sono presenti sia attributi ereditati che sintetizzati si
devono seguire le seguenti regolo::
1. Un attributo ereditato di un simbolo nel RHs di una produzione deve
essere computato in una azione semantica prima del simbolo.
2. Una azione semantica non si deve riferire ad un attributo
sintetizzato di un simbolo della RHS di tale azione semantica
3. Un attributo sintetizzato per un non terminale nella LHS pu solo
essere computato dopo che tutti gli attributi a cui si riferisce sono
stati computati (noi normalmente porremo tale azione semantica
alla fine della produzione)
Con una grammatica L (L-attributed syntax-directed definition) posssible sempre
construire il corrispondente schema di traduzione che soddisfa queste tre regole.
Un schema di traduzione con
attributi ereditati
D T id { addtype(id.entry,T.type), L.in = T.type } L
T int { T.type = integer }
T real { T.type = real }
L id { addtype(id.entry,L.in), L
1
.in = L.in } L
1
L c
Questo e il translation scheme per una L-attributed definitions.
38
Predictive Parsing (di attributi ereditati)
void D() {
int Ttype,Lin,identry;
T(&Ttype); nextoken(id,&identry);
addtype(identry,Ttype); Lin=Ttype;
call L(Lin); a synthesized attribute (an output parameter)
}
Void T(int *Ttype) {
if (currtoken is int) {nextoken(int); *Ttype=TYPEINT; }
else if (currtoken is real) { consume(real); *Ttype=TYPEREAL; }
else { error(unexpected type); }
}
an inherited attribute (an input parameter)
Void L(int Lin) {
if (currtoken is id) { int L1in,identry; nextoken(id,&identry);
addtype(identry,Lin); L1in=Lin; call L(L1in); }
else if (currtoken is endmarker) { }
else { error(unexpected token); }
Eliminazione delle ricorsioni sinistre dallo
schema di traduzione
Schema di traduzione con una grammatica left.
E E
1
+ T { val of E = E
1
.val + T .val }
E E
1
- T { E.val = E
1
.val T .val }
E T { E.val = T.val }
T T
1
* F { T.val = T
1
.val* F.val }
T F { T.val = F.val }
F ( E ) { F.val = E.val }
F digit { F.val = digit.lexval }
Quando eliminiamo la ricorsione sinistra dalla grammatica
dobbiamo eseguire delle modifiche nelle regole semantiche
39
Eliminazione ricorsione sinistra
E T { A.in=T.val } A { E.val=A.syn }
A + T { A
1
.in=A.in+T.val } A
1
{ A.syn = A
1
.syn}
A - T { A
1
.in=A.in-T.val } A
1
{ A.syn = A
1
.syn}
A c { A.syn = A.in }
T F { B.in=F.val } B { T.val=B.syn }
B * F { B
1
.in=B.in*F.val } B
1
{ B.syn = B
1
.syn}
B c { B.syn = B.in }
F ( E ) { F.val = E.val }
F digit { F.val = digit.lexval }
Eliminazione ricorsione sinistra
A A
1
Y { A.a = g(A
1
.a,Y.y) } grammatica ricorsiva sinistra
A X { A.a=f(X.x) } con attributi sintetizzati (a,y,x).
eliminazione ricorsione sinistra
attributo ereditato del nuovo non terminale
attributo sintetizzato del nuovo non terminale
A X { R.in=f(X.x) } R { A.a=R.syn }
R Y { R
1
.in=g(R.in,Y.y) } R
1
{ R.syn = R
1
.syn}
R c { R.syn = R.in }
40
Valutazione degli attributi
A
Y
A
A.a=g(f(X.x),Y.y)
X
X.x=f(X.x)
A
R
X
Y
R.in=f(X.
x)
R.syn=g(f(X.x),Y.y)
R.syn=g(f(X.x),Y.y)
R
1
R1.in=g(f(X.x),Y.y)
c
R1.syn=g(f(X.x),Y.
y)
Schema di traduzione
Generazione di codice intermedio
E T { A.in=T.loc } A { E.loc=A.loc }
A + T { A
1
.in=newtemp(); emit(add,A.in,T.loc,A
1
.in) }
A
1
{ A.loc = A
1
.loc}
A c { A.loc = A.in }
T F { B.in=F.loc } B { T.loc=B.loc }
B * F { B
1
.in=newtemp(); emit(mult,B.in,F.loc,B
1
.in) }
B
1
{ B.loc = B
1
.loc}
B c { B.loc = B.in }
F ( E ) { F.loc = E.loc }
F id { F.loc = id.name }
41
Predictive Parsing Intermediate
Code Generation
void E(char **Eloc) {
char *Ain, *Tloc, *Aloc;
T(&Tloc); Ain=Tloc;
A(Ain,&Aloc); *Eloc=Aloc;
}
Void A(char *Ain, char **Aloc) {
if (currtok is +) {
char *A1in, *Tloc, *A1loc;
nexttoken(+);
T(&Tloc); A1in=newtemp(); emit(add,Ain,Tloc,A1in);
A(A1in,&A1loc); *Aloc=A1loc;
}
else { *Aloc = Ain }
}
Predictive Parsing (cont.)
T(char **Tloc) {
char *Bin, *Floc, *Bloc;
F(&Floc); Bin=Floc;
B(Bin,&Bloc); *Tloc=Bloc;}
B(char *Bin, char **Bloc) {
if (currtok is *) {
char *B1in, *Floc, *B1loc;
nextoken(+); call F(&Floc); B1in=newtemp(); emit(mult,Bin,Floc,B1in);
B(B1in,&B1loc); Bloc=B1loc;}
else { *Bloc = Bin }}
F(char **Floc) {
if (currtok is () { char *Eloc; nexttolken((); call E(&Eloc); consume()); *Floc=Eloc
}
else { char *idname; nexttoken(id,&idname); *Floc=idname }
}
42
Valutazione Bottom-Up di attributi
ereditati
Utilizzando uno schema di traduzione top-down si pu
implementare qualsiasi L-attributed definition basata su
grammatiche LL(1).
Utilizzando uno schema di traduzione bottom-up translation scheme,
si pu anche implementare qualsiasi L-attributed definition basata
su grammatiche LL(1) (qualsiasi grammatica LL(1) anche LR(1)).
Oltre alle L-attributed definitions basate su grammatiche LL(1),
noi possiamo impe,emtare alcune L-attributed definitions basate su
grammatiche LR(1) (non tutte) utilzzando uno schema di traduzione
bottom-up.
Removing Embedding Semantic Actions
Nello schema di valutazione bottom-up, le azioni semantiche sono valutate
durante la riduzione.
Durinte la valutazione bottom-up degli attributi S noi abbiamo uno stack
parallelo che contiene gli attributi sintetizzati.
Problema: dove memorizzare gli attributi ereditati?
Soluzione:
Convertie la nostra grammatica in una equivalente che garantisca:
Tutte le azioni semantiche embedded sono rimosse
Tutti gli attributi ereditati sono copiati negli attributi sintetizzati.
Quindi valujtare tutte le azioni semantiche durante le riduzioni e
troveremo un posto per gli attributi ereditati
43
Rimozione di Azione Semantiche
Embedded
Per trasformare uno schema di traduzione in uno equivalente
1. Rimuovere un azione semantica embedded S
i
, ponendo un
nuovo non terminale M
i
al posto dellazione semantica.
2. Porre lazione semantica S
i
alla fine della nuova produzione
M
i
c per il non terminaleM
i
.
3. Questa azione semantica S
i
sara valutata quando la nuova
produzione sar ridotta.
4. Lordine di valutazione delle regole semantiche rimane
invariato da questa trasformazione
Esempio di rimozione delle azioni
semantiche embedded
A{S
1
} X
1
{S
2
} X
2
... {S
n
} X
n

AM
1
X
1
M
2
X
2
... M
n
X
n
M
1
c {S
1
}
M
2
c {S
2
}
.
.
M
n
c {S
n
}
44
Rimozione azioni semantiche embedded
E T R
R + T { print(+) } R
1
R c
T id { print(id.name) }

E T R
R + T M R
1
R c
T id { print(id.name) }
M c { print(+) }
Traduzione con attributi ereditati
Supponiamo che ogni non-terminale A abbia un attributo ereditato A.i
e ogni simbolo C abbia un attributo sintetizzato nella nostra
grammatica
Per ogni produzione AX
1
X
2
... X
n
, (1)
Introdurre dei nuovi non terminali M
1
,M
2
,...,M
n
e
Sostituire (1) con AM
1
X
1
M
2
X
2
... M
n
X
n
Gli attributi sintetizzati di X
i
non verranno modificati
Gli attributi ereditati di X
i
saranno copiati in un attributo sintetizzato di M
i
nella nuova regola semantica aggiunta alla fine della produzioneM
i
c.
Ora, glia attributi ereditati di X
i
possono essere trovati in un attributo
sintetizzato di M
i
(che disponibile nello stack).
A {B.i=f1(...)} B {C.i=f2(...)} C {A.s= f3(...)}

A {M1.i=f1(...)} M1 {B.i=M1.s} B {M2.i=f2(...)} M2 {C.i=M2.s} C {A.s=


f3(...)}
M1c {M1.s=M1.i}
M2c {M2.s=M2.i}
45
Traduzione con attributi ereditati
S {A.i=1} A {S.s=k(A.i,A.s)}
A {B.i=f(A.i)} B {C.i=g(A.i,B.i,B.s)} C {A.s= h(A.i,B.i,B.s,C.i,C.s)}
B b {B.s=m(B.i,b.s)}
C c {C.s=n(C.i,c.s)}
S {M
1
.i=1} M
1
{A.i=M
1
.s} A {S.s=k(M
1
.s,A.s)}
A {M
2
.i=f(A.i)} M
2
{B.i=M
2
.s} B
{M
3
.i=g(A.i,M
2
.s,B.s)} M
3
{C.i=M
3
.s} C {A.s= h(A.i, M
2
.s,B.s, M
3
.s,C.s)}
B b {B.s=m(B.i,b.s)}
C c {C.s=n(C.i,c.s)}
M
1
c {M
1
.s=M
1
.i}
M
2
c {M
2
.s=M
2
.i}
M
3
c {M
3
.s=M
3
.i}
Schema di traduzione reale
S {M
1
.i=1} M
1
{A.i=M
1
.s} A {S.s=k(M
1
.s,A.s)}
A {M
2
.i=f(A.i)} M
2
{B.i=M
2
.s} B {M
3
.i=g(A.i,M
2
.s,B.s)} M
3
{C.i=M
3
.s} C {A.s= h(A.i, M
2
.s,B.s, M
3
.s,C.s)}
B b {B.s=m(B.i,b.s)}
C c {C.s=n(C.i,c.s)}
M
1
c {M
1
.s= M
1
.i}
M
2
c {M
2
.s=M
2
.i}
M
3
c {M
3
.s=M
3
.i}
46
Schema di traduzione reale
S M
1
A { s[ntop]=k(s[top-1],s[top]) }
M
1
c { s[ntop]=1 }
A M
2
B M
3
C { s[ntop]=h(s[top-4],s[top-3],s[top-2],s[top-1],s[top]) }
M
2
c { s[ntop]=f(s[top]) }
M
3
c { s[ntop]=g(s[top-2],s[top-1],s[top])}
B b { s[ntop]=m(s[top-1],s[top]) }
C c { s[ntop]=n(s[top-1],s[top]) }
Valutazione degli attributi
S
S.s=k(1,h(..))
A.i=1
A
A.s=h(1,f(1),m(..),g(..),n(..))
B.i=f(1) C.i=g(1,f(1),m(..))
B C
B.s=m(f(1),b.s) C.s=n(g(..),c.s)
b c
47
Evaluation of Attributes
stack input s-attribute stack
bc$
M
1
bc$ 1
M
1
M
2
bc$ 1 f(1)
M
1
M
2
b c$ 1 f(1) b.s
M
1
M
2
B c$ 1 f(1) m(f(1),b.s)
M
1
M
2
B M
3
c$ 1 f(1) m(f(1),b.s) g(1,f(1),m(f(1),b.s))
M
1
M
2
B M
3
c $ 1 f(1) m(f(1),b.s) g(1,f(1),m(f(1),b.s)) c.s
M
1
M
2
B M
3
C $ 1 f(1) m(f(1),b.s) g(1,f(1),m(f(1),b.s)) n(g(..),c.s)
M
1
A $ 1 h(f(1),m(..),g(..),n(..))
S $ k(1,h(..))
Problemi
Tutti gli L-attributed definitions basati su grammatiche LR non possono
essere valutati durante il parsing bottom-up.
S { L.i=0 } L questo schema di traduzione non pu essere
L { L
1
.i=L.i+1 } L
1
1 implementato durante il parsing the bottom-up
L c { print(L.i) }
S M
1
L
L M
2
L
1
1 ma dato che L c sara ridotto prima
dalanalizzatore
L c { print(s[top]) } botton-up il traduttore non puo conoschere il numero
si.
M
1
c { s[ntop]=0 } 1
M
2
c { s[ntop]=s[top]+1 }
48
Problemi
La grammatica modificata non pu essere LR.
L L b L M L b
L a L a NOT LR-grammar
M c
S .L, $
L . M L b, $
L . a, $
M .,a shift/reduce conflict

Potrebbero piacerti anche