meccanismo per verificare stringhe
nascono per descrivere in modo formale la lingua
es: frase = soggetto + verbo + complemento-oggetto
poi soggetto = nome oppure articolo + sostantivo oppure …
frase = soggetto verbo complemento-oggetto soggetto = nome O articolo sostantivo O articolo sostantivo aggettivo verbo = ausiliario verbo-semplice O verbo-semplice ecc.
frase completa: richiede più regole
esempio:
no
es: il soggetto si può o meno omettere a seconda dei casi
il soggetto può stare alla fine della frase
ecc.
intenzione = usarle per i linguaggi naturali
uso attuale = linguaggi informatici
si usa → invece di =
una regola per ogni caso
non basta scrivere "articolo"
bisogna arrivare ai caratteri
frase → soggetto verbo complemento-oggetto soggetto → nome soggetto → articolo sostantivo soggetto → articolo sostantivo aggettivo verbo → ausiliario verbo-semplice complemento oggetto → nome complemento oggetto → articolo sostantivo complemento oggetto → articolo sostantivo aggettivo articolo → il sostantivo → cane sostantivo → gatto aggettivo → bianco ausiliario → ha verbo-semplice → morso
due sostantivi, un aggettivo, un verbo, un articolo
frase ⇒ soggetto verbo complemento-oggetto ⇒ articolo sostantivo aggettivo verbo complemento-oggetto ⇒ il sostantivo aggettivo verbo complemento-oggetto ⇒ il sostantivo aggettivo verbo articolo sostantivo ⇒ il sostantivo aggettivo verbo articolo gatto ⇒ il cane aggettivo verbo articolo gatto ⇒ il cane aggettivo ausiliario verbo-semplice articolo gatto ⇒ il cane aggettivo ausiliario morso articolo gatto ⇒ il cane aggettivo ha morso articolo gatto ⇒ il cane bianco ha morso articolo gatto ⇒ il cane bianco ha morso il gatto
in generale?
si parte dal primo simbolo
si rimpiazzano simboli con altri
seguendo le regole
si generano stringhe
si parte dal simbolo frase
si applica una regola
in questo caso frase → soggetto verbo complemento-oggetto
si ottiene soggetto verbo complemento-oggetto
si applica un'altra regola
in questo caso soggetto → articolo sostantivo
si ottiene articolo sostantivo aggettivo verbo complemento-oggetto
a ogni passo abbiamo una sequenza di simboli
esempio: articolo sostantivo aggettivo verbo complemento-oggetto
se esiste una regola articolo → il
si può rimpiazzare un simbolo articolo con il
esempio di stringa ottenuta così:
il cane bianco ha morso il gatto
stringa generata dalla gramamtica
generata: il cane bianco ha morso il gatto
non generata: ha cane gatto il
una data stringa può venire generata o no dalla grammatica
sono tre modi per decidere se una stringa soddisfa una certa forma oppure no
successione di regole: specifica la struttura della stringa
nell'esempio: il cane bianco viene da soggetto
dice che questo è il soggetto della frase
in generale: identifica le parti della stringa
molto complesso
ammette variazioni difficili da codificare con regole
esempi di frasi valide:
grammatiche: comode per i linguaggi artificiali
linguaggi artificiali
esempi:
nell'esempio:
due tipi di simboli
simbolo iniziale: un non terminale
codice → nome cognome nascita comune lettera nome → trelettere cognome → trelettere nascita → duecifre lettera duecifre comune → lettera trecifre trelettere → lettera lettera lettera trecifre → cifra cifra cifra duecifre → cifra cifra lettera → A lettera → B lettera → C lettera → D lettera → E lettera → F lettera → G lettera → H lettera → I lettera → J lettera → K lettera → L lettera → M lettera → N lettera → O lettera → P lettera → Q lettera → R lettera → S lettera → T lettera → U lettera → V lettera → W lettera → X lettera → Y lettera → Z cifra → 0 cifra → 1 cifra → 2 cifra → 3 cifra → 4 cifra → 5 cifra → 6 cifra → 7 cifra → 8 cifra → 9
iniziale: codice
terminali: quelli che appaiono nei codici fiscali
= lettere maisucole e cifre
non terminali: gli altri
rappresentano parti di codici fiscali
codice ⇒ nome cognome nascita comune lettera ⇒ trelettere cognome nascita comune lettera ⇒ trelettere trelettere nascita comune lettera ⇒ trelettere trelettere duecifre lettera duecifre comune lettera ⇒ trelettere trelettere duecifre lettera duecifre lettera trecifre lettera ⇒ lettera lettera lettera trelettere duecifre lettera duecifre lettera trecifre lettera ⇒ lettera lettera lettera trelettere cifra cifra lettera duecifre lettera trecifre lettera ⇒ lettera lettera lettera trelettere cifra cifra Z duecifre lettera trecifre lettera
ancora simboli non terminali
= derivazione incompleta
si può andare avanti:
R lettera lettera trelettere cifra cifra Z duecifre lettera trecifre lettera ⇒ R lettera lettera lettera lettera lettera cifra cifra Z duecifre lettera trecifre lettera ⇒ R lettera lettera lettera lettera lettera cifra cifra Z cifra cifra lettera trecifre lettera ⇒ R lettera lettera R lettera lettera cifra cifra Z cifra cifra lettera trecifre lettera ⇒ R lettera S R lettera lettera cifra cifra Z cifra cifra lettera trecifre lettera ⇒ R lettera S R lettera lettera 9 cifra Z cifra cifra lettera trecifre lettera ⇒ R lettera S R lettera lettera 9 2 Z cifra cifra lettera trecifre lettera ⇒ R Q S R lettera lettera 9 2 Z cifra cifra lettera trecifre lettera ⇒ R Q S R lettera T 9 2 Z cifra cifra lettera trecifre lettera ⇒ R Q S R lettera T 9 2 Z cifra 4 lettera trecifre lettera ⇒ R Q S R lettera T 9 2 Z cifra 4 lettera trecifre R ⇒ R Q S R lettera T 9 2 Z cifra 4 lettera cifra cifra cifra R ⇒ R Q S R N T 9 2 Z cifra 4 lettera cifra cifra cifra R ⇒ R Q S R N T 9 2 Z cifra 4 lettera 2 cifra cifra R ⇒ R Q S R N T 9 2 Z cifra 4 lettera 2 9 cifra R ⇒ R Q S R N T 9 2 Z 2 4 lettera 2 9 cifra R ⇒ R Q S R N T 9 2 Z 2 4 lettera 2 9 9 R ⇒ R Q S R N T 9 2 Z 2 4 H 2 9 9 R
solo terminali
= derivazione completa
da codice
con una serie di passaggi
si ottiene RQSRNT92Z24H299R
è una stringa generata dalla grammatica
esempio: ultima regola applicata lettera→H
si rimpiazza il simbolo terminale non (lettera)
con quello che c'è dopo la freccia (H)
in generale: non_terminale→simboli
ora: generazione
per la generazione usiamo ⇒, la freccia doppia
quella singola → indica una regola
una grammatica è: 〈N, T, R, I〉
〈N, T, R, I〉 genera:
definizione ricorsiva
(prossimo lucido)
stringhe generate: sequenze generate fatte solo di elementi di T
sono quelle viste finora
regole simbolo non terminale → sequenza simboli
ne esistono forme più generali e più restrittive
espressioni con numeri, +, -, *, / e parentesi
espressione → espressione + espressione espressione → espressione - espressione espressione → espressione * espressione espressione → espressione / espressione espressione → (espressione) espressione → numero numero → cifra numero → cifra numero cifra → 0 cifra → 1 cifra → 2 cifra → 3 cifra → 4 cifra → 5 cifra → 6 cifra → 7 cifra → 8 cifra → 9
espressione ⇒ espressione * espressione ⇒ espressione * (espressione) ⇒ espressione * (espressione+espressione) ⇒ numero * (espressione+espressione) ⇒ numero * (numero + espressione) ⇒ numero * (numero + numero) ⇒ cifra * (numero + numero) ⇒ 2 * (numero + numero) ⇒ 2 * (numero + cifra numero) ⇒ 2 * (numero + cifra cifra numero) ⇒ 2 * (numero + cifra cifra cifra) ⇒ 2 * (cifra + cifra cifra cifra) ⇒ 2 * (4 + cifra cifra cifra) ⇒ 2 * (4 + 2 cifra cifra) ⇒ 2 * (4 + 2 1 cifra) ⇒ 2 * (4 + 2 1 0)
2*(4+210): solo simboli terminali
stringa generata dalla grammatica
in effetti, è una espressione valida
non lo è per esempio 2)34-()+*
da numero si ottiene 210 così
numero ⇒ cifra numero
⇒ cifra cifra numero
⇒ cifra cifra cifra
anche sequenze più lunghe
numero → cifra numero → cifra numero
come dire: un numero è una cifra seguita da un numero
esempio: numero 4923:
4 seguito dal numero 923
a sua volta: 923 è 9 seguito da…
no!
numero definito in termini di un altro numero
es: numero 4923 definito in termini del numero 923
923 definito da 23, ecc.
numero ⇒ cifra numero
⇒ cifra cifra numero
⇒ cifra cifra cifra numero
⇒ cifra cifra cifra cifra numero
…
nessun problema
contiene sempre un simbolo non terminale
= non è una stringa generata
sequenza di istruzioni
programma → istruzione programma istruzione → assegnamento istruzione → condizionale istruzione → ciclo assegnamento → variabile=espressione …
gli interpreti/compilatori hanno la grammatica completa
la usano per verificare se il programma la rispetta
(2+3)*4 è una espressione numerica
= è generata dalla grammatica delle espressioni
generazione: dice solo che è corretta
serve: la sua struttura
prima (2+3) uguale a 5
poi 5*4 uguale a 20
le regole usate dicono la struttura
espressione ⇒ espressione * espressione ⇒ espressione * numero ⇒ espressione * cifra ⇒ espressione * 4 ⇒ (espressione) * 4 ⇒ (espressione + espressione) * 4 … ⇒ (2+3) * 4
si può visualizzare in modo grafico
espressione ⇒ ⇒ espressione * espressione … ⇒ espressione * 4 ⇒ (espressione) * 4 ⇒ (espressione + espressione) * 4 … ⇒ (2+3) * 4 |
⇒ |
omessi i passi numero⇒… in poi
rappresentazione strutture ad albero in memoria:
corso successivo
saltando i passi da numero in poi:
espressione
|
+---------+---------+
| | |
espressione * espressione
| |
+----------+----------+ |
| | | |
( espressione ) 4
|
+------+------+
| | |
espressione + espressione
| |
| |
2 3
valore espressione:
animazione:
animazione non visualizzabile con questo browser
struttura ad albero ottenuta dalla derivazione
derivazione stringa s ⇒ albero sintattico di s
albero di s in questa grammatica
con un'altra grammatica può essere diverso
2+3*4 senza le parentesi
si può ottenere in due modi diversi
espressione
|
+------------+------------+
| | |
espressione * espressione
| |
+-------+-------+ |
| | | |
espressione + espressione 4
| |
| |
2 3
|
espressione
|
+-------------+-------------+
| | |
espressione + espressione
| |
| +-------+-------+
| | | |
2 espressione * espressione
| |
| |
3 4
|
espressione
|
+------------+------------+
| | |
espressione * espressione
| |
+-------+-------+ |
| | | |
espressione + espressione 4
| |
| |
2 3
|
espressione
|
+-------------+-------------+
| | |
espressione + espressione
| |
| +-------+-------+
| | | |
2 espressione * espressione
| |
| |
3 4
|
|
2+3=5
5*4=20 |
3*4=12
2+12=14 |
primo errato
secondo giusto
stessa stringa 2+3*4
due alberi diversi
uno dei due dà un valore errato (20)
l'altro corretto (14)
altre stringhe hanno un albero unico: es. 9+3
altre ne hanno diversi, ma tutti corretti: es. 1+2+3
una grammatica in cui esistono stringhe che hanno più di un albero di derivazione si dice ambigua
esistono stringhe con alberi di derivazione diversi
(altre possono averne uno solo)
problema delle grammatiche ambigue?
albero = struttura della stringa
due alberi: qual è la struttura della stringa?
alcune grammatiche si possono rendere non ambigue
espressione → espressioneper espressione → espressionepiu espressioneper → numero espressioneper → (espressionepiu) espressioneper → numero * espressioneper espressioneper → (espressionepiu) * espressioneper espressionepiu → numero espressionepiu → espressioneper espressionepiu → espressioneper + espressionepiu numero → cifra numero → cifra numero cifra → 0 … cifra → 9
non ambigua: perchè?
espressione → espressioneper espressione → espressionepiu espressioneper → numero espressioneper → (espressionepiu) espressioneper → numero * espressioneper espressioneper → (espressionepiu) * espressioneper espressionepiu → numero espressionepiu → espressioneper espressionepiu → espressioneper + espressionepiu …
unici modi:
significato?
a parole: moltiplicazione solo fra:
2+3*4
non può essere 2+3 moltiplicato per 4
sarebbe una somma senza parentesi moltiplicata per altro
unico albero possibile:
quello di 2 sommato a 3*4
unica derivazione possibile di 2+3*4
espressione ⇒ ⇒ espressionepiu ⇒ espressioneper + espressionepiu ⇒ numero + espressionepiu ⇒ numero + espressioneper ⇒ numero + numero * espressioneper ⇒ numero + numero * numero
nessuna altra possibile…
proviamo a generare 2+3*4 in modo sbagliato
come se fosse 2+3 moltiplicato per 4
espressione ⇒ ⇒ espressioneper ⇒ numero * espressioneper ??? ⇒ 2 + 3 * 4
numero può produrre 2
ma dopo dovrebbe esserci *
alternativa…
espressione ⇒ ⇒ espressioneper ⇒ (espressionepiu) * espressioneper ??? ⇒ 2 + 3 * 4
la stringa finale non ha le parentesi
non si può derivare
partendo con espressione ⇒ espressionper
non c'è modo di generare 2+3*4
unico modo: partire da espressione ⇒ espressionepiu
significato 2+3*4 è una somma
ok: infatti è 2 sommato a 3*4
osservazione:
esistono grammatiche diverse che generano le stesse stringhe
si dicono equivalenti
certe regole non ammesse
equivalenti a espressioni regolari e automi a stati finiti
solo regole:
X → a X → a Y
X e Y: non terminali
a: terminale
numeri interi positivi
N → 0 N → 1 N → 2 N → 3 N → 4 N → 5 N → 6 N → 7 N → 8 N → 9 N → 0 N N → 1 N N → 2 N N → 3 N N → 4 N N → 5 N N → 6 N N → 7 N N → 8 N N → 9 N
grammatica regolare destra
N ⇒ ⇒ 4 N ⇒ 4 8 N ⇒ 4 8 0
N ⇒ ⇒ 1 N ⇒ 1 0 N ⇒ 1 0 9 N ⇒ 1 0 9 4 N ⇒ 1 0 9 4 3
solo regole:
X → a X → Y a
X e Y: non terminali
a: terminale
sempre numeri interi positivi
N → 0 N → 1 N → 2 N → 3 N → 4 N → 5 N → 6 N → 7 N → 8 N → 9 N → N 0 N → N 1 N → N 2 N → N 3 N → N 4 N → N 5 N → N 6 N → N 7 N → N 9 N → N 9
N ⇒ ⇒ N 0 ⇒ N 8 0 ⇒ 4 8 0
stessa sequenza vista prima
generata a partire dal fondo
la grammatica regolare destra la generava a partire dall'inizio
automi deterministici = automi non deterministici = espressioni regolari = grammatiche regolari destre = grammatiche regolari sinistre
significa:
ecc.
linguaggio = insieme di stringhe
un linguaggio divide le stringhe in:
automi, espressioni, grammatiche: dividono le stringhe
rappresentano linguaggi
automi deterministici = automi non deterministici = espressioni regolari = grammatiche regolari destre = grammatiche regolari sinistre
significa:
si possono usare per rappresentare gli stessi linguaggi
non tutti i linguaggi si rappresentano in questi modi
stringhe aaaabbbb con:
tante a quante b
= una sequenza di a seguita da una sequenza di b di lunghezza uguale
non c'è una grammatica regolare che accetta tutte e sole queste stringhe
qualcosa di simile:
X → a X → a X X → b Y Y → b Y → b Y
genera per esempio aaaabbbb
ma anche aabbbb
genera stringhe di troppo
non è il linguaggio voluto
an = stringa di a ripetuta n volte
stringhe anbn
dato che grammatica regolare destra = espressioni regolari = …
tentativo con automa:
0 -b-> (1) (a) (b) |
non si può imporre lunghezza uguale |
0 -a-> 1 -a-> 3 -a-> 5
/ / /
<-b <-b <-b
(2) <-b- 4 <-b- 6 <-b
|
se è lungo n, non accetta an+1bn+1 |
tentativo con le espressioni regolari:
X → a b X → a X b
esempio di derivazione:
X ⇒ a X b ⇒ a a X b b ⇒ a a a X b b b ⇒ a a a a b b b b
non si può riscrivere come una regolare?
| X → ab uguale a | X → a Y |
| Y → b |
ma X → a X b no
al massimo: X → a X
non si possono mischiare regole destre e sinistre
es:
X → a Z Z → X b
non è una grammatica regolare!
regolare destra = regolare sinistra
insieme = come senza nessuna restrizione
anbn non capita spesso
capita stringhe con elementi a coppie
X → a X b
come dire a -qualcosa- b
esempio: espressioni con parentesi:
X → ( X )
ogni parentesi aperta ha la sua chiusa
e viceversa
generalizzazione delle parentesi
forma apertura -qualcosa- chiusura
esempio: parentesi aperta e chiusa
altro esempio: html
esempio: tabella html:
<table> celle-della-tabella </table>
all'interno di una cella si può mettere un'altra tabella:
<table> celle <table> celle-sottotabella </table> celle </table>
quasi tutte le pagine web attualmente esistenti usa questo genere di struttura a tabelle l'una dentro l'altra per disporre le loro parti nelle posizioni volute
testo → <table> contenutotabella </table> contenutotabella → … testo …
A → aperto B chiuso
le stringhe generate hanno sempre aperto e chiuso bilanciati
finora:
esiste una forma ancora più generale
forma più generale possibile
c'è un vincolo su sequenza → sequenza
sequenza → sequenza
vincolo:
la sequenza prima di → deve contenere almeno un simbolo non terminale
sequenza di terminali: non si può modificare
tutte la altre: sì
XaYb → Zcd aXbWz → arcbWz
se in una sequenza compare XaYb
al suo posto si può mettere Zcd
anche se a e b sono terminali!
X non terminale, a terminale
intermedie fra struttura di frase e non contestuali
seq1 X seq2 → seq1 sequenza seq2
contesto = quello che c'è prima e dopo
(seq1 prima e seq2 dopo)
regole simili:
primo caso: X → ZwY si può applicare solo se prima di X c'è ac e dopo db
secondo caso: si può applicare sempre
modo compatto di scrivere grammatiche non contestuali
si usano alcuni operatori delle espressioni regolari
BNF=Backus-Naur Form
espr → numero espr → (espr) espr → espr * espr espr → espr + espr
in BNF diventa:
espr → numero | (espr) | espr * espr | espr + espr
vantaggi…
espr → numero | (espr) | espr * espr | espr + espr
intuitivo: espr è numero oppure espressione fra parentesi, oppure…
forma estesa: bisognava leggere tutte le regole espr → … per capirlo
usa altre cose prese dalle espressioni regolari
ripetizione, in modo esteso:
numero → cifra numero → cifra numero
numero → cifra {cifra}
qui graffe = ripetizione anche vuota
quindi {cifra} = zero o più cifre
come * delle espressioni regolari
regola molto più facile da leggere
invece di ? si usano le parentesi quadre:
numeroconsegno → [-] numero
intero con segno
forma estesa:
numeroconsegno → numero numeroconsegno → - numero
parentesi ( ) come nelle espressioni regolari
al posto di → si usa =
oppure :==
sempre grammatiche non contestuali
solo una forma più semplice e intuitiva
messaggi scambiati nel protocollo HTTP
esempio: URL
http_URL = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]]
variante di EBNF
"…" = stringa da interpretare letteralmente
sempre in HTTP
nel protocollo viene passata la data
HTTP-date = rfc1123-date | rfc850-date | asctime-date
rfc1123-date = wkday "," SP date1 SP time SP "GMT"
rfc850-date = weekday "," SP date2 SP time SP "GMT"
asctime-date = wkday SP date3 SP time SP 4DIGIT
date1 = 2DIGIT SP month SP 4DIGIT
; day month year (e.g., 02 Jun 1982)
date2 = 2DIGIT "-" month "-" 2DIGIT
; day-month-year (e.g., 02-Jun-82)
date3 = month SP ( 2DIGIT | ( SP 1DIGIT ))
; month day (e.g., Jun 2)
time = 2DIGIT ":" 2DIGIT ":" 2DIGIT
; 00:00:00 - 23:59:59
wkday = "Mon" | "Tue" | "Wed"
| "Thu" | "Fri" | "Sat" | "Sun"
weekday = "Monday" | "Tuesday" | "Wednesday"
| "Thursday" | "Friday" | "Saturday" | "Sunday"
month = "Jan" | "Feb" | "Mar" | "Apr"
| "May" | "Jun" | "Jul" | "Aug"
| "Sep" | "Oct" | "Nov" | "Dec"
definiti altrove: SP (spazio)
1DIGIT, 2DIGIT
; indica l'inizio di un commento
commenti in html e xml:
Comment ::= '<!--' ((Char - '-') | ('-' (Char - '-')))* '-->'
' per indicare stringhe letterali
Char - '-' = qualsiasi carattere tranne -
esempio:
<!-- questo e' un commento -->
…
compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | with_stmt | funcdef
if_stmt: 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite]
while_stmt: 'while' test ':' suite ['else' ':' suite]
for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite]
…
: al posto di →
* per indicare la ripetizione
cose comuni:
dice se una stringa si può generare da una grammatica
si parte dal simbolo iniziale
a ogni passo si cerca di capire quale regola applicare
si guardano uno o più caratteri della stringa
grammatica:
espr → par espr → espr * espr espr → espr + espr par → 1 par → ( espr )
stringa 1*(1+1)
grammatica:
espr → par espr → espr * espr espr → espr + espr par → 1 par → ( espr )
stringa 1*(1+1)
inizio: espr
applico una regola espr → …
quale?
grammatica:
espr → par
espr → espr * espr
espr → espr + espr
par → 1
par → ( espr )
stringa 1*(1+1)
quale regola espr → … applico?
poi: la prima espr diventa par che diventa 1
ecc.
si capisce cosa applicare guardando solo il primo carattere
grammatica di prima: non è LL(1)
si può modificare per renderla tale
genera le stesse stringhe:
espr → par seg par → 1 par → ( espr ) seg → ε seg → + espr seg → * espr
ε = stringa vuota
ora: analisi
non terminale/terminale → regola da applicare
| 1 | ( | ) | + | * | ||
|---|---|---|---|---|---|---|
| espr | par seg | par seg | - | - | - | - |
| par | 1 | ( espr ) | - | - | - | - |
| seg | - | - | ε | + espr | * espr | ε |
cosa significa?
| 1 | ( | ) | + | * | ||
|---|---|---|---|---|---|---|
| espr | par seg | par seg | - | - | - | - |
| par | 1 | ( espr ) | - | - | - | - |
| seg | - | - | ε | + espr | * espr | ε |
la prima cella dice che:
da espr, per generare una stringa che inizia con 1, occorre applicare espr → par seg
cella di riga espr e colonna 1: contiene par seg
| 1 | ( | ) | + | * | ||
|---|---|---|---|---|---|---|
| espr | par seg | par seg | - | - | - | - |
| par | 1 | ( espr ) | - | - | - | - |
| seg | - | - | ε | + espr | * espr | ε |
da seg non c'è modo di generare una stringa che inizia con (
lo stesso per le altre celle con -
| 1 | ( | ) | + | * | ||
|---|---|---|---|---|---|---|
| espr | par seg | par seg | - | - | - | - |
| par | 1 | ( espr ) | - | - | - | - |
| seg | - | - | ε | + espr | * espr | ε |
da seg forse si può generare ) altro
ma solo applicando seg → ε
| 1 | ( | ) | + | * | ||
|---|---|---|---|---|---|---|
| espr | par seg | par seg | - | - | - | - |
| par | 1 | ( espr ) | - | - | - | - |
| seg | - | - | ε | + espr | * espr | ε |
ultima colonna: cosa fare se la stringa è finita
| 1 | ( | ) | + | * | ||
|---|---|---|---|---|---|---|
| espr | par seg | par seg | - | - | - | - |
| par | 1 | ( espr ) | - | - | - | - |
| seg | - | - | ε | + espr | * espr | ε |
derivare questa tabella in generale non è semplice
ci sono varie complicazioni
stringa di esempio: 1*(1+1)
in ogni momento: pila + resto della stringa
inizio:
espr 1+(1*1)
elemento in cima + primo della stringa: tabella
|
1 | +(1*1) | ||
simbolo espr
primo carattere 1
guardo la tabella
|
1 | +(1*1) | ||
espr/1 ⇒ par seg
al posto di espr
metto par seg
| 1 | ( | ) | + | * | ||
|---|---|---|---|---|---|---|
| espr | par seg | par seg | - | - | - | - |
| par | 1 | ( espr ) | - | - | - | - |
| seg | - | - | ε | + espr | * espr | ε |
|
1 | +(1*1) | |||
par/1 ⇒ 1
al posto di par
metto 1
| 1 | ( | ) | + | * | ||
|---|---|---|---|---|---|---|
| espr | par seg | par seg | - | - | - | - |
| par | 1 | ( espr ) | - | - | - | - |
| seg | - | - | ε | + espr | * espr | ε |
|
1 | +(1*1) | |||
1/1 ⇒ rimuovi
non c'è bisogno di guardare la tabella
|
+ | (1*1) | ||
seg/+ ⇒ + espr
al posto di seg
metto + e sotto espr
| 1 | ( | ) | + | * | ||
|---|---|---|---|---|---|---|
| espr | par seg | par seg | - | - | - | - |
| par | 1 | ( espr ) | - | - | - | - |
| seg | - | - | ε | + espr | * espr | ε |
|
+ | (1*1) | |||
+/+ ⇒ rimuovi
|
( | 1*1) | ||
espr/( ⇒ par seg
| 1 | ( | ) | + | * | ||
|---|---|---|---|---|---|---|
| espr | par seg | par seg | - | - | - | - |
| par | 1 | ( espr ) | - | - | - | - |
| seg | - | - | ε | + espr | * espr | ε |
|
( | 1*1) | |||
par/( ⇒ ( espr )
|
( | 1*1) | |||||
(/( ⇒ rimuovi
|
1 | *1) | ||||
espr/1 ⇒ par seg
|
1 | *1) | |||||
par/1 ⇒ 1
|
1 | *1) | |||||
1/1 ⇒ rimuovi
|
* | 1) | ||||
seg/* ⇒ * espr
|
* | 1) | |||||
*/* ⇒ rimuovi
|
1 | ) | ||||
espr/1 ⇒ par seg
|
1 | ) | |||||
par/1 ⇒ 1
|
1 | ) | |||||
1/1 ⇒ rimuovi
|
) | |||||
seg/) ⇒ ε
(rimuovi solo seg)
| 1 | ( | ) | + | * | ||
|---|---|---|---|---|---|---|
| espr | par seg | par seg | - | - | - | - |
| par | 1 | ( espr ) | - | - | - | - |
| seg | - | - | ε | + espr | * espr | ε |
|
) | ||||
)/) ⇒ rimuovi
|
||||
seg/fine stringa ⇒ ε
si toglie seg
| 1 | ( | ) | + | * | ||
|---|---|---|---|---|---|---|
| espr | par seg | par seg | - | - | - | - |
| par | 1 | ( espr ) | - | - | - | - |
| seg | - | - | ε | + espr | * espr | ε |
pila vuota e stringa finita: stringa generata
nota: in tutti gli altri casi la stringa non lo è
pila e resto della stringa
inizio: simbolo iniziale e stringa intera
ogni passo:
a ogni passo si sa cosa fare
non ci sono scelte
molti linguaggi di programmazione sono definiti in modo tale da essere analizzabili con il metodo top-down in LL(1)
per alcune grammatiche non contestuali non si può fare un'analisi LL(1)
LL(1) = analisi guardando 1 carattere per volta
anbn ∪ anb2n
es: inizio stringa aaaaabbb…
ho otto caratteri, ma ancora non so se le b sono doppie
I → S
I → D
S → ab
S → aSb
D → abb
D → aDbb
prima regola da applicare per generare aaaaabbb…:
lo so solo dopo il decimo carattere
il primo carattere non basta, ne servono dieci
nota: grammatica non ambigua
anche un programma è una stringa
deve rispettare una certa sintassi
la struttura influenza la valutazione:
lo stesso per tutto il programma
if a==b:
print 'abcd'
print 'print'
stessi caratteri di:
print ' = afi: =' print print 'a b c d '
la struttura dice cosa eseguire
es. print e 'print'
programma → albero sintattico → esecuzione
elementi base:
facili da indentificare con espressioni regolari
| programma | → | identificazione elementi | → | analisi grammaticale |
| = | ||||
|
ogni numero rimpiazzato da un token
ogni parola rimpiazzata da un token |