Linguaggio per la produzione di grafici Pierpaolo Giuliani Matr. 290007 Prof: Enrico Denti Linguaggi...

Post on 02-May-2015

215 views 0 download

Transcript of Linguaggio per la produzione di grafici Pierpaolo Giuliani Matr. 290007 Prof: Enrico Denti Linguaggi...

ProduChartProducer Chart

Linguaggio per la produzione di grafici

Pierpaolo GiulianiMatr. 290007

Prof: Enrico Denti

Linguaggi e modelli computazionali LS

Realizzazione di un semplice linguaggio per produrre grafici

Occorre:◦ Progettare un linguaggio che sia in grado di esprimere le

caratteristiche di un particolare grafico.

◦ Realizzare un tool che supporti tale linguaggio: accetti in ingresso una descrizione del grafico nel linguaggio

realizzato; esegua un’analisi sintattica al fine di riconoscere se lo schema è

scritto in modo lecito per il linguaggio; esegua le azioni corrispondenti alla semantica dello schema immesso.

◦ Realizzare uno strumento grafico che: visualizzi il risultato finale del grafico prodotto

Obiettivo

Grammatica - esempioGrafico{

tipo grafico{'Categoria','Valore',VERT, NORMAL_AREA,{

};nome finestra{grafico};titolo grafico{'grafico Area'};

sottotitolo{[Il grafico area permette di rappre-sentare serie di dati….],CORSIVO,15,ALTO};sfondo finestra{BIANCO};sfondo grafico{GRIGIOCHIARO};}

{Prima,GIALLO,

[ Categoria1,1.0][ Categoria2,4.0][ Categoria3,3.0][ Categoria4,5.0][ Categoria5,5.0]

}

{Seconda,VERDE,

[ Categoria1,5.0][ Categoria2,7.0][ Categoria3,6.0][ Categoria4,8.0][ Categoria5,4.0]

}

{Terza,ROSSO,

[ Categoria1,4.0][ Categoria2,3.0][ Categoria3,2.0][ Categoria4,3.0][ Categoria5,6.0]

}

Token della grammatica (1)

TOKEN : {<CATEGORYCHART: "NORMAL_AREA" | "AREA_STACKED" |

"BAR_STACKED" | "DUALDIM_BAR" | "TRIDIM_BAR" | "LINE“ | "POPULATION_BAR" >

| <XYCHART: "INTERVAL_XY_BAR" | "COLLECTION_XY_AREA" >| <PIE: "PIE">

| <STEP_LINE: "STEP_LINE">| <DIFFERENCE: "DIFFERENCE">

| <TIME_SERIES: "TIME_SERIES">| <GANTT:"GANTT">| <HISTOGRAM:"HISTOGRAM">

| <DIM: "2D" | "3D”>| <ORIENTAZIONE: "ORIZZ" | "VERT" >| <COLORE: "NERO" | "ROSSO" | "BLU" | "CIANO" | "BIANCO" |

"GRIGIOCHIARO" |"GRIGIO” | "GRIGIOSCURO" | "ROSA" | "VERDE" | "MAGENTA" |"ARANCIONE" | "GIALLO" >

Tipologie di grafico

Parte lessicale

Token della grammatica (1)TOKEN :

{<CATEGORYCHART: "NORMAL_AREA" | "AREA_STACKED" |

"BAR_STACKED" | "DUALDIM_BAR" | "TRIDIM_BAR" | "LINE“ | "POPULATION_BAR" >

| <XYCHART: "INTERVAL_XY_BAR" | "COLLECTION_XY_AREA" >| <PIE: "PIE">

| <STEP_LINE: "STEP_LINE">| <DIFFERENCE: "DIFFERENCE">

| <TIME_SERIES: "TIME_SERIES">| <GANTT:"GANTT">| <HISTOGRAM:"HISTOGRAM">

| <DIM: "2D" | "3D”>| <ORIENTAZIONE: "ORIZZ" | "VERT" >| <COLORE: "NERO" | "ROSSO" | "BLU" | "CIANO" | "BIANCO" |

"GRIGIOCHIARO" |"GRIGIO” | "GRIGIOSCURO" | "ROSA" | "VERDE" | "MAGENTA" |"ARANCIONE" | "GIALLO" >

Grafici ottenibili

Token della grammatica (1)TOKEN :

{<CATEGORYCHART: "NORMAL_AREA" | "AREA_STACKED" |

"BAR_STACKED" | "DUALDIM_BAR" | "TRIDIM_BAR" | "LINE“ | "POPULATION_BAR" >

| <XYCHART: "INTERVAL_XY_BAR" | "COLLECTION_XY_AREA" >| <PIE: "PIE">

| <STEP_LINE: "STEP_LINE">| <DIFFERENCE: "DIFFERENCE">

| <TIME_SERIES: "TIME_SERIES">| <GANTT:"GANTT">| <HISTOGRAM:"HISTOGRAM">

| <DIM: "2D" | "3D”>| <ORIENTAZIONE: "ORIZZ" | "VERT" >| <COLORE: "NERO" | "ROSSO" | "BLU" | "CIANO" | "BIANCO" |

"GRIGIOCHIARO" |"GRIGIO” | "GRIGIOSCURO" | "ROSA" | "VERDE" | "MAGENTA" |"ARANCIONE" | "GIALLO" >

Caratteristiche del grafico

Token della grammatica (2)| <STILE: "GRASSETTO" | "CORSIVO" | "NORMALE" >| <POSIZIONE: "SINISTRA" | "DESTRA" | "ALTO" | "BASSO" >

| <MESE: "GEN" | "FEB" | "MAR" | "APR" | "MAG" | "GIU" | "LUG" | "AGO" | "SET" | "OTT" | "NOV" | "DIC" >

| <CIFRA: ["0"-"9"]>| <NUM: ["1"-"9"] (<CIFRA>)* | "0">| <NUMVIRG: ("+" | "-")? <NUM> "." (<CIFRA>)*>

| <CARATTERE: ["a"-"z", "A"-"Z" ] | <CARATVARI> | <CIFRA> >| <CARATVARI: ["_", "\'", "!", "$“ ]>| <STRINGA: (<CARATTERE>)+ >

Associare caratteristiche alla descrizione del

grafico

Token della grammatica (2)| <STILE: "GRASSETTO" | "CORSIVO" | "NORMALE" >| <POSIZIONE: "SINISTRA" | "DESTRA" | "ALTO" | "BASSO" >

| <MESE: "GEN" | "FEB" | "MAR" | "APR" | "MAG" | "GIU" | "LUG" | "AGO" | "SET" | "OTT" | "NOV" | "DIC“ >

| <CIFRA: ["0"-"9"]>| <NUM: ["1"-"9"] (<CIFRA>)* | "0">| <NUMVIRG: ("+" | "-")? <NUM> "." (<CIFRA>)*>

| <CARATTERE: ["a"-"z", "A"-"Z" ] | <CARATVARI> | <CIFRA> >| <CARATVARI: ["_", "\'", "!", "$“ ]>| <STRINGA: (<CARATTERE>)+ >

Caratteristiche temporali

Token della grammatica (2)| <STILE: "GRASSETTO" | "CORSIVO" | "NORMALE" >| <POSIZIONE: "SINISTRA" | "DESTRA" | "ALTO" | "BASSO" >

| <MESE: "GEN" | "FEB" | "MAR" | "APR" | "MAG" | "GIU" | "LUG" | "AGO" | "SET" | "OTT" | "NOV" | "DIC" >

| <CIFRA: ["0"-"9"]>| <NUM: ["1"-"9"] (<CIFRA>)* | "0">| <NUMVIRG: ("+" | "-")? <NUM> "." (<CIFRA>)*>

| <CARATTERE: ["a"-"z", "A"-"Z" ] | <CARATVARI> | <CIFRA> >| <CARATVARI: ["_", "\'", "!", "$“ ]>| <STRINGA: (<CARATTERE>)+ >

Valori presenti nel grafico

Token della grammatica (2)| <STILE: "GRASSETTO" | "CORSIVO" | "NORMALE" >| <POSIZIONE: "SINISTRA" | "DESTRA" | "ALTO" | "BASSO" >

| <MESE: "GEN" | "FEB" | "MAR" | "APR" | "MAG" | "GIU" | "LUG" | "AGO" | "SET" | "OTT" | "NOV" | "DIC" >

| <CIFRA: ["0"-"9"]>| <NUM: ["1"-"9"] (<CIFRA>)* | "0">| <NUMVIRG: ("+" | "-")? <NUM> "." (<CIFRA>)*>

| <CARATTERE: ["a"-"z", "A"-"Z" ] | <CARATVARI> | <CIFRA> >| <CARATVARI: ["_", "\'", "!", "$“ ]>| <STRINGA: (<CARATTERE>)+ >

Rappresentazione stringhe presenti nel

grafico

Grammatica - Scope

Il simbolo iniziale Scope della grammatica Scope ::= "Grafico" "{"

"tipo grafico" "{" Tipo "}" ";" "nome finestra" "{" (

StringaComposta )? "}" ";" "titolo grafico" "{" ( StringaComposta )? "}"

";" "sottotitolo" "{" ( Sottotitolo )? "}" ";" "sfondo finestra" "{" ( <COLORE> )? "}" ";" "sfondo grafico“ "{" ( <COLORE> )?

"}" ";" "}" <EOF>

Lo Scope della grammatica richiede:

tipo grafico descrizione del grafico da realizzare

nome finestra

titolo grafico

sottotitolo

sfondo finestra

sfondo grafico

permettono il settaggio di parametri generali relativi alla visualizzazione del grafico stesso

StringaComposta ::= <STRINGA> ( <STRINGA> )*

Grammatica – Parametri generali

Sottotitolo ::= "[" StringaComposta "]" ","ProprietaCarattere ",“ <POSIZIONE>

ProprietaCarattere ::= <STILE> "," <NUM>

Descrizione del sottotitolo

Esempio:

sottotitolo{[DifferenceChart permette di realizzare grafici di Differenza],GRASSETTO,15,BASSO

};

<STILE: "GRASSETTO" |"CORSIVO“|"NORMALE" >

<POSIZIONE: "SINISTRA" |"DESTRA" |"ALTO" |"BASSO" >

Grammatica – costruzione grafi co (1)

Tipo – costruzione del grafico◦ Classificazione Grafici:

SingleVal: serie che compongono il grafico a singolo valore MultiVal: serie che compongono il grafico a più valori, suddivisi in:

Orientati Non orientati

Tipo ::= ( SingleVal | MultiVal )

SingleVal ::= <PIE> ",“ <DIM> "," <NUM> "," ( "[" SerieCategVal "]" <COLORE> )+

MultiVal ::= NomeAssi "," ( ( <ORIENTAZIONE> "," ConOrient | NoOrient ) )

NomeAssi ::= StringaComposta "," StringaComposta

Grammatica – costruzione grafi co (2)

Grafici orientati

Grafici non orientati

ConOrient ::= ( Category | XY | StepLine | Histogram )

NoOrient ::= ( TimeSeries | Difference | Gantt )

Grafico = parametro

generale +

serie dati

Grafico = tipologia "," ( attributi generali serie ( serie dati)+ )+

GenSerie ::= <STRINGA> ",“ ( <COLORE> )?

Due categorie di grafici multival:

Stringa descrittiva serie Colore serie

Grammatica – costruzione grafi co (2)

Modellazione dei Dati delle Serie:SerieCategVal ::= <STRINGA> "," <NUMVIRG>

SerieXY ::= <NUMVIRG> "," <NUMVIRG>

DataValore ::= Data "," <NUMVIRG>

GanttData ::= <STRINGA> "," Data "," Data

SerieStepData ::= DataValore "," Orario

HistogramData ::= <NUMVIRG> ";"

Data ::= <NUM> "-" <MESE> "-" <NUM>

Orario ::= <NUM> “:” <NUM>

[ Categoria1 , 3.24]

[1.13 , 700.2]

[ Ottenere_Approvazione, 9-APR-2010 ,10-APR-2010]

[ 2-MAG-2009 , 124.1]

[19-FEB-2010 , 8.0 , 16:0]

[4.6; 6.6; 3.0; 7.3;]

Grammatica – costruzione grafi co (2)

Grafici orientati

Grafici non orientati

ConOrient ::= ( Category | XY | StepLine | Histogram )

NoOrient ::= ( TimeSeries | Difference | Gantt )

Category ::= <CATEGORYCHART> "," ( "{" GenSerie "," ( "[" SerieCategVal "]" )+ "}" )+

Raggruppa diverse tipologie di grafici: Barre

2D / 3D stacked

Area Classica Stacked

Line Population

Grammatica – costruzione grafi co (2)

Grafici orientati

Grafici non orientati

ConOrient ::= ( Category | XY | StepLine | Histogram )

NoOrient ::= ( TimeSeries | Difference | Gantt )

XY ::= <XYCHART> "," ( "{" GenSerie "," ( "[" SerieXY "]" )+ "}" )+

Raggruppa 2 tipologie di grafici: Area XY Barre XY

Grammatica – costruzione grafi co (2)

Grafici orientati

Grafici non orientati

ConOrient ::= ( Category | XY | StepLine | Histogram )

NoOrient ::= ( TimeSeries | Difference | Gantt )

StepLine ::= <STEP_LINE> "," ( "{" GenSerie "," ( "[" SerieStepData "]" )+ "}" "," "tratteggio:" <NUMVIRG> ","

"spessore:“ <NUMVIRG> )+

Grammatica – costruzione grafi co (2)

Grafici orientati

Grafici non orientati

ConOrient ::= ( Category | XY | StepLine | Histogram )

NoOrient ::= ( TimeSeries | Difference | Gantt )

Histogram ::= <HISTOGRAM> "," ( "{" GenSerie ","

"[" ( HistogramData )+ "]" "," <NUM>

"}")+

Grammatica – costruzione grafi co (2)

Grafici orientati

Grafici non orientati

ConOrient ::= ( Category | XY | StepLine | Histogram )

NoOrient ::= ( TimeSeries | Difference | Gantt )

TimeSeries ::= <TIME_SERIES> "," ( "{" GenSerie ","

( "[" DataValore "]" )+ "}" )+

Grammatica – costruzione grafi co (2)

Grafici orientati

Grafici non orientati

ConOrient ::= ( Category | XY | StepLine | Histogram )

NoOrient ::= ( TimeSeries | Difference | Gantt )

Difference ::= <DIFFERENCE> "," DifferenceData

DifferenceData "MINORE" "{" <COLORE> "}" "," "MAGGIORE" "{" <COLORE> "}"

DifferenceData ::= "{" GenSerie "," ( "[" DataValore "]" )+

"}"

Grammatica – costruzione grafi co (2)

Grafici orientati

Grafici non orientati

ConOrient ::= ( Category | XY | StepLine | Histogram )

NoOrient ::= ( TimeSeries | Difference | Gantt )

Gantt ::= <GANTT> "," ( "{" GenSerie ","

( "[" GanttData "]" )+ "}" )+

Proprietà della grammatica

La grammatica è di Tipo 2 (context-free) secondo la classificazione di Chomsky, in quanto tutte le produzioni risultano essere nella forma

Il linguaggio generato dalla grammatica risulta essere di Tipo 3 (regolare) in quanto la grammatica non contiene self-embedding, ovvero non prevede simboli non terminali autoinclusivi del tipo:A → β A δ dove A є VN e δ,β є V+

A αcon α (VT VN)*, A VN

Non c’è vincolo α != є

Osservazioni sulla grammatica

La grammatica è LL(1):• Ogni metasimbolo a sinistra di più produzioni ha starter

simbols delle parti destre di produzioni alternative disgiunti (NECESSARIA)• il riconoscitore utilizza al più un simbolo per riconoscere con certezza

la produzione da scegliere• Nessun metasimbolo genera stringa vuota (SUFFICIENTE)

VisitorAST

ParserScannerSpecifica

Flusso d’esecuzione e Interpretazione

Specifica del grafico secondo grammatica

Analisi lessicale (Lexer o Scanner)◦ Data una sequenza di caratteri restituisce i token che compaiono

Analisi sintattica-semantica (Parser)◦ Data una sequenza token verifica attinenza alle regole grammaticali

◦ Produce l’ AST

Visitor◦ Percorre l’albero APT mediante la tecnica del double dispatch

Package dell’applicazione

ChartContiene le classi per la gestione generale del grafico e dei diversi dataset

ChartCreatorContiene tutte le classi per realizzare il grafico

DatasetContiene tutte le classi per gestire correttamente le diverse serie dati dei differenti grafici

ProduChart.guiContiene le interfacce grafiche ed il manager dell’applicazione

VisitorContiene i Visitor creati da JTB in automatico

ProduChartVisitorContiene i visitor realizzati che estendono la classe DepthFirstVisitor

syntaxTreeContiene le classi necessarie per la costruzione dell’AST

parserContiene le classi per lo scanning, il parsing

Package dell’applicazione

Diagramma delle classi – Dataset

DatasetContiene tutte le classi per gestire correttamente le diverse serie dati dei differenti grafici

Diagramma delle classi –Creazione grafi ci

ChartCreatorContiene tutte le classi per realizzare il grafico

Diagramma delle classi –classi JavaCC

Lexer: - contiene il metodo

getNextToken- riconosce i token

descritti dalle espressioni regolari

Parser: chiama il lexer ogni volta che necessita del prossimo token. Contiene un metodo per

ogni simbolo non terminale presente nella

specifica della grammatica

Ogni chiamata al metodo getNextToken() restituisce

un oggetto di questa classe

Diagramma delle classi – c lassi Visitor

Automaticamente generato da JTB

Pattern visitor:

Ciascun visitor realizza una visita di tipo depth-first avvalendosi del meccanismo

double dispatch.

I visitor hanno un metodo visit per ogni classe rappresentante un nodo dell’ APT.

Le classi visitate accetteranno la visita richiamando il metodo visit con

argomento “this”.

Esempio di classe della tassonomia

Diagramma delle classi – c lassi Visitor

Automaticamente generato da JTB

◦ ProduChartVisitor Percorre l’albero ed

istanzia tutti gli oggetti neces-sari per produrre il grafico

Effettua gli opportuni controlli semantici Correttezza delle date:

Correttezza degli orari:

◦ ProduChartTreeVisitor Percorre l’albero e

costruisce una struttura TreeNode

◦ ProduChartXmlVisitor Percorre l’albero e

costruisce un documento XML

Data ::= <NUM> "-" <MESE> "-" <NUM>

Orario ::= <NUM> “:” <NUM>

Funzionalità aggiuntive Ulteriori funzionalità:

◦ Salvataggio del programma in XML “ Più si struttura l’informazione, meno fatica si fa ad

elaborarla “

◦ Salvataggio del grafico prodotto in PDF

◦ Esportare il grafico come immagine

Limiti e sviluppi futuri Oltre al salvataggio, prevedere la lettura dei dati delle serie da

XML

Ampliare il numero dei grafici supportati

Ampliare le funzionalità esprimibili dall’utente mediante il linguaggio◦ Console per la scelta del colore◦ Stili del grafico (tratteggio,ecc.)

WIZARD per una definizione più semplice del file del grafico nel linguaggio realizzato

Inserimento di più grafici contemporaneamente ◦ Per confronto◦ Per modellare diversi aspetti afferenti a grafici diversi

Strumenti utilizzati Linguaggio: Java (jdk1.6.0_10) Ambiente di sviluppo: NetBeans IDE 6.8 Generazione automatica parser: JavaCC 5.0 Strumento per la generazione automatica delle classi necessarie

a creare l’albero sintattico (AST) e per l’implementazione di Visitor che operano depth-first: Java Tree Builder 1.3.2

Strumento di produzione grafici: JFreeChart

Demo