Progetto Automi e Linguaggi Parser svliluppato con JLex e cup



Documenti analoghi
3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Algoritmi di Ricerca. Esempi di programmi Java

Programmare in Java. Olga Scotti

Esercitazione n 4. Obiettivi

Università degli Studi di Ferrara - A.A. 2014/15 Dott. Valerio Muzzioli ORDINAMENTO DEI DATI

La struttura dati ad albero binario

Funzioni in C. Violetta Lonati

Sviluppata da: Lo Russo - Porcelli Pag. 1 di 6 6FRSR utilizzare il DBMS Postgresql per imparare il linguaggio SQL.

Inizializzazione, Assegnamento e Distruzione di Classi

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

Alcuni consigli per un uso di base delle serie di dati automatiche in Microsoft Excel

Java: Compilatore e Interprete

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Riccardo Dutto, Paolo Garza Politecnico di Torino. Riccardo Dutto, Paolo Garza Politecnico di Torino

Dispensa YACC: generalità

Appunti di Informatica 1

SOSEBI PAPERMAP2 MODULO WEB MANUALE DELL UTENTE

Esercitazione 4 JDBC

Introduzione alla programmazione in C

Analizzatore lessicale o scanner

Capitolo Quarto...2 Le direttive di assemblaggio di ASM Premessa Program Location Counter e direttiva ORG

Introduzione al Linguaggio C

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

Il Software e Il Sistema Operativo. Prof. Francesco Accarino IIS Altiero Spinelli A.S. 09/10

Le variabili. Olga Scotti

Registratori di Cassa

Mon Ami 3000 Varianti articolo Gestione di varianti articoli

FIRESHOP.NET. Gestione Lotti & Matricole.

GUIDA RAPIDA PER LA COMPILAZIONE DELLA SCHEDA CCNL GUIDA RAPIDA PER LA COMPILAZIONE DELLA SCHEDA CCNL

SOFTWARE A SUPPORTO DELLA GESTIONE AMMINISTRATIVA DELLO SPORTELLO UNICO SPECIFICA DEI REQUISITI UTENTE

con ANTLR tesi di laurea Anno Accademico Relatore Ch.mo prof. Porfirio Tramontana Candidato Fabio Canova Matr

Corso di Informatica (Programmazione) Lezione 6 (31 ottobre 2008)

Prova di Laboratorio di Programmazione

Siti web centrati sui dati Architettura MVC-2: i JavaBeans

SQL Server Integration Services. SQL Server 2005: ETL - 1. Integration Services Project

RISOLUTORE AUTOMATICO PER SUDOKU

Introduzione al MATLAB c Parte 2

Studente (Cognome Nome): Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Secondo Compitino 21 Dicembre 2006

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Guida rapida per i docenti all'uso della piattaforma di e-learning dell'istituto Giua

Manuale Utente Amministrazione Trasparente GA

14 - Packages. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Concetto di Funzione e Procedura METODI in Java

Le funzioni in C. I programmi C sono costituiti da definizioni di variabili e funzioni.

MANUALE PARCELLA FACILE PLUS INDICE

Gestione delle informazioni necessarie all attività di validazione degli studi di settore. Trasmissione degli esempi da valutare.

FIRESHOP.NET. Gestione del taglia e colore.

Sistema Banca dati e Repertorio dei dispositivi medici Notifiche multiple di DM simili

Automatizzare i compiti ripetitivi. I file batch. File batch (1) File batch (2) Visualizzazione (2) Visualizzazione

ISTITUTO TECNICO ECONOMICO MOSSOTTI

Veneto Lavoro via Ca' Marcello 67/b, Venezia-Mestre tel.: 041/

La prima applicazione Java. Creazione di oggetti - 1. La prima applicazione Java: schema di esecuzione. Gianpaolo Cugola - Sistemi Informativi in Rete

Obiettivi d esame PHP Developer Fundamentals on MySQL Environment

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Integrazione del progetto CART regione Toscana nel software di CCE K2

1 ACCESSO AL 3 2 CARICAMENTO DELLE RICHIESTE/PRESTAZIONI MONITORAGGIO DELLE RICHIESTE DOWNLOAD ESITI...

Codifica: dal diagramma a blocchi al linguaggio C++

MANUALE UTENTE Fiscali Free

Strumenti per la programmazione

Portale tirocini. Manuale utente Per la gestione del Progetto Formativo

