SlideShare ist ein Scribd-Unternehmen logo
1 von 97
Downloaden Sie, um offline zu lesen
LFC




                                     Formalismi
                                     generativi
                                     Espressioni regolari
                                     Grammatiche libere
                                     Altri tipi di grammatica



Linguaggi formali e compilazione
    Corso di Laurea in Informatica




           A.A. 2008/2009
LFC
Linguaggi formali e compilazione
                                      Formalismi
                                      generativi
                                      Espressioni regolari
                                      Grammatiche libere
                                      Altri tipi di grammatica




Formalismi generativi
   Espressioni e linguaggi regolari
   Grammatiche libere
   Altri tipi di grammatiche
LFC
Linguaggi formali e compilazione
                                      Formalismi
                                      generativi
                                      Espressioni regolari
                                      Grammatiche libere
                                      Altri tipi di grammatica




Formalismi generativi
   Espressioni e linguaggi regolari
   Grammatiche libere
   Altri tipi di grammatiche
LFC
Linguaggi regolari
                                                               Formalismi
                                                               generativi
                                                               Espressioni regolari
    Un linguaggio L su un alfabeto Σ = {a1 , . . . , an } si   Grammatiche libere
                                                               Altri tipi di grammatica
    dice regolare se può essere espresso mediante
    composizione finita di operazioni di concatenazione,
    unione e chiusura riflessiva a partire dai linguaggi
    elementari (detti anche unitari) {a1 }, . . . , {an }.
    Ogni linguaggio finito è chiaramente regolare mentre
    ci sono abbondanti esempi di interessanti linguaggi
    infiniti che non sono regolari.
    Come vedremo, i linguaggi regolari giocano un ruolo
    importante nella definizione del lessico di un
    programma scritto in linguaggio ad alto livello, oltre
    che in svariati altri campi dell’Informatica.
LFC
Esempi di linguaggi regolari
                                                                Formalismi
                                                                generativi
                                                                Espressioni regolari
                                                                Grammatiche libere
    Sia Σ l’alfabeto ASCII e sia X = X1 X2 . . . Xn una         Altri tipi di grammatica

    generica stringa di Σ∗ . Il linguaggio {X } è regolare in
    quanto esprimibile come concatenazione dei
    linguaggi unitari {X1 }, {X2 }, . . . , {Xn }.
    Il linguaggio {X , Y , Z }, dove X , Y e Z sono stringhe
    generiche sull’alfabeto ASCII è regolare perché
    esprimibile come unione dei linguaggi regolari
    {X }, {Y }, e {Z }.
    Generalizzando l’esempio precedente si dimostra
    come ogni linguaggio finito sia esprimibile come
    unione di concatenzazioni di linguaggi unitari.
LFC
Altri esempi
                                                             Formalismi
                                                             generativi
                                                             Espressioni regolari
                                                             Grammatiche libere
                                                             Altri tipi di grammatica


    Il linguaggio L5 = {an bm |n, m ≥ 0} è regolare in
    quanto esprimibile nel modo seguente
    L5 = {a}∗ {b}∗ .
    I seguenti linguaggi, introdotti nel gruppo di lucidi
    introduttivi, sono tutti regolari:
                                                         R
    {ab, c}2 , {ab, c}3 , {ab, c}∗ , {ab, c}+ , {ab, c}2
    Il linguaggio L6 = {an bn |n ≥ 0} non è regolare.
    Il linguaggio L10 = {an |n primo} non è regolare.
LFC
Espressioni regolari
                                                              Formalismi
                                                              generativi
                                                              Espressioni regolari
                                                              Grammatiche libere

    Le espressioni regolari su un alfabeto Σ sono un          Altri tipi di grammatica



    formalismo che riflette (e semplifica) le costruzioni
    delineate sopra per la definizione di linguaggi
    regolari.
    Più precisamente, le espressioni regolari (e.r.)su Σ
    sono definite ricorsivamente nel modo seguente:
          Base.      Φ è un’espressione regolare che
                     denota l’insieme vuoto;
                     per ogni a ∈ Σ, a è un’e.r. che denota
                     l’insieme {a};
LFC
Espressioni regolari
                                                            Formalismi
Segue definizione di e.r.                                    generativi
                                                            Espressioni regolari
                                                            Grammatiche libere

Concatenazione Se E ed F sono e.r., la scrittura EF è       Altri tipi di grammatica



           un’e.r. che denota l’insieme di stringhe che
           possono essere scritte concatenando una
           stringa dell’insieme denotato da E (più
           brevemente diremo “una stringa di E”) con
           una stringa di F;
    Unione Se E ed F sono e.r., la scrittura E + F è
           un’e.r. che denota l’unione di E e di F.
  Chiusura Se E è un’e.r., la scrittura E ∗ è un’e.r. che
           denota l’insieme delle stringhe ottenute
           concatenando stringhe di E un numero
           arbitrario i ≥ 0 di volte.
LFC
Espressioni regolari
                                                           Formalismi
                                                           generativi
                                                           Espressioni regolari
                                                           Grammatiche libere
                                                           Altri tipi di grammatica



Un’ulteriore regola
  Parentesi. Se E è un’e.r., la scrittura (E) è un’e.r.
             equivalente alla prima, cioè che denota lo
             stesso insieme di stringhe
serve a forzare un ordine di composizione delle
espressioni diverso da quello standard (in base al quale
chiusura precede concatenazione che precede unione).
LFC
Esempi
   L’espressione regolare 0 + 1∗ 10 su B (interpretabile      Formalismi
                                                              generativi
   come 0 + ((1∗ )10), in base alle regole di                 Espressioni regolari
                                                              Grammatiche libere

   precedenza) denota il linguaggio                           Altri tipi di grammatica


   R1 = {0, 10, 110, 1110, . . .}.
   Il linguaggio R1 è chiaramente differente dal
   linguaggio R2 su B definito dall’espressione regolare
   (0 + 1)∗ 10, che consiste di tutte le stringhe binarie
   che terminano con 10.
   Posto Σ = {a, b, c}, l’espressione regolare
   a(b + c)∗ a denota il linguaggio R3 su Σ costituito
   dalle stringhe che iniziano e terminano con il
   carattere a e che non contengono altri caratteri a.
   La scrittura (1 + 01)∗ (0 + 1 + 01) denota il linguaggio
   delle stringhe su B di lunghezza maggiore di zero
   che non contengono due caratteri 0 consecutivi.
LFC
Abbreviazioni di uso pratico
                                                                Formalismi
                                                                generativi

    Poiché { } = Φ∗ , si può utilizzare il simbolo
                                                                Espressioni regolari
                                                     per        Grammatiche libere
                                                                Altri tipi di grammatica
    indicare l’insieme { }.
    La scrittura [E] si può utilizzare al posto della e.r. E+
    e l’operatore [ ] prende il nome di opzione.
    Se è definito un ordinamento fra i caratteri di Σ,
    allora si possono utilizzare convenzioni specifiche
    per denotare intervalli di caratteri. Ad esempio, la
    scrittura [a − f] denota i caratteri compresi fra a ed f
    (opzione su un intervallo).
    Poiché L+ = LL∗ , l’operatore di chiusura (non
    riflessiva) è ammesso nelle e.r. dove si intende che
    E + = EE ∗ .
LFC
Abbreviazioni di uso pratico
                                                                Formalismi
                        n                                       generativi
                                                                Espressioni regolari
    Poiché Ln =LL . . . L, l’operatore di elevamento a          Grammatiche libere
                                                                Altri tipi di grammatica
    potenza è ammesso nelle e.r. e si intende che
               n

    En   =EE . . . E.
    La scrittura [E]ji si può utilizzare al posto della e.r.
    E i + E i+1 + . . . + E j .
    Per alcuni insiemi di caratteri di particolare
    importanza (cifre, lettere, caratteri alfanumerici,
    caratteri di spaziatura, ...) si possono usare
    espressioni specifiche, come ad esempio
    (prendendo a prestito la notazione dalle espressioni
    riconosciute dal comando grep di Linux):
    [: digit :], [: alpha :], [: alnum :], [: space :], . . .
LFC
Esempi di interesse nel contesto dei
linguaggi di programmazione
                                                                   Formalismi
                                                                   generativi
                                                                   Espressioni regolari
                                                                   Grammatiche libere

    Osserviamo dapprima che nel contesto della                     Altri tipi di grammatica



    definizione della sintassi dei linguaggi di
    programmazione il simbolo + è spesso rimpiazzato
    da |.
    L’espressione regolare [1 − 9][: digit :]∗ denota
    l’insieme delle stringhe che rappresentano (nella
    consueta rappresentazione in base 10) i numeri
    interi positivi.
    L’espressione regolare
    [: alpha :]([: alpha :]|[: digit :])∗ denota l’insieme degli
    identificatori legali in alcuni linguaggi di
    programmazione (soprattutto fra i più vecchi).
LFC
Esercizi proposti
    Scrivere un’e.r. per il seguente linguaggio              Formalismi
                                                             generativi
    sull’alfabeto {a, b, c}:                                 Espressioni regolari
                                                             Grammatiche libere
                                                             Altri tipi di grammatica


               E1 = {an bm ck |m = 0 ⇒ k = 3}

    Scrivere un’e.r. per il linguaggio E2 , sull’alfabeto
    {a, b}, delle stringhe contenenti al più due a.
    Scrivere un’e.r. per il linguaggio E3 , sull’alfabeto
    {a, b}, delle stringhe contenenti un numero dispari di
    b.
    Scrivere un’e.r. per il linguaggio E4 , sull’alfabeto
    {a, b}, definito ricorsivamente nel modo seguente:
     1. ∈ E4 ;
     2. Se x ∈ E4 allora anche abax ∈ E4 e xaa ∈ E4 .
    Inoltre, solo le stringhe ottenibili in questo modo
    appartengono a E4 .
LFC
Esercizi proposti
                                                             Formalismi
                                                             generativi
                                                             Espressioni regolari
                                                             Grammatiche libere

    Scrivere un’e.r. per il linguaggio E5 , sull’alfabeto    Altri tipi di grammatica



    {a, b, c}, costituito dalle stringhe in cui ogni
    occorrenza di b è seguita da almeno un’occorrenza
    di c.
    Descrivere nel modo più semplice possibile, in
    Italiano, il linguaggio corrispondente alla seguente
    espressione regolare: ((a|b)3 )∗ (a|b).
    Si dica qual è la stringa più corta che non appartiene
    al linguaggio descritto dall’espressione regolare
    a∗ (ab)∗ b∗ .
LFC
Linguaggi formali e compilazione
                                      Formalismi
                                      generativi
                                      Espressioni regolari
                                      Grammatiche libere
                                      Altri tipi di grammatica




Formalismi generativi
   Espressioni e linguaggi regolari
   Grammatiche libere
   Altri tipi di grammatiche
LFC
Grammatiche formali
                                                           Formalismi
   Come le espressioni regolari, anche le grammatiche      generativi
                                                           Espressioni regolari
   formali sono uno strumento per la descrizione di        Grammatiche libere
                                                           Altri tipi di grammatica
   linguaggi.
   Sono un formalismo generativo perché il linguaggio è
   definito come l’insieme delle stringhe che possono
   essere “generate” usando le regole della
   grammatica.
   Le grammatiche libere (Context-Free Grammar o
   semplicemente CFG) sono un particolare tipo di
   grammatica formale che trova ampio uso nella
   definizione dei linguaggi di programmazione.
   Solo per fare un esempio, la struttura a blocchi dei
   programmi scritti in Pascal (C, C++, Java, ...) viene
   descritta mediante grammatiche libere.
LFC
Definizione formale di grammatica
    Una grammatica G è una quadrupla di elementi:         Formalismi
                                                          generativi

                      G = (N , T , P, S),                 Espressioni regolari
                                                          Grammatiche libere
                                                          Altri tipi di grammatica


    dove
        N è un insieme di simboli, detti non terminali;
        T è un insieme di simboli terminali, N ∩ T = Φ;
        P è l’insieme delle produzioni;
        S ∈ N è il simbolo iniziale (o assioma).
    Conviene anche definire l’insieme V = N ∪ T come il
    vocabolario della grammatica.
    La forma delle produzioni è ciò che caratterizza il
    “tipo” di grammatica.
    In una grammatica libera le produzioni hanno la
    seguente forma
                           A→α
    dove A ∈ N e α ∈ V ∗
LFC
Un primo esempio di grammatica libera
                                                              Formalismi
                  N       {E}
                      =                                       generativi
                                                              Espressioni regolari

                  T       {(, ), +, ∗, id}
                      =                                       Grammatiche libere
                                                              Altri tipi di grammatica

                  S       E
                      =
                  P       {E → E+E,
                      =
                           E → E∗E,
                           E → (E),
                           E → id
                          }

    Si noti la presenza, nella definizione di una
    grammatica, dei cosiddetti metasimboli, simboli cioè
    che non sono terminali ne’ non terminali.
    Esempi di metasimboli sono le parentesi graffe (che
    hanno il solito significato di descrizione di insieme) e
    la freccia orientata a destra (→).
LFC
Derivazioni
                                                             Formalismi
                                                             generativi
    Le grammatiche sono formalismi generativi perchè         Espressioni regolari

    consentono di “generare” stringhe di caratteri tramite   Grammatiche libere
                                                             Altri tipi di grammatica

    il meccanismo delle derivazioni.
    Una derivazione è il processo mediante il quale, a
    partire dall’assioma ed applicando una sequenza di
    produzioni, si arriva a scrivere una stringa di T ∗ .
    Al riguardo le produzioni sono anche dette regole di
    riscrittura.
    Una produzione del tipo

                         E → E+E

    si legge infatti nel seguente modo: Il simbolo E può
    essere “riscritto” come E+E.
LFC
Derivazioni (continua)
                                                               Formalismi
    Sia α = βAγ, dove A ∈ N e β, γ ∈ V ∗ e sia A → δ           generativi
                                                               Espressioni regolari

    una produzione di G.                                       Grammatiche libere
                                                               Altri tipi di grammatica


    Applicare la produzione A → δ alla stringa α
    consente di sostituire (“riscrivere”) il non terminale A
    con il lato destro δ della produzione, ottenendo la
    stringa βδγ.
    Si dice che α deriva direttamente la stringa βδγ e si
    scrive
                          α ⇒G βδγ
    Se α1 ⇒G α2 ⇒G . . . ⇒G αk , k ≥ 1, allora si dice
    che α1 deriva αk e si scrive α1 ⇒∗ αk .
                                     G
    Qualora non possano sorgere ambiguità eviteremo di
    indicare la grammatica nella notazione ⇒G .
LFC
Esempi
                                                       Formalismi
Chiamiamo G1 la grammatica precedentemente             generativi
                                                       Espressioni regolari

introdotta. Allora:                                    Grammatiche libere
                                                       Altri tipi di grammatica




   E+E ⇒G1 id+E tramite l’applicazione della
   produzione E → id alla prima occorrenza di E.
   E+E ⇒∗ 1 id + id tramite l’applicazione della
           G
   produzione E → id ad entrambe le occorrenze di E.
   E ⇒∗ 1 id + (E) in quanto
      G
   E ⇒G1 E+E ⇒G1 E+(E) ⇒G1 id + (E).
   E ⇒∗ 1 id + (id), in quanto E ⇒G1 E+E ⇒G1
      G
   E+(E) ⇒G1 id + (E) ⇒G1 id + (id).
   Una derivazione alternativa per id + (id) è E ⇒G1
   E+E ⇒G1 id+E ⇒G1 id + (E) ⇒G1 id + (id).
LFC
Frasi e linguaggio generato da una
grammatica
                                                            Formalismi
                                                            generativi
                                                            Espressioni regolari

