grammatiche

meccanismo per verificare stringhe

espressioni regolari
come deve essere fatta la stringa
automa
meccanismo per dire se una stringa va accettata o no
grammatica
descrizione di come si possono generare certe stringhe

grammatiche: origini

nascono per descrivere in modo formale la lingua

es: frase = soggetto + verbo + complemento-oggetto

poi soggetto = nome oppure articolo + sostantivo oppure …


esempio di grammatica

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:


adatta al linguaggio naturale?

no

es: il soggetto si può o meno omettere a seconda dei casi

il soggetto può stare alla fine della frase

ecc.


uso delle grammatiche formali

intenzione = usarle per i linguaggi naturali

uso attuale = linguaggi informatici


come si scrivono

si usa invece di =

una regola per ogni caso

non basta scrivere "articolo"
bisogna arrivare ai caratteri


esempio di grammatica

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


esempio di derivazione

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?


grammatica = sistema di generazione

si parte dal primo simbolo

si rimpiazzano simboli con altri
seguendo le regole

si generano stringhe


generazione, sull'esempio

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


applicazione di una regola

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


applicazione: riassunto

esempio di stringa ottenuta così:
il cane bianco ha morso il gatto

stringa generata dalla gramamtica


non tutte le stringhe

generata: il cane bianco ha morso il gatto

non generata: ha cane gatto il

una data stringa può venire generata o no dalla grammatica

grammatiche, automi, espressioni regolari

sono tre modi per decidere se una stringa soddisfa una certa forma oppure no


differenza fra i tre sistemi


grammatiche: struttura della stringa

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


linguaggio naturale

molto complesso

ammette variazioni difficili da codificare con regole

esempi di frasi valide:

grammatiche: comode per i linguaggi artificiali


uso delle grammatiche

linguaggi artificiali

esempi:


definizione formale


simboli

nell'esempio:

due tipi di simboli


simboli terminali e non terminali

simboli terminali
quelli che compaiono nella stringa finale
simboli non terminali
quelli che rappresentano parti di stringa

simbolo iniziale: un non terminale


esempio: codici fiscali

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

esempio: simboli

iniziale: codice

terminali: quelli che appaiono nei codici fiscali
= lettere maisucole e cifre

non terminali: gli altri
rappresentano parti di codici fiscali


esempio di derivazione

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


derivazione completa

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


derivazione: cosa dimostra?

da codice
con una serie di passaggi
si ottiene RQSRNT92Z24H299R

è una stringa generata dalla grammatica


uso delle regole

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


definizione formale di grammatica

simboli
terminali e non terminali
regole
nella forma non terminale → sequenza di simboli
simbolo iniziale
uno dei simboli non terminali

ora: generazione


generazione

per la generazione usiamo , la freccia doppia
quella singola indica una regola


grammatica

una grammatica è: ⟨N, T, R, I⟩


sequenze generate da una grammatica

⟨N, T, R, I⟩ genera:

definizione ricorsiva
(prossimo lucido)

stringhe generate: sequenze generate fatte solo di elementi di T


definizione ricorsiva


grammatiche non contestuali

sono quelle viste finora

regole simbolo non terminale → sequenza simboli

ne esistono forme più generali e più restrittive


esempio

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

esempio di generazione

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-()+*


ripetizione

da numero si ottiene 210 così

numero ⇒ cifra numero
       ⇒ cifra cifra numero
       ⇒ cifra cifra cifra

anche sequenze più lunghe


definizione ricorsiva di sequenza

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…


definizione ciclica?

no!

numero definito in termini di un altro numero

es: numero 4923 definito in termini del numero 923

923 definito da 23, ecc.


se applico la regola all'infinito?

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


esempio di sequenza: programma Python

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


generazione: basta?