(Esercizi Tratti da Temi d esame degli ordinamenti precedenti)

Istruzioni per l installazione del software per gli esami ICoNExam (Aggiornate al 15/01/2014)

15 - Packages. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Modulo. Programmiamo in Pascal. Unità didattiche COSA IMPAREREMO...

BANCA DATI PER L OCCUPAZIONE DEI GIOVANI GENITORI

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012

Architettura MVC-2: i JavaBeans

Il sofware è inoltre completato da una funzione di calendario che consente di impostare in modo semplice ed intuitivo i vari appuntamenti.

Importazione dati da Excel

MATLAB. Caratteristiche. Dati. Esempio di programma MATLAB. a = [1 2 3; 4 5 6; 7 8 9]; b = [1 2 3] ; c = a*b; c

Definire all'interno del codice un vettore di interi di dimensione DIM, es. int array[] = {1, 5, 2, 4, 8, 1, 1, 9, 11, 4, 12};

SOMMARIO... 3 INTRODUZIONE...

Java:Struttura di Programma. Fabio Scanu a.s. 2014/2015

10.1. Un indirizzo IP viene rappresentato in Java come un'istanza della classe InetAddress.

Una metodologia di progettazione di applicazioni web centrate sui dati

Centro Acquisti per la Pubblica Amministrazione EmPULIA. Linee guida per gli Enti Aderenti. Procedure Negoziate: Richiesta di Preventivo. Versione 2.

Manuale Utente Albo Pretorio GA

Guida operativa. My Legal Corner. BestSoft SOFTWARE IN SANITÀ

PROGRAMMA SVOLTO DI INFORMATICA ANNO SCOLASTICO 2013/2014. DOCENTE: Villani Chiara

Excel. A cura di Luigi Labonia. luigi.lab@libero.it

Introduzione. Macro macro istruzione. Sequenza di comandi memorizzati programma

5.3 TABELLE RECORD Inserire, eliminare record in una tabella Aggiungere record Eliminare record

Organizzazione degli archivi

Capitolo 3. L applicazione Java Diagrammi ER. 3.1 La finestra iniziale, il menu e la barra pulsanti

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

ALICE AMMINISTRAZIONE UTENTI WEB

M:\Manuali\VARIE\GENERAZIONE REPORT PARAMETRICI.doc GENERAZIONE REPORT PARAMETRICI

void funzioneprova() { int x=2; cout<<"dentro la funzione x="<<x<<endl; }

Introduzione alla programmazione Java. Dott. Ing. M. Banci, PhD

Sistemi Operativi MECCANISMI E POLITICHE DI PROTEZIONE. D. Talia - UNICAL. Sistemi Operativi 13.1

MECCANISMI E POLITICHE DI PROTEZIONE 13.1

Fasi di creazione di un programma

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

Università degli Studi di L Aquila. Facoltà di Ingegneria. Corso di Laurea in Ingegneria Elettronica Corso di Sistemi Informativi

GENERAZIONE ARCHIVIO F24 AGENZIA ENTRATE

10 - Programmare con gli Array

Corso di Informatica

Transcript:

Progetto Automi e Linguaggi Parser svliluppato con JLex e cup Sviluppato da Santoro Carlo Maurizio Matricola:0108/528 Sviluppo terminato il: 18/06/06

TRACCIA DEL PROGETTO Si costruisca, utilizzando la coppia di programmi JLex e CUP, un parser in grado di riconoscere un linguaggio che descrive dei capi di abbigliamento ed attribuisca loro delle valutazioni. Il linguaggio consente delle categorie di capi di abbigliamento; per ognuna è possibile definire un insieme di attributi che si applicano ad una categoria ed assegnare agli attributi un peso, utile per la valutazione complessiva di un abbigliamento. Dopo la definizione delle categorie dei capi d abbigliamento possono comparire le descrizioni dei prodotti che assegnano una valorizzazione agli attributi. Una valorizzazione è formata da un valore, descritto con un simbolo ( '-', '+', '*'), e da un nome di attributo. Il significato dei simboli è descritto nella seguente tabella: Simbolo Significato Valore * Eccellente 3 + Buono 2 - Sufficiente 1 Il programma deve riconoscere il linguaggio descritto precedentemente e deve stampare, suddivisi per categorie, l elenco dei prodotti con il loro punteggio. Se nella descrizione non è presente un attributo presente nella definizione del capo di abbigliamento allora a tale attributo viene assegnato il valore di default 1. Quando il programma incontra un errore, sia sintattico che semantico, deve segnalarlo e terminare l'esecuzione: non è richiesta la gestione ed il recupero degli errori. Dato il seguente ingresso: // Definizione dei capi di abbigliamento: abito = [rifiniture->10, tessuto->8]; camicia = [rifiniture->10, tessuto->8];? // Descrizione dei capi di abbigliamento : abito di BOSS = rifiniture *, tessuto -: abito; abito di Valentino = rifiniture *, tessuto +: abito; camicia di Armani = rifiniture +, tessuto +: camicia; Esempio Il programma dovrebbe produrre il seguente output; il formato non è vincolante, invece le informazioni contenute lo sono: Punteggi raggiunti: Abito di Boss, 38 Abito di Valentino, 46 Camicia di Armani, 36