Sia G = (N , T , P, S) una grammatica.                      Grammatiche libere
                                                            Altri tipi di grammatica


    Si chiama forma di frase di G una qualunque stringa
    α di V ∗ tale che S ⇒∗ α.
                         G
    Se α ∈ T ∗ allora si dice che α è una frase di G.
    Il linguaggio generato da G (che indicheremo spesso
    con la notazione L(G)) è l’insieme delle frasi di G.
    Dagli esempi precedenti possiamo conlcudere che le
    stringhe id + (E) e id + (id) sono forme di frase di
    G1 ; id + (id) è anche una frase e dunque è nel
    linguaggio L(G).
    Se la grammatica è libera da contesto allora anche il
    linguaggio viene detto libero (da contesto).
LFC
Esempi
                                                           Formalismi
                                                           generativi
   La grammatica G1 genera il linguaggio delle             Espressioni regolari
                                                           Grammatiche libere

   espressioni aritmetiche composte da +, *, (, ) e id.    Altri tipi di grammatica



   Le stringhe più corte in L(G1 ) sono
   id, id + id, id ∗ id, (id).
   Il linguaggio {ab, c}∗ è libero perché generato da

              S → SS, S → ab, S → c, S →

   Il linguaggio L11 su {a, b} costituito da tutte le
   stringhe α palindrome (cioè tali che αR = α) è libero
   in quanto generabile dalla grammatica

         S → aSa, S → bSb, S → a, S → b, S →
LFC
Un esempio più complesso: le e.r. come
linguaggio libero
                                                             Formalismi
                                                             generativi
                                                             Espressioni regolari
    La grammatica G2 così definita                            Grammatiche libere
                                                             Altri tipi di grammatica



               N       {E, T , F , A}
                   =
               T       {0, 1, (, ), +, ∗, Φ, }
                   =
               S       E
                   =
               P       {E → T , E → T +E,
                   =
                         T → F , T → FT ,
                         F → (E), F → (E)* ,
                         F → A, F → A* ,
                         A → 0, A → 1
                       }

    genera tutte le stringhe sull’alfabeto
    0, 1, (, ), +, ∗, Φ, che sono espressioni regolari ben
    formate.
LFC
Esempio
   La stringa (epressione regolare) 0(0+1)∗       Formalismi
   appartiene a L(G2 ) causa la derivazione:      generativi
                                                  Espressioni regolari
                                                  Grammatiche libere

           ⇒G2
       E         T                                Altri tipi di grammatica



           ⇒G2                 Usando T → FT
                 FT
           ⇒G2                 Usando T → F
                 FF
           ⇒G2                 Usando F → A
                 AF
                 A(E)∗         Usando F → (E)∗
           ⇒G2
                 0(E)∗
           ⇒G2                 Usando A → 0
                 0(T + E)∗
           ⇒G2                 Usando E → T + E
                 0(T + T )∗
           ⇒G2                 Usando E → T
                 0(F + T )∗
           ⇒G2                 Usando T → F
                 0(F + F )∗
           ⇒G2                 Usando T → F
                 0(A + F )∗
           ⇒G2                 Usando F → A
                 0(A + A)∗
           ⇒G2                 Usando F → A
                 0(0 + A)∗
           ⇒G2                 Usando A → 0
                 0(0 + 1)∗
           ⇒G2                 Usando A → 1
LFC
Linguaggio generato da una grammatica
(continua)
                                                            Formalismi
                                                            generativi
                                                            Espressioni regolari
                                                            Grammatiche libere
   Per dimostrare formalmente che una data                  Altri tipi di grammatica


   grammatica G genera un dato linguaggio L (cioè per
   provare che L = L(G)) si procede solitamente per
   induzione.
   Dapprima si formula una congettura sulla forma delle
   frasi di L(G), di solito provando alcune semplici
   derivazioni.
   Dopodiché si dimostra separatamente (per
   induzione) che:
       se X è generata dal linguaggio, allora X ha quella
       particolare forma;
       se X è una stringa con quella particolare forma,
       allora è generabile dal linguaggio.
LFC
Esempio
   Si consideri laseguente grammatica:                    Formalismi
                                                          generativi
                                                          Espressioni regolari
                                                          Grammatiche libere
                    N       {A, B}
                        =                                 Altri tipi di grammatica


                    T       {a, b}
                        =
                    S       A
                        =
                    P       {A → aA,
                        =
                             A → B,
                             B → bB,
                             B→
                            }

   Vogliamo dimostrare che
   L(G) = L5 = {an bm |n, m ≥ 0}.
   Dimostriamo che, se X ∈ L(G), allora X = an bm , per
   opportuni valori di n ed m. La dimostrazione procede
   per induzione sulla lunghezza k delle derivazioni.
LFC
Esempio (continua)
    Preliminarmente, osserviamo che una derivazione
                                                              Formalismi
    lunga k (k ≥ 1) genera, a partire da B, la stringa        generativi

    bk −1 (anche questa è una semplice induzione).            Espressioni regolari
                                                              Grammatiche libere
                                                              Altri tipi di grammatica
    Per tornare a L(G), la base dell’induzione è costituita
    dall’unica derivazione lunga 2 (la più corta):
    A ⇒ B ⇒ , che genera una stringa della forma
    voluta (con n = m = 0).
    Dimostriamo ora che la tesi è vera per derivazioni
    lunghe k > 2.
    Per una tale derivazione possiamo scrivere
                        A ⇒ aA ⇒∗ X ,
    oppure
                        A ⇒ B ⇒∗ X ,
    L’applicazione ad X dell’ipotesi induttiva (nel primo
    caso) o del risultato preliminare (secondo caso)
    porta agevolmente alla tesi.
LFC
Esempio (continua)
                                                            Formalismi
                                                            generativi
                                                            Espressioni regolari


    Dimostrare che ogni stringa della forma an bm           Grammatiche libere
                                                            Altri tipi di grammatica


    appartiene al linguaggio è ancora più semplice.
    an bm è infatti generabile dalla seguente derivazione
    di lunghezza n + m + 2

            A ⇒∗ an A ⇒ an B ⇒∗ an bm B ⇒ an bm

    costituita da
        n applicazioni della regola A → aA;
        una applicazione di A → B;
        m applicazioni di B → bB;
        una applicazione di B → .
LFC
Equivalenza
                                                        Formalismi
   Due grammatiche G e G si dicono equivalenti se       generativi
                                                        Espressioni regolari
   generano lo stesso linguaggio.                       Grammatiche libere
                                                        Altri tipi di grammatica

   In alcuni testi, la sola coincidenza dei linguaggi
   generati viene detta equivalenza debole.
   In seguito vedremo diverse trasformazioni delle
   grammatiche che conservano il linguaggio.
   Un primo semplice esempio è costituito dalla
   grammatica G1 e dalla seguente grammatica:

                          → E+T | T
                      E
                          → T ∗F | F
                      T
                          → id | (E)
                      F

   che risultano essere (debolmente) equivalenti.
LFC
Convenzioni notazionali
    I simboli non terminali, detti anche variabili         Formalismi
    sintattiche, verranno spesso espressi (come nel caso   generativi
                                                           Espressioni regolari

    della grammatica appena introdotta) usando lettere     Grammatiche libere
                                                           Altri tipi di grammatica

    maiuscole in corsivo.
    La scrittura

                   E → E+E | E∗E | (E) | id

    verrà utilizzata come abbreviazione per

                            → E+E,
                        E
                            → E∗E,
                        E
                            → (E),
                        E
                            → id
                        E

    Il metasimbolo | (barra verticale) indica dunque
    alternativa.
LFC
Descrizione succinta di una grammatica
                                                         Formalismi
                                                         generativi
    Se si conviene di elencare per prime le produzioni   Espressioni regolari

    relative al simbolo iniziale, una grammatica può     Grammatiche libere
                                                         Altri tipi di grammatica

    essere espressa semplicemente tramite le
    produzioni (in realtà abbiamo già usato questa
    convenzione).
    Ad esempio, la grammatica G2 che descrive le
    espressioni regolari su {a, b} può essere
    semplicemente descritta come

                     → T | T +E
                 E
                     → F | FT
                 T
                     → (E) | (E)∗ | A | A∗
                 F
                 A → 0|1
LFC
Backus-Naur Form (BNF)
   Nella descrizione della sintassi dei linguaggi di     Formalismi
                                                         generativi
   programmazione le variabili sintattiche vengono       Espressioni regolari
                                                         Grammatiche libere

   rappresentate mediante un identificatore descrittivo   Altri tipi di grammatica


   racchiuso fra parentesi angolate.
   Esempio

                    → if espressione booleana then
       comando if
                                lista di comandi
                         endif |
                         if espressione booleana then
                                lista di comandi
                         else
                                lista di comandi
                         endif
LFC
Altri esempi
                                                                Formalismi
                                                                generativi
    Nella BNF, la grammatica G1 viene descritta dalle               Espressioni regolari
                                                                    Grammatiche libere
    seguenti produzioni                                             Altri tipi di grammatica




                      →     espressione + espressione |
       espressione
                      →     espressione ∗ espressione |
       espressione
                      → ( espressione ) | id
       espressione

    Una grammatica per le chiamate di procedura in Java

                            → id( parametri-opzionali )
               chiamata
                            →    lista-di-parametri |
     parametri-opzionali
                            →    lista-di-parametri , parametro |
       lista-di-parametri
                                 parametro
LFC
Altre convenzioni
    Elementi opzionali possono essere inclusi fra i meta   Formalismi
                                                           generativi
    simboli [ e ].                                         Espressioni regolari
                                                           Grammatiche libere

    Ad esempio, potremo usare la scrittura                 Altri tipi di grammatica




                          → if espressione booleana then
         comando if
                                   lista di comandi
                              [ else
                                   lista di comandi ]
                              endif

    Elementi ripetitivi possono essere inclusi fra i
    metasimboli { e }.
    Ad esempio

                            →     comando { ; comando }
        list di comandi
LFC
Altre convenzioni (continua)
                                                              Formalismi
    Più recentemente, nella BNF i simboli terminali (detti    generativi
    anche token name) vengono scritti in grassetto.           Espressioni regolari
                                                              Grammatiche libere
                                                              Altri tipi di grammatica
    In questo modo diventa possibile sopprimere l’uso
    delle parentesi angolate intorno alle variabili
    sintattiche, migliorando la leggibilità complessiva. Le
    variabili sintattiche continuano ad essere scritte in
    corsivo.
    Ad esempio, potremo scrivere

                     → if espressione booleana then
       comando if
                             lista di comandi
                         [ else
                             lista di comandi ]
                         endif
LFC
Altre convenzioni (continua)
                                                            Formalismi
                                                            generativi
                                                            Espressioni regolari
                                                            Grammatiche libere
                                                            Altri tipi di grammatica



    Nel caso in cui possano sorgere ambiguità, i simboli
    terminali vengono racchiusi fra doppi apici.
    Un esempio è costituita dal caso di simboli terminali
    coincidenti con qualche metasimbolo.
    Esempio (tratto dalla sintassi del C):

    comando composto → { { dichiarazione } { comando } }
LFC
Esercizi proposti
                                                             Formalismi
    Fornire una grammatica libera per l’insieme delle        generativi
                                                             Espressioni regolari

    stringhe costituite da parentesi correttamente           Grammatiche libere
                                                             Altri tipi di grammatica

    bilanciate (ad esempio, ()(()) e (()) devono far parte
    del linguaggio, mentre ())( non deve farne parte).
    Fornire una grammatica libera per il linguaggio
    L12 = {an b2n |n > 0} sull’alfabeto {a, b}.
    Si consideri la seguente grammatica GI

          S → I | A,
           I → if B then S | if B then S else S,
          A → a, B → b

    e si fornisca una derivazione per la stringa
                 if b then if b then a else a
LFC
Alberi di derivazione (parse tree)
    Un parse tree illustra graficamente il processo di               Formalismi
                                                                    generativi
    derivazione di una stringa a partire dal simbolo                Espressioni regolari
                                                                    Grammatiche libere

    iniziale (o, più genericamente, da un non terminale).           Altri tipi di grammatica



    Formalmente, un parse tree per una grammatica
    libera G = N , T , P, S è un albero radicato ed
    etichettato che soddisfa le seguenti proprietà:
        i nodi interni sono etichettati con simboli di N e, in
        particolare, la radice è etichettata con l’assioma;
        le foglie sono etichettate con simboli di T o con il
        simbolo ;
        se A ∈ N etichetta un nodo interno e X1 , . . . , Xk sono
        le etichette dei figli di (il nodo con etichetta) A, con
        Xi ∈ V, allora deve esistere in P la produzione
        A → X1 X2 . . . Xk ;
        Se A ∈ N etichetta un nodo interno il cui unico figlio
        è un nodo con etichetta , allora deve esistere in P la
        produzione A → .
LFC
Esempi
                                                    Formalismi
                                                    generativi
   Parse tree per la stringa id ∗ (id + id) nella   Espressioni regolari
                                                    Grammatiche libere
   grammatica G1                                    Altri tipi di grammatica


                          E



                  E                E
                          *



                               (
                 id                E    )



                                   +
                          id                id
LFC
Esempi
                                                             Formalismi
   Parse tree per la stringa                                 generativi
                                                             Espressioni regolari

                if b then if b then a else a                 Grammatiche libere
                                                             Altri tipi di grammatica


   nella grammatica GI
                               S

                               I

    if         then                               else
           B                       S                     S

           b                       I                     a

                       if              then
                               B              S

                               b              a
LFC
Alberi di derivazione (parse tree)
    Un parse tree impone una struttura sintattica alle          Formalismi
                                                                generativi
    frasi e questo è generalmente il primo passo per            Espressioni regolari

    attribuire ad esse un significato.                           Grammatiche libere
                                                                Altri tipi di grammatica


    La struttura sintattica può essere vista in maniera
    ricorsiva come composizione della struttura di
    (sotto)frasi corrispondenti a sottoalberi del parse
    tree.
    In particolare, il sottoalbero radicato in un nodo con
    etichetta A ∈ N fornisce la struttura della frase
    derivata a partire da A.
    Nel caso del parse tree relativo alla frase
    id ∗ (id + id), il sottoalbero radicato nel nodo indicato
    dalla freccia fornisce la struttura sintattica
    dell’espressione fra parentesi e l’albero nella sua
    interezza mostra la struttura della frase come
    composizione di espressioni.
LFC
Parse tree e derivazioni
                                                               Formalismi
                                                               generativi
    Un risultato fondamentale afferma che α è una frase        Espressioni regolari
                                                               Grammatiche libere
    di una grammatica G (cioè può essere derivata in G         Altri tipi di grammatica


    a partire dal simbolo iniziale) se e solo se esiste in G
    un parse tree per α.
    In generale, una frase di una grammatica può essere
    ottenuta mediante più di una derivazione (si
    rammenti l’esempio di id + (id) nella grammatica G1 ).
    In particolare, ad un dato parse tree per α possono
    corrispondere più derivazioni.
    Per definire con precisione il comportamento di un
    parser (come vedremo) è conveniente eliminare
    questa “ridondanza” limitandoci a considerare solo
    particolari derivazioni.
LFC
Derivazioni canoniche
                                                               Formalismi
    Si dice che S ⇒∗ α è una derivazione canonica              generativi
                       G                                       Espressioni regolari
    sinistra della frase α in G, se in essa ad ogni passo      Grammatiche libere
                                                               Altri tipi di grammatica
    viene riscritto il simbolo non terminale più a sinistra.
    Analoga definizione vale per la derivazione canonica
    destra.
    Delle due derivazioni viste per id + (id) in G1 , la
    seconda è una derivazione canonica sinistra, mentre
    la prima non è una derivazione canonica.
    Se α ∈ V ∗ (cioè se α è una forma di frase) e S ⇒∗ α  G
    mediante una derivazione canonica sinistra (destra),
    si dice che α è una forma di frase sinistra (destra); il
    termine inglese utilizzato è left/right sentential form.
    Considerare derivazioni canoniche può non essere
    sufficiente ad eliminare ambiguità.
