Yet Another Compiler-Compiler. Generazione automatica di analizzatori sintattici

Размер: px
Начинать показ со страницы:

Download "Yet Another Compiler-Compiler. Generazione automatica di analizzatori sintattici"

Транскрипт

1 Yet Another Compiler-Compiler Generazione automatica di analizzatori sintattici

2 2 YACC Yet Another Compiler-Compiler YACC (Bison) è un generatore di analizzatori sintattici a partire dalla descrizione di una grammatica LALR(1) Genera un sorgente C L ingresso è un file che descrive la grammatica con un formalismo analogo alla BNF (Backus-Naur Form) per la specifica dei linguaggi Simboli non terminali identificatori per convenzione in minuscolo expr, stmt Simboli terminali identificatori per convenzione in maiuscolo o singoli caratteri INTEGER, FLOAT, IF, WHILE, ;,. Regole grammaticali (produzioni) expr: expr + expr expr * expr ; E E+E E*E

3 3 YACC valori e azioni Ad ogni elemento è associato un tipo e un valore semantico Tipo: INTEGER, IDENTIFICATORE Valore: Il valore dell intero, il riferimento dell identificatore nella tavola dei simboli Anche le categorie sintattiche possono avere associato un valore Il risultato della valutazione di un espressione Le azioni corrispondono a codice C associato a ciascuna produzione Ogni volta che viene applicata una produzione si esegue l azione associata ad essa In genere l azione permette di combinare i valori associati agli elementi nel lato destro della produzione per ottenere il valore del simbolo non terminale sul lato sinistro expr: expr + expr { $$ = $1 + $3;}; 1 2 3

4 4 YACC integrazione con l analizzatore lessicale Per estrarre i simboli terminali dal file da analizzare occorre usare un analizzatore lessicale l analizzatore sintattico prodotto a YACC chiama l analizzatore lessicale quando deve leggere il prossimo simbolo terminale file di input Analizzatore lessicale INTEGER IDENTIFIER. prossimo elemento Analizzatore sintattico azioni L analizzatore sintattico è sotto forma di una funzione yyparse() e occorre corredarla dell analizzatore lessicale (es. yylex()), le funzioni di gestione degli errori e del programma che la invoca

5 5 I file di grammatica La grammatica è definita in un file di testo (per convenzione con estensione.y) %{ dichiarazioni C (include/define/variabili globali) %} dichiarazioni YACC (definizione di simboli terminali/non-terminali e loro proprietà) %% regole grammaticali e azioni associate %% codice C (copiato nel file generato dopo la funzione yyparse())

6 6 Simboli terminali Rappresentano una classe di elementi equivalenti dal punto di vista sintattico sono rappresentati con codici numerici associati al loro identificatore Corrispondono a dei #define L analizzatore lessicale yylex() deve produrre tale codice quando trova un elemento della classe (si può usare l opzione d per generare il file xx.tab.h che contiene i define per le classi di simboli terminali) while return WHILE; /* regola lex */ Sono dichiarati nella sezione delle dichiarazioni YACC %token WHILE Gli elementi letterali sono utilizzati come le costanti carattere del C (es. + ) e non devono essere dichiarati a meno che non si voglia specificare il tipo di valore semantico associato, l associatività o la precedenza (il codice associato è il valore ASCII corrispondente)

7 7 Definizione delle regole - 1 Una regola grammaticale ha la forma risultato: componenti.. ; <risultato> è il simbolo non terminale a cui si riduce l espressione del lato destro della produzione Il lato destro della produzione è costituito da una sequenza di componenti che comprendono simboli terminali, non terminali e azioni (codice C compreso fra { }) simbolo terminale expr: expr + expr {$$=$1+$3; } AZIONE

8 8 Definizione delle regole - 2 Si possono elencare regole alternative che portano alla riduzione nello stesso simbolo non terminale expr: expr + expr {$$=$1+$3} expr * expr {$$=$1*$3} ; Se il corpo della produzione è vuoto la regola viene soddisfatta anche dalla stringa vuota expr: /* vuota */ expr1 ; La regola è ricorsiva se il non-terminale a sinistra (<risultato>) compare anche nel lato destro (è preferibile evitare la ricorsione a destra..) exprseq: expr exprseq, expr ;

