Fondamenti di Programmazione A.A. 2012-2013 Grammatiche Parse trees Lezione del 17/10/2012 AUTILI MARCO http://www.di.univaq.it/marco.autili/
Riassunto lezione precedente Sintassi vs Semantica Stringhe, linguaggi e operazioni Introduzione grammatiche Grammatiche libere dal contesto Grammatica per espressioni semplici Derivazione di espressioni semplici
Riassunto lezione precedente E ( E ) E E + E E E - E E E * E E E / E E N N C N NC C 0 1 2 3 4 5 6 7 8 9 la testa è la categoria sintattica a sinistra della freccia; il metasimbolo si legge può essere riscritto in una categoria sintattica è un simbolo non terminale che può essere riscritto il corpo, costituito da zero o più categorie sintattiche e/o simboli terminali a destra della freccia. il metasimbolo si legge oppure ; N:B.: Ogni categoria sintattica può essere riscritta e genera un sotto-linguaggio N.B.: Ogni simbolo terminale non può essere riscritto
Riassunto lezione precedente Insieme di tutte le espressioni sintatticamente corrette Derivazione (Generazione/Costruzione) di espressioni, cioè stringhe sull alfabeto {0,1,, 9, (, ), +, -, *, /}, sintatticamente corrette E -> E * E -> usando la produzione E ::= E * E N * E -> usando la produzione E ::= N N * N -> usando la produzione E ::= N C * N -> usando la produzione N ::= C C * C -> usando la produzione N ::= C 9 * C -> usando la produzione C ::= 9 9 * 5 usando la produzione C ::= 5 N.B.: -> è diverso da ::= e da
Linguaggi di programmazione Un linguaggio di programmazione e un insieme di stringhe ammissibili (sintatticamente corrette) che chiamiamo programmi I linguaggi di programmazione sono essenzialmente sottoinsiemi di ASCII* (e sue estensioni), dove ASCII è l alfabeto dei caratteri alfabetici, numeri e di interpunzione presenti, secondo uno standard internazionale, sulla tastiera alfanumerica di ogni computer. ASCII è l'acronimo di American Standard Code for Information Interchange (ovvero Codice Standard Americano per lo Scambio di Informazioni)
ASCII Table..
Per esempio <Comando> while < Condizione > do <Comando> <Comando> if < Condizione > then <Comando> <Comando> if < Condizione > then <Comando> else <Comando> <Comando> begin <ListaCom> end <Comando> < ComSemplice > <ListaCom> <Comando> <ListaCom> ; <Comando> < ComSemplice > dalla questa grammatica, si può derivare: if (x < 3) then x = x + 1; else x = x - 1;
Definizione formale di grammatica Formalmente una grammatica G è definita come una quadrupla <A, V, S, P> A è un insieme di simboli detto alfabeto; V è l insieme finito di simboli NON TERMINALI, ovvero delle categorie sintattiche, ovvero di variabili che rappresentano sottolinguaggi ; S V è il SIMBOLO INIZIALE, ovvero la categoria sintattica principale o iniziale; P è un insieme finito di produzioni. ESEMPIO: < {0,1,, 9, (, ), +, -, *, /}, {E,N,C}, E, {E::=( E ),, C::=9} > Per le grammatiche libere ciascuna produzione ha la struttura A α dove A V e α (A V) +
Linguaggi generati da grammatiche Il linguaggio generato (oppure definito) da una grammatica G = <A, V, S, P> è l insieme: L(G) = {α α A* e α è derivabile da S in base a P} L(G) di solito è infinito Per generare, o meglio enumerare, tutte le stringhe in L(G) si dovrebbero analizzare ciclicamente, una dopo l altra, le produzioni della grammatica: si modifica ogni volta il linguaggio di ogni categoria sintattica usando la regola induttiva in tutti i modi possibili, facendo cioè tutte le scelte possibili per le stringhe generate fino a quel momento (vedi esempio dispense pag. 25).
Parse trees Gli alberi di derivazione (parse trees) sono una rappresentazione ad albero della struttura sintattica delle stringhe rispetto ad una grammatica data Sono molti utili: per strutturare il processo di derivazione di una stringa e quindi per rappresentare la dimostrazione che una stringa appartiene al linguaggio generato da una grammatica per definire il significato di una stringa in termini della sua struttura sintattica Per esempio, sono usati dall analizzatore sintattico e l analizzatore semantico (come parti dei compilatori)
Parse trees: un esempio <E> ( <E> ) <E> <E> + <E> <E> <E> <E> <E> <E> * <E> <E> <E> / <E> <E> <N> <N> <C> <N> <N> <C> <C> 0 <C> 1 <C> 9 La stringa che si ottiene concatenando le etichette delle foglie dell albero da sx verso dx si chiama frontiera: 3 * (2 + 14)