LFC
Esempio
   La frase id + id + id di G1 può essere ottenuta
                                                            Formalismi
   mediante due differenti derivazioni canoniche destre,    generativi
                                                            Espressioni regolari
   e precisamente                                           Grammatiche libere
                                                            Altri tipi di grammatica


                       ⇒G1
                   E          E+E
                       ⇒G1    E+E+E
                       ⇒G1    E+E+id
                       ⇒G1    E+id+id
                       ⇒G1    id + id + id
   e
                       ⇒G1
                   E          E+E
                       ⇒G1    E+id
                       ⇒G1    E+E+id
                       ⇒G1    E+id+id
                       ⇒G1    id + id + id
   (dove i simboli non terminali sottolineati sono quelli
   che verranno espansi al passo successivo).
LFC
Ambiguità
   Abbiamo visto che ad una frase può corrispondere        Formalismi
                                                           generativi
   più di una derivazione cononica.                        Espressioni regolari
                                                           Grammatiche libere
                                                           Altri tipi di grammatica
   Tuttavia, per un dato un parse tree esiste una sola
   derivazione canonica sinistra e una sola derivazione
   canonica destra. (NB. D’ora in avanti, ci riferiremo
   alle derivazioni canoniche destre semplicemente
   come alle derivazioni canoniche.)
   Diciamo quindi che una grammatica è ambigua se
   esistono frasi per le quali esistono differenti parse
   tree (equivalentemente, differenti derivazioni
   canoniche sinistre o destre).
   L’ambiguità è un ostacolo alla realizzazione di un
   parser e di norma o viene eliminata alla radice
   (utilizzando grammatiche non ambigue) oppure
   utilizzando opportune regole per la disambiguazione.
LFC
Esempio
                                                            Formalismi
   La grammatica GI è ambigua in quanto alla frase          generativi
                                                            Espressioni regolari

                if b then if b then a else a                Grammatiche libere
                                                            Altri tipi di grammatica


   corrisponde un altro parse tree, e precisamente
                     S

                     I

    if        then
          B                           S

          b                              I

                         if       then           else
                              B              S          S

                              b              a          a
LFC
Aspetti problematici per il parsing
Ci sono alcune caratteristiche delle grammatiche libere
                                                          Formalismi
che possono ostacolare il processo di parsing, o anche    generativi

solo un “certo tipo” di parsing (come vedremo). Ne        Espressioni regolari
                                                          Grammatiche libere

elenchiamo brevemente alcune:                             Altri tipi di grammatica




    ambiguità;
    presenza di simboli non terminali che generano
    linguaggi vuoti;
    simboli non terminali che non compaiono in nessuna
    forma di frase;
    presenza di cicli (derivazioni del tipo A ⇒+ A) o
    comunque di left recursion (derivazioni del tipo
    A ⇒+ Aα, con α = );
    presenza di produzioni A → , dove A = S;
    presenza di prefissi comuni a due o più produzioni
    relative allo stesso non terminale, ad esempio
    A → αβ1 e A → αβ2 .
LFC
Esempi
   La grammatica                                        Formalismi
                                                        generativi
                                                        Espressioni regolari
                                                        Grammatiche libere
                      S → Sa | b                        Altri tipi di grammatica




   presenta una ricorsione immediata a sinistra in
   quanto S → Sa.
   La grammatica

                     S → A|b
                     A → Aa | Sa

   presenta una ricorsione a sinistra in quanto
   S ⇒+ Sa.
   La grammatica GI (oltre ad essere ambigua)
   presenta un prefisso comune alla due produzioni che
   riscrivono il simbolo I.
LFC
Esempi
   Nella grammatica
                                                      Formalismi
                                                      generativi
                        S → SA                        Espressioni regolari
                                                      Grammatiche libere

                        A → a|                        Altri tipi di grammatica




   c’è una produzione A → e questa provoca il ciclo
   S ⇒+ S.
   Nella grammatica
                         S → aS
                         A→a
   il non terminale A è irraggiungibile da S.
   Nella grammatica
                     S → aS | a | A
                      A → Aa
   il non terminale A genera il linguaggio vuoto.
LFC
Scrittura di una grammatica per il parsing
    Terminiamo questa parte del corso sulle CFG             Formalismi
    presentando una serie di algoritmi per la “rimozione”   generativi
                                                            Espressioni regolari
    degli aspetti problematici cui abbiamo fatto cenno.     Grammatiche libere
                                                            Altri tipi di grammatica

    Ci serve qualche definizione.
    Raggiungibilità Un non terminale è raggiungibile se
                  può comparire in una forma di frase.
    Buona definizione Un non terminale è ben definito
                  se non genera il linguaggio vuoto.
         Pulizia Si dice che una grammatica è pulita se
                  non contiene cicli e ogni non terminale
                  è raggiungibile e ben definito.
    Annullabilità Un non terminale A è annullabile se
                  A ⇒+ .
    Prefissi comuni Presenza di coppie di produzioni del
                  tipo A → αβ1 e A → αβ2 .
    Ricorsione sinistra Presenza di derivazioni del tipo
                  A ⇒+ Aα.
LFC
Rimozione dei non terminali non ben definiti
                                                              Formalismi
    Per eliminare i simboli non terminali che generano un     generativi
                                                              Espressioni regolari
    linguaggio vuoto si calcola dapprima l’insieme            Grammatiche libere
                                                              Altri tipi di grammatica
    complemento, costituito dai non terminali ben definiti,
    mediante un algoritmo di chiusura.
    Chiameremo D tale insieme.
    La base dell’algoritmo pone in D tutti quei terminali A
    per i quali esiste una produzione A → α, con α ∈ T ∗ .
    Il passo ricorsivo consiste nell’aggiungere a D quei
    simboli non terminali A per i quali esiste una
    produzione A → α in cui α contiene simboli terminali
    o simboli già in D.
    Quando il passo ricorsivo non aggiunge nulla a D,
    l’algoritmo termina e l’insieme dei non terminali non
    ben definiti è N D.
LFC
Esempio
   Si consideri la grammatica G così definita:                Formalismi
                                                             generativi
                                                             Espressioni regolari
                   S → aA b | bDEa                           Grammatiche libere
                                                             Altri tipi di grammatica

                   A→        | aA | D
                   B → b | bC
                   C → cE
                   D → dA
                       → eC
                   E
                       → fD
                   F

   L’insieme D viene calcolato inserendo dapprima i
   simboli A e B (passo base), quindi S e D, infine F .
   Ne consegue che C ed E sono non ben definiti.
   Come “effetto collaterale” è possibile eliminare quelle
   produzioni inutili che, come S → bDEa, contengono
   a destra simboli non ben definiti.
LFC
Esempio (continua)
                                                              Formalismi
                                                              generativi
                                                              Espressioni regolari
                                                              Grammatiche libere
                                                              Altri tipi di grammatica
    Dopo l’eliminazione dei non terminali non ben definiti
    e delle produzioni inutili si ottiene la grammatica G ,
    equivalente a G:

                      S → aA b
                      A→        | aA | D
                      B→b
                      D → dA
                          → fD
                      F
LFC
Rimozione dei non terminali non raggiungibili
                                                             Formalismi
    Il problema dell’eliminazione dei simboli non            generativi
                                                             Espressioni regolari
    raggiungibili può essere visto come una semplice         Grammatiche libere
                                                             Altri tipi di grammatica
    istanza del problema della raggiungibilità in un grafo
    orientato.
    Data una CFG G si costruisce un grafo orientato
    G = (V , E) nel seguente modo: l’insieme V dei
    vertici contiene un elemento corrispondente ad ogni
    non terminale di G; l’insieme E contiene una coppia
    (arco orientato) A, B se e solo se esiste una
    produzione A → αBβ, α, β ∈ V ∗ .
    L’esecuzione dell’algoritmo BFS consente di stabilire
    i nodi raggiungibili dal nodo (corrispondente ad) S.
    Si può quindi procedere all’eliminazione dei non
    terminali corrispondenti ai vertici non raggiunti.
LFC
Esempio (continua)
    Eseguendo la BFS sul grafo corrispondente a G         Formalismi
                                                          generativi
                                                          Espressioni regolari
                             A              D             Grammatiche libere
                                                          Altri tipi di grammatica


                   S


                                  F
                         B



    si scopre che B ed F non sono raggiungibili da S.
    La loro eliminazione porta alla grammatica
    equivalente G :

                       S → aA b
                       A→        | aA | D
                       D → dA

    È ora facile vedere che il linguaggio generato da G
    è a(a|d)∗ b.
LFC
Eliminazione dei non terminali annullabili
                                                            Formalismi
                                                            generativi
                                                            Espressioni regolari
                                                            Grammatiche libere
    L’algoritmo calcola l’insieme E dei simboli non         Altri tipi di grammatica


    terminali a partire dai quali è possibile derivare .

          E ← {A ∈ N |A → ∈ P}
     1:
          while ∃A → A1 . . . Ak t.c. Ai ∈ E & A ∈ E do
     2:
             E ← E ∪ {A}
     3:
          end while
     4:
          Elimina da P le produzioni del tipo A →
     5:
          Elimina i non terminali di E dalle restanti
     6:
          produzioni in tutti i modi (combinatorialmente)
          possibili
LFC
Esempio
                                                         Formalismi
                                                         generativi
   Si consideri la grammatica:                           Espressioni regolari
                                                         Grammatiche libere
                                                         Altri tipi di grammatica

                     S → A|
                     A → aAC | SB
                     B → bB | b |
                     C→c

   Inizialmente si pone E = {S, B}, poiché S e B sono
   immediatamente annullabili.
   Poiché esiste la produzione A → SB, al secondo
   passo il non terminale A viene inserito in E.
   Nessun altro non terminale può essere aggiunto a E.
   Risulta quindi E = {S, A, B}.
LFC
Esempio (continua)
    Dopo l’eliminazione delle produzioni del tipo: A →
                                                              Formalismi
                                                              generativi
                       S→A                                    Espressioni regolari
                                                              Grammatiche libere

                       A → aAC | SB                           Altri tipi di grammatica



                       B → bB | b
                      C→c
    dopo la cancellazione dei non terminali in E in tutti i
    modi combinatorialmente possibili:
                S→A
                A → aAC | aC | SB | S | B
                B → b | bB
               C→c
    La grammatica modificata è equivalente alla
    grammatica di partenza, salvo che non può generare
    la stringa vuota.
LFC
Esempio (continua)
                                                       Formalismi
                                                       generativi
                                                       Espressioni regolari
                                                       Grammatiche libere
    Per rendere del tutto equivalenti le grammatiche   Altri tipi di grammatica


    possiamo aggiungere un nuovo assioma S con le
    produzioni S → S | .
    La grammatica “completa” diviene quindi:

                  → S|
              S
               S→A
               A → aAC | aC | SB | S | B
               B → b | bB
               C→c
LFC
Eliminazione dei cicli
    I cicli, cioè derivazioni del tipo A ⇒+ A, sono non
                                                             Formalismi
    solo inutili ma anche dannosi, in quanto danno           generativi
    origine ad ambiguità.                                    Espressioni regolari
                                                             Grammatiche libere

    Un algoritmo per eliminare i cicli elimina più in        Altri tipi di grammatica



    generale le produzioni che danno origine a
    derivazioni del tipo A ⇒+ B.
    Si suppone che non ci siano non terminali annullabili.
    In una tale grammatica, la possibilità che risulti
    A ⇒+ B può essere solo conseguenza di una catena
    di cosiddette produzioni singole:
                          A → A1
                             → A2
                                  ...
                             → Ak
                             →B
    che sono facili da individuare.
LFC
Eliminazione dei cicli (continua)
                                                            Formalismi
                                                            generativi
                                                            Espressioni regolari
                                                            Grammatiche libere

    Si consideri ora una generica coppia A, B tale che      Altri tipi di grammatica



    A ⇒+ B; se

                     B → α1 | . . . | αr

    sono le produzioni (non singole) di B, allora si
    aggiungono alla grammatica le produzioni

                     A → α1 | . . . | αr

    Al termine, si eliminano tutte le produzioni singole.
LFC
Esempio
   Si consideri ancora la grammatica:             Formalismi
                                                  generativi
                                                  Espressioni regolari

                 → S|
             S                                    Grammatiche libere
                                                  Altri tipi di grammatica


              S→A
              A → aAC | aC | SB | S | B
              B → b | bB
              C→c

   È facile vedere che risulta: S ⇒+ S, S ⇒+ A,
   S ⇒+ B, S ⇒+ A, S ⇒+ B, S ⇒+ S, A ⇒+ B.
   Le produzioni che vanno aggiunte sono quindi

                 → aAC | aC | SB | b | bB
             S
             S → aAC | aC | SB | b | bB
             A → b | bB
LFC
Esempio (continua)
    La grammatica risultante (priva di cicli) è:    Formalismi
                                                    generativi
                                                    Espressioni regolari

                   → aAC | aC | SB | b | bB |
             S                                      Grammatiche libere
                                                    Altri tipi di grammatica


              S → aAC | aC | SB | b | bB
              A → aAC | aC | SB | b | bB
              B → b | bB
             C→c

    Una grammatica equivalente ma più semplice (e
    sempre senza cicli) è:

                    → S|
               S
                 S → aSC | aC | SB | b | bB
                 B → b | bB
                 C→c
LFC
Eliminazione delle ricorsioni sinistre
                                                                  Formalismi
                                                                  generativi
                                                                  Espressioni regolari
                                                                  Grammatiche libere
    Si può assumere che la grammatica in input non                Altri tipi di grammatica


    contenga non terminali annullabili ne’ cicli.
    Sia A1 , . . . , An un ordinamento (arbitrario) dei simboli
    non terminali.
    L’idea dell’algoritmo è di far sì che ogni produzione
    del tipo Ai → Aj α abbia sempre i < j.
    L’algoritmo consta di due cicli annidati:
     1. Nel ciclo esterno (con iteratore i) vengono eliminate
        le ricorsioni immediate Ai → Ai α;
     2. Nel ciclo interno (con iteratore j) vengono modificate
        quelle produzioni del tipo Ai → Aj α in cui j < i.
LFC
Eliminazione delle ricorsioni sinistre
(continua)
                                                                 Formalismi
                                                                 generativi
                                                                 Espressioni regolari
                                                                 Grammatiche libere

    Per eliminare tutte le produzioni del tipo A → Aαr ,         Altri tipi di grammatica



    r = 1, 2, . . . , t (per qualche t ≥ 1), si considerano le
    altre produzioni relative al non terminale A

                     A → β1 | β2 | . . . | βm

    in cui nessuna stringa βs inizia per A.
    Le produzioni per A vengono quindi sostituite nel
    modo seguente

               A → β1 A | β2 A | . . . | βm A
                   → α1 A | α2 A | . . . | αt A |
              A
LFC
Eliminazione delle ricorsioni sinistre
(continua)
                                                          Formalismi
                                                          generativi
                                                          Espressioni regolari
                                                          Grammatiche libere
                                                          Altri tipi di grammatica

    Per eliminare una produzione del tipo Ai → Aj α si
    considerano le altre produzioni relative al non
    terminale Aj

                     Aj → β1 | β2 | . . . | βp

    in cui nessuna stringa inizia per Aq , q ≤ j.
    La produzione Ai → Aj α viene quindi sostituita nel
    modo seguente

                     → β1 α | β2 α | . . . | βm α
                Ai
LFC
Eliminazione delle ricorsioni sinistre
(continua)
                                                           Formalismi
                                                           generativi
                                                           Espressioni regolari
                                                           Grammatiche libere
                                                           Altri tipi di grammatica




L’algoritmo completo è il seguente
  1: Disponi i non terminali in ordine A1 , . . . , An
  2: for i = 1 to n do
        for j = 1 to i − 1 do
  3:
            Sostituisci le produzioni del tipo Ai → Aj α
  4:
        end for
  5:
        Sostituisci le produzioni del tipo Ai → Ai α
  6:
  7: end for
LFC
Esempio
                                                         Formalismi
                                                         generativi
                                                         Espressioni regolari
   Consideriamo ancora la grammatica G1 per le           Grammatiche libere
                                                         Altri tipi di grammatica
   espressioni

                     → E + E | E ∗ E | (E) | id
             E

   che contiene solo ricorsioni immediate (anche
   perché contiene un solo non terminale).
   Le produzioni vengono sostituite nel modo seguente,
   con l’introduzione di un non terminale E

                       → (E) E | id E
                 E
                       → +E E | ∗ E E |
                 E