9 9 Definizione della semantica - 1 La semantica dipende dai valori associati agli elementi e dalle azioni eseguite quando si fanno le riduzioni (si applica una regola) expr + expr expr L applicazione della regola expr: expr + expr; deve associare al simbolo expr risultante dalla riduzione il valore della somma dei valori associati ai due simboli expr nell espressione sul lato destro Per default a tutti i simboli è associato un valore di tipo int Si può modificare con un altro tipo C mettendo nella parte di dichiarazioni C #define YYSTYPE <tipoc>

10 10 Definizione della semantica - 2 Se si vogliono usare tipi dati diversi per simboli diversi Si deve specificare la lista completa dei tipi nella parte di dichiarazioni YACC Tipi C %union { double val; char } *sptr; Nomi associati ai tipi in YACC Si associa uno dei tipi definiti ai simboli terminali/non-terminali con le dichiarazioni %token e %type %token <val> NUM %type <sptr> string_ass

11 11 Definizione della semantica - 3 Un azione è una parte di codice C che viene eseguita quando una regola viene applicata (riduzione) Le azioni possono comparire anche nel mezzo della stringa che rappresenta il lato destro della produzione e in tal caso sono eseguite quando la regola è soddisfatta parzialmente (è però poco leggibile) Il codice C dell azione può far riferimento ai valori semantici associati agli elementi della regola expr: expr + expr {$$=$1+$3} ; $$ $1 $3 Il valore dell elemento n nella sequenza è associato a $n $$ rappresenta il valore del lato sinistro Se non si specifica un azione risulta per default $$=$1 Il tipo associato a $n è quello specificato per l elemento corrispondente (si può eventualmente forzare con $<tipo>n

12 12 Dichiarazioni YACC Tutti i simboli terminali che non sono singoli caratteri vanno dichiarati Si utilizza la direttiva %token ID (genera un #define) E possibile specificare la precedenza e l associatività (a sinistra/a destra) degli operatori per semplificare la scrittura della grammatica %left simboli %left <tipo>simboli %right simboli %right <tipo>simboli %nonassoc simboli x op y op z : (x op y) op z x op y op z : x op (y op z) x op y op z : errore di sintassi La precedenza è determinata dall ordine delle dichiarazioni %left + - %left * / - + priorità

13 13 Interfaccia col C La funzione di analisi yyparse() legge simboli terminali, esegue azioni e ritorna il controllo quando Raggiunge la fine del file (valore 0) Incontra un errore di sintassi non recuperabile (valore 1) In un azione si usa la macro YYACCEPT (valore 0) o YYABORT (valore 1) I simboli terminali sono individuati dall analizzatore lessicale - es. yylex() - che fornisce il codice corrispondente (ASCII o #define di YACC) Il valore semantico eventualmente associato al simbolo terminale deve essere memorizzato nella variabile globale yylval Se in YACC si usa un solo tipo YYSTYPE allora yylval è di tale tipo altrimenti è una union C

14 14 Interfaccia col C - yylval Se yylval è di un tipo unico nell azione di lex si avrà }. yylval = value; return ID; Se si usano invece più tipi %union { double val; char *sptr; } }. yylval.sptr = string; return STRING; Se il valore è un puntatore, l indirizzo deve essere relativo ad un area di memoria globale o nello heap (allocata con malloc)

15 15 Gestione degli errori - 1

16 16 Gestione degli errori - 2 Dopo aver eseguito yyerror() l analizzatore tenta di recuperare l errore se è stata scritta una funzione di recupero da errori, altrimenti esce da yyparse con valore 1 La variabile yynerrs memorizza il numero di errori trovati (è una variabile globale per analizzatori non rientranti) In genere si vuole evitare che l analisi si blocchi al primo errore incontrato Si può definire cosa fare in corrispondenza di un errore di sintassi facendo in modo che la regola riconosca il simbolo terminale error Il simbolo speciale error è generato dall analizzatore tutte le volte che si genera un errore di sintassi

17 17 Gestione degli errori - 3 stmt: /* vuoto */ stmt \n stmt exp \n stmt error \n Se si verifica un errore in exp ci sono probabilmente delle derivazioni incomplete nello stack dell analizzatore e altri simboli terminali nell input prima di arrivare a \n il parser forza l applicazione della regola eliminando parte del contesto sintattico dallo stack e dall input elimina stati e oggetti dallo stack fino a che la regola che comprende error è accettabile (trova lo stmt precedente) sposta nello stack il simbolo error legge simboli dall ingresso fino a che non trova un simbolo terminale di lookahead accettabile ( \n in questo caso)

18 18 Gestione degli errori the art of In genere è difficile decidere (e realizzare) la migliore strategia per la gestione degli errori Ad esempio si può saltare il resto della linea di ingresso o il comando corrente in caso di errore stmt: error ; /* in caso di errore si prosegue fino a leggere ; */ Si può cercare di bilanciare le parentesi per evitare che si generino errori a catena correlat i al primo item: ( expr ) ( error ) /* rileva un errore in expr senza generare errori di bilanciamento di parentesi */

19 19 Gestione degli errori the art of 2 Facendo le scelte sbagliate un errore di sintassi ne può innescare un altro.. Per evitare una produzione incontrollata di messaggi di errore l analizzatore non emette messaggi nuovi per un errore di sintassi che compare subito dopo l ultimo rilevato (si devono leggere almeno due nuovi simboli per generare un nuovo errore) Si può riattivare l emissione di messaggi di errore chiamando la funzione yyerrok in una azione

20 20 Un esempio - calcolatrice parser per gestire le operazioni di una calcolatrice multifunzione che prevede Operatori artimetici ( +, -, *, /, ^ ) Funzioni predefinite (sin, cos, exp, log, ) che si invocano come f(x) Variabili con nome e assegnazioni (v=1) File sorgente per YACC/Bison File sorgente per LEX File di supporto in C (gestione tavola dei simboli) L analizzatore sintattico si genera con bison d calc.y I files prodotti sono calc.yy,tab.c e calc.yy.tab.h

21 21 Parser generators Sono disponibili numerosi generatori di parser lessicali e/o sintattici Generano codice per linguaggi target diversi Implementano strategie di parsing diverse BYACC/J genera parser Java di tipo LALR(1) Coco/R genera parser di tipo LL(k) in C, C++, C#, Java, Pascal CUP genera parser LALR(1) in Java JavaCC genera parser LL(k) in Java Lime genera parser LALR(1) in PHP.. Si veda

Esercitazioni di Linguaggi e Traduttori

Esercitazioni di Linguaggi e Traduttori 1 Linguaggi CF e Riconoscitori 2 Introduzione a Yacc Introduzione a YACC Definizione dei simboli Codifica della grammatica Formato del programma prodotto da YACC Ambiguità e conflitti Conflitti shift-reduce

Подробнее

Dispensa 3. 1.1 YACC: generalità

Dispensa 3. 1.1 YACC: generalità Dispensa 3 1.1 YACC: generalità Il tool Yacc (acronimo per Yet Another Compiler Compiler) è uno strumento software che a partire da una specifica grammaticale context free di un linguaggio scritta in un

Подробнее

Dispensa YACC. 1.1 YACC: generalità

Dispensa YACC. 1.1 YACC: generalità Dispensa YACC 1.1 YACC: generalità Il tool Yacc (acronimo per Yet Another Compiler Compiler) è uno strumento software che a partire da una specifica grammaticale context free di un linguaggio scritta in

Подробнее

Analizzatore lessicale o scanner. Lo scanner rappresenta un'interfaccia fra il programma sorgente e l'analizzatore sintattico o parser.

Analizzatore lessicale o scanner. Lo scanner rappresenta un'interfaccia fra il programma sorgente e l'analizzatore sintattico o parser. Analizzatore lessicale o scanner Dispensa del corso di Linguaggi e Traduttori A.A. 2005-2006 Lo scanner rappresenta un'interfaccia fra il programma sorgente e l'analizzatore sintattico o parser. Lo scanner,

Подробнее

Linguaggi e Ambienti di Programmazione

Linguaggi e Ambienti di Programmazione Linguaggi e Ambienti di Programmazione Principi e tecniche diffuse che si incontrano spesso nelle applicazioni dell informatica. Compilatori Editor di struttura: riceve in input una sequenza di comandi

Подробнее

Analizzatori Lessicali con JLex. Giuseppe Morelli

Analizzatori Lessicali con JLex. Giuseppe Morelli Analizzatori Lessicali con JLex Giuseppe Morelli Terminologia Tre concetti sono necessari per comprendere la fase di analisi lessicale: TOKEN: rappresenta un oggetto in grado di rappresentare una specifica

Подробнее

I Linguaggi di Programmazione

I Linguaggi di Programmazione I Linguaggi di Programmazione 1 Linguaggio naturale e linguaggio macchina La comunicazione uomo-macchina avviene attraverso formalismi che assumono la forma di un linguaggio. Caratteristiche del Linguaggio

Подробнее

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica Fondamenti di Informatica INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA Fondamenti di Informatica - D. Talia - UNICAL 1 Fondamenti di Informatica - Programma Un programma è una formulazione

Подробнее

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - Programma

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - Programma Fondamenti di Informatica INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA Fondamenti di Informatica - D. Talia - UNICAL 1 Fondamenti di Informatica - Programma Un programma è una formulazione

Подробнее

Costanti e Variabili

Costanti e Variabili Parte 3 Costanti e Variabili Identificatori Un identificatore è un nome che viene associato a diverse entità (costanti, tipi, variabili, funzioni, ecc.) e serve ad identificare la particolare entità Gli

Подробнее

Funzioni, Stack e Visibilità delle Variabili in C

Funzioni, Stack e Visibilità delle Variabili in C Funzioni, Stack e Visibilità delle Variabili in C Programmazione I e Laboratorio Corso di Laurea in Informatica A.A. 2016/2017 Calendario delle lezioni Lez. 1 Lez. 2 Lez. 3 Lez. 4 Lez. 5 Lez. 6 Lez. 7

Подробнее

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I Lezione 4 Elementi lessicali e espressioni logiche Matricole 2-3 Elementi lessicali il linguaggio C ha un suo vocabolario di base i cui elementi sono detti token esistono 6 tipi di token: parole chiave

Подробнее

Lezione 6 Introduzione al C++ Mauro Piccolo

Lezione 6 Introduzione al C++ Mauro Piccolo Lezione 6 Introduzione al C++ Mauro Piccolo [email protected] Linguaggi di programmazione Un linguaggio formale disegnato per descrivere la computazione Linguaggi ad alto livello C, C++, Pascal, Java,

Подробнее

Fasi di un Compilatore

Fasi di un Compilatore Dipartimento di Matematica e Informatica Università di Camerino Un implementazione compilativa di un linguaggio di programmazione viene realizzata tramite un programma che prende il nome di compilatore

Подробнее

Programmazione Orientata agli Oggetti in Linguaggio Java

Programmazione Orientata agli Oggetti in Linguaggio Java Programmazione Orientata agli Oggetti in Linguaggio Java Classi e Oggetti: Metafora Parte a versione 2.2 Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina)

