Analizzatori Lessicali con JLex. Giuseppe Morelli

Documenti analoghi
Primi passi con JFlex

Fondamenti d Informatica: linguaggi formali. Barbara Re, Phd

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

Yet Another Compiler-Compiler. Generazione automatica di analizzatori sintattici

Fasi di un Compilatore

Analizzatore lessicale

Esercitazioni di Linguaggi e Traduttori

LEX. Espressioni regolari in Lex

Espressioni regolari in UNIX p.1/19

Funzioni, Stack e Visibilità delle Variabili in C

Implementazione di DFA in C

Riconoscitori e analizzatori sintattici. Scanning e parsing. Funzionamento di un parser: la tecnica Shift/Reduce. Esempio

Corso di Informatica

Linguaggi di Programmazione

Funzioni, Stack e Visibilità delle Variabili in C

Scopo del progetto è la costruzione di un compilatore per il linguaggio descritto qui di seguito.

Strutture dati nel supporto a run time

Laboratorio di Algoritmi e Strutture Dati

POLITECNICO DI TORINO. Laboratorio di Compilatori Corso di Linguaggi e Traduttori. Esercitazione 2. a.a 2010 / 2011

Linguaggi e Traduttori: Analisi lessicale

Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 4 24/10/2013

#include <stdio.h> /* l esecuzione comincia dalla funzione main */ int main()

Linguaggi e Ambienti di Programmazione

Automi e Linguaggi Formali

Il corpo di tutte le funzioni deve essere contenuto tra parentesi graffe

Linguaggio di Riferimento: C

Elementi di programmazione

Progetti Algoritmi e Strutture Dati A.A Si intende realizzare una coda di priorità mediante un max-heap.

La seconda linea deve iniziare con un TAB (non la scritta 'TAB') e contiene cosa il programmatore scriverebbe per ottenere quel target.

POLITECNICO DI TORINO. Laboratorio di Compilatori Corso di Linguaggi e Traduttori. Esercitazione 5. a.a 2010 / Controllo dei tipi

Input/Output di numeri

Introduzione alla programmazione in linguaggio C

Corso di Laboratorio di Sistemi Operativi

Laboratorio di Programmazione (Corso di Laurea in Informatica)

Programmare. Compilatori e interpreti. Editor :: vi. Hello1.c. #include <stdio.h> >> cc Hello1.c. main() { printf( \n Hello World!

Analizzatore Lessicale Parte I Scanner

ciclo di vita della soluzione (informatica) di un problema

Le classi in java. Un semplice programma java, formato da una sola classe, assume la seguente struttura:

ciclo di vita della soluzione (informatica) d un problema

Linguaggio C - sezione dichiarativa: costanti e variabili

Adeguamento template fatture elettroniche per dispositivi medici

INPUT E OUTPUT DI VALORI NUMERICI

Laboratorio di Informatica I

Capitolo 5 - Funzioni

Introduzione alla programmazione nella shell di Unix 10 Maggio 2005

perror: individuare l errore quando una system call restituisce -1

Lezione 5: Introduzione alla programmazione in C

Page 1. Programmazione. Shell e programmazione. File comandi (script) Introduzione alla programmazione nella shell di Unix

STORIA E CARATTERISTICHE

Progetto per il Laboratorio di Programmazione Un interprete per il linguaggio PINO. Modulo I: Le tavole dei simboli (TS)

Detail ELETTRONICA INDUSTRIALE

Il linguaggio C. Prof. E. Occhiuto INFORMATICA 242AA a.a. 2010/11 pag. 1

Analisi lessicale (scanner)

Autore: Prof. Agostino Sorbara ITIS "M. M. Milano" Polistena (RC)

ANALISI SINTATTICA LUCIDI DI F. D'AMORE E A. MARCHETTI SPACCAMELA

Esempio. Le istruzioni corrispondono a quelle di sopra, ma sono scritte in modo simbolico. E indipendente dalla machina

Laboratorio di Sistemi Software Progetto Pattern Generator Specifica iniziale

1 PANORAMICA SUL LINGUAGGIO C

ASTRAZIONE. Sono indipendenti dalla macchina hardware sottostante ASTRAZIONE 1

Unità Didattica 1 Linguaggio C. Fondamenti. Struttura di un programma.

Le basi del linguaggio Java

Programmazione Orientata agli Oggetti in Linguaggio Java

Introduzione alla programmazione

Analizzatore lessicale o scanner

Introduzione al C. Unità 10 Preprocessore

LINGUAGGI DI PROGRAMMAZIONE