DESCRIZIONE GENERALE DEL PROGETTO Data una sequenza di simboli in ingresso, si vuole sviluppare un programma che verifica se la sequenza appartiene o no al linguaggio definito dalla grammatica. E necessario un analizzatore sintattico (parser) : un programma che è in grado di associare alla sequenza di simboli in ingresso il relativo albero di derivazione. Deve essere di tipo bottom-up (dalle foglie alla radice), un software di questo tipo è CUP. CUP è un generatore di analizzatori sintattici o parser che trasforma la descrizione di una grammatica context-free in un programma Java per riconoscere ed analizzare la grammatica stessa. Oltre alle regole sintattiche, è possibile specificare quali azioni devono essere eseguite in corrispondenza del riconoscimento dei vari simboli della grammatica. E necessario integrare il parser così generato con un analizzatore lessicale: alcune convenzioni permettono di eseguire l integrazione di Cup con lo scanner JLex in modo semplificato. Ed è stato creato uno script che effettua questo compito. Setup, verrà impostata l integrazione con JLex e le funzioni e variabili per i calcoli Terminali e Non Terminali, tutti i simboli da utilizzare nel programma Precedenze - Regole, espressioni che legano i simboli terminali e non terminali Dopo aver prodotto il sorgente si opererà in questo modo: JLEX : E un Analizzatore lessicale o scanner che si occupa di analizzare uno stream di caratteri in input e produrre in uscita uno stream di tokens(hanno un tipo e un valore) che costituiscono gli elementi base su cui andrà ad operare un analizzatore sintattico cup. I sorgenti hanno la seguente struttura User code, verranno inserite le informazioni per l integrazione con cup %% Jlex directives %% Regolar Expression Rules, tutti I simboli da intercettare Dopo aver prodotto il sorgente si opererà in questo modo:

INTEGRAZIONE DI CUP E JLEX I due programmi vengono interfacciati secondo il seguente schema : I passaggi sono stati automatizzati da uno script che esegue le compilazioni dei codici e alla fine esegue il codice. Script.bat del Yylex.java del sym.java del parser.java rmdir /S /Q Example La prima parte si occupa di rimuovere i codici compilati eventualmente già presenti nella directory java JLex.Main minimal.lex move minimal.lex.java Yylex.java java java_cup.main < minimal.cup javac -d. *.java java Example.parser La seconda parte segue lo schema precedente Alla fine viene lanciato il codice prodotto Lo script in formato.bat è eseguibile in sistemi di tipo DOS\WINDOWS ma con le dovute modifiche si può eseguire su sistemi GNU\Linux. Lo script richiede che sia inserito in una directory del tipo.../myjlex/j e che al suo interno vi siano le directory con i sorgenti compilati di JLEX e CUP, è anche necessario che sia impostato nel path la cartella.../myjlex/j. I due file che l utente dovrà produrre saranno esclusivamente minimal.lex e minimal.cup scelti in questo modo perché disponibili direttamente sul sito ufficiale di cup.