Подробнее

Linguaggio C - sezione dichiarativa: costanti e variabili

Linguaggio C - sezione dichiarativa: costanti e variabili Dipartimento di Elettronica ed Informazione Politecnico di Milano Informatica e CAD (c.i.) - ICA Prof. Pierluigi Plebani A.A. 2008/2009 Linguaggio C - sezione dichiarativa: costanti e variabili La presente

Подробнее

Elementi di Base. Introduzione a Python.

Elementi di Base. Introduzione a Python. Elementi di Base Introduzione a Python http://www.dia.uniroma3.it/~roselli/ [email protected] Credits Materiale a cura del Prof. Franco Milicchio Panoramica Elementi di base della sintassi (struttura,

Подробнее

Fondamenti d Informatica: linguaggi formali. Barbara Re, Phd

Fondamenti d Informatica: linguaggi formali. Barbara Re, Phd Fondamenti d Informatica: linguaggi formali Barbara Re, Phd Agenda } Introdurremo } La nozione di linguaggio } Strumenti per definire un linguaggio } Espressioni Regolari 2 Linguaggio } Da un punto di

Подробнее

Primo programma in C

Primo programma in C Primo programma in C Struttura minima di un file C Applicazioni C in modo console Struttura del programma Commenti Direttive #include Definizione di variabili Corpo del main 2 Struttura minima di un file