Corso di PHP. Prerequisiti. 2.1 Variabili. Conoscenza HTML Tecnica della programmazione Principi di programmazione web. M. Malatesta 2.

Definire tramite una grammatica ad attributi il

Corso sul linguaggio Java

Introduzione al C. Unità 10 Preprocessore. D. Bloisi, S. Peluso, A. Pennisi, S. Salza

Introduzione al linguaggio C Funzioni

Corso sul linguaggio C

Analisi lessicale (scanner)

Scheme: struttura del programma e campo di azione

Programmazione I - Laboratorio

Programmazione Orientata agli Oggetti in Linguaggio Java

Il preprocessore. Direttiva define Direttiva include Direttiva if

Corso di Linguaggi di Programmazione

3.5.1 PREPARAZ1ONE I documenti che si possono creare con la stampa unione sono: lettere, messaggi di posta elettronica, o etichette.

Pattern matching e tipi di dato strutturati

Linguaggio C: introduzione

Programmazione ad Oggetti

Struttura dei programmi e Variabili

Programmazione Orientata agli Oggetti. Emilio Di Giacomo e Walter Didimo

ASTRAZIONE ASTRAZIONE

Le istruzioni corrispondono univocamente a quelle macchina, ma vengono espresse tramite nomi simbolici i (parole chiave)

Linguaggio C. Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore.

I Linguaggi di Programmazione

Corso di Matematica per la Chimica. Dott.ssa Maria Carmela De Bonis a.a

LA CODIFICA DELLE INFORMAZIONI

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

Comandi principali di Linux (1)

Programmare. Definire una sequenza di istruzioni che specificano come effettuare una elaborazione

Le direttive del Preprocessore

Elementi di Base. Introduzione a Python.

CAPITOLO 3 - ALGORITMI E CODIFICA

Laboratorio di Programmazione(corso A) Laurea in Informatica - A.A. 2000/2001 Docente: A. Lanza

Transcript:

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 classe di unità lessicali. In genere è rappresentato da un nome ed un attributo. PATTERN o MODELLO: è una descrizione compatta delle possibili forme che una unità lessicale può assumere LESSEMA: è una sequenza di caratteri del programma sorgente che corrisponde al pattern di un token (istanza specifica di un token)

Compiti di un analizzatore lessicale È la prima fase del processo di compilazione ed ha il compito principale di leggere il programma sorgente (sequenza di caratteri), raggrupparli in lessemi, e produrre in uscita una sequenza di token corrispondente ai lessemi trovati, interagendo con la tabella dei simboli. Trattando direttamente il programma sorgente l analizzatore lessicale è in grado di svolgere ulteriori operazioni e/o compiti

Elimina e/o ignora spazi vuoi e delimitatori in genere (spazi, tabulazioni, ritorni a capo) Associa i messaggi di errore prodotti dal compilatore al programma sorgente ( es. conta il numero di CR e lo restituisce in presenza di un errore, o si occupa di riscrivere il programma sorgente con iniettato il messaggio di errore nella linea corrispondente) Se nel programma sorgente sono presenti delle macro potrebbe occuparsi della relativa espansione

Fasi analisi lessicale A volte gli analizzatori lessicali sono visti come composizione di due distinti processi: La scansione o scanning: eliminazione di separatori e commenti espansione di macro etc. ovvero tutte le attività che non richiedono la tokenizzazione L analisi lessicale vera e propria: produzione della sequenza di TOKEN a partire dalla sequenza già scansionata.

Un analizzatore lessicale ha lo scopo di suddividere un flusso di caratteri in input in TOKEN. Realizzare un analizzatore lessicale da zero, può risultare un lavoro alquanto complicato. La miglior utility per la costruzione di un analizzatore lessicale è il programma Lex (generatore di analizzatori lessicali per Unix) che, dato un file di specifiche, genera il codice C di un analizzatore che soddisfa le specifiche

JLex JLex è una utility basata sul modello Lex, prende infatti delle specifiche simili a quelle accettate da Lex, quindi, crea un sorgente Java che implementa un analizzatore lessicale soddisfacente le specifiche.

Download ed installazione Il Link : http://www.cs.princeton.edu/~appel/modern/java/jlex/ È possibile scaricare il sorgente del generatore: Main.java (naturalmente è scritto in Java) Si mette in una directory JLex (il cui path sta nel PATH di ambiente) Si compila Si richiama su un file di specifica con : java JLex.Main source.lex Nello stesso sito: manuale, readme, esempi.