(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


derivazione

espressione ⇒ espressione * espressione
⇒ espressione * numero
⇒ espressione * cifra 
⇒ espressione * 4
⇒ (espressione) * 4
⇒ (espressione + espressione) * 4
…
⇒ (2+3) * 4

si può visualizzare in modo grafico


derivazione ⇒ albero

espressione ⇒
⇒ espressione * espressione
…
⇒ espressione * 4
⇒ (espressione) * 4
⇒ (espressione + espressione) * 4
…
⇒ (2+3) * 4
  ⇒  
                  espressione
                       |
             +---------+---------+
             |         |         |
         espressione   *    espressione
             |                   |
  +----------+----------+        |
  |          |          |        |
  (     espressione     )        4
             |
      +------+------+
      |      |      |
 espressione + espressione
      |             |
      |             |
      2             3

omessi i passi numero⇒… in poi

rappresentazione strutture ad albero in memoria:
corso successivo


costruzione dell'albero

saltando i passi da numero in poi:

[] (animazione)

valutazione

                  espressione
                       |
             +---------+---------+
             |         |         |
         espressione   *    espressione
             |                   |
  +----------+----------+        |
  |          |          |        |
  (     espressione     )        4
             |
      +------+------+
      |      |      |
 espressione + espressione
      |             |
      |             |
      2             3

valore espressione:


valutazione, sull'albero

animazione:

animazione non visualizzabile con questo browser

albero sintattico

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


derivazioni diverse

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

valutazione nei due casi

                     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


valutazioni errate

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


grammatiche ambigue

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?


problema dell'ambiguità

albero = struttura della stringa

due alberi: qual è la struttura della stringa?

alcune grammatiche si possono rendere non ambigue


espressione numerica: grammatica non ambigua

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è?


generare qualcosa * qualcosa

espressione → espressioneper
espressione → espressionepiu
espressioneper → numero
espressioneper → (espressionepiu)
espressioneper → numero * espressioneper
espressioneper → (espressionepiu) * espressioneper
espressionepiu → numero
espressionepiu → espressioneper
espressionepiu → espressioneper + espressionepiu
…

unici modi:

significato?


significato di una derivazione

a parole: moltiplicazione solo fra:


alberi esclusi

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


derivazione corretta

unica derivazione possibile di 2+3*4

espressione ⇒
⇒ espressionepiu
⇒ espressioneper + espressionepiu
⇒ numero + espressionepiu
⇒ numero + espressioneper
⇒ numero + numero * espressioneper
⇒ numero + numero * numero 

nessuna altra possibile…


derivazione sbagliata

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…


altra regola

espressione ⇒
⇒ espressioneper
⇒ (espressionepiu) * espressioneper
  ???
⇒    2   +   3     *       4

la stringa finale non ha le parentesi

non si può derivare


derivazioni sbagliate: conclusione

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


grammatiche equivalenti

osservazione:

esistono grammatiche diverse che generano le stesse stringhe

si dicono equivalenti


grammatiche regolari

certe regole non ammesse

equivalenti a espressioni regolari e automi a stati finiti


grammatiche regolari destre

solo regole:

X → a
X → a Y

X e Y: non terminali
a: terminale


esempio: sequenze di cifre

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


numeri positivi: esempio di derivazione

N ⇒
⇒ 4 N
⇒ 4 8 N
⇒ 4 8 0

altro esempio di derivazione

N ⇒
⇒ 1 N
⇒ 1 0 N
⇒ 1 0 9 N
⇒ 1 0 9 4 N
⇒ 1 0 9 4 3

grammatiche regolari sinistre

solo regole:

X → a
X → Y a

X e Y: non terminali
a: terminale


grammatiche regolari sinistre: esempio

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

esempio di derivazione

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


stessi linguaggi

automi deterministici = automi non deterministici = espressioni regolari = grammatiche regolari destre = grammatiche regolari sinistre

significa:

ecc.


linguaggio

linguaggio = insieme di stringhe

un linguaggio divide le stringhe in:

automi, espressioni, grammatiche: dividono le stringhe

rappresentano linguaggi


stessi 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


linguaggi non regolari

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


grammatica regolare: tentativo

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


con gli altri meccanismi

an = stringa di a ripetuta n volte

stringhe anbn

dato che grammatica regolare destra = espressioni regolari = …


perchè no?

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

perchè no?

tentativo con le espressioni regolari:


grammatica non regolare

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?


espressione regolare equivalente?

X → ab uguale a X → a Y
Y → b

ma X → a X b no

al massimo: X → a X


nota su regolari destre e sinistre

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


esempio più utile

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


delimitatori

generalizzazione delle parentesi

forma apertura -qualcosa- chiusura

esempio: parentesi aperta e chiusa

altro esempio: html


delimitatori in html, xml, svg, ecc.

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


tabelle, con grammatiche non regolari

testo → <table> contenutotabella </table>
contenutotabella → … testo …

delimitatori simmetrici, in generale

A → aperto B chiuso

le stringhe generate hanno sempre aperto e chiuso bilanciati


tipi di grammatiche

finora:

esiste una forma ancora più generale


grammatiche generali

non terminale → sequenza
grammatica non contestuale
quelle viste finora
sequenza → sequenza
grammatiche a struttura di frase

forma più generale possibile

c'è un vincolo su sequenza → sequenza


grammatiche a struttura di frase

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ì


esempi di regole generali

XaYb → Zcd
aXbWz → arcbWz

se in una sequenza compare XaYb
al suo posto si può mettere Zcd

anche se a e b sono terminali!


classificazione delle grammatiche

sequenza X sequenza → sequenza
grammatiche a struttura di frase
sequenza1 X sequenza2 → sequenza1 sequenza sequenza2
grammatiche contestuali
X → sequenza
grammatiche non contestuali
X → a Y
grammatiche regolari destre
(sinistre: simili)

X non terminale, a terminale


grammatiche contestuali

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)


