{ crashlang un linguaggio per raccogliere i risultati di un crash test attività progettuale di...
TRANSCRIPT
{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
• … 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…
• 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
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.
• 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
• 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
• 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
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"] >
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
> )+ >
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" >
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"] )*
"\"" >
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" >}
• 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
• 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)?
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.
• 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
• 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
<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
• 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
• 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