Analizzatori Lessicali con JLex

Slides:



Advertisements
Presentazioni simili
Introduzione al linguaggio C++
Advertisements

Introduzione al DTD Mario Arrigoni Neri.
© 2007 SEI-Società Editrice Internazionale, Apogeo Unità F2 Selezione.
Recupero debito quarto anno Primo incontro
Introduzione alla programmazione A. Ferrari. Il linguaggio C Nel 1972 Dennis Ritchie nei Bell Laboratories progettò il linguaggio C Il linguaggio possiede.
Sintassi (prima parte)
Analizzatori Sintattici con Cup Giuseppe Morelli.
MATLAB. Scopo della lezione Programmare in Matlab Funzioni Cicli Operatori relazionali Esercizi vari.
1 Semantica Operazionale di un frammento di Java: lo stato.
1 Strutture dati nel supporto a run time. 2 Entità presenti quando un programma va in esecuzione §programmi dutente (compilati) §routines del supporto.
Shell Scripting. Shell e comandi La shell e' un programma che interpreta i comandi dell'utente. I comandi possono essere dati da terminale, oppure contenuti.
Anno accademico Il preprocessore del linguaggio C.
Fondamenti di Informatica I a.a Il linguaggio C Il preprocessore La sostituzione di macro Le compilazioni condizionali Linclusione di file C.
Concetti di base: header file, funzione main(),set caratteri C++, token, operatori, espressioni etc. Flusso di controllo, cicli, costrutti.
Programmazione Procedurale in Linguaggio C++
Caratteri e stringhe di caratteri
TRADUZIONE DEL PROGRAMMA Una volta che un programma sia stato scritto in C, esso non può essere eseguito senza unulteriore traduzione. Ciò perché qualsiasi.
Funzioni definite dall’utente
JAVASCRIPT DIFFERENZA TRA JAVASCRIPT E JAVA TAG LO SCRIPT OGGETTI LE CLASSI FUNZIONE GESTORE DI EVENTI ELEMENTI DEL LINGUAGGI è un vero e proprio linguaggio.
1 Programmazione ad oggetti in Java E.Mumolo, DEEI
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Introduzione a JAVA Anno Accademico 2009/2010.
Corso di Laurea in Biotecnologie Informatica (Programmazione)
Corso di Informatica (Programmazione)
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Le stringhe di caratteri in Java Anno Accademico 2009/2010.
Introduzione agli stream e alle classi
Scomposizione di stringhe
Corso di Informatica A.A Corso di Informatica Laurea Triennale - Comunicazione&Dams Dott.ssa Adriana Pietramala Laurea.
Corso di Informatica A.A Corso di Informatica Laurea Triennale - Comunicazione&Dams Dott.ssa Adriana Pietramala Laurea.
nome: sequenza di caratteri usata per denotare un oggetto
memoria gestita staticamente:
1 LINUX: struttura generale The layers of a UNIX system. User Interface.
Il Linguaggio C.
Espressioni condizionali
AN FI Un denominatoe comune Lo stile funzionale Concetti fondamentali.
Per costruire unapplicazione occorre compilare il file (o i file se più duno) che contengono il testo del programma (file sorgente) Il risultato sono uno.
Introduzione a:. Nella prima parte di questo corso si vedranno i CONCETTI di: CLASSE (programma) METODO (Algoritmi e dati) CONCETTI CLASSICI DI PROGRAMMAZIONE.
Javascript: fondamenti, concetti, modello a oggetti
ANTLR V.3 Renzi Alberto.
CAP. 2 ANALISI LESSICALE 2.1 Il ruolo dell'analizzatore lessicale
PROGRAMMARE IN C Un ambiente di sviluppo `e un software che serve per scrivere ed eseguire programmi. Generalmente integra almeno 3 funzionalita’: Editor:
Introduzione al linguaggio assembly del microprocessore a parte
CODIFICA Da flow-chart a C++.
Un esempio: Calcolo della potenza n-esima di un numero reale
BIOINFO3 - Lezione 331 SUBROUTINE IN PERL Una subroutine (funzione, metodo, procedura o sottoprogramma), e` una prozione di codice all`interno di un programma.
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA FINALE DEL 21 MAGGIO 2007 NOME: COGNOME: ________________________________________________________________________________.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
I nomi in Java F. Bombi 18 novembre novembre 2003.
Linguaggi e modelli computazionali LS Manni Tiziano
Astrazione procedurale ed eccezioni
I processi.
Lezione 3 Struttura lessicale del linguaggio
Programmazione ad oggetti
Introduzione a Javascript
Tecnologie di InternetDocument Type Definition Dott. Nicola Dragoni Document Type Definition  Document Type Definition (DTD)  Documento XML valido 
Variabili Numeriche –Interi (byte, short, int, long): complemento a 2 –A virgola mobile (float, double): IEEE 745 Alfanumeriche –Carattere (char): Unicode.
Lez. 9 (13/14)Elementi di Programmazione1 Lezione 9 Valutazione di espressioni File di testo sequenziali.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 7 Tipi di dato e strutture dati Specifica e realizzazione di strutture informative come classi.
1 Tipi di Dato §descrittori, tipi, controllo e inferenza dei tipi §specifica (semantica) e implementazione di tipi di dato l implementazioni “sequenziali”
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
Ancora sulla shell. Shell e comandi La shell e' un programma che interpreta i comandi dell'utente. I comandi possono essere dati da terminale, oppure.
Concetti Fondamentali sulla Programmazione
FI - Algoritmi e Programmazione 1 Variabili Consentono di aumentare notevolmente la potenza espressiva. Una variabile è caratterizzata da:  Un nome 
Eprogram informatica V anno. Introduzione a PHP Introduzione La diffusione di PHP ha avuto un notevole incremento dalla fine degli anni Novanta a oggi,
1 Metodo I metodi sono uno strumento che i programmatori usano per strutturare i programmi, sia per renderli più facili da capire che per permettere il.
Parsing ricorsivo discendente Il parsing ricorsivo discendente (recursive descent parsing) è un metodo di tipo top-down che può essere facilmente codificato.
Gestire i dati: download e salvataggio. L’importanza dei dati La quasi totalità delle applicazioni hala necessità di gestire varie funzionalità relative.
Metodi in Java. Note Identificazione input: (il raggio è un numero reale !!!) Identificazione delle operazioni necessarie al calcolo Area=r*r*PI Circonferenza=2*r*PI.
Introduzione alle Classi e agli Oggetti in Java 1.
Eccezioni in Java. Le eccezioni in Java Exception handling: insieme di costrutti e regole sintattiche e semantiche presenti nel linguaggio allo scopo.
Transcript della presentazione:

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 “%%”: User Code: viene ricopiata nel file java finale “as is”; fornisce “spazio” per implementare classi di supporto etc.. JLex directives: Vengono definite le Macro e vengono dichiarati i nomi degli stati 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”