contestuali e non contestuali

regole simili:

contestuale
acXdb → acZwYdb
non contestuale
X → ZwY

primo caso: X → ZwY si può applicare solo se prima di X c'è ac e dopo db

secondo caso: si può applicare sempre


forma di Backus-Naur

modo compatto di scrivere grammatiche non contestuali

si usano alcuni operatori delle espressioni regolari

BNF=Backus-Naur Form


BNF: alternativa

espr → numero
espr → (espr)
espr → espr * espr
espr → espr + espr

in BNF diventa:

espr → numero | (espr) | espr * espr | espr + espr

vantaggi…


vantaggi della condensazione

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


forma di Backus-Naur estesa (EBFN)

usa altre cose prese dalle espressioni regolari

ripetizione, in modo esteso:

numero → cifra
numero → cifra numero

EBNF: ripetizione

numero → cifra {cifra}

qui graffe = ripetizione anche vuota

quindi {cifra} = zero o più cifre

come * delle espressioni regolari

regola molto più facile da leggere


EBNF: opzionalità

invece di ? si usano le parentesi quadre:

numeroconsegno → [-] numero

intero con segno

forma estesa:

numeroconsegno → numero
numeroconsegno → - numero

EBNF: altro

parentesi ( ) come nelle espressioni regolari

al posto di si usa =
oppure :==


EBNF: classificazione

sempre grammatiche non contestuali

solo una forma più semplice e intuitiva


EBNF: esempio

messaggi scambiati nel protocollo HTTP

esempio: URL

http_URL = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]]

variante di EBNF
"…" = stringa da interpretare letteralmente


EBNF: esempio più complesso

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


EBNF: altro esempio

commenti in html e xml:

Comment ::= '<!--' ((Char - '-') | ('-' (Char - '-')))* '-->'

' per indicare stringhe letterali

Char - '-' = qualsiasi carattere tranne -

esempio:

<!-- questo e' un commento -->

EBNF: grammatica Python

…
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


EBNF: varianti

cose comuni:


analisi top-down

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


top-down: esempio

grammatica:

espr → par
espr → espr * espr
espr → espr + espr
par → 1
par → ( espr )

stringa 1*(1+1)


top-down: esempio

grammatica:

espr → par
espr → espr * espr
espr → espr + espr
par → 1
par → ( espr )

stringa 1*(1+1)

inizio: espr

applico una regola espr → …

quale?


top-down: esempio

grammatica:

espr → par
espr → espr * espr
espr → espr + espr
par → 1
par → ( espr )

stringa 1*(1+1)

quale regola espr → … applico?

guardando solo il primo 1:
non lo so
tutte e tre le espr → … generano stringhe che iniziano con 1
guardando 1*:
regola espr → espr * espr

poi: la prima espr diventa par che diventa 1

ecc.


grammatiche LL(1)

si capisce cosa applicare guardando solo il primo carattere

grammatica di prima: non è LL(1)

si può modificare per renderla tale


versione LL(1)

genera le stesse stringhe:

espr → par seg
par → 1
par → ( espr )
seg → ε
seg → + espr
seg → * espr

ε = stringa vuota

ora: analisi


primo passo: tabella

non terminale/terminale → regola da applicare


tabella

1 ( ) + *
espr par seg par seg - - - -
par 1 ( espr ) - - - -
seg - - ε + espr * espr ε

cosa significa?


tabella: esempio

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


celle vuote

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 -


tabella: ε

1 ( ) + *
espr par seg par seg - - - -
par 1 ( espr ) - - - -
seg - - ε + espr * espr ε

