Capitolo 1 Grammatiche E Linguaggi Formali
Total Page:16
File Type:pdf, Size:1020Kb
View metadata, citation and similar papers at core.ac.uk brought to you by CORE provided by Electronic Thesis and Dissertation Archive - Università di Pisa UNIVERSITÀ DEGLI STUDI DI PISA Facoltà di Scienze Matematiche, Fisiche e Naturali Corso di Laurea Specialistica in Informatica Tesi di Laurea Compiler Generator: Considerazioni e Confronti Candidato: Gianfilippo Bortone Relatore: Controrelatore: Prof. Marco Bellia Prof. Andrea Maggiolo Schettini Anno Accademico 2006/2007 Ai miei genitori Francesca e Donato che mi hanno sostenuto ed incoraggiato in tutti questi anni. “Una parola non riuscirebbe a racchiudere tutto ciò che è dentro di lui; difficile, a volte, entrare nel suo particolarissimo mondo, ma chiunque sia toccato dal suo affetto non può rimanere impassibile di fronte a quella miscela di stravaganza, dolcezza e fantasia che è... Gianfy B.! ” Alessandra e Francesca A tutti i miei amici. Indice Introduzione .................................................................................. V Capitolo 1: Grammatiche e linguaggi formali 1.1 Linguaggio: introduzione ............................................................ 1 1.1.1 Operazioni su stringhe e su linguaggi .................................. 2 1.1.2 Linguaggi formali ................................................................. 5 1.1.3 Rappresentazione di linguaggi: generatori e riconoscitori ... 6 1.2 Grammatica: Introduzione ........................................................... 6 1.2.1 Grammatiche regolari ............................................................ 9 1.2.2 Grammatica ambigua ........................................................... 10 1.2.3 Albero sintattico ................................................................... 11 1.3 Automi a stati finiti: introduzione ............................................... 14 1.3.1 Automa a stati finiti deterministici ........................................ 16 1.3.2 Automa a stati finiti non deterministici ............................... 20 Capitolo 2: Riconoscitori deterministici 2.1 Introduzione ................................................................................. 24 2.2 Analisi sintattica ........................................................................... 25 2.3 Grammatiche libere dal contesto .................................................. 28 2.4 Alberi di derivazione .................................................................... 29 2.5 Ambiguità ..................................................................................... 35 2.6 Automi a pila ................................................................................ 38 2.7 Analisi discendente deterministica: introduzione ......................... 44 2.7.1 Eliminazione della ricorsione a sinistra ............................... 45 2.7.2 Fattorizzazione a sinistra ...................................................... 50 2.7.3 Parser Top-Down ................................................................ 52 2.7.4 Grammatiche LL(K) ............................................................. 55 2.7.5 Grammatiche LL(1) ............................................................. 58 2.7.6 Funzione First ....................................................................... 59 I 2.7.7 Funzione Follow ................................................................... 59 2.7.8 Costruzione della tabella per le grammatiche LL(1) ............ 60 2.8 Analisi ascendente deterministica: introduzione .......................... 63 2.8.1 Parser Bottom-up ................................................................. 64 2.8.2 Automa di controllo per il parsing LR ................................. 68 2.8.3 Costruzione della tabella per le grammatiche LR(0) ........... 69 2.8.4 Costruzione della tabella per le grammatiche SLR(1) ......... 73 2.8.5 Costruzione della tabella per le grammatiche LR(1) ........... 76 2.8.6 Costruzione della tabella per le grammatiche LALR(1) ...... 81 Capitolo 3: Parser generator YACC 3.1 Parser generator Yacc: introduzione ............................................ 84 3.2 File generati dal parser Yacc ........................................................ 85 3.3 Struttura di un parser generator Yacc ........................................... 86 3.3.1 Sezione del file di specifica .................................................. 86 3.3.2 Sezione azioni ...................................................................... 89 3.3.3 Sezione programmi .............................................................. 91 3.4 Interfaccia con l’analizzatore lessicale ......................................... 91 3.5 Come lavora il parser prodotto da Yacc ....................................... 92 3.6 Ambiguità e conflitti usando Yacc ............................................... 95 3.7 Gestione degli errori in Yacc ....................................................... 100 3.8 Ambiente di sviluppo Yacc .......................................................... 103 3.9 Ricorsione sinistra ........................................................................ 104 3.10 Limiti interni di Yacc ................................................................. 106 3.11 Descrizione dei file generati da Yacc ......................................... 107 Capitolo 4: Parser generator Bison 4.1 Parser generator Bison: introduzione ........................................... 114 4.2 Struttura di un parser generator Bison ......................................... 115 4.2.1 Sezione prologue .................................................................. 115 4.2.2 Sezione dichiarazioni ........................................................... 116 4.2.3 Sezione regole grammaticali ................................................ 116 4.2.4 Sezione epilogue .................................................................. 117 4.3 Lista di dichiarazioni usate in Bison ............................................ 118 4.4 Valori semantici ........................................................................... 122 4.5 Come usare il parser Bison .......................................................... 123 4.6 Gestione degli errori ..................................................................... 124 4.7 Generalizzazione del parser LR (GLR) ........................................ 125 II 4.8 Altri parser generators per grammatiche LALR(1) ...................... 127 Capitolo 5: Parser generator Essence 5.1 Parser generator Essence: introduzione ........................................ 130 5.2 Struttura di una grammatica per Essence ..................................... 131 5.2.1 Struttura sintattica ................................................................ 132 5.2.2 Struttura semantica ............................................................... 132 5.3 Esecuzione del parser Essence ..................................................... 134 5.4 Implementazione dello strema di input ........................................ 135 5.4.1 Interfaccia dello stream ........................................................ 135 5.4.2 Struttura dello stream ........................................................... 136 5.5 Recupero degli errori .................................................................... 137 5.6 Altri parser generators per grammatiche LR o GLR .................... 138 Capitolo 6: Parser generator Coco/R 6.1 Parser generator Coco/R: introduzione ........................................ 140 6.2 Caratteristiche di Coco/R ............................................................. 141 6.3 Struttura generica di un parser generator Coco/R ........................ 142 6.3.1 Struttura del compilatore Coco1/R ....................................... 143 6.3.2 Le produzioni ....................................................................... 144 6.3.3 Le azioni semantiche ............................................................ 144 6.3.4 Gli attributi ........................................................................... 145 6.3.5 Attributi dei simboli terminali .............................................. 146 6.3.6 Il simbolo ANY .................................................................... 146 6.4 Conflitti LL(1) .............................................................................. 147 6.5 Risolvere i conflitti LL(1) con la trasformazione della grammatica ................................................................................... 148 6.6 Come risolvere i conflitti LL(1) ................................................... 151 6.6.1 Conflitti risolti da un multi simbolo di lookahead ............... 152 6.6.2 Nomi dei tokens ..................................................................... 153 6.6.3 Traslazione dei conflitti resolvers ........................................ 154 6.6.4 Conflitti risolti attraverso informazioni semantiche ............. 155 6.6.5 Disporre i resolvers in modo corretto ................................... 156 6.7 Trattamento degli errori sintattici ................................................. 157 6.7.1 Simboli terminali non validi ................................................. 158 6.7.2 Liste alternative non valide .................................................. 158 6.7.3 Sincronizzazione .................................................................. 159 6.7.4 Weak tokens (tokens deboli) ................................................ 160 III 6.8 Struttura del file ............................................................................ 161 6.9 Altri parser generators per