Подробнее

Analizzatore Lessicale Parte I Scanner

Analizzatore Lessicale Parte I Scanner Analizzatore Lessicale Parte I Scanner Sommario Dispensa di Linguaggi di Programmazione Corrado Mencar, Pasquale Lops In questa dispensa si descrive un approccio alla costruzione di un analizzatore lessicale

Подробнее

Definizioni syntax-directed

Definizioni syntax-directed Definizioni syntax-directed Esempio: Notazione infissa Notazione postfissa Produzioni E E 1 + T E E 1 T E T T 0 T 1 T 2... T 9 Regole semantiche E.t := E 1.t _T.t _ + E.t := E 1.t _T.t _ - E.t := T.t T.t

Подробнее

Perché il linguaggio C?

Perché il linguaggio C? Il linguaggio C 7 Perché il linguaggio C? Larga diffusione nel software applicativo Standard di fatto per lo sviluppo di software di sistema Visione a basso livello della memoria Capacità di manipolare

Подробнее

Il Modello di un Compilatore. La costruzione di un compilatore per un particolare linguaggio di programmazione e' abbastanza complessa.

Il Modello di un Compilatore. La costruzione di un compilatore per un particolare linguaggio di programmazione e' abbastanza complessa. Il Modello di un Compilatore La costruzione di un compilatore per un particolare linguaggio di programmazione e' abbastanza complessa. La complessità dipende dal linguaggio sorgente. Compilatore: traduce