da seg forse si può generare ) altro

ma solo applicando seg → ε


tabella: ultima colonna

1 ( ) + *
espr par seg par seg - - - -
par 1 ( espr ) - - - -
seg - - ε + espr * espr ε

ultima colonna: cosa fare se la stringa è finita


tabella: generazione

1 ( ) + *
espr par seg par seg - - - -
par 1 ( espr ) - - - -
seg - - ε + espr * espr ε

derivare questa tabella in generale non è semplice

ci sono varie complicazioni


esempio di analisi

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


passo 1

espr
      1+(1*1)
   
   

simbolo espr
primo carattere 1

guardo la tabella


passo 1

espr
      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 ε

passo 2

par
seg
      1+(1*1)
 
 
 
 

par/1 ⇒ 1

al posto di par
metto 1

1 ( ) + *
espr par seg par seg - - - -
par 1 ( espr ) - - - -
seg - - ε + espr * espr ε

passo 3

1
seg
      1+(1*1)
 
 
 
 

1/1 ⇒ rimuovi

non c'è bisogno di guardare la tabella


passo 4

seg
      +(1*1)
 
 
 
 

seg/+ ⇒ + espr

al posto di seg
metto + e sotto espr

1 ( ) + *
espr par seg par seg - - - -
par 1 ( espr ) - - - -
seg - - ε + espr * espr ε

passo 5

+
espr
      +(1*1)
 
 
 
 

+/+ ⇒ rimuovi


passo 6

espr
      (1*1)
 
 
 
 

espr/( ⇒ par seg

1 ( ) + *
espr par seg par seg - - - -
par 1 ( espr ) - - - -
seg - - ε + espr * espr ε

passo 7

par
seg
      (1*1)
 
 
 
 

par/( ⇒ ( espr )


passo 8

(
espr
)
seg
      (1*1)
 
 
 
 

(/( ⇒ rimuovi


passo 9

espr
)
seg
      1*1)
 
 
 
 

espr/1 ⇒ par seg


passo 10

par
seg
)
seg
      1*1)
 
 
 
 

par/1 ⇒ 1


passo 11

1
seg
)
seg
      1*1)
 
 
 
 

1/1 ⇒ rimuovi


passo 12

seg
)
seg
      *1)
 
 
 
 

seg/* ⇒ * espr


passo 13

*
espr
)
seg
      *1)
 
 
 
 

*/* ⇒ rimuovi


passo 14

espr
)
seg
      1)
 
 
 
 

espr/1 ⇒ par seg


passo 15

par
seg
)
seg
      1)
 
 
 
 

par/1 ⇒ 1


passo 16

1
seg
)
seg
      1)
 
 
 
 

1/1 ⇒ rimuovi


passo 17

seg
)
seg
      )
 
 
 
 

seg/) ⇒ ε
(rimuovi solo seg)

1 ( ) + *
espr par seg par seg - - - -
par 1 ( espr ) - - - -
seg - - ε + espr * espr ε

passo 18

)
seg
      )
 
 
 
 

)/) ⇒ rimuovi


passo 19

seg
       
 
 
 
 

seg/fine stringa ⇒ ε
si toglie seg

1 ( ) + *
espr par seg par seg - - - -
par 1 ( espr ) - - - -
seg - - ε + espr * espr ε

passo 20

 
           
 
 
 
 

pila vuota e stringa finita: stringa generata

nota: in tutti gli altri casi la stringa non lo è


analisi top-down LL(1)

pila e resto della stringa

inizio: simbolo iniziale e stringa intera

ogni passo:

  • simbolo in cima + inizio stringa: guarda tabella
  • simboli uguali: elimina
  • simbolo e stringa finita: ultima colonna

vantaggi analisi LL(1)

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)


linguaggi non 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


analisi sintattica dei programmi

anche un programma è una stringa

deve rispettare una certa sintassi

la struttura influenza la valutazione:

  • 2+(3*4) ha gli stessi caratteri di (2+3)*4
  • valori diversi

lo stesso per tutto il programma


struttura e valutazione

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


analisi lessicale e sintattica

elementi base:

  • numeri (es. 32.344)
  • parole (es. while)

facili da indentificare con espressioni regolari


analisi in due fasi

programma identificazione elementi analisi grammaticale
=
ogni numero rimpiazzato da un token
ogni parola rimpiazzata da un token