LFC
Esempio
   Consideriamo la grammatica così definita:
                                                         Formalismi
                                                         generativi
                      A → Bb | a                         Espressioni regolari
                                                         Grammatiche libere
                      B → Bb | Ac                        Altri tipi di grammatica




   che consente la derivazione A ⇒+ Acb.
   Se nell’ordinamento dei non terminali A si fa
   precedere a B diviene necessario eliminare la
   produzione B → Ac.
   Questo comporta l’introduzione delle due produzioni
   B → Bbc | ac.
   La successiva eliminazione delle ricorsioni
   immediate (B → Bb | Bbc) porta alla seguente
   grammatica modificata
                  A → Bb | a
                  B → acB
                      → bB | bcB |
                  B
LFC
Eliminazione delle ambiguità
                                                              Formalismi
                                                              generativi
    Da un punto di vista algoritmico il problema è            Espressioni regolari
                                                              Grammatiche libere
    notevolmente più complicato.                              Altri tipi di grammatica


    Addirittura, se non si fanno restrizioni di altro tipo
    sulla grammatica libera G in input, il problema di
    stabilire se G è ambigua non ammette algoritmo
    (problema indecidibile).
    Gli algoritmi esistono per sottoclassi delle
    grammatiche libere.
    Nella pratica la soluzione consiste nel “progettare” la
    grammatica in modo che essa sia non ambigua
    (piuttosto che verificarlo a posteriori) evitando una
    serie di errori che possono generare ambiguità.
    Esamineremo alcuni degli accorgimenti da utilizzare
LFC
Ambiguità delle frasi condizionali
                                                           Formalismi
                                                           generativi
    Nel contesto dei linguaggi di programmazione è         Espressioni regolari

    consuetudine interpretare la frase ambigua della       Grammatiche libere
                                                           Altri tipi di grammatica

    grammatca GI
          if cond then if cond then stmt else stmt
    nel seguente modo:
    if cond then
       begin
        if cond then stmt else stmt
       end
    associando cioè ogni else con il più vicino then non
    ancora associato.
    Questa regola di solito viene implementata dai
    parser ma non viene forzata dalle produzioni.
LFC
Ambiguità delle frasi condizionali (continua)
    Volendo modificare la grammatica, si introducono
                                                        Formalismi
    due tipologie di istruzione condizionale, che       generativi
                                                        Espressioni regolari
    chiameremo chiusa e aperta                          Grammatiche libere
                                                        Altri tipi di grammatica


               S → O|C
               C → if B then C else C | A
               O → if B then S |
                       if B then C else O
    dove A indica un generico altro comando.
    Se ora riconsideriamo la frase
                   if b then if b then a else a
    dove b ed a indicano, rispettivamente, condizioni
    logiche e comandi generici (non condizionali)
    vediamo che all’interpretazione
            if b then begin if b then a end else a
    non corrisponde nessuna derivazione.
LFC
Esempio
   Consideriamo il seguente frammento di grammatica,       Formalismi
                                                           generativi
   nella quale, rispetto al caso precedente, abbiamo       Espressioni regolari
                                                           Grammatiche libere
   inserito anche un’istruzione iterativa                  Altri tipi di grammatica




             S → O|C
            C → if B then C else C | I | A
            O → if B then S |
                     if B then C else O
             I → while B do S

   Con questa grammatica la stringa
          if b then while b do if b then a else a
   è ambigua, come dimostrano i due possibili alberi di
   derivazioni mostrati nelle successive trasparenze (la
   soluzione è lasciata come esercizio)
LFC
Esempio (continua)
                                S
                                                                        Formalismi
                                                                        generativi
                                                                        Espressioni regolari
                                C                                       Grammatiche libere
                                                                        Altri tipi di grammatica


    if       then                                            else
         B                      C                                   C


         b                      I                                   A


                    while       do
                            B                 S                     a


                            b                 O


                                     if           then
                                          B              S


                                          b              C


                                                         A


                                                         a
LFC
Esempio (continua)
                   S
                                                                       Formalismi
                                                                       generativi
                                                                       Espressioni regolari
                   O                                                   Grammatiche libere
                                                                       Altri tipi di grammatica


   if       then
        B                           S


        b                           C


                                     I


                   while       do
                           B                        S


                           b                        C


                                    if       then           else
                                         B              C          C


                                         b              A          A


                                                        a          a
LFC
Ambiguità legata alla ricorsione
    Se una grammatica ammette (per almeno un simbolo
                                                               Formalismi
    non terminale raggiungibile) risorsioni bilaterali, cioè   generativi
    sia ricorsioni a sinistra che a destra, allora la          Espressioni regolari
                                                               Grammatiche libere

    grammatica è ambigua.                                      Altri tipi di grammatica



    In generale, supponiamo che una data grammatica
    consente una derivazione del tipo A ⇒+ AαA, con
    α ∈ V ∗.
    Sono quindi possibili le seguenti due derivazioni
    della stringa α1 α2 α3 α4 α5 , dove αi ∈ T è derivabile
    da A, i = 1, . . . , 5.
                   A                  A


            A              A    A              A
                      α4             α2


     A            A                       A         A
           α2              α5   α1             α4


     α1          α3                       α3        α5
LFC
Ambiguità legate all’unione di linguaggi
                                                         Formalismi
                                                         generativi
    Se G e G generano i linguaggi L e L , allora un      Espressioni regolari
                                                         Grammatiche libere

    modo immediato per generare il linguaggio            Altri tipi di grammatica


    L = L ∪ L è di usare una grammatica siffatta

                 S → S |S
                    → . . . Produzioni di G
                S
                    → . . . Produzioni di G
                S

    assumendo che S ed S siano gli assiomi
    rispettivamente di G e G e che le due grammatiche
    non abbiano simboli non terminali comuni.
    Tuttavia se L ∩ L = Φ allora la grammatica risulta
    ambigua.
LFC
Esempio
   Sia G la grammatica (già vista) che genera il
                                                             Formalismi
   linguaggio L11 , delle palindrome sull’alfabeto {a, b}:   generativi
                                                             Espressioni regolari

                 P → aPa | bPb | a | b |                     Grammatiche libere
                                                             Altri tipi di grammatica


   Sia G la grammatica (anch’essa già vista) che
   genera il linguaggio L5 , delle stringhe an bm :
                  A → aA | B, B → bB |
   Poiché l’intersezione dei due linguaggi non è vuota
   (contiene stringhe del tipo an e bm ), la grammatica
               S → P|A
               P → aPa | bPb | a | b |
               A → aA | B, B → bB |
   è ambigua.
   Ad esempio, la frase aa ammette le due seguenti
   derivazioni canoniche: S ⇒ aPa ⇒ aa e
   S ⇒ A ⇒ aA ⇒ aaA ⇒ aaB ⇒ aa.
LFC
Ambiguità legate al concatenamento di
linguaggi
                                                          Formalismi
                                                          generativi
                                                          Espressioni regolari
    Se G e G generano i linguaggi L e L , allora un       Grammatiche libere
                                                          Altri tipi di grammatica
    modo immediato per generare il linguaggio L = L L
    è di usare una grammatica siffatta

                 S → SS
                    → . . . Produzioni di G
                S
                    → . . . Produzioni di G
                S

    assumendo che S ed S siano gli assiomi
    rispettivamente di G e G e che le due grammatiche
    non abbiano simboli non terminali comuni.
    Se G può generare le stringhe α1 α2 e α1 e G può
    generare le stringhe α2 α3 e α3 , allora la stringa
    α1 α2 α3 ammette due derivazioni canoniche.
LFC
Esempio
   Il linguaggio L8 (delle stringhe del tipo an bm ck ) può   Formalismi
                                                              generativi
   essere ottenuto come concatenazione dei linguaggi          Espressioni regolari


   {an bm } e {bn cm }, e dunque dalla grammatica:
                                                              Grammatiche libere
                                                              Altri tipi di grammatica




                S → AC
                A → aA | B, B → bB |
                C → bC | D, D → cD |

   che però risulta ambigua, a causa della capacità di
   entrambe le grammatiche “componenti” di generare
   le stringhe bn .
   Ad esempio, per la stringa abc si possono dare le
   seguenti due derivazioni canoniche: S ⇒ AC ⇒
   AD ⇒ AcD ⇒ Ac ⇒ aAc ⇒ aBc ⇒ abBc ⇒ abc e
   S ⇒ AC ⇒ AbC ⇒ AbD ⇒ AbcD ⇒ Abc ⇒
   aAbc ⇒ aBbc ⇒ abc.
LFC
Precedenza degli operatori
                                                          Formalismi
    La grammatica G1 fornisce un esempio di ambiguità     generativi
                                                          Espressioni regolari

    legata alla presenza di produzioni bilaterali         Grammatiche libere
                                                          Altri tipi di grammatica



                         → E+E | E∗E
                     E

    In questo caso è facile eliminare la ricorsione
    bilaterale immediata, introducendo un nuovo simbolo
    non terminale E

                     → E+E | E∗E | E
                 E
                     → id | (E)
                E

    La nuova grammatica non è più ambigua ma, come
    G1 , presenta un problema legato alla precedenza
    degli operatori.
LFC
Precedenza degli operatori (continua)
    Si osservi l’albero di derivazione della stringa         Formalismi
    id + id ∗ id                                             generativi
                                                             Espressioni regolari

                                    E                        Grammatiche libere
                                                             Altri tipi di grammatica




                          E            *   E’


                                           id
                  E       +       E’


                                  id
                  E’


                  id
    Esso suggerisce che l’interpretazione debba essere
    (id + id) ∗ id, che non coincide con l’interpretazione
    che universalmente si dà alla stringa in Matematica.
LFC
Precedenza degli operatori (continua)
                                                              Formalismi
                                                              generativi
    La “usuali” precedenze di operatore possono essere        Espressioni regolari
                                                              Grammatiche libere

    forzate introducendo differenti simboli non terminali     Altri tipi di grammatica



    per i diversi livelli di precedenza.
    Ad esempio, nel caso di somma e prodotto possiamo
    introdurre due livelli di precedenza, rappresentati dai
    non terminali E e T , oltre ad un simbolo (useremo F )
    per la catogoria delle espressioni di base (nel nostro
    caso identificatori ed espressioni tra parentesi):

                          → E+T | T
                      E
                          → T ∗F | F
                      T
                          → id | (E)
                      F
LFC
Precedenza degli operatori (continua)
                                                           Formalismi
                                                           generativi
                                                           Espressioni regolari
                                                           Grammatiche libere
                                                           Altri tipi di grammatica


    La grammatica precedente (con le ovvie estensioni)
    “gestisce” senza ambiguità anche il caso degli
    operatori di divisione e sottrazione, inseriti nelle
    giuste categorie sintattiche:

                      → E+T | E−T | T
                  E
                      → T ∗F | T /F | F
                  T
                      → id | (E)
                  F
LFC
Precedenza degli operatori (continua)
                                                             Formalismi
                                                             generativi
                                                             Espressioni regolari
                                                             Grammatiche libere

    Volendo inserire anche l’operatore di                    Altri tipi di grammatica


    esponenziazione (che ha precedenza maggiore), è
    necessario prevedere un’ulteriore variabile sintattica
    e ricordarsi che l’operatore di esponenziazione (qui
    useremo il simboloˆ) è associativo a destra:

                      → E+T | E−T | T
                  E
                      → T ∗P | T /P | P
                  T
                  P → FˆP | F
                      → id | (E)
                  F
LFC
Esercizi
                                                          Formalismi
                                                          generativi
                                                          Espressioni regolari
                                                          Grammatiche libere

    Si consideri il linguaggio La>b delle stringhe su     Altri tipi di grammatica


    {a, b} che contengono più a che b. Si dica,
    giustificando la risposta, se la seguente grammatica
    libera genera La>b

           S → a | aS | Sa | abS | aSb | Sab |
                  baS | bSa | Sba

    Si formisca una grammatica libera per il linguaggio
    su B contenente tutte e sole le stringhe con un
    diverso numero di 0 e 1.
LFC
Esercizi
    Quali sono le produzioni inutili nella seguente
                                                      Formalismi
    grammatica? (R. Backhouse)                        generativi
                                                      Espressioni regolari

                     A → aDbb | CH                    Grammatiche libere
                                                      Altri tipi di grammatica


                     B → BaH | B
                     C→D
                     D → C|
                         → cEd | b
                     E
                         → BF
                     F
                     H → CD | a
    Si dica se la grammatica
                         S → aA
                         A → AB | B
                         B→b
    è ambigua.
LFC
Esercizi
    Si considerino le seguenti grammatiche per i          Formalismi
    linguaggi L8 ed L9 :                                  generativi
                                                          Espressioni regolari
                                                          Grammatiche libere
                                                          Altri tipi di grammatica
                          → DC
                      S
                      D → aDb |
                      C → cC |

    e

                          → AE
                      S
                          → bEc |
                      E
                       A → aA |

    Si dica quale linguaggio genera la grammatica
    ottenuta “unendo” le due grammatiche per L8 ed L9 ,
    con la produzione iniziale S → S | S , e se la
    grammatica stessa è ambigua.
LFC
Linguaggi formali e compilazione
                                      Formalismi
                                      generativi
                                      Espressioni regolari
                                      Grammatiche libere
                                      Altri tipi di grammatica




Formalismi generativi
   Espressioni e linguaggi regolari
   Grammatiche libere
   Altri tipi di grammatiche
LFC
Grammatiche lineari
    Se le produzioni di una grammatica G sono tutte del      Formalismi
    tipo A → XB o A → X , dove X ∈ T ∗ e B ∈ N , allora      generativi
                                                             Espressioni regolari

    la grammatica è detta lineare destra.                    Grammatiche libere
                                                             Altri tipi di grammatica

    Allo stesso modo, se le produzioni sono del tipo
    A → BX o A → X , G è detta lineare sinistra.
    Grammatiche lineari (destre o sinistre) sono dette
    regolari.
    Si può dimostrare che le espressioni regolari e le
    grammatiche regolari sono formalismi equivalenti; in
    altri termini, un linguaggio è regolare se e solo se è
    generabile da una grammatica regolare.
    Inoltre, poichè le grammatiche regolari sono anche
    libere, ogni linguaggio regolare è anche libero.
    Il viceversa non è vero; infatti il linguaggio
    L6 = {an bn |n ≥ 0} non è regolare ma generabile
    dalla grammatica libera S → aSb | .