DEFINIZIONE DEL SORGENTE CUP Descrizione della grammatica Il file cup dovrà prendere in ingresso i simboli TERMINALI forniti da JLex e riconoscere se appartenenti alla grammatica tramite le produzioni dei simboli NON TERMINALI. E anche necessario compiere delle operazioni che consentano di effettuare gli opportuni calcoli previsti dalla traccia, a questo scopo sono state definite delle strutture dati e delle funzioni che agevolano tele compito. Sono proposti : in blu il codice cup, in nero le produzioni della grammatica, in corsivo i simboli non terminali e in corsivo grassetto i simboli terminali //SIMBOLI TERMINALI terminal paperta,pchiusa,pvirgola,uguale,virgola,freccia,pinter,duepunti,asterisco,piu,meno; terminal String stringa; terminal Integer numero; Questi simboli sono intercettati da JLex e costituiscono la base per la creazione di espressioni con i simboli non terminali Stringa e numero hanno una definizione propria perché dovranno essere associate a delle variabili. //SIMBOLI NON TERMINALI non terminal radice,interrog,listadef,definizione,listaattrib,attrib,listadescrizione,descrizione,listavalorattrib,valorattrib; I simboli non terminali verranno usati nelle produzioni //PRODUZIONE PRINCIPALE start with radice; Rappresenta la radice dell albero di derivazione E lecita una sola occorrenza di questa parola chiave //DEFINIZIONE DELLA GRAMMATICA radice ::= interrog listadef interrog listadescrizione interrog; radice? listadefinizioni? listadescrizioni? //PRODUZIONE DI DEFINIZIONI listadef ::= listadef definizione definizione ; definizione ::= stringa uguale paperta listaattrib pchiusa pvirgola; listaattrib ::= listaattrib virgola attrib attrib ; attrib ::= stringa freccia numero ; listadefinizioni listadefinizioni definizione definizione definizione stringa = [ ListaAttibuti ]; ListaAttrubuti ListaAttributi, attributo attributo attributo stringa -> numero //PRODUZIONE DI DESCRIZIONE listadescrizione ::= listadescrizione descrizione descrizione ; descrizione ::= stringa uguale listavalorattrib duepunti stringa pvirgola; listavalorattrib ::= listavalorattrib virgola valorattrib valorattrib ; valorattrib ::= stringa asterisco stringa piu stringa meno ; ListaDescrizione ListaDescrizione descrizione descrizione descrizione stringa = ListaValoreAttributo : stringa ; ListaValoreAttributo ListaValoreAttributo, ValoreAttributo ValoreAttributo ValoreAttributo stringa * stringa + stringa -

DEFINIZIONE DEL SORGENTE CUP Definizione delle strutture dati Dopo aver riconosciuto la grammatica si devono effettuare i calcoli per produre l output desiderato. La parte delle definizioni e la parte delle descrizioni creano due strutture dati sulle quali si effettueranno i dovuti calcoli per produrre la sequenza di uscita. DEFINIZIONI Dato un input come: abito = [rifiniture->10, tessuto->8]; camicia = [rifiniture->10, tessuto->8]; Dovrà produrre una tabella come: Rifiniture Tessuto Abito 10 8 Camicia 10 8 Tale tabella dovrà essere implementata fisicamente come: String capi[]; //Vettore colonna a sinistra della matrice String attibuti[]; //Vettore riga sopra alla matrice int [][]matrice ; //Memorizza informazione sui pesi dato che gli attributi e i capi sono vettori di stringhe e i pesi sono inseriti in una matrice di interi DESCRIZIONI Dato un input come: abito di BOSS = rifiniture *, tessuto -: abito; abito di Valentino = rifiniture *, tessuto +: abito; camicia di Armani = rifiniture +, tessuto +: camicia; Dovrà produrre una tabella come: Nome capo Tipo capo rifiniture tessuto abito di BOSS Abito (1) * (3) - (1) abito di Valentino Abito (1) * (3) + (2) camicia di Armani Camicia (2) + (2) + (2) Tale tabella dovrà essere implementata fisicamente come: String vettdescr[]; //Vettore dei nomi delle descrizioni int tipodescr[]; //Contiene la tipologia dei capi int [][]matriceattr; //Matrice che contiene il valore degli attributi