Подробнее

Le basi del linguaggio Java

Le basi del linguaggio Java Corso di Laurea Ingegneria Civile Fondamenti di Informatica Dispensa 10 Le basi del linguaggio Java Aprile 2010 Le basi del linguaggio Java 1 Prerequisiti Nozioni generali sulla sintassi e semantica del

Подробнее

Corso di Fondamenti di Informatica Il sistema dei tipi in C++

Corso di Fondamenti di Informatica Il sistema dei tipi in C++ Corso di Fondamenti di Informatica Il sistema dei tipi in C++ Anno Accademico Francesco Tortorella Struttura di un programma C++ // Programma semplice in C++ #include int main() { cout

Подробнее

Generatori di analizzatori lessicali e sintattici

Generatori di analizzatori lessicali e sintattici Generatori di analizzatori lessicali e sintattici 1 Analizzatori lessicali Analisi lessicale: riconoscere nella stringa di ingresso gruppi di simboli che corrispondono a specifiche categorie sintattiche.

Подробнее

Analizzatore lessicale o scanner

Analizzatore lessicale o scanner Analizzatore lessicale o scanner Lo scanner rappresenta un'interfaccia fra il programma sorgente e l'analizzatore sintattico o parser. Lo scanner, attraverso un esame carattere per carattere dell'ingresso,

Подробнее

Dispensa 2. Data una grammatica context free esistono tre metodi diversi per costruirne la parsing table per un parser LR:

Dispensa 2. Data una grammatica context free esistono tre metodi diversi per costruirne la parsing table per un parser LR: Dispensa 2 2.1 Costruzione Parsing Table LR: generalità Come tutti i parser tabellari predittivi, anche i parser LR possono essere applicati solo a parsing table senza conflitti (ossia entrate multiple)

Подробнее

6 - Blocchi e cicli. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

6 - Blocchi e cicli. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo 6 - Blocchi e cicli Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://pages.di.unipi.it/milazzo milazzo di.unipi.it

Подробнее

Linguaggi e Traduttori: Analisi lessicale

Linguaggi e Traduttori: Analisi lessicale Linguaggi e Traduttori: Analisi lessicale Armando Tacchella Sistemi e Tecnologie per il Ragionamento Automatico (STAR-La) Dipartimento di Informatica Sistemistica e Telematica (DIST) Università di Genova

Подробнее

Caratteristiche di un linguaggio ad alto livello

Caratteristiche di un linguaggio ad alto livello Caratteristiche di un linguaggio ad alto livello Un linguaggio ad alto livello deve offrire degli strumenti per: rappresentare le informazioni di interesse dell algoritmo definire le istruzioni che costituiscono

Подробнее

Programmazione in Java (I modulo)

Programmazione in Java (I modulo) Programmazione in Java (I modulo) Lezione 4 Variabili di tipo primitivo. Dichiarazione di costanti Conversioni di tipo: operatore cast Altri operatori di assegnamento Operazioni aritmetiche e di confronto

Подробнее

Prof. Pagani Corrado INTRODUZIONE AL LINGUAGGIO C

Prof. Pagani Corrado INTRODUZIONE AL LINGUAGGIO C Prof. Pagani Corrado INTRODUZIONE AL LINGUAGGIO C IL LINGUAGGIO C Nel 1972 Dennis Ritchie nei Bell Laboratories progettò il linguaggio C Il linguaggio possiede tutti i costrutti di controllo dei linguaggi

Подробнее

Linguaggi di Programmazione

Linguaggi di Programmazione Linguaggi di Programmazione 1 Linguaggio naturale e linguaggio macchina La comunicazione uomo-macchina avviene attraverso formalismi che assumono la forma di un linguaggio. Caratteristiche del Linguaggio

Подробнее