LFC
Esempi
                                                            Formalismi
                                                            generativi
                      1)∗
   Il linguaggio 0(0 +   è regolare in quanto               Espressioni regolari
                                                            Grammatiche libere

   generabile dalla seguente grammatica lineare destra      Altri tipi di grammatica




            A → 0B | 0, B → 0 | 1 | 0B | 1B

   Il linguaggio L5 è regolare in quanto generabile dalla
   seguente grammatica lineare destra (come abbiamo
   già visto):

                 S → aS | B, B → bB |

   Il linguaggio {ab, c}∗ è generabile dalla seguente
   grammatica
                      S → abS | cS |
LFC
Grammatiche dipendenti dal contesto
    Se la forma generale delle produzioni è del tipo:
                                                            Formalismi
                                                            generativi
                           α→β                              Espressioni regolari
                                                            Grammatiche libere
                                                            Altri tipi di grammatica


    dove α, β ∈ V ∗ e |α| ≤ |β|, allora la grammatica è
    detta dipendente dal contesto (in inglese,
    context-dependent o context-sensitive o, ancora più
    brevemente, CSG).
    Alternativamente, le produzioni possono essere del
    tipo
                          αAγ → αβγ
    dove α, β, γ ∈ V ∗ , β = e A ∈ N .
    Si può dimostrare che le due forme sono equivalenti
    (cioè generano gli stessi linguaggi).
    Tuttavia, la seconda forma “spiega” meglio il nome di
    queste grammatiche: il simbolo A può essere riscritto
    come β solo se appare nel contesto α − γ.
LFC
Linguaggi dipendenti dal contesto
    Sono così detti i linguaggi generabili da grammatiche   Formalismi
                                                            generativi
    dipendenti dal contesto.                                Espressioni regolari
                                                            Grammatiche libere

    Poiché la forma generale delle produzioni di una        Altri tipi di grammatica



    CSG sono più generali di quelle di una CFG,
    l’insieme dei linguaggi dipendenti dal contesto
    “contiene” l’insieme dei linguaggi liberi.
    (Si noti che la stringa vuota può essere sempre
    aggiunta prevedendo la produzione S → , dove
    l’assioma S non compare nella parte destra di
    alcuna produzione.)
    Viceversa, ci sono linguaggi dipendenti dal contesto
    che non sono liberi.
    Un esempio è il linguaggio

                   L13 = {an bn cn |n ≥ 0}
LFC
Classificazione di Chomsky
                                                            Formalismi
                                                            generativi
                                                            Espressioni regolari
                                                            Grammatiche libere

   Le grammatiche (e i corrispondenti linguaggi) sono       Altri tipi di grammatica



   stati raggruppati in 4 classi, in dipendenza della
   “potenza” delle produzioni.
   Al livello più basso abbiamo le grammatiche regolari
   (o di tipo 3), quindi le grammatiche libere (tipo 2) e
   quelle dipendenti dal contesto (tipo 1).
   Le grammatiche più generali, di tipo 0, sono dette
   grammatiche a struttura di frase, in cui le produzioni
   sono come quelle delle grammatiche di tipo 1 senza
   la restrizione |α| ≤ |β|.
LFC
Costrutti non liberi nei linguaggi di
programmazione
                                                             Formalismi
                                                             generativi
                                                             Espressioni regolari
                                                             Grammatiche libere
                                                             Altri tipi di grammatica
    Alcuni aspetti della sintassi dei linguaggi di
    programmazione non sono catturabili da produzioni
    di grammatiche libere.
    Ad esempio, il fatto che il numero di argomenti in una
    chiamata di procedura debbe coincidere con il
    numero di parametri formali nella corrispondente
    definizione non è esprimibile con una CFG.
    Tale caratteristica è catturata dal cosiddetto
    linguaggio delle repliche (che non è libero):

                     LR = {αα|α ∈ T ∗ }.

Weitere ähnliche Inhalte

Was ist angesagt?

Compiler Design
Compiler DesignCompiler Design
Compiler DesignMir Majid
 
Generations of Programming Languages
Generations of Programming LanguagesGenerations of Programming Languages
Generations of Programming LanguagesTarun Sharma
 
Syntactic analysis in NLP
Syntactic analysis in NLPSyntactic analysis in NLP
Syntactic analysis in NLPkartikaVashisht
 
Kaggle Days Madrid - Alberto Danese
Kaggle Days Madrid - Alberto DaneseKaggle Days Madrid - Alberto Danese
Kaggle Days Madrid - Alberto DaneseAlberto Danese
 
Compiler Construction Course - Introduction
Compiler Construction Course - IntroductionCompiler Construction Course - Introduction
Compiler Construction Course - IntroductionMuhammad Sanaullah
 
Language processors
Language processorsLanguage processors
Language processorseShikshak
 
Intermediate code generation in Compiler Design
Intermediate code generation in Compiler DesignIntermediate code generation in Compiler Design
Intermediate code generation in Compiler DesignKuppusamy P
 
4_5802928814682016556.pptx
4_5802928814682016556.pptx4_5802928814682016556.pptx
4_5802928814682016556.pptxAshenafiGirma5
 
Top down and botttom up Parsing
Top down     and botttom up ParsingTop down     and botttom up Parsing
Top down and botttom up ParsingGerwin Ocsena
 
Lecture 5 - Structured Programming Language
Lecture 5 - Structured Programming Language Lecture 5 - Structured Programming Language
Lecture 5 - Structured Programming Language Md. Imran Hossain Showrov
 
Lexical Analysis - Compiler Design
Lexical Analysis - Compiler DesignLexical Analysis - Compiler Design
Lexical Analysis - Compiler DesignAkhil Kaushik
 
Intermediate code generation (Compiler Design)
Intermediate code generation (Compiler Design)   Intermediate code generation (Compiler Design)
Intermediate code generation (Compiler Design) Tasif Tanzim
 

Was ist angesagt? (20)

Compiler Design
Compiler DesignCompiler Design
Compiler Design
 
Generations of Programming Languages
Generations of Programming LanguagesGenerations of Programming Languages
Generations of Programming Languages
 
Top down parsing
Top down parsingTop down parsing
Top down parsing
 
Syntactic analysis in NLP
Syntactic analysis in NLPSyntactic analysis in NLP
Syntactic analysis in NLP
 
Kaggle Days Madrid - Alberto Danese
Kaggle Days Madrid - Alberto DaneseKaggle Days Madrid - Alberto Danese
Kaggle Days Madrid - Alberto Danese
 
Compiler Construction Course - Introduction
Compiler Construction Course - IntroductionCompiler Construction Course - Introduction
Compiler Construction Course - Introduction
 
Language processors
Language processorsLanguage processors
Language processors
 
Compiler construction
Compiler constructionCompiler construction
Compiler construction
 
Intermediate code generation in Compiler Design
Intermediate code generation in Compiler DesignIntermediate code generation in Compiler Design
Intermediate code generation in Compiler Design
 
Topdown parsing
Topdown parsingTopdown parsing
Topdown parsing
 
Speech processing
Speech processingSpeech processing
Speech processing
 
Compiler Design
Compiler DesignCompiler Design
Compiler Design
 
4_5802928814682016556.pptx
4_5802928814682016556.pptx4_5802928814682016556.pptx
4_5802928814682016556.pptx
 
Phases of compiler
Phases of compilerPhases of compiler
Phases of compiler
 
Top down and botttom up Parsing
Top down     and botttom up ParsingTop down     and botttom up Parsing
Top down and botttom up Parsing
 
Parsing
ParsingParsing
Parsing
 
Top down parsing
Top down parsingTop down parsing
Top down parsing
 
Lecture 5 - Structured Programming Language
Lecture 5 - Structured Programming Language Lecture 5 - Structured Programming Language
Lecture 5 - Structured Programming Language
 
Lexical Analysis - Compiler Design
Lexical Analysis - Compiler DesignLexical Analysis - Compiler Design
Lexical Analysis - Compiler Design
 
Intermediate code generation (Compiler Design)
Intermediate code generation (Compiler Design)   Intermediate code generation (Compiler Design)
Intermediate code generation (Compiler Design)
 

Mehr von Majong DevJfu

9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA Cloud9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA CloudMajong DevJfu
 
8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processes8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processesMajong DevJfu
 
7 - Architetture Software - Software product line
7 - Architetture Software - Software product line7 - Architetture Software - Software product line
7 - Architetture Software - Software product lineMajong DevJfu
 
6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformation6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformationMajong DevJfu
 
5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven Architecture5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven ArchitectureMajong DevJfu
 
4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture Portfolio4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture PortfolioMajong DevJfu
 
3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural styles3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural stylesMajong DevJfu
 
2 - Architetture Software - Software architecture
2 - Architetture Software - Software architecture2 - Architetture Software - Software architecture
2 - Architetture Software - Software architectureMajong DevJfu
 
1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a product1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a productMajong DevJfu
 
10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural styles10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural stylesMajong DevJfu
 

Mehr von Majong DevJfu (20)

9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA Cloud9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA Cloud
 
8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processes8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processes
 
7 - Architetture Software - Software product line
7 - Architetture Software - Software product line7 - Architetture Software - Software product line
7 - Architetture Software - Software product line
 
6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformation6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformation
 
5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven Architecture5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven Architecture
 
4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture Portfolio4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture Portfolio
 
3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural styles3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural styles
 
2 - Architetture Software - Software architecture
2 - Architetture Software - Software architecture2 - Architetture Software - Software architecture
2 - Architetture Software - Software architecture
 
1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a product1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a product
 
10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural styles10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural styles
 
Uml3
Uml3Uml3
Uml3
 
Uml2
Uml2Uml2
Uml2
 
6
66
6
 
5
55
5
 
4 (uml basic)
4 (uml basic)4 (uml basic)
4 (uml basic)
 
3
33
3
 
2
22
2
 
1
11
1
 
Tmd template-sand
Tmd template-sandTmd template-sand
Tmd template-sand
 
26 standards
26 standards26 standards
26 standards
 

Linguaggi Formali Compilazione: Grammatiche

  • 1. LFC Formalismi generativi Espressioni regolari Grammatiche libere Altri tipi di grammatica Linguaggi formali e compilazione Corso di Laurea in Informatica A.A. 2008/2009
  • 2. LFC Linguaggi formali e compilazione Formalismi generativi Espressioni regolari Grammatiche libere Altri tipi di grammatica Formalismi generativi Espressioni e linguaggi regolari Grammatiche libere Altri tipi di grammatiche
  • 3. LFC Linguaggi formali e compilazione Formalismi generativi Espressioni regolari Grammatiche libere Altri tipi di grammatica Formalismi generativi Espressioni e linguaggi regolari Grammatiche libere Altri tipi di grammatiche
  • 4. LFC Linguaggi regolari Formalismi generativi Espressioni regolari Un linguaggio L su un alfabeto Σ = {a1 , . . . , an } si Grammatiche libere Altri tipi di grammatica dice regolare se può essere espresso mediante composizione finita di operazioni di concatenazione, unione e chiusura riflessiva a partire dai linguaggi elementari (detti anche unitari) {a1 }, . . . , {an }. Ogni linguaggio finito è chiaramente regolare mentre ci sono abbondanti esempi di interessanti linguaggi infiniti che non sono regolari. Come vedremo, i linguaggi regolari giocano un ruolo importante nella definizione del lessico di un programma scritto in linguaggio ad alto livello, oltre che in svariati altri campi dell’Informatica.
  • 5. LFC Esempi di linguaggi regolari Formalismi generativi Espressioni regolari Grammatiche libere Sia Σ l’alfabeto ASCII e sia X = X1 X2 . . . Xn una Altri tipi di grammatica generica stringa di Σ∗ . Il linguaggio {X } è regolare in quanto esprimibile come concatenazione dei linguaggi unitari {X1 }, {X2 }, . . . , {Xn }. Il linguaggio {X , Y , Z }, dove X , Y e Z sono stringhe generiche sull’alfabeto ASCII è regolare perché esprimibile come unione dei linguaggi regolari {X }, {Y }, e {Z }. Generalizzando l’esempio precedente si dimostra come ogni linguaggio finito sia esprimibile come unione di concatenzazioni di linguaggi unitari.
  • 6. LFC Altri esempi Formalismi generativi Espressioni regolari Grammatiche libere Altri tipi di grammatica Il linguaggio L5 = {an bm |n, m ≥ 0} è regolare in quanto esprimibile nel modo seguente L5 = {a}∗ {b}∗ . I seguenti linguaggi, introdotti nel gruppo di lucidi introduttivi, sono tutti regolari: R {ab, c}2 , {ab, c}3 , {ab, c}∗ , {ab, c}+ , {ab, c}2 Il linguaggio L6 = {an bn |n ≥ 0} non è regolare. Il linguaggio L10 = {an |n primo} non è regolare.
  • 7. LFC Espressioni regolari Formalismi generativi Espressioni regolari Grammatiche libere Le espressioni regolari su un alfabeto Σ sono un Altri tipi di grammatica formalismo che riflette (e semplifica) le costruzioni delineate sopra per la definizione di linguaggi regolari. Più precisamente, le espressioni regolari (e.r.)su Σ sono definite ricorsivamente nel modo seguente: Base. Φ è un’espressione regolare che denota l’insieme vuoto; per ogni a ∈ Σ, a è un’e.r. che denota l’insieme {a};
  • 8. LFC Espressioni regolari Formalismi Segue definizione di e.r. generativi Espressioni regolari Grammatiche libere Concatenazione Se E ed F sono e.r., la scrittura EF è Altri tipi di grammatica un’e.r. che denota l’insieme di stringhe che possono essere scritte concatenando una stringa dell’insieme denotato da E (più brevemente diremo “una stringa di E”) con una stringa di F; Unione Se E ed F sono e.r., la scrittura E + F è un’e.r. che denota l’unione di E e di F. Chiusura Se E è un’e.r., la scrittura E ∗ è un’e.r. che denota l’insieme delle stringhe ottenute concatenando stringhe di E un numero arbitrario i ≥ 0 di volte.
  • 9. LFC Espressioni regolari Formalismi generativi Espressioni regolari Grammatiche libere Altri tipi di grammatica Un’ulteriore regola Parentesi. Se E è un’e.r., la scrittura (E) è un’e.r. equivalente alla prima, cioè che denota lo stesso insieme di stringhe serve a forzare un ordine di composizione delle espressioni diverso da quello standard (in base al quale chiusura precede concatenazione che precede unione).
  • 10. LFC Esempi L’espressione regolare 0 + 1∗ 10 su B (interpretabile Formalismi generativi come 0 + ((1∗ )10), in base alle regole di Espressioni regolari Grammatiche libere precedenza) denota il linguaggio Altri tipi di grammatica R1 = {0, 10, 110, 1110, . . .}. Il linguaggio R1 è chiaramente differente dal linguaggio R2 su B definito dall’espressione regolare (0 + 1)∗ 10, che consiste di tutte le stringhe binarie che terminano con 10. Posto Σ = {a, b, c}, l’espressione regolare a(b + c)∗ a denota il linguaggio R3 su Σ costituito dalle stringhe che iniziano e terminano con il carattere a e che non contengono altri caratteri a. La scrittura (1 + 01)∗ (0 + 1 + 01) denota il linguaggio delle stringhe su B di lunghezza maggiore di zero che non contengono due caratteri 0 consecutivi.
  • 11. LFC Abbreviazioni di uso pratico Formalismi generativi Poiché { } = Φ∗ , si può utilizzare il simbolo Espressioni regolari per Grammatiche libere Altri tipi di grammatica indicare l’insieme { }. La scrittura [E] si può utilizzare al posto della e.r. E+ e l’operatore [ ] prende il nome di opzione. Se è definito un ordinamento fra i caratteri di Σ, allora si possono utilizzare convenzioni specifiche per denotare intervalli di caratteri. Ad esempio, la scrittura [a − f] denota i caratteri compresi fra a ed f (opzione su un intervallo). Poiché L+ = LL∗ , l’operatore di chiusura (non riflessiva) è ammesso nelle e.r. dove si intende che E + = EE ∗ .
  • 12. LFC Abbreviazioni di uso pratico Formalismi n generativi Espressioni regolari Poiché Ln =LL . . . L, l’operatore di elevamento a Grammatiche libere Altri tipi di grammatica potenza è ammesso nelle e.r. e si intende che n En =EE . . . E. La scrittura [E]ji si può utilizzare al posto della e.r. E i + E i+1 + . . . + E j . Per alcuni insiemi di caratteri di particolare importanza (cifre, lettere, caratteri alfanumerici, caratteri di spaziatura, ...) si possono usare espressioni specifiche, come ad esempio (prendendo a prestito la notazione dalle espressioni riconosciute dal comando grep di Linux): [: digit :], [: alpha :], [: alnum :], [: space :], . . .
  • 13. LFC Esempi di interesse nel contesto dei linguaggi di programmazione Formalismi generativi Espressioni regolari Grammatiche libere Osserviamo dapprima che nel contesto della Altri tipi di grammatica definizione della sintassi dei linguaggi di programmazione il simbolo + è spesso rimpiazzato da |. L’espressione regolare [1 − 9][: digit :]∗ denota l’insieme delle stringhe che rappresentano (nella consueta rappresentazione in base 10) i numeri interi positivi. L’espressione regolare [: alpha :]([: alpha :]|[: digit :])∗ denota l’insieme degli identificatori legali in alcuni linguaggi di programmazione (soprattutto fra i più vecchi).
  • 14. LFC Esercizi proposti Scrivere un’e.r. per il seguente linguaggio Formalismi generativi sull’alfabeto {a, b, c}: Espressioni regolari Grammatiche libere Altri tipi di grammatica E1 = {an bm ck |m = 0 ⇒ k = 3} Scrivere un’e.r. per il linguaggio E2 , sull’alfabeto {a, b}, delle stringhe contenenti al più due a. Scrivere un’e.r. per il linguaggio E3 , sull’alfabeto {a, b}, delle stringhe contenenti un numero dispari di b. Scrivere un’e.r. per il linguaggio E4 , sull’alfabeto {a, b}, definito ricorsivamente nel modo seguente: 1. ∈ E4 ; 2. Se x ∈ E4 allora anche abax ∈ E4 e xaa ∈ E4 . Inoltre, solo le stringhe ottenibili in questo modo appartengono a E4 .
  • 15. LFC Esercizi proposti Formalismi generativi Espressioni regolari Grammatiche libere Scrivere un’e.r. per il linguaggio E5 , sull’alfabeto Altri tipi di grammatica {a, b, c}, costituito dalle stringhe in cui ogni occorrenza di b è seguita da almeno un’occorrenza di c. Descrivere nel modo più semplice possibile, in Italiano, il linguaggio corrispondente alla seguente espressione regolare: ((a|b)3 )∗ (a|b). Si dica qual è la stringa più corta che non appartiene al linguaggio descritto dall’espressione regolare a∗ (ab)∗ b∗ .
  • 16. LFC Linguaggi formali e compilazione Formalismi generativi Espressioni regolari Grammatiche libere Altri tipi di grammatica Formalismi generativi Espressioni e linguaggi regolari Grammatiche libere Altri tipi di grammatiche
  • 17. LFC Grammatiche formali Formalismi Come le espressioni regolari, anche le grammatiche generativi Espressioni regolari formali sono uno strumento per la descrizione di Grammatiche libere Altri tipi di grammatica linguaggi. Sono un formalismo generativo perché il linguaggio è definito come l’insieme delle stringhe che possono essere “generate” usando le regole della grammatica. Le grammatiche libere (Context-Free Grammar o semplicemente CFG) sono un particolare tipo di grammatica formale che trova ampio uso nella definizione dei linguaggi di programmazione. Solo per fare un esempio, la struttura a blocchi dei programmi scritti in Pascal (C, C++, Java, ...) viene descritta mediante grammatiche libere.
  • 18. LFC Definizione formale di grammatica Una grammatica G è una quadrupla di elementi: Formalismi generativi G = (N , T , P, S), Espressioni regolari Grammatiche libere Altri tipi di grammatica dove N è un insieme di simboli, detti non terminali; T è un insieme di simboli terminali, N ∩ T = Φ; P è l’insieme delle produzioni; S ∈ N è il simbolo iniziale (o assioma). Conviene anche definire l’insieme V = N ∪ T come il vocabolario della grammatica. La forma delle produzioni è ciò che caratterizza il “tipo” di grammatica. In una grammatica libera le produzioni hanno la seguente forma A→α dove A ∈ N e α ∈ V ∗
  • 19. LFC Un primo esempio di grammatica libera Formalismi N {E} = generativi Espressioni regolari T {(, ), +, ∗, id} = Grammatiche libere Altri tipi di grammatica S E = P {E → E+E, = E → E∗E, E → (E), E → id } Si noti la presenza, nella definizione di una grammatica, dei cosiddetti metasimboli, simboli cioè che non sono terminali ne’ non terminali. Esempi di metasimboli sono le parentesi graffe (che hanno il solito significato di descrizione di insieme) e la freccia orientata a destra (→).
  • 20. LFC Derivazioni Formalismi generativi Le grammatiche sono formalismi generativi perchè Espressioni regolari consentono di “generare” stringhe di caratteri tramite Grammatiche libere Altri tipi di grammatica il meccanismo delle derivazioni. Una derivazione è il processo mediante il quale, a partire dall’assioma ed applicando una sequenza di produzioni, si arriva a scrivere una stringa di T ∗ . Al riguardo le produzioni sono anche dette regole di riscrittura. Una produzione del tipo E → E+E si legge infatti nel seguente modo: Il simbolo E può essere “riscritto” come E+E.
  • 21. LFC Derivazioni (continua) Formalismi Sia α = βAγ, dove A ∈ N e β, γ ∈ V ∗ e sia A → δ generativi Espressioni regolari una produzione di G. Grammatiche libere Altri tipi di grammatica Applicare la produzione A → δ alla stringa α consente di sostituire (“riscrivere”) il non terminale A con il lato destro δ della produzione, ottenendo la stringa βδγ. Si dice che α deriva direttamente la stringa βδγ e si scrive α ⇒G βδγ Se α1 ⇒G α2 ⇒G . . . ⇒G αk , k ≥ 1, allora si dice che α1 deriva αk e si scrive α1 ⇒∗ αk . G Qualora non possano sorgere ambiguità eviteremo di indicare la grammatica nella notazione ⇒G .
  • 22. LFC Esempi Formalismi Chiamiamo G1 la grammatica precedentemente generativi Espressioni regolari introdotta. Allora: Grammatiche libere Altri tipi di grammatica E+E ⇒G1 id+E tramite l’applicazione della produzione E → id alla prima occorrenza di E. E+E ⇒∗ 1 id + id tramite l’applicazione della G produzione E → id ad entrambe le occorrenze di E. E ⇒∗ 1 id + (E) in quanto G E ⇒G1 E+E ⇒G1 E+(E) ⇒G1 id + (E). E ⇒∗ 1 id + (id), in quanto E ⇒G1 E+E ⇒G1 G E+(E) ⇒G1 id + (E) ⇒G1 id + (id). Una derivazione alternativa per id + (id) è E ⇒G1 E+E ⇒G1 id+E ⇒G1 id + (E) ⇒G1 id + (id).
  • 23. LFC Frasi e linguaggio generato da una grammatica Formalismi generativi Espressioni regolari Sia G = (N , T , P, S) una grammatica. Grammatiche libere Altri tipi di grammatica Si chiama forma di frase di G una qualunque stringa α di V ∗ tale che S ⇒∗ α. G Se α ∈ T ∗ allora si dice che α è una frase di G. Il linguaggio generato da G (che indicheremo spesso con la notazione L(G)) è l’insieme delle frasi di G. Dagli esempi precedenti possiamo conlcudere che le stringhe id + (E) e id + (id) sono forme di frase di G1 ; id + (id) è anche una frase e dunque è nel linguaggio L(G). Se la grammatica è libera da contesto allora anche il linguaggio viene detto libero (da contesto).
  • 24. LFC Esempi Formalismi generativi La grammatica G1 genera il linguaggio delle Espressioni regolari Grammatiche libere espressioni aritmetiche composte da +, *, (, ) e id. Altri tipi di grammatica Le stringhe più corte in L(G1 ) sono id, id + id, id ∗ id, (id). Il linguaggio {ab, c}∗ è libero perché generato da S → SS, S → ab, S → c, S → Il linguaggio L11 su {a, b} costituito da tutte le stringhe α palindrome (cioè tali che αR = α) è libero in quanto generabile dalla grammatica S → aSa, S → bSb, S → a, S → b, S →
  • 25. LFC Un esempio più complesso: le e.r. come linguaggio libero Formalismi generativi Espressioni regolari La grammatica G2 così definita Grammatiche libere Altri tipi di grammatica N {E, T , F , A} = T {0, 1, (, ), +, ∗, Φ, } = S E = P {E → T , E → T +E, = T → F , T → FT , F → (E), F → (E)* , F → A, F → A* , A → 0, A → 1 } genera tutte le stringhe sull’alfabeto 0, 1, (, ), +, ∗, Φ, che sono espressioni regolari ben formate.
  • 26. LFC Esempio La stringa (epressione regolare) 0(0+1)∗ Formalismi appartiene a L(G2 ) causa la derivazione: generativi Espressioni regolari Grammatiche libere ⇒G2 E T Altri tipi di grammatica ⇒G2 Usando T → FT FT ⇒G2 Usando T → F FF ⇒G2 Usando F → A AF A(E)∗ Usando F → (E)∗ ⇒G2 0(E)∗ ⇒G2 Usando A → 0 0(T + E)∗ ⇒G2 Usando E → T + E 0(T + T )∗ ⇒G2 Usando E → T 0(F + T )∗ ⇒G2 Usando T → F 0(F + F )∗ ⇒G2 Usando T → F 0(A + F )∗ ⇒G2 Usando F → A 0(A + A)∗ ⇒G2 Usando F → A 0(0 + A)∗ ⇒G2 Usando A → 0 0(0 + 1)∗ ⇒G2 Usando A → 1
  • 27. LFC Linguaggio generato da una grammatica (continua) Formalismi generativi Espressioni regolari Grammatiche libere Per dimostrare formalmente che una data Altri tipi di grammatica grammatica G genera un dato linguaggio L (cioè per provare che L = L(G)) si procede solitamente per induzione. Dapprima si formula una congettura sulla forma delle frasi di L(G), di solito provando alcune semplici derivazioni. Dopodiché si dimostra separatamente (per induzione) che: se X è generata dal linguaggio, allora X ha quella particolare forma; se X è una stringa con quella particolare forma, allora è generabile dal linguaggio.
  • 28. LFC Esempio Si consideri laseguente grammatica: Formalismi generativi Espressioni regolari Grammatiche libere N {A, B} = Altri tipi di grammatica T {a, b} = S A = P {A → aA, = A → B, B → bB, B→ } Vogliamo dimostrare che L(G) = L5 = {an bm |n, m ≥ 0}. Dimostriamo che, se X ∈ L(G), allora X = an bm , per opportuni valori di n ed m. La dimostrazione procede per induzione sulla lunghezza k delle derivazioni.
  • 29. LFC Esempio (continua) Preliminarmente, osserviamo che una derivazione Formalismi lunga k (k ≥ 1) genera, a partire da B, la stringa generativi bk −1 (anche questa è una semplice induzione). Espressioni regolari Grammatiche libere Altri tipi di grammatica Per tornare a L(G), la base dell’induzione è costituita dall’unica derivazione lunga 2 (la più corta): A ⇒ B ⇒ , che genera una stringa della forma voluta (con n = m = 0). Dimostriamo ora che la tesi è vera per derivazioni lunghe k > 2. Per una tale derivazione possiamo scrivere A ⇒ aA ⇒∗ X , oppure A ⇒ B ⇒∗ X , L’applicazione ad X dell’ipotesi induttiva (nel primo caso) o del risultato preliminare (secondo caso) porta agevolmente alla tesi.
  • 30. LFC Esempio (continua) Formalismi generativi Espressioni regolari Dimostrare che ogni stringa della forma an bm Grammatiche libere Altri tipi di grammatica appartiene al linguaggio è ancora più semplice. an bm è infatti generabile dalla seguente derivazione di lunghezza n + m + 2 A ⇒∗ an A ⇒ an B ⇒∗ an bm B ⇒ an bm costituita da n applicazioni della regola A → aA; una applicazione di A → B; m applicazioni di B → bB; una applicazione di B → .
  • 31. LFC Equivalenza Formalismi Due grammatiche G e G si dicono equivalenti se generativi Espressioni regolari generano lo stesso linguaggio. Grammatiche libere Altri tipi di grammatica In alcuni testi, la sola coincidenza dei linguaggi generati viene detta equivalenza debole. In seguito vedremo diverse trasformazioni delle grammatiche che conservano il linguaggio. Un primo semplice esempio è costituito dalla grammatica G1 e dalla seguente grammatica: → E+T | T E → T ∗F | F T → id | (E) F che risultano essere (debolmente) equivalenti.
  • 32. LFC Convenzioni notazionali I simboli non terminali, detti anche variabili Formalismi sintattiche, verranno spesso espressi (come nel caso generativi Espressioni regolari della grammatica appena introdotta) usando lettere Grammatiche libere Altri tipi di grammatica maiuscole in corsivo. La scrittura E → E+E | E∗E | (E) | id verrà utilizzata come abbreviazione per → E+E, E → E∗E, E → (E), E → id E Il metasimbolo | (barra verticale) indica dunque alternativa.
  • 33. LFC Descrizione succinta di una grammatica Formalismi generativi Se si conviene di elencare per prime le produzioni Espressioni regolari relative al simbolo iniziale, una grammatica può Grammatiche libere Altri tipi di grammatica essere espressa semplicemente tramite le produzioni (in realtà abbiamo già usato questa convenzione). Ad esempio, la grammatica G2 che descrive le espressioni regolari su {a, b} può essere semplicemente descritta come → T | T +E E → F | FT T → (E) | (E)∗ | A | A∗ F A → 0|1
  • 34. LFC Backus-Naur Form (BNF) Nella descrizione della sintassi dei linguaggi di Formalismi generativi programmazione le variabili sintattiche vengono Espressioni regolari Grammatiche libere rappresentate mediante un identificatore descrittivo Altri tipi di grammatica racchiuso fra parentesi angolate. Esempio → if espressione booleana then comando if lista di comandi endif | if espressione booleana then lista di comandi else lista di comandi endif
  • 35. LFC Altri esempi Formalismi generativi Nella BNF, la grammatica G1 viene descritta dalle Espressioni regolari Grammatiche libere seguenti produzioni Altri tipi di grammatica → espressione + espressione | espressione → espressione ∗ espressione | espressione → ( espressione ) | id espressione Una grammatica per le chiamate di procedura in Java → id( parametri-opzionali ) chiamata → lista-di-parametri | parametri-opzionali → lista-di-parametri , parametro | lista-di-parametri parametro
  • 36. LFC Altre convenzioni Elementi opzionali possono essere inclusi fra i meta Formalismi generativi simboli [ e ]. Espressioni regolari Grammatiche libere Ad esempio, potremo usare la scrittura Altri tipi di grammatica → if espressione booleana then comando if lista di comandi [ else lista di comandi ] endif Elementi ripetitivi possono essere inclusi fra i metasimboli { e }. Ad esempio → comando { ; comando } list di comandi
  • 37. LFC Altre convenzioni (continua) Formalismi Più recentemente, nella BNF i simboli terminali (detti generativi anche token name) vengono scritti in grassetto. Espressioni regolari Grammatiche libere Altri tipi di grammatica In questo modo diventa possibile sopprimere l’uso delle parentesi angolate intorno alle variabili sintattiche, migliorando la leggibilità complessiva. Le variabili sintattiche continuano ad essere scritte in corsivo. Ad esempio, potremo scrivere → if espressione booleana then comando if lista di comandi [ else lista di comandi ] endif
  • 38. LFC Altre convenzioni (continua) Formalismi generativi Espressioni regolari Grammatiche libere Altri tipi di grammatica Nel caso in cui possano sorgere ambiguità, i simboli terminali vengono racchiusi fra doppi apici. Un esempio è costituita dal caso di simboli terminali coincidenti con qualche metasimbolo. Esempio (tratto dalla sintassi del C): comando composto → { { dichiarazione } { comando } }
  • 39. LFC Esercizi proposti Formalismi Fornire una grammatica libera per l’insieme delle generativi Espressioni regolari stringhe costituite da parentesi correttamente Grammatiche libere Altri tipi di grammatica bilanciate (ad esempio, ()(()) e (()) devono far parte del linguaggio, mentre ())( non deve farne parte). Fornire una grammatica libera per il linguaggio L12 = {an b2n |n > 0} sull’alfabeto {a, b}. Si consideri la seguente grammatica GI S → I | A, I → if B then S | if B then S else S, A → a, B → b e si fornisca una derivazione per la stringa if b then if b then a else a
  • 40. LFC Alberi di derivazione (parse tree) Un parse tree illustra graficamente il processo di Formalismi generativi derivazione di una stringa a partire dal simbolo Espressioni regolari Grammatiche libere iniziale (o, più genericamente, da un non terminale). Altri tipi di grammatica Formalmente, un parse tree per una grammatica libera G = N , T , P, S è un albero radicato ed etichettato che soddisfa le seguenti proprietà: i nodi interni sono etichettati con simboli di N e, in particolare, la radice è etichettata con l’assioma; le foglie sono etichettate con simboli di T o con il simbolo ; se A ∈ N etichetta un nodo interno e X1 , . . . , Xk sono le etichette dei figli di (il nodo con etichetta) A, con Xi ∈ V, allora deve esistere in P la produzione A → X1 X2 . . . Xk ; Se A ∈ N etichetta un nodo interno il cui unico figlio è un nodo con etichetta , allora deve esistere in P la produzione A → .
  • 41. LFC Esempi Formalismi generativi Parse tree per la stringa id ∗ (id + id) nella Espressioni regolari Grammatiche libere grammatica G1 Altri tipi di grammatica E E E * ( id E ) + id id
  • 42. LFC Esempi Formalismi Parse tree per la stringa generativi Espressioni regolari if b then if b then a else a Grammatiche libere Altri tipi di grammatica nella grammatica GI S I if then else B S S b I a if then B S b a
  • 43. LFC Alberi di derivazione (parse tree) Un parse tree impone una struttura sintattica alle Formalismi generativi frasi e questo è generalmente il primo passo per Espressioni regolari attribuire ad esse un significato. Grammatiche libere Altri tipi di grammatica La struttura sintattica può essere vista in maniera ricorsiva come composizione della struttura di (sotto)frasi corrispondenti a sottoalberi del parse tree. In particolare, il sottoalbero radicato in un nodo con etichetta A ∈ N fornisce la struttura della frase derivata a partire da A. Nel caso del parse tree relativo alla frase id ∗ (id + id), il sottoalbero radicato nel nodo indicato dalla freccia fornisce la struttura sintattica dell’espressione fra parentesi e l’albero nella sua interezza mostra la struttura della frase come composizione di espressioni.
  • 44. LFC Parse tree e derivazioni Formalismi generativi Un risultato fondamentale afferma che α è una frase Espressioni regolari Grammatiche libere di una grammatica G (cioè può essere derivata in G Altri tipi di grammatica a partire dal simbolo iniziale) se e solo se esiste in G un parse tree per α. In generale, una frase di una grammatica può essere ottenuta mediante più di una derivazione (si rammenti l’esempio di id + (id) nella grammatica G1 ). In particolare, ad un dato parse tree per α possono corrispondere più derivazioni. Per definire con precisione il comportamento di un parser (come vedremo) è conveniente eliminare questa “ridondanza” limitandoci a considerare solo particolari derivazioni.
  • 45. LFC Derivazioni canoniche Formalismi Si dice che S ⇒∗ α è una derivazione canonica generativi G Espressioni regolari sinistra della frase α in G, se in essa ad ogni passo Grammatiche libere Altri tipi di grammatica viene riscritto il simbolo non terminale più a sinistra. Analoga definizione vale per la derivazione canonica destra. Delle due derivazioni viste per id + (id) in G1 , la seconda è una derivazione canonica sinistra, mentre la prima non è una derivazione canonica. Se α ∈ V ∗ (cioè se α è una forma di frase) e S ⇒∗ α G mediante una derivazione canonica sinistra (destra), si dice che α è una forma di frase sinistra (destra); il termine inglese utilizzato è left/right sentential form. Considerare derivazioni canoniche può non essere sufficiente ad eliminare ambiguità.
  • 46. LFC Esempio La frase id + id + id di G1 può essere ottenuta Formalismi mediante due differenti derivazioni canoniche destre, generativi Espressioni regolari e precisamente Grammatiche libere Altri tipi di grammatica ⇒G1 E E+E ⇒G1 E+E+E ⇒G1 E+E+id ⇒G1 E+id+id ⇒G1 id + id + id e ⇒G1 E E+E ⇒G1 E+id ⇒G1 E+E+id ⇒G1 E+id+id ⇒G1 id + id + id (dove i simboli non terminali sottolineati sono quelli che verranno espansi al passo successivo).
  • 47. LFC Ambiguità Abbiamo visto che ad una frase può corrispondere Formalismi generativi più di una derivazione cononica. Espressioni regolari Grammatiche libere Altri tipi di grammatica Tuttavia, per un dato un parse tree esiste una sola derivazione canonica sinistra e una sola derivazione canonica destra. (NB. D’ora in avanti, ci riferiremo alle derivazioni canoniche destre semplicemente come alle derivazioni canoniche.) Diciamo quindi che una grammatica è ambigua se esistono frasi per le quali esistono differenti parse tree (equivalentemente, differenti derivazioni canoniche sinistre o destre). L’ambiguità è un ostacolo alla realizzazione di un parser e di norma o viene eliminata alla radice (utilizzando grammatiche non ambigue) oppure utilizzando opportune regole per la disambiguazione.
  • 48. LFC Esempio Formalismi La grammatica GI è ambigua in quanto alla frase generativi Espressioni regolari if b then if b then a else a Grammatiche libere Altri tipi di grammatica corrisponde un altro parse tree, e precisamente S I if then B S b I if then else B S S b a a
  • 49. LFC Aspetti problematici per il parsing Ci sono alcune caratteristiche delle grammatiche libere Formalismi che possono ostacolare il processo di parsing, o anche generativi solo un “certo tipo” di parsing (come vedremo). Ne Espressioni regolari Grammatiche libere elenchiamo brevemente alcune: Altri tipi di grammatica ambiguità; presenza di simboli non terminali che generano linguaggi vuoti; simboli non terminali che non compaiono in nessuna forma di frase; presenza di cicli (derivazioni del tipo A ⇒+ A) o comunque di left recursion (derivazioni del tipo A ⇒+ Aα, con α = ); presenza di produzioni A → , dove A = S; presenza di prefissi comuni a due o più produzioni relative allo stesso non terminale, ad esempio A → αβ1 e A → αβ2 .
  • 50. LFC Esempi La grammatica Formalismi generativi Espressioni regolari Grammatiche libere S → Sa | b Altri tipi di grammatica presenta una ricorsione immediata a sinistra in quanto S → Sa. La grammatica S → A|b A → Aa | Sa presenta una ricorsione a sinistra in quanto S ⇒+ Sa. La grammatica GI (oltre ad essere ambigua) presenta un prefisso comune alla due produzioni che riscrivono il simbolo I.
  • 51. LFC Esempi Nella grammatica Formalismi generativi S → SA Espressioni regolari Grammatiche libere A → a| Altri tipi di grammatica c’è una produzione A → e questa provoca il ciclo S ⇒+ S. Nella grammatica S → aS A→a il non terminale A è irraggiungibile da S. Nella grammatica S → aS | a | A A → Aa il non terminale A genera il linguaggio vuoto.
  • 52. LFC Scrittura di una grammatica per il parsing Terminiamo questa parte del corso sulle CFG Formalismi presentando una serie di algoritmi per la “rimozione” generativi Espressioni regolari degli aspetti problematici cui abbiamo fatto cenno. Grammatiche libere Altri tipi di grammatica Ci serve qualche definizione. Raggiungibilità Un non terminale è raggiungibile se può comparire in una forma di frase. Buona definizione Un non terminale è ben definito se non genera il linguaggio vuoto. Pulizia Si dice che una grammatica è pulita se non contiene cicli e ogni non terminale è raggiungibile e ben definito. Annullabilità Un non terminale A è annullabile se A ⇒+ . Prefissi comuni Presenza di coppie di produzioni del tipo A → αβ1 e A → αβ2 . Ricorsione sinistra Presenza di derivazioni del tipo A ⇒+ Aα.
  • 53. LFC Rimozione dei non terminali non ben definiti Formalismi Per eliminare i simboli non terminali che generano un generativi Espressioni regolari linguaggio vuoto si calcola dapprima l’insieme Grammatiche libere Altri tipi di grammatica complemento, costituito dai non terminali ben definiti, mediante un algoritmo di chiusura. Chiameremo D tale insieme. La base dell’algoritmo pone in D tutti quei terminali A per i quali esiste una produzione A → α, con α ∈ T ∗ . Il passo ricorsivo consiste nell’aggiungere a D quei simboli non terminali A per i quali esiste una produzione A → α in cui α contiene simboli terminali o simboli già in D. Quando il passo ricorsivo non aggiunge nulla a D, l’algoritmo termina e l’insieme dei non terminali non ben definiti è N D.
  • 54. LFC Esempio Si consideri la grammatica G così definita: Formalismi generativi Espressioni regolari S → aA b | bDEa Grammatiche libere Altri tipi di grammatica A→ | aA | D B → b | bC C → cE D → dA → eC E → fD F L’insieme D viene calcolato inserendo dapprima i simboli A e B (passo base), quindi S e D, infine F . Ne consegue che C ed E sono non ben definiti. Come “effetto collaterale” è possibile eliminare quelle produzioni inutili che, come S → bDEa, contengono a destra simboli non ben definiti.
  • 55. LFC Esempio (continua) Formalismi generativi Espressioni regolari Grammatiche libere Altri tipi di grammatica Dopo l’eliminazione dei non terminali non ben definiti e delle produzioni inutili si ottiene la grammatica G , equivalente a G: S → aA b A→ | aA | D B→b D → dA → fD F
  • 56. LFC Rimozione dei non terminali non raggiungibili Formalismi Il problema dell’eliminazione dei simboli non generativi Espressioni regolari raggiungibili può essere visto come una semplice Grammatiche libere Altri tipi di grammatica istanza del problema della raggiungibilità in un grafo orientato. Data una CFG G si costruisce un grafo orientato G = (V , E) nel seguente modo: l’insieme V dei vertici contiene un elemento corrispondente ad ogni non terminale di G; l’insieme E contiene una coppia (arco orientato) A, B se e solo se esiste una produzione A → αBβ, α, β ∈ V ∗ . L’esecuzione dell’algoritmo BFS consente di stabilire i nodi raggiungibili dal nodo (corrispondente ad) S. Si può quindi procedere all’eliminazione dei non terminali corrispondenti ai vertici non raggiunti.
  • 57. LFC Esempio (continua) Eseguendo la BFS sul grafo corrispondente a G Formalismi generativi Espressioni regolari A D Grammatiche libere Altri tipi di grammatica S F B si scopre che B ed F non sono raggiungibili da S. La loro eliminazione porta alla grammatica equivalente G : S → aA b A→ | aA | D D → dA È ora facile vedere che il linguaggio generato da G è a(a|d)∗ b.
  • 58. LFC Eliminazione dei non terminali annullabili Formalismi generativi Espressioni regolari Grammatiche libere L’algoritmo calcola l’insieme E dei simboli non Altri tipi di grammatica terminali a partire dai quali è possibile derivare . E ← {A ∈ N |A → ∈ P} 1: while ∃A → A1 . . . Ak t.c. Ai ∈ E & A ∈ E do 2: E ← E ∪ {A} 3: end while 4: Elimina da P le produzioni del tipo A → 5: Elimina i non terminali di E dalle restanti 6: produzioni in tutti i modi (combinatorialmente) possibili
  • 59. LFC Esempio Formalismi generativi Si consideri la grammatica: Espressioni regolari Grammatiche libere Altri tipi di grammatica S → A| A → aAC | SB B → bB | b | C→c Inizialmente si pone E = {S, B}, poiché S e B sono immediatamente annullabili. Poiché esiste la produzione A → SB, al secondo passo il non terminale A viene inserito in E. Nessun altro non terminale può essere aggiunto a E. Risulta quindi E = {S, A, B}.
  • 60. LFC Esempio (continua) Dopo l’eliminazione delle produzioni del tipo: A → Formalismi generativi S→A Espressioni regolari Grammatiche libere A → aAC | SB Altri tipi di grammatica B → bB | b C→c dopo la cancellazione dei non terminali in E in tutti i modi combinatorialmente possibili: S→A A → aAC | aC | SB | S | B B → b | bB C→c La grammatica modificata è equivalente alla grammatica di partenza, salvo che non può generare la stringa vuota.
  • 61. LFC Esempio (continua) Formalismi generativi Espressioni regolari Grammatiche libere Per rendere del tutto equivalenti le grammatiche Altri tipi di grammatica possiamo aggiungere un nuovo assioma S con le produzioni S → S | . La grammatica “completa” diviene quindi: → S| S S→A A → aAC | aC | SB | S | B B → b | bB C→c
  • 62. LFC Eliminazione dei cicli I cicli, cioè derivazioni del tipo A ⇒+ A, sono non Formalismi solo inutili ma anche dannosi, in quanto danno generativi origine ad ambiguità. Espressioni regolari Grammatiche libere Un algoritmo per eliminare i cicli elimina più in Altri tipi di grammatica generale le produzioni che danno origine a derivazioni del tipo A ⇒+ B. Si suppone che non ci siano non terminali annullabili. In una tale grammatica, la possibilità che risulti A ⇒+ B può essere solo conseguenza di una catena di cosiddette produzioni singole: A → A1 → A2 ... → Ak →B che sono facili da individuare.
  • 63. LFC Eliminazione dei cicli (continua) Formalismi generativi Espressioni regolari Grammatiche libere Si consideri ora una generica coppia A, B tale che Altri tipi di grammatica A ⇒+ B; se B → α1 | . . . | αr sono le produzioni (non singole) di B, allora si aggiungono alla grammatica le produzioni A → α1 | . . . | αr Al termine, si eliminano tutte le produzioni singole.
  • 64. LFC Esempio Si consideri ancora la grammatica: Formalismi generativi Espressioni regolari → S| S Grammatiche libere Altri tipi di grammatica S→A A → aAC | aC | SB | S | B B → b | bB C→c È facile vedere che risulta: S ⇒+ S, S ⇒+ A, S ⇒+ B, S ⇒+ A, S ⇒+ B, S ⇒+ S, A ⇒+ B. Le produzioni che vanno aggiunte sono quindi → aAC | aC | SB | b | bB S S → aAC | aC | SB | b | bB A → b | bB
  • 65. LFC Esempio (continua) La grammatica risultante (priva di cicli) è: Formalismi generativi Espressioni regolari → aAC | aC | SB | b | bB | S Grammatiche libere Altri tipi di grammatica S → aAC | aC | SB | b | bB A → aAC | aC | SB | b | bB B → b | bB C→c Una grammatica equivalente ma più semplice (e sempre senza cicli) è: → S| S S → aSC | aC | SB | b | bB B → b | bB C→c
  • 66. LFC Eliminazione delle ricorsioni sinistre Formalismi generativi Espressioni regolari Grammatiche libere Si può assumere che la grammatica in input non Altri tipi di grammatica contenga non terminali annullabili ne’ cicli. Sia A1 , . . . , An un ordinamento (arbitrario) dei simboli non terminali. L’idea dell’algoritmo è di far sì che ogni produzione del tipo Ai → Aj α abbia sempre i < j. L’algoritmo consta di due cicli annidati: 1. Nel ciclo esterno (con iteratore i) vengono eliminate le ricorsioni immediate Ai → Ai α; 2. Nel ciclo interno (con iteratore j) vengono modificate quelle produzioni del tipo Ai → Aj α in cui j < i.
  • 67. LFC Eliminazione delle ricorsioni sinistre (continua) Formalismi generativi Espressioni regolari Grammatiche libere Per eliminare tutte le produzioni del tipo A → Aαr , Altri tipi di grammatica r = 1, 2, . . . , t (per qualche t ≥ 1), si considerano le altre produzioni relative al non terminale A A → β1 | β2 | . . . | βm in cui nessuna stringa βs inizia per A. Le produzioni per A vengono quindi sostituite nel modo seguente A → β1 A | β2 A | . . . | βm A → α1 A | α2 A | . . . | αt A | A
  • 68. LFC Eliminazione delle ricorsioni sinistre (continua) Formalismi generativi Espressioni regolari Grammatiche libere Altri tipi di grammatica Per eliminare una produzione del tipo Ai → Aj α si considerano le altre produzioni relative al non terminale Aj Aj → β1 | β2 | . . . | βp in cui nessuna stringa inizia per Aq , q ≤ j. La produzione Ai → Aj α viene quindi sostituita nel modo seguente → β1 α | β2 α | . . . | βm α Ai
  • 69. LFC Eliminazione delle ricorsioni sinistre (continua) Formalismi generativi Espressioni regolari Grammatiche libere Altri tipi di grammatica L’algoritmo completo è il seguente 1: Disponi i non terminali in ordine A1 , . . . , An 2: for i = 1 to n do for j = 1 to i − 1 do 3: Sostituisci le produzioni del tipo Ai → Aj α 4: end for 5: Sostituisci le produzioni del tipo Ai → Ai α 6: 7: end for
  • 70. LFC Esempio Formalismi generativi Espressioni regolari Consideriamo ancora la grammatica G1 per le Grammatiche libere Altri tipi di grammatica espressioni → E + E | E ∗ E | (E) | id E che contiene solo ricorsioni immediate (anche perché contiene un solo non terminale). Le produzioni vengono sostituite nel modo seguente, con l’introduzione di un non terminale E → (E) E | id E E → +E E | ∗ E E | E
  • 71. LFC Esempio Consideriamo la grammatica così definita: Formalismi generativi A → Bb | a Espressioni regolari Grammatiche libere B → Bb | Ac Altri tipi di grammatica che consente la derivazione A ⇒+ Acb. Se nell’ordinamento dei non terminali A si fa precedere a B diviene necessario eliminare la produzione B → Ac. Questo comporta l’introduzione delle due produzioni B → Bbc | ac. La successiva eliminazione delle ricorsioni immediate (B → Bb | Bbc) porta alla seguente grammatica modificata A → Bb | a B → acB → bB | bcB | B
  • 72. LFC Eliminazione delle ambiguità Formalismi generativi Da un punto di vista algoritmico il problema è Espressioni regolari Grammatiche libere notevolmente più complicato. Altri tipi di grammatica Addirittura, se non si fanno restrizioni di altro tipo sulla grammatica libera G in input, il problema di stabilire se G è ambigua non ammette algoritmo (problema indecidibile). Gli algoritmi esistono per sottoclassi delle grammatiche libere. Nella pratica la soluzione consiste nel “progettare” la grammatica in modo che essa sia non ambigua (piuttosto che verificarlo a posteriori) evitando una serie di errori che possono generare ambiguità. Esamineremo alcuni degli accorgimenti da utilizzare
  • 73. LFC Ambiguità delle frasi condizionali Formalismi generativi Nel contesto dei linguaggi di programmazione è Espressioni regolari consuetudine interpretare la frase ambigua della Grammatiche libere Altri tipi di grammatica grammatca GI if cond then if cond then stmt else stmt nel seguente modo: if cond then begin if cond then stmt else stmt end associando cioè ogni else con il più vicino then non ancora associato. Questa regola di solito viene implementata dai parser ma non viene forzata dalle produzioni.
  • 74. LFC Ambiguità delle frasi condizionali (continua) Volendo modificare la grammatica, si introducono Formalismi due tipologie di istruzione condizionale, che generativi Espressioni regolari chiameremo chiusa e aperta Grammatiche libere Altri tipi di grammatica S → O|C C → if B then C else C | A O → if B then S | if B then C else O dove A indica un generico altro comando. Se ora riconsideriamo la frase if b then if b then a else a dove b ed a indicano, rispettivamente, condizioni logiche e comandi generici (non condizionali) vediamo che all’interpretazione if b then begin if b then a end else a non corrisponde nessuna derivazione.
  • 75. LFC Esempio Consideriamo il seguente frammento di grammatica, Formalismi generativi nella quale, rispetto al caso precedente, abbiamo Espressioni regolari Grammatiche libere inserito anche un’istruzione iterativa Altri tipi di grammatica S → O|C C → if B then C else C | I | A O → if B then S | if B then C else O I → while B do S Con questa grammatica la stringa if b then while b do if b then a else a è ambigua, come dimostrano i due possibili alberi di derivazioni mostrati nelle successive trasparenze (la soluzione è lasciata come esercizio)
  • 76. LFC Esempio (continua) S Formalismi generativi Espressioni regolari C Grammatiche libere Altri tipi di grammatica if then else B C C b I A while do B S a b O if then B S b C A a
  • 77. LFC Esempio (continua) S Formalismi generativi Espressioni regolari O Grammatiche libere Altri tipi di grammatica if then B S b C I while do B S b C if then else B C C b A A a a
  • 78. LFC Ambiguità legata alla ricorsione Se una grammatica ammette (per almeno un simbolo Formalismi non terminale raggiungibile) risorsioni bilaterali, cioè generativi sia ricorsioni a sinistra che a destra, allora la Espressioni regolari Grammatiche libere grammatica è ambigua. Altri tipi di grammatica In generale, supponiamo che una data grammatica consente una derivazione del tipo A ⇒+ AαA, con α ∈ V ∗. Sono quindi possibili le seguenti due derivazioni della stringa α1 α2 α3 α4 α5 , dove αi ∈ T è derivabile da A, i = 1, . . . , 5. A A A A A A α4 α2 A A A A α2 α5 α1 α4 α1 α3 α3 α5
  • 79. LFC Ambiguità legate all’unione di linguaggi Formalismi generativi Se G e G generano i linguaggi L e L , allora un Espressioni regolari Grammatiche libere modo immediato per generare il linguaggio Altri tipi di grammatica L = L ∪ L è di usare una grammatica siffatta S → S |S → . . . Produzioni di G S → . . . Produzioni di G S assumendo che S ed S siano gli assiomi rispettivamente di G e G e che le due grammatiche non abbiano simboli non terminali comuni. Tuttavia se L ∩ L = Φ allora la grammatica risulta ambigua.
  • 80. LFC Esempio Sia G la grammatica (già vista) che genera il Formalismi linguaggio L11 , delle palindrome sull’alfabeto {a, b}: generativi Espressioni regolari P → aPa | bPb | a | b | Grammatiche libere Altri tipi di grammatica Sia G la grammatica (anch’essa già vista) che genera il linguaggio L5 , delle stringhe an bm : A → aA | B, B → bB | Poiché l’intersezione dei due linguaggi non è vuota (contiene stringhe del tipo an e bm ), la grammatica S → P|A P → aPa | bPb | a | b | A → aA | B, B → bB | è ambigua. Ad esempio, la frase aa ammette le due seguenti derivazioni canoniche: S ⇒ aPa ⇒ aa e S ⇒ A ⇒ aA ⇒ aaA ⇒ aaB ⇒ aa.
  • 81. LFC Ambiguità legate al concatenamento di linguaggi Formalismi generativi Espressioni regolari Se G e G generano i linguaggi L e L , allora un Grammatiche libere Altri tipi di grammatica modo immediato per generare il linguaggio L = L L è di usare una grammatica siffatta S → SS → . . . Produzioni di G S → . . . Produzioni di G S assumendo che S ed S siano gli assiomi rispettivamente di G e G e che le due grammatiche non abbiano simboli non terminali comuni. Se G può generare le stringhe α1 α2 e α1 e G può generare le stringhe α2 α3 e α3 , allora la stringa α1 α2 α3 ammette due derivazioni canoniche.
  • 82. LFC Esempio Il linguaggio L8 (delle stringhe del tipo an bm ck ) può Formalismi generativi essere ottenuto come concatenazione dei linguaggi Espressioni regolari {an bm } e {bn cm }, e dunque dalla grammatica: Grammatiche libere Altri tipi di grammatica S → AC A → aA | B, B → bB | C → bC | D, D → cD | che però risulta ambigua, a causa della capacità di entrambe le grammatiche “componenti” di generare le stringhe bn . Ad esempio, per la stringa abc si possono dare le seguenti due derivazioni canoniche: S ⇒ AC ⇒ AD ⇒ AcD ⇒ Ac ⇒ aAc ⇒ aBc ⇒ abBc ⇒ abc e S ⇒ AC ⇒ AbC ⇒ AbD ⇒ AbcD ⇒ Abc ⇒ aAbc ⇒ aBbc ⇒ abc.
  • 83. LFC Precedenza degli operatori Formalismi La grammatica G1 fornisce un esempio di ambiguità generativi Espressioni regolari legata alla presenza di produzioni bilaterali Grammatiche libere Altri tipi di grammatica → E+E | E∗E E In questo caso è facile eliminare la ricorsione bilaterale immediata, introducendo un nuovo simbolo non terminale E → E+E | E∗E | E E → id | (E) E La nuova grammatica non è più ambigua ma, come G1 , presenta un problema legato alla precedenza degli operatori.
  • 84. LFC Precedenza degli operatori (continua) Si osservi l’albero di derivazione della stringa Formalismi id + id ∗ id generativi Espressioni regolari E Grammatiche libere Altri tipi di grammatica E * E’ id E + E’ id E’ id Esso suggerisce che l’interpretazione debba essere (id + id) ∗ id, che non coincide con l’interpretazione che universalmente si dà alla stringa in Matematica.
  • 85. LFC Precedenza degli operatori (continua) Formalismi generativi La “usuali” precedenze di operatore possono essere Espressioni regolari Grammatiche libere forzate introducendo differenti simboli non terminali Altri tipi di grammatica per i diversi livelli di precedenza. Ad esempio, nel caso di somma e prodotto possiamo introdurre due livelli di precedenza, rappresentati dai non terminali E e T , oltre ad un simbolo (useremo F ) per la catogoria delle espressioni di base (nel nostro caso identificatori ed espressioni tra parentesi): → E+T | T E → T ∗F | F T → id | (E) F
  • 86. LFC Precedenza degli operatori (continua) Formalismi generativi Espressioni regolari Grammatiche libere Altri tipi di grammatica La grammatica precedente (con le ovvie estensioni) “gestisce” senza ambiguità anche il caso degli operatori di divisione e sottrazione, inseriti nelle giuste categorie sintattiche: → E+T | E−T | T E → T ∗F | T /F | F T → id | (E) F
  • 87. LFC Precedenza degli operatori (continua) Formalismi generativi Espressioni regolari Grammatiche libere Volendo inserire anche l’operatore di Altri tipi di grammatica esponenziazione (che ha precedenza maggiore), è necessario prevedere un’ulteriore variabile sintattica e ricordarsi che l’operatore di esponenziazione (qui useremo il simboloˆ) è associativo a destra: → E+T | E−T | T E → T ∗P | T /P | P T P → FˆP | F → id | (E) F
  • 88. LFC Esercizi Formalismi generativi Espressioni regolari Grammatiche libere Si consideri il linguaggio La>b delle stringhe su Altri tipi di grammatica {a, b} che contengono più a che b. Si dica, giustificando la risposta, se la seguente grammatica libera genera La>b S → a | aS | Sa | abS | aSb | Sab | baS | bSa | Sba Si formisca una grammatica libera per il linguaggio su B contenente tutte e sole le stringhe con un diverso numero di 0 e 1.
  • 89. LFC Esercizi Quali sono le produzioni inutili nella seguente Formalismi grammatica? (R. Backhouse) generativi Espressioni regolari A → aDbb | CH Grammatiche libere Altri tipi di grammatica B → BaH | B C→D D → C| → cEd | b E → BF F H → CD | a Si dica se la grammatica S → aA A → AB | B B→b è ambigua.
  • 90. LFC Esercizi Si considerino le seguenti grammatiche per i Formalismi linguaggi L8 ed L9 : generativi Espressioni regolari Grammatiche libere Altri tipi di grammatica → DC S D → aDb | C → cC | e → AE S → bEc | E A → aA | Si dica quale linguaggio genera la grammatica ottenuta “unendo” le due grammatiche per L8 ed L9 , con la produzione iniziale S → S | S , e se la grammatica stessa è ambigua.
  • 91. LFC Linguaggi formali e compilazione Formalismi generativi Espressioni regolari Grammatiche libere Altri tipi di grammatica Formalismi generativi Espressioni e linguaggi regolari Grammatiche libere Altri tipi di grammatiche
  • 92. LFC Grammatiche lineari Se le produzioni di una grammatica G sono tutte del Formalismi tipo A → XB o A → X , dove X ∈ T ∗ e B ∈ N , allora generativi Espressioni regolari la grammatica è detta lineare destra. Grammatiche libere Altri tipi di grammatica Allo stesso modo, se le produzioni sono del tipo A → BX o A → X , G è detta lineare sinistra. Grammatiche lineari (destre o sinistre) sono dette regolari. Si può dimostrare che le espressioni regolari e le grammatiche regolari sono formalismi equivalenti; in altri termini, un linguaggio è regolare se e solo se è generabile da una grammatica regolare. Inoltre, poichè le grammatiche regolari sono anche libere, ogni linguaggio regolare è anche libero. Il viceversa non è vero; infatti il linguaggio L6 = {an bn |n ≥ 0} non è regolare ma generabile dalla grammatica libera S → aSb | .
  • 93. LFC Esempi Formalismi generativi 1)∗ Il linguaggio 0(0 + è regolare in quanto Espressioni regolari Grammatiche libere generabile dalla seguente grammatica lineare destra Altri tipi di grammatica A → 0B | 0, B → 0 | 1 | 0B | 1B Il linguaggio L5 è regolare in quanto generabile dalla seguente grammatica lineare destra (come abbiamo già visto): S → aS | B, B → bB | Il linguaggio {ab, c}∗ è generabile dalla seguente grammatica S → abS | cS |
  • 94. LFC Grammatiche dipendenti dal contesto Se la forma generale delle produzioni è del tipo: Formalismi generativi α→β Espressioni regolari Grammatiche libere Altri tipi di grammatica dove α, β ∈ V ∗ e |α| ≤ |β|, allora la grammatica è detta dipendente dal contesto (in inglese, context-dependent o context-sensitive o, ancora più brevemente, CSG). Alternativamente, le produzioni possono essere del tipo αAγ → αβγ dove α, β, γ ∈ V ∗ , β = e A ∈ N . Si può dimostrare che le due forme sono equivalenti (cioè generano gli stessi linguaggi). Tuttavia, la seconda forma “spiega” meglio il nome di queste grammatiche: il simbolo A può essere riscritto come β solo se appare nel contesto α − γ.
  • 95. LFC Linguaggi dipendenti dal contesto Sono così detti i linguaggi generabili da grammatiche Formalismi generativi dipendenti dal contesto. Espressioni regolari Grammatiche libere Poiché la forma generale delle produzioni di una Altri tipi di grammatica CSG sono più generali di quelle di una CFG, l’insieme dei linguaggi dipendenti dal contesto “contiene” l’insieme dei linguaggi liberi. (Si noti che la stringa vuota può essere sempre aggiunta prevedendo la produzione S → , dove l’assioma S non compare nella parte destra di alcuna produzione.) Viceversa, ci sono linguaggi dipendenti dal contesto che non sono liberi. Un esempio è il linguaggio L13 = {an bn cn |n ≥ 0}
  • 96. LFC Classificazione di Chomsky Formalismi generativi Espressioni regolari Grammatiche libere Le grammatiche (e i corrispondenti linguaggi) sono Altri tipi di grammatica stati raggruppati in 4 classi, in dipendenza della “potenza” delle produzioni. Al livello più basso abbiamo le grammatiche regolari (o di tipo 3), quindi le grammatiche libere (tipo 2) e quelle dipendenti dal contesto (tipo 1). Le grammatiche più generali, di tipo 0, sono dette grammatiche a struttura di frase, in cui le produzioni sono come quelle delle grammatiche di tipo 1 senza la restrizione |α| ≤ |β|.
  • 97. LFC Costrutti non liberi nei linguaggi di programmazione Formalismi generativi Espressioni regolari Grammatiche libere Altri tipi di grammatica Alcuni aspetti della sintassi dei linguaggi di programmazione non sono catturabili da produzioni di grammatiche libere. Ad esempio, il fatto che il numero di argomenti in una chiamata di procedura debbe coincidere con il numero di parametri formali nella corrispondente definizione non è esprimibile con una CFG. Tale caratteristica è catturata dal cosiddetto linguaggio delle repliche (che non è libero): LR = {αα|α ∈ T ∗ }.