{ CrashLang Un linguaggio per raccogliere i risultati di un crash test Attività progettuale di...

20
{ CrashLang Un linguaggio per raccogliere i risultati di un crash test Attività progettuale di Linguaggi e Modelli Computazionali M Anno Accademico: 2010/2011 Realizzato da: Luca Bettelli

Transcript of { CrashLang Un linguaggio per raccogliere i risultati di un crash test Attività progettuale di...

Page 1: { CrashLang Un linguaggio per raccogliere i risultati di un crash test Attività progettuale di Linguaggi e Modelli Computazionali M Anno Accademico: 2010/2011.

{CrashLang

Un linguaggio per raccogliere i risultati di un crash test

Attività progettuale di Linguaggi e Modelli Computazionali M

Anno Accademico: 2010/2011

Realizzato da: Luca Bettelli

Page 2: { CrashLang Un linguaggio per raccogliere i risultati di un crash test Attività progettuale di Linguaggi e Modelli Computazionali M Anno Accademico: 2010/2011.

• … mette alla prova le automobili prossime alla commercializzazione, valutandone il livello di sicurezza.

• Vengono simulati in laboratorio i più comuni tipi di incidente, per verificare se la pressione subita nell’impatto da particolari manichini è tale da causare danni ai passeggeri della vettura.

• EuroNCAP è la società che realizza questi test in Europa.• Esegue test più severi rispetto ai requisiti di sicurezza previsti

dalle normative europee ed assegna un punteggio ai risultati ottenuti.

• Pubblica sul proprio sito web una scheda per ogni auto testata, così che i consumatori possano farsi un’idea della qualità sulle caratteristiche di sicurezza dell’auto che intendono acquistare.

Un Crash Test…

Page 3: { CrashLang Un linguaggio per raccogliere i risultati di un crash test Attività progettuale di Linguaggi e Modelli Computazionali M Anno Accademico: 2010/2011.

• Contiene gran parte delle informazioni presenti nelle schede del sito web di EuroNCAP.

• Rappresenta le informazioni in modo sintetico e leggibile.

• Non contiene i punteggi, a meno che non sia necessario. L’interprete ricaverà i punteggi mancanti direttamente dal testo.

• Per semplicità, alcune parti ridondanti o troppo prolisse delle schede di EuroNCAP non hanno una controparte in CrahLang.

• I punteggi ricavati dal testo non sono gli stessi presenti sul sito, perché non viene dichiarato quale peso si dà al punteggio dei singoli test nel calcolo del voto finale.

Il linguaggio CrashLang

Page 4: { CrashLang Un linguaggio per raccogliere i risultati di un crash test Attività progettuale di Linguaggi e Modelli Computazionali M Anno Accademico: 2010/2011.

Giudizio complessivoIntestazione

Un esempio di schedaCiascuna scheda prevede quattro sezioni di test e due sezioni contenenti i dettagli dell’auto testata. Ad ogni sezione di test viene assegnato un giudizio complessivo, espresso sia in punti che in percentuale.

Adu

lt o

ccup

ant

Child

occ

upan

tPe

dest

rian

Test

ed c

ar

Nel linguaggio si mettono solo i giudizi indicati in legenda. A ciascun giudizio corrisponde un colore e un punteggio. Il punteggio sotto ciascuna immagine è si ottiene sommando i punteggi parziali dell’immagine che sta sopra.

Nel linguaggio si indica il valore numerico dei punteggi a sinistra. Il punteggio totale di questa sezione è dato dalla somma dei sette punteggi.

Per ciascuna fascia d’età, la colonna destra contiene le informazioni sul tipo di seggiolino testato.

Safe

ty a

ssis

t

Diviso in tre aree: per ciascuna devono essere elencati i giudizi (e quindi colori e punteggi) assegnati a quella parte dell’auto.

Sono tre test distinti. Ciascuno può avere valore fail, pass o not_assessed. Solo in caso pass viene assegnato un punto, negli altri casi zero.

Elenco di stringhe di dimensione variabile. Contiene le informazioni sull’auto testata e l’equipaggiamento di sicurezza presente.

Page 5: { CrashLang Un linguaggio per raccogliere i risultati di un crash test Attività progettuale di Linguaggi e Modelli Computazionali M Anno Accademico: 2010/2011.

• L’intenzione è quella di interpretare il linguaggio per ricostruire la pagina web di partenza:• Voglio mantenere la struttura e i contenuti della pagina

originale.• Voglio calcolare automaticamente i punteggi.• Voglio generare dinamicamente le immagini.

• Quindi… posso creare un sito web dinamico, che esegua su un opportuno web server.

• In ambiente Java:• L’interprete viene invocato all’interno di una pagina JSP

e manda in output direttamente dei tag HTML.• Per le immagini posso usare delle Servlet, che colorano

le parti del manichino in base ai parametri di GET ricevuti.

Obiettivo finale

Page 6: { CrashLang Un linguaggio per raccogliere i risultati di un crash test Attività progettuale di Linguaggi e Modelli Computazionali M Anno Accademico: 2010/2011.

• Linguaggio di Programmazione:• Java 6

• Ambiente di sviluppo:• Eclipse Indigo (versione Java EE)

• Generazione parser, AST e visitor:• JavaCC + JTB (invocati tramite plugin Eclipse)

• Automatizzazione processi di build e deploy:• Apache Ant

• Web server, JSP e servlet container:• Apache Tomcat (versione 7.0)

Tecnologie utilizzate

Page 7: { CrashLang Un linguaggio per raccogliere i risultati di un crash test Attività progettuale di Linguaggi e Modelli Computazionali M Anno Accademico: 2010/2011.

• Tutte le sezioni sono generate da un’apposita produzione. Nelle prossime slide verranno mostrate le principali.

Scope ::= Adult Child Pedestrian SafetyAssist TestedCar Equipment < EOF >

Alcune produzioni

Page 8: { CrashLang Un linguaggio per raccogliere i risultati di un crash test Attività progettuale di Linguaggi e Modelli Computazionali M Anno Accademico: 2010/2011.

Adult ::= < ADULT > < LBRACE > ( AdultTest )+ < RBRACE >

AdultTest ::= < ID > < LBRACE > ( < ID > < EQUAL > < RATING > < SEMICOLON > )+ < RBRACE >

Alcune produzioni

Rating è riconosciuto da una regular

expression:

< RATING : "g" | "a" | "m" | "w" | "p" >

Id è riconosciuto da una regular expression:< ID : ( < LETTER > | < DIGIT > | "_" )+ >< LETTER : ["a"-"z", "A"-"Z"] >< DIGIT : ["0"-"9"] >

Page 9: { CrashLang Un linguaggio per raccogliere i risultati di un crash test Attività progettuale di Linguaggi e Modelli Computazionali M Anno Accademico: 2010/2011.

Child ::= < CHILD > < LBRACE > ( ChildTest )+ ChildResult < RBRACE >

ChildTest ::= < AGE > < EQUAL > < ID > < LBRACE > ExtraDescriptions ( ChildResult )+ < RBRACE >

ChildResult ::= < ID > < EQUAL > < POS_FLOAT > < SEMICOLON >

Alcune produzioni

Pos_float è riconosciuto da una regular

expression:

< POS_FLOAT : ( < DIGIT > )+ "." ( < DIGIT

> )+ >

Page 10: { CrashLang Un linguaggio per raccogliere i risultati di un crash test Attività progettuale di Linguaggi e Modelli Computazionali M Anno Accademico: 2010/2011.

Pedestrian ::= < PEDESTRIAN > < LBRACE > ( < ID > < EQUAL > RatingArray < SEMICOLON > )+ < RBRACE >

RatingArray ::= < LBRACKET > ( < RATING > )+ < RBRACKET >

SafetyAssist ::= < SAFETY_ASSIST > < LBRACE > ( SafetyTest )+ < RBRACE >

SafetyTest ::= < ID > < LBRACE > ( < ID > < EQUAL > < TEST_RESULT > < SEMICOLON > )+ < RBRACE >

Alcune produzioni

Test_result è riconosciuto da una regular

expression:

< TEST_RESULT : "pass" | "fail" |

"not_assessed" >

Page 11: { CrashLang Un linguaggio per raccogliere i risultati di un crash test Attività progettuale di Linguaggi e Modelli Computazionali M Anno Accademico: 2010/2011.

TestedCar ::= < TESTED_CAR > < LBRACE > ExtraDescriptions < RBRACE >

Equipment ::= < EQUIPMENT > < LBRACE > ExtraDescriptions < RBRACE >

ExtraDescriptions ::= ( Description )+

Description ::= < STRING > [ < EQUAL > < STRING > ] < SEMICOLON >

Alcune produzioni

Per fare in modo che la stringa contenga anche caratteri speciali, il tipo String è definito come segue. Il carattere ‘"’ è il

delimitatore:

< STRING : "\"" ( ~["\"","\\","\n","\r"] )*

"\"" >

Page 12: { CrashLang Un linguaggio per raccogliere i risultati di un crash test Attività progettuale di Linguaggi e Modelli Computazionali M Anno Accademico: 2010/2011.

SKIP :{ " "| "\r"| "\t"| "\n"}TOKEN : //sections & subsections{ < EQUAL : "=" >| < SEMICOLON : ";" >| < LBRACE : "{" >| < RBRACE : "}" >| < LBRACKET : "[" >| < RBRACKET : "]" >}

Elenco dei tokenTOKEN : //document keywords{ < ADULT : "adult" >| < CHILD : "child" >| < AGE : "age" >| < PEDESTRIAN : "pedestrian" >| < SAFETY_ASSIST : "safety_assist" >| < TESTED_CAR : "tested_car" >| < EQUIPMENT : "equipment" >}

Page 13: { CrashLang Un linguaggio per raccogliere i risultati di un crash test Attività progettuale di Linguaggi e Modelli Computazionali M Anno Accademico: 2010/2011.

• Osservo la grammatica:• Non ci sono produzioni che accorciano la forma di

frase.• Sulla parte sinistra delle produzioni c’è un solo

simbolo terminale.

• Secondo la classificazione di Chomsky, la grammatica ottenuta è context free, ovvero tutte le regole di produzione hanno la forma:

• Vista l’assenza di self embedding nelle produzioni, la grammatica è anche regolare (tipo 3).

La grammatica di CrashLang

Page 14: { CrashLang Un linguaggio per raccogliere i risultati di un crash test Attività progettuale di Linguaggi e Modelli Computazionali M Anno Accademico: 2010/2011.

• Dato che non ho ε-rules, la condizione necessaria e sufficiente per avere una grammatica LL(1) è che i metasimboli che compaiono più a sinistra in produzioni alternative abbiano gli insiemi degli starter symbols disgiunti.• In questo caso le produzioni che contengono

scelte non sono immediatamente visibili:• Si possono trovare traducendo + o la forma in

BNF.• In molti casi, le "B" e le "D" sono costituite da soli

simboli terminali, sempre diversi l’uno dall’altro.

È anche LL(1)?

Page 15: { CrashLang Un linguaggio per raccogliere i risultati di un crash test Attività progettuale di Linguaggi e Modelli Computazionali M Anno Accademico: 2010/2011.

Struttura del progettoServlet per la generazione di immagini dinamiche.

Contiene la grammatica del linguaggio e il parser generato da JavaCC.

Generato da JTB, contiene le classi che costituiscono l’AST.

Generato da JTB, contiene sia i visitor generati a default da JTB che i visitor ridefiniti JspVisitor e TreeVisitor.

Contiene il file di build ANT e un file di properties per settare le directory del Java JDK e il deploy path di Tomcat.

JSP che mostra il codice contenuto in un file CrashLang.

JSP che mostra l’albero sintattico di un file CrashLang.

Intestazione del sito, inclusa nelle altre JSP. Legge il direttorio cars e propone in un menù a tendina le auto disponibili.

Home page del sito CrashLang.

Contiene esempi di crash test scritti in linguaggio CrashLang.

JSP che invoca l’interprete di CrashLang.

Page 16: { CrashLang Un linguaggio per raccogliere i risultati di un crash test Attività progettuale di Linguaggi e Modelli Computazionali M Anno Accademico: 2010/2011.

• Interpreta un file CrashLang e dispone il suo contenuto in una pagina web visivamente simile a quella del sito EuroNCAP.• Estende la classe DepthFirstRetArguVisitor,

generata a default da JTB.• L’albero sintattico viene esplorato in modalità

depth first.• La classe estesa da JspVisitor è parametrica:

• Ogni metodo riceve in ingresso un PrintWriter: serve al visitor per emettere i tag HTML.

• Ogni metodo restituisce un oggetto Float: si usa per restituire al metodo chiamante i punteggi parziali ottenuti in una sottosezione.

La classe JspVisitor

Page 17: { CrashLang Un linguaggio per raccogliere i risultati di un crash test Attività progettuale di Linguaggi e Modelli Computazionali M Anno Accademico: 2010/2011.

• Permette l’esplorazione dell’albero sintattico astratto ottenuto interpretando un file CrashLang.• Si appoggia alla libreria Javascript jsTree, che

decora i tag HTML della pagina dando ai nodi <ul> e <li> una struttura a directory.• La classe estende DepthFirstVoidArguVisitor,

generato da JTB.• Ogni metodo emette i tag HTML sul

PrintWriter passato come parametro.

La classe TreeVisitor

Page 18: { CrashLang Un linguaggio per raccogliere i risultati di un crash test Attività progettuale di Linguaggi e Modelli Computazionali M Anno Accademico: 2010/2011.

<body><%@ include file="header.jsp" %><% out.flush(); try { String fileName = request.getParameter("car"); parser = new CrashParser(new FileInputStream(fileName)); parser.Scope().accept(new JspVisitor(), response.getWriter()); } catch(Exception e) {%> <div id="content"> <div class="title">An error occurred while parsing the file:</div> <code><% out.flush(); e.printStackTrace(response.getWriter());%> </code> </div><% }%></body>

L’invocazione del visitor

Apertura del file CrashLang

In c

aso

di e

ccez

ione

PrintWriter passato al visitor per emettere le tag HTML

Page 19: { CrashLang Un linguaggio per raccogliere i risultati di un crash test Attività progettuale di Linguaggi e Modelli Computazionali M Anno Accademico: 2010/2011.

• Una pagina HTML, contiene al suo interno soltanto il link alle immagini che il browser deve scaricare, pertanto queste non possono essere generate dall’interprete di CrashLang assieme al resto del documento.

• Dal momento che le combinazioni di colori sono troppe è impensabile mantenere sul server le immagini già colorate: l’immagine richiesta dal browser viene generata e restituita a run time da un’apposita servlet.

• Le servlet leggono i parametri di GET lasciati dall’interprete: passando come parametri i giudizi assegnati, viene applicato su ciascuna parte del manichino il colore corrispondente.

Colorare i manichini

http://localhost/CrashLang/images/side.png ? head=g & chest=m & abdomen=p & pelvis=g

URL su cui è mappata la servlet

Page 20: { CrashLang Un linguaggio per raccogliere i risultati di un crash test Attività progettuale di Linguaggi e Modelli Computazionali M Anno Accademico: 2010/2011.

• Per il deploy è stato predisposto un file ANT che, direttamente all’interno dell’ambiente Eclipse, permette di compilare il progetto, realizzare il pacchetto WAR e inviarlo al web server.

• Per indicare la posizione del JDK e del direttorio di deployment vanno modificati i parametri del file ant/environment.properties.

• Sono anche presenti i target ANT che avviano o fermano il web server, nel caso sia necessario aggiornare il pacchetto WAR.

• Quando il server è in funzione è comunque possibile aggiornare i file statici grazie al target update.pages.

Deploy del progetto