Struttura di un file di specifica Lex Tre sezioni separate dal simbolo %% : 1. User Code: viene ricopiata nel file java finale as is ; fornisce spazio per implementare classi di supporto etc.. 2. JLex directives: Vengono definite le Macro e vengono dichiarati i nomi degli stati 3. JLex rules: vengono definite le regole per l analisi ognuna delle quali consiste di tre parti: lista degli stati (opzionale), espressione regolare, azione User code %% Jlex directives %% JLex rules

User Code Section Contiene le classi per: Utilizzo del lexer (potrebbe non esserci se utilizzato in combinazione con un generatore di parser) Funzioni, proprietà, variabili e/o costanti di supporto La definizione degli oggetti TOKEN

Note: JLex Directives Yylex: è la classe generata dal lexer che implementa l analizzatore lessicale Per l utilizzo del lexer nella sezione user code viene istanziato un oggetto e poi utilizzato come precedentemente mostrato Vedremo in seguito che si può inserire codice in tale classe Inserendo metodi e/o proprietà %{ code %} Modificandone il costruttore (con o senza gestione delle eccezioni) %init{ code %init} Inserendo codice eseguibile quando la fine del file viene raggiunta %eof{ code %eof}

JLex Directives Definizione di Macro Una macro è di fatto la definizione di una espressione regolare; Consiste di : <nome> = <definzione> dove nome è un identificatore, definizione è una espressione regolare; Una definizione di macro può contenere l espansione di altre macro

JLex Directives - Dichiarazione di stato Gli stati lessicali sono utilizzati per controllare il matching di alcune espressioni regolari. La dichiarazione avviene: %state state[0], state[1], state[2].. dove state[0], state[1], state[2] sono identificatori validi YYINITIAL è lo stato implicito di ogni lexer generato con JLex Tali stati compaiono opzionalmente all inizio di ogni regola per la selezione della stessa.

JLex Directives %char permette di attivare il conteggio dei caratteri(yychar)in input (0 based) %line permette di attivare il conteggio dei caratteri(yyline)in input (0 based) utile per la gestione e la segnalazione degli errori La funzione Yylex.yylex() è la funzione da invocare per avere i TOKEN di tipo Yytoken Si possono modificare le cose con: %class <name> cambio Yylex in name %function <name> cambio yylex in name %type <name> cambio Yytoken in name

JLex Rules: Regolar Expression Si tratta delle regole che consentono la suddivisione in TOKEN dell input. Si associano espressioni regolari, che rappresentano i lessemi del linguaggio, ad azioni (ovvero codice Java. tokenizzazione) Ogni regola ha tre parti: [<stati>] <espressione> {<azione>} Se più di una regola è soddisfatta da una stringa di input viene eseguita la prima in ordine di apparizione (maggiore priorità)

Stati ed espressioni <stato0, stato1, >: elenco di stati, opzionali, che permettono di attivare una regola Se la funzione yylex() è chiamata con il lexer che si trova nello stato X, il lexer potrà fare il matching con regole che hanno X nell elenco degli stati Nessuno stato -> la regola è selezionata in tutti gli stati L alfabeto per JLex è rappresentato dal set di caratteri Ascii (0 127): Metacaratteri? * + ( ) ^ $. [ ] { } \ Escape \b \n \t \f \r \ddd \^C \c Concatenazione r1r2 concatenazione di r1 ed r2 Scelta r1 r2 r1 oppure r2

Espressioni regolari

Azione L azione associata ad una regola lessicale consiste in un blocco di codice Java { codice } Tale codice dovrebbe prevedere un valore di ritorno.. Altrimenti il lexer va in loop alla ricerca di un altro lessema(coincide ad una chiamata ricorsiva a yylex()) Attenzione alla ricorsione ed alla giusta gestione di yyline e yychar (non tail recursion vs tail recursion)

Transizione degli stati La transizione degli stati è fatta da una azione attraverso la chiamata alla funzione yybegin(state) state deve essere uno stato valido dichiarato nella sezione JLex Directives YYINITIAL è l unico stato implicito ed è lo stato in cui il lexer rimane fino a che una non viene effettuata una transizione

Il Lexer generato: note Risiede in una classe Yylex La funzione di accesso al lexer è Yylex.yylex() che restituisce token di tipo Yytoken La classe Yytoken deve essere dichiarata nella USER CODE Section: può ridefinire anche tipi primitivi Si possono definire gerarchie di classi per token

Esempi Riconoscitore di Numeri ed identificatori Riconoscitore di Numeri ed identificatori evoluto Utilizzo degli stati per il riconoscimento di stringhe