Linguaggi e Traduttori 2

Docente: Giovanni Pighizzini

Anno accademico 2005/2006


Materiale didattico

Analizzatori lessicali: esempi relativi a JFLex
Riconoscimento e parsing di linguaggi context-free (2 maggio 2006)
Parser ricorsivo-discendenti
Generazione di codice
Parser bottom-up


Analizzatori lessicali

JFlex
The fast scanner generator for Java

Esempi d'uso
Un semplice esempio di riconoscitore di elementi lessicali all'interno di un testo:
(N.B. Per alcuni  esempi è necessaria la versione 5 del linguaggio Java)

Una calcolatrice in notazione postfissa:

Un riconoscitore di numeri romani:
Parser ricorsivo-discendenti

Esempio: espressioni aritmetiche


Generazione di codice

Negli esempi si utilizza una macchina a stack, implementata nella classe Macchina. Viene inoltre fornita la classe Codice, utile per generare il codice e memorizzarlo in un file. Alcune note relative alle istruzioni della macchina e all'uso di queste classi sono fornite nel documento Note sulla macchina a stack.

Nota: le classi MacchinaCodice fanno parte di un package di nome lt2.macchina. Per utilizzare correttamente le classi si consiglia di definire all'interno di una directory lt2, una sottodirectory di nome macchina, nella quale vanno posti e compilati i file Macchina.java e Codice.java. La directory lt2 dovrà essere collocata in una posizione accessibile secondo la variabile d'ambiente CLASSPATH.
I file sorgenti Macchina.java e Codice.java che NON DEVONO essere modificati.

Gli esempi presenti su questa pagina utilizzano solo un piccolo sottoinsieme delle istruzioni disponibili. Esempi d'uso di altre istruzioni, per la compilazione dei costrutti tipici dei linguaggi di programmazione, sono mostrati a lezione.

In particolare, con riferimento all'esempio del compilatore per le espressioni aritmetiche, eseguendo Espressione.java verrà chiesto all'utente di inserire un'espressione. Se l'espressione è scritta correttamente verrà generato un file di nome eseguibile contenente il codice corrispondente. L'applicazione Macchina.java permette di eseguire tale codice. Richiamando tale applicazione con l'opzione -L è possibile visualizzare il codice senza eseguirlo, mentre con l'opzione -d è possibile vedere ciascuna istruzione prima che venga eseguita.



Parser bottom-up

CUP
Constructor of Useful Parsers
Note relative all'installazione.

Esempio: espressioni aritmetiche
Gli esempi presentati di seguito sono analoghi a quelli relativi ai parser top-down. È stata utilizzata la versione 11a beta di CUP e il package lt2.calc.

Nota
L'analizzatore sintattico generato da CUP utilizza token prelevati dall'analizzatore lessicale da uno stream di input. La fine dello stream è indicata da un particolare token EOF. Nella maggior parte dei casi lo stream è un file di testo. Negli esempi precedenti, invece, l'input dell'applicazione è sempre una riga di testo a partire dalla quale, mediante l'uso di
StringReader viene creato uno strem corrispondente a essa.
Forniamo un esempio in cui la lettura avviene da un file (lo standard input). Si tratta sempre di una calcolatrice (senza identificatori), in cui possono essere inserite più espressioni, una per riga. Si notino le modifiche al file di specifica sintattica, con una nuova variabile per trattare più righe di testo.

WebCounter segnala  accessi a queste pagine dal 22 febbraio 2000


Ultimo aggiornamento: 24 maggio 2006
© Giovanni Pighizzini