Occorre produrre un output del tipo: Punteggi raggiunti: Abito di Boss, 38 Abito di Valentino, 46 Camicia di Armani, 36 DEFINIZIONE DEL SORGENTE CUP Calcoli per produrre l output Per realizzarlo si dovrà procedere ad operare parallelamente sulle due matrici, scorrendo tutte le righe della tabella 2, per ogni riga si dovrà proporre un risultato. Per calcolare il risultato di ogni riga si dovranno allineare le tabelle con : l indice di riga della tabella 1 e il valore della riga considerata del vettore TipoCapo nella tabella 2 Dopo avere allineato le due righe delle tabelle opportunamente, si potrà effettuare la sommatoria per tutte le righe utili : Σ( Tabella1[descrizione]*Tabella2[descrizione] ) Il codice che effettua tale operazione è : int i=0; //indice di riga int k; //indice di colonna int risultato; //accumulatore dei risultati parziali for (k=1;k<=9;k++){ risultato=0; for (i=1;i<=9;i++) risultato = risultato+(matrice[tipodescr[k]][i]*matriceattr[k][i]); Stampa (risultato);

DEFINIZIONE DEL SORGENTE JLEX Lo scanner dovrà intercettare i simboli in input da tastiera, in caso di stringa o numero dovrà essere istanziata una nuova variabile che verrà trattata in modo opportuno da cup SIMBOLI SEMPLICI stringa=[a-za-z] %% "[" { return new Symbol(sym.paperta); "]" { return new Symbol(sym.pchiusa); ";" { return new Symbol(sym.pvirgola); "=" { return new Symbol(sym.uguale); "," { return new Symbol(sym.virgola); "->" { return new Symbol(sym.freccia); "?" { return new Symbol(sym.pinter); ":" { return new Symbol(sym.duepunti); "*" { return new Symbol(sym.asterisco); "+" { return new Symbol(sym.piu); "-" { return new Symbol(sym.meno); SIMBOLI COME VARIABILE {stringa* { return new Symbol(sym.stringa, new String(yytext())); [0-9]+ { return new Symbol(sym.numero, new Integer(yytext())); [ \t\r\n\f] { /* ignora spazi bianchi. */. { System.err.println("Carattere non consentito: "+yytext()); L integrazione con cup e in generale con il progetto è effettuata all inizio del codice con : package Example; import java_cup.runtime.symbol; %% %cup

package Example; import java_cup.runtime.*; action code {: SORGENTE CUP : minimal.cup pag1 //DEFINIZIONE VARIABILI GLOBALI int sezione=0; int capi_now=0; //Variabile di stato che indica a quale capo ci si riferisce(indice vet) int attrib_now=0; //Variabile di stato che indica a quale attributo ci si riferisce(indice vet) //VARIABILI PER LA DEFINIZIONE //Tabella 1 int [][]matrice ; //Memorizza informazione sui pesi String capi[]; //Vettore colonna a sinistra della matrice String attibuti[]; //Vettore riga sopra alla matrice String nomedescr; //Il nome della descrizione visualizzato in output //VARIABILI PER LA DESCRIZIONE //Formano tabella 2 String vettdescr[]; //Vettore dei nomi delle descrizioni ex AbitoDiUgoBoss int tipodescr[]; //Contiene la tipologia dei capi int [][]matriceattr; //Matrice che contiene gli attributi int postabdue = 1; //Indica in che posizione ci si trova della tabella 2 nell'input //Inizializza ed istanzia i dati void gestiscisezione() { if (sezione==1) { int i; //Scorre le colonne int k; //Scorre le righe //Tabella 1 matrice = new int[10][10]; capi = new String[10]; attibuti = new String[10]; //Tabella 2 vettdescr = new String[10]; matriceattr = new int[10][10]; tipodescr = new int[10]; //inizializza dati //Tabella 1 for (i=1;i<=9;i++){capi[i]="nullo"; for (i=1;i<=9;i++){attibuti[i]="nullo"; for (i=1;i<=9;i++){ for (k=1;i<=9;i++){matrice[i][k]=0; //Tabella 2 for (i=1;i<=9;i++){vettdescr[i]="nullo"; for (i=1;i<=9;i++){tipodescr[i]=0; for (i=1;i<=9;i++){ for (k=1;i<=9;i++){matriceattr[i][k]=0; //End SEZIONE 1 //END funzione gestiscisezione

SORGENTE CUP : minimal.cup pag 2 //Calcola e visualizza i risultati void stampa(){ int i=0; //indice di riga int k; //indice di colonna int risultato; //accumulatore dei risultati parziali System.out.println(""); for (k=1;k<=9;k++){ risultato=0;ù for (i=1;i<=9;i++){risultato=risultato+(matrice[tipodescr[k]][i]*matriceattr[k][i]); if(risultato==0)system.out.print(""); else {System.out.print(vettdescr[k]);System.out.print(",");System.out.println(risultato); //End funzione stampa void addattrib(string s,int n) { int i=0; int postrovato=0; //indica dove è stato trovato while (postrovato==0){ i=i+1; if (s.equals(attibuti[i])) postrovato=i; else if (attibuti[i].equals("nullo")) {attibuti[i]=s; postrovato=i; attrib_now=postrovato; matrice[capi_now][attrib_now]=n; //Riceve in input una descrizione del tipo NOME VALORE(*+-) void nuovadescr(string s,int valore) { int i=0; int postrovato=0; //indica dove è stato trovato //Trova l'indice vettore dove si trova l'attributo s while (postrovato==0){ i=i+1; if (s.equals(attibuti[i])) postrovato=i; matriceattr[postabdue][postrovato]=valore; //Da una stringa restituisce la posizione del vettore CAPO int trovacapo(string s) { int i=0; int postrovato=0; //indica dove è stato trovato //Trova l'indice vettore dove si trova l'attributo s while (postrovato==0){ i=i+1; if (s.equals(capi[i])) postrovato=i; return(postrovato);

SORGENTE CUP : minimal.cup pag3 //Aggiunge un attributo alla lista degli attributi void addcapo(string s) { int i=0; int postrovato=0; //indica dove è stato trovato while (postrovato==0){ i=i+1; if (s.equals(capi[i])) postrovato=i; else if (capi[i].equals("nullo")) {capi[i]=s; postrovato=i; capi_now=postrovato; :;//FINE ACTIONE CODE parser code {: public static void main(string args[]) throws Exception { new parser(new Yylex(System.in)).parse(); : //SIMBOLI TERMINALI terminal paperta,pchiusa,pvirgola,uguale,virgola,freccia,pinter,duepunti,asterisco,piu,meno; terminal String stringa; terminal Integer numero; //SIMBOLI NON TERMINALI non terminal radice,interrog,listadef,definizione,listaattrib,attrib,listadescrizione,descrizione,listavalorattrib,valorattrib; //PRODUZIONE PRINCIPALE start with radice; //DEFINIZIONE DELLA GRAMMATICA radice ::= interrog listadef interrog listadescrizione {: System.out.println(""); System.out.println("GRAMMATICA RICONOSCIUTA"); stampa(); :interrog; //PRODUZIONE DI DEFINIZIONI interrog ::= {:sezione=sezione+1; gestiscisezione(); : pinter ; listadef ::= listadef definizione definizione ; definizione ::= stringa:sdefin{: addcapo(sdefin); : uguale paperta listaattrib pchiusa pvirgola; listaattrib ::= listaattrib virgola attrib attrib ; attrib ::= stringa:sattrib freccia numero:n {: addattrib(sattrib,n); :; //PRODUZIONE DI DESCRIZIONE listadescrizione ::= listadescrizione descrizione descrizione ; descrizione ::= stringa:s1 {: vettdescr[postabdue]=s1; : uguale listavalorattrib duepunti stringa:s2{: tipodescr[postabdue]=trovacapo(s2); postabdue=postabdue+1; : pvirgola; listavalorattrib ::= listavalorattrib virgola valorattrib valorattrib ; valorattrib ::= stringa:s1 asterisco {:nuovadescr(s1,3); : stringa:s2 piu {: nuovadescr(s2,2); : stringa:s3 meno {: nuovadescr(s3,1); : ;

SORGENTE JLlex : minimal.lex package Example; import java_cup.runtime.symbol; %% %cup stringa=[a-za-z] %% "[" { return new Symbol(sym.paperta); "]" { return new Symbol(sym.pchiusa); ";" { return new Symbol(sym.pvirgola); "=" { return new Symbol(sym.uguale); "," { return new Symbol(sym.virgola); "->" { return new Symbol(sym.freccia); "?" { return new Symbol(sym.pinter); ":" { return new Symbol(sym.duepunti); "*" { return new Symbol(sym.asterisco); "+" { return new Symbol(sym.piu); "-" { return new Symbol(sym.meno); {stringa* { return new Symbol(sym.stringa, new String(yytext())); [0-9]+ { return new Symbol(sym.numero, new Integer(yytext())); [ \t\r\n\f] { /* ignora spazi bianchi. */. { System.err.println("Carattere non consentito: "+yytext());