Linguaggi per il Web prof. Riccardo Rosati corso di Laurea in Ingegneria Informatica e Automatica corso di Laurea in Ingegneria dei Sistemi Informatici Sapienza Universit`a di Roma, a.a. 2013/2014 Esercitazione di riepilogo Esercizio 1a Sia data la grammatica G =< VT , VN , S, P >, in cui S C → → P = A → B → ACB ACc | c aa | aA b | Bb | 1. determinare se la stringa aaaaacc appartiene a L(G) e, in caso affermativo, scrivere una derivazione canonica sinistra della stringa e un albero di derivazione della stringa. 2. determinare se la stringa aaaaccccbbbb appartiene a L(G) e, in caso affermativo, scrivere una derivazione canonica sinistra della stringa e un albero di derivazione della stringa. 3. dire se la grammatica G presenta prefissi comuni e, in caso positivo, scrivere una grammatica G0 tale che: (i) G0 non presenti prefissi comuni; (ii) L(G0 ) = L(G). Soluzione Per quanto riguarda la stringa aaaaacc possiamo notare che essa risulta ottenibile mediante la seguente derivazione: S → ACB → aACB → aaaCB → aaaACcB → aaaaaCcB → aaaaaccB → aaaaacc (1) Osservando ora la seconda stringa, ovvero aaaaccccbbbb, notiamo che il processo di derivazione non ci consente di derivarla: infatti per ottenere quattro simboli terminali c nella forma di frase, `e necessario introdurre, mediante la regola di produzione C → ACc, almeno quattro simboli non terminali A. Ma dalle regole di produzione per A segue immediatamente che da ogni simbolo non terminale A si ottengono necessariamente almeno due simboli terminali a. Pertanto, per ottenere quattro simboli c si produrrebbero necessariamente almeno otto simboli terminali a, mentre la stringa in esame ne contiene solo quattro. Infine, la grammatica G presenta prefissi comuni sulla regola A → aa | aA e presenta ricorsione sinistra diretta nella regola B → Bb Applicando la trasformazione che elimina la ricorsione sinistra diretta, otteniamo le regole S C A B B0 → → → → → ACB ACc | c aa | aA bB 0 | B 0 bB 0 | 1 Applicando infine la trasformazione che elimina i prefissi comuni, otteniamo le regole S C A A0 B B0 → → → → → → ACB ACc | c aA0 a|A bB 0 | B 0 bB 0 | Esercizio 1b (a) Data la seguente grammatica G: S → aS | bXX X → cd | bY X Y → ZZaaa Z → aXb | bY c | cZd | da `e possibile stabilire se G `e una grammatica LL(1) senza costruire esplicitamente gli insiemi FIRST e FOLLOW e la tabella di parsing di G? motivare la risposta; (b) Data la seguente grammatica G: S → SSA | SSB | SSC | AS | A A → baS | cSCB | bab B → Dba | Dbc | Bdc | BS C → CcbaD | Cc | d D → DD | Ac | d | DDbb scrivere una grammatica G0 tale che G0 non presenti n´e ricorsione sinistra diretta n´e prefissi comuni e tale che L(G0 ) = L(G). Esercizio 2 Si consideri il frammento del linguaggio Java costituito dalle stringhe che corrispondono alla definizione di una istruzione if con ramo else obbligatorio. L’istruzione pu` o avere come condizione booleana solo una uguaglianza tra nomi di variabile e/o costanti intere, e come istruzioni (nei rami then e else) solo una singola assegnazione di una variabile con espressione uguale a un singolo valore intero o a una singola variabile, oppure una istruzione if. Un esempio di stringa appartenente a questo linguaggio `e il seguente: if (x==z) x=0; else y=1; Altro esempio: if (x==z) if (y==1) x=0; else x=1; else if (x==2) z=3; else if (z==100) z=99; else x=4; 2 Scrivere (preferibilmente in JavaCC) una grammatica non contestuale per tale linguaggio, dividendo la specifica del lessico del linguaggio (che va definita mediante espressioni regolari) dalla specifica della sintassi vera e propria. Soluzione PARSER_BEGIN(ese4) public class ese4 { public static void main(String args[]) throws ParseException { ese4 parser = new ese4(System.in); parser.s(); } } PARSER_END(ese4) SKIP : { <(" "| "\t" | "\n" | "\r" )> } TOKEN : { <IF: "if"> | <ELSE: "else"> | <IDENT: (["a"-"z"]|["A"-"Z"])(["a"-"z"]|["A"-"Z"]|["0"-"9"])*> | <NUM: (["0"-"9"])+> | <PARAP: "("> | <PARCH: ")"> | <PVIRG: ";"> | <UG: "="> | <UGUG: "=="> } void s() : {} { istruzioneIf() <EOF> {} } void istruzioneIf() : {} { <IF> condizione() istruzione() <ELSE> istruzione() {} } void condizione() : {} { <PARAP> valore() <UGUG> valore() <PARCH> {} } void valore() : {} 3 { <IDENT> | <NUM> {} } void istruzione() : {} { istruzioneIf() | istruzioneAssegnazione() {} } void istruzioneAssegnazione() : {} { <IDENT> <UG> valore() <PVIRG> {} } Esercizio 3 (a) Scrivere un documento HTML contenente una form contenente i seguenti campi: • cognome e nome (casella di testo editabile lunga 40 caratteri) • sesso (selezionabile tramite due bottoni radio) • matricola (casella di testo editabile lunga 12 caratteri) • regione di residenza (da scegliere da un menu che riporta le 20 regioni italiane) • email (casella di testo editabile lunga 30 caratteri) • telefono (casella di testo editabile lunga 15 caratteri) • anno di corso (casella di testo editabile lunga 2 caratteri) • richieste particolari (area di testo editabile di 12 righe per 60 colonne) • bottone di invio • bottone di reset (b) Aggiungere al documento HTML una funzione JavaScript che esegue i seguenti controlli: • verifica che il cognome e nome non sia vuoto; • verifica che sia stata selezionata una regione; • verifica che l’anno di corso sia un numero compreso tra 1 e 6 oppure sia la stringa “FC”; • verifica che o l’email o il telefono siano non vuoti. Inoltre, fare in modo che, nel documento HTML, tale funzione JavaScript venga eseguita quando l’utente invia la form. Soluzione (a) Documento HTML contenente la form richiesta: <html> <head> </head> 4 <body> <form action="" method="post" name="registr"> cognome: <input type="text" name="cognome" size="40" maxlength="40"> <br> sesso: <input type="radio" name="sesso" value="M">M <input type="radio" name="sesso" value="F">F <br> matricola: <input type="text" name="matricola" size="12" maxlength="12"> <br> regione: <select name="regione"> <option value="nessuna" selected></option> <option value="valdaosta">Val d’Aosta</option> <option value="piemonte">Piemonte</option> <option value="liguria">Liguria</option> <option value="lombardia">Lombardia</option> <option value="veneto">Veneto</option> <option value="trentino">Trentino Alto Adige</option> <option value="friuli">Friuli Venezia-Giulia</option> <option value="emilia">Emilia-Romagna</option> <option value="toscana">Toscana</option> <option value="marche">Marche</option> <option value="umbria">Umbria</option> <option value="lazio">Lazio</option> <option value="abruzzo">Abruzzo</option> <option value="molise">Molise</option> <option value="campania">Campania</option> <option value="basilicata">Basilicata</option> <option value="puglia">Puglia</option> <option value="calabria">Calabria</option> <option value="sicilia">Sicilia</option> <option value="sardegna">Sardegna</option> </select> <br> email: <input type="text" name="email" size="30" maxlength="30"> <br> telefono: <input type="text" name="tel" size="15" maxlength="15"> <br> anno di corso: <input type="text" name="anno" size="2" maxlength="2"> <br> richieste particolari: 5 <br> <textarea name="richieste" cols="60" rows="12"></textarea> <br> <input type="submit" value="Invia"> <input type="reset" value="Reset"> </form> </body> </html> (b) Documento HTML contenente, oltre alla form, la funzione Javascript richiesta: <html> <head> <script type="text/javascript" language="javascript"> function validaForm() { if (document.registr.cognome.value=="") { alert("Inserire cognome"); return false; } if (document.registr.matricola.value=="") { alert("Inserire matricola"); return false; } if (document.registr.regione.value=="nessuna") { alert("Selezionare una regione"); return false; } if ((document.registr.email.value=="")&&(document.registr.tel.value=="")) { alert("Inserire o l’email o il numero di telefono"); return false; } if (document.registr.anno.value!="FC") { if (isNaN(document.registr.anno.value)||document.registr.anno.value=="") { alert("Anno di corso errato"); return false; } else { var v=parseInt(document.registr.anno.value); if ((v<1)||(v>6)) { alert("Anno di corso errato"); return false; } } } alert("Dati inseriti correttamente"); return true; } 6 </script> </head> <body> <form action="" method="post" name="registr" onSubmit="return validaForm();"> cognome: <input type="text" name="cognome" size="40" maxlength="40"> <br> sesso: <input type="radio" name="sesso" value="M">M <input type="radio" name="sesso" value="F">F <br> matricola: <input type="text" name="matricola" size="12" maxlength="12"> <br> regione: <select name="regione"> <option value="nessuna" selected></option> <option value="valdaosta">Val d’Aosta</option> <option value="piemonte">Piemonte</option> <option value="liguria">Liguria</option> <option value="lombardia">Lombardia</option> <option value="veneto">Veneto</option> <option value="trentino">Trentino Alto Adige</option> <option value="friuli">Friuli Venezia-Giulia</option> <option value="emilia">Emilia-Romagna</option> <option value="toscana">Toscana</option> <option value="marche">Marche</option> <option value="umbria">Umbria</option> <option value="lazio">Lazio</option> <option value="abruzzo">Abruzzo</option> <option value="molise">Molise</option> <option value="campania">Campania</option> <option value="basilicata">Basilicata</option> <option value="puglia">Puglia</option> <option value="calabria">Calabria</option> <option value="sicilia">Sicilia</option> <option value="sardegna">Sardegna</option> </select> <br> email: <input type="text" name="email" size="30" maxlength="30"> <br> telefono: <input type="text" name="tel" size="15" maxlength="15"> <br> anno di corso: <input type="text" name="anno" size="2" maxlength="2"> 7 <br> richieste particolari: <br> <textarea name="richieste" cols="60" rows="12"></textarea> <br> <input type="submit" value="Invia"> <input type="reset" value="Reset"> </form> </body> </html> Esercizio 4a Dato il seguente documento XML: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE a [ <!ELEMENT a b? (c | d)* e+> <!ELEMENT b (#PCDATA)> <!ELEMENT c EMPTY> <!ELEMENT d (#PCDATA | a)*> <!ELEMENT e EMPTY> <!ATTLIST a prop CDATA #REQUIRED> <!ATTLIST b prop CDATA #IMPLIED> <!ATTLIST c attrc CDATA #IMPLIED> <!ATTLIST e attre CDATA #REQUIRED> ]> <a prop="v1"> <b prop="1">riga 1</b> <b prop="pippo">riga 2</b> <c/> <b x="3">riga 3</b> <d>riga 4 <a prop="v2"> <c prop="xyz"/> <e/> </a> </d> <e attre="38"/> </a> dire se il documento `e valido. In caso contrario, evidenziare le violazioni della DTD da parte del documento. Esercizio 4b Data la seguente DTD: <!DOCTYPE a [ <!ELEMENT a (a*,(u|s|z),a*,y,((t,y)|(w,z)))> <!ELEMENT s (#PCDATA|w)*> 8 <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ATTLIST <!ATTLIST <!ATTLIST t u x y w z s u x (x?,w*,(t|a|s)?)> (a?,(u|s)*,(z,y)+)> (#PCDATA|x)*> (#PCDATA|x)*> EMPTY> ((z,y)*,(u|s)+)> attrs CDATA #REQUIRED> attru CDATA #IMPLIED> attrx CDATA #REQUIRED> ]> 1. dire se la DTD `e corretta ed in caso negativo evidenziare gli errori presenti e correggerli; 2. scrivere un documento XML che sia valido rispetto alla DTD (eventualmente corretta) e che contenga tutti gli elementi dichiarati nella DTD. Esercizio 4c Dato il seguente documento XML: <a prop="v1"> <b prop="1">riga 1</b> <b prop="pippo">riga 2</b> <c/> <b x="3">riga 3</b> <d>riga 4 <a prop="v2"> <c prop="xyz"/> <e/> </a> </d> <e attre="38"/> </a> 1. scrivere l’albero DOM corrispondente a tale documento; 2. scrivere una sequenza di chiamate a metodi della API DOM che genera l’albero DOM corrispondente al documento. Esercizio 4d 1. Scrivere una DTD che formalizza le seguenti regole: • sono ammessi solo gli elementi <a>, <b>, <c>, <d>, <e>; • <a> `e l’elemento radice; • <a> pu` o contenere solo elementi di tipo <b> o di tipo <c>, deve contenere almeno un elemento di tipo <c>, e tutti gli elementi <b> devono precedere gli elementi <c>; • <b> pu` o contenere solo elementi di tipo <d> o di tipo <e>, deve contenere almeno un elemento <e>, e tutti gli elementi <d> devono precedere gli elementi <e>; 9 • <c> pu` o contenere solo elementi di tipo <d> o di tipo <a>, deve contenere almeno tre elementi <d>, e tutti gli elementi <d> devono precedere gli elementi <a>; • gli elementi <d> possono contenere ogni tipo di elemento (compreso #PCDATA); • <e> `e un elemento vuoto; • <a> ha un attributo attrx obbligatorio di tipo CDATA e un attributo attry che pu` o assumere solo i valori s1, s2, o s3, e s1 `e il valore di default; • <e> ha un attributo attrz obbligatorio di tipo CDATA e un attributo attrw opzionale di tipo NMTOKEN. 2. scrivere una grammatica non contestuale G tale che L(G) corrisponde all’insieme dei documenti XML validi rispetto alla DTD del punto precedente. Esercizio 5 Data la seguente DTD: <!DOCTYPE a <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ATTLIST ]> [ a b c d e c (b?, c*, (d|e)+)> (#PCDATA)> (#PCDATA)> (#PCDATA)> EMPTY> attr CDATA #IMPLIED> scrivere un XML Schema corrispondente. Soluzione <?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="a"> <xsd:complexType> <xsd:sequence> <xsd:element name="b" type="xsd:string" minOccurs="0" maxOccurs="1"/> <xsd:element name="c" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/> <xsd:choice minOccurs="1" maxOccurs="unbounded"> <xsd:element name="d" type="xsd:string"/> <xsd:element name="e"> <xsd:complexType/> </xsd:element> </xsd:choice> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema> 10 Esercizio 6a Scrivere un foglio di stile XSL che, dato un documento XML, restituisce il documento tale che: 1) l’elemento root `e uguale all’elemento root del documento di input; 2) ogni elemento x diverso dall’elemento radice viene trasformato in un elemento nuovo, copiando il nome dell’elemento x in un elemento nome contenuto nell’elemento nuovo. Ad esempio, se il documento XML di input `e il seguente: <root> <b> <a>testo1</a> <c> <a/> testo2 <d> <a>testo3</a> </d> </c> testo4 <a/> </b> </root> il foglio di stile applicato al documento deve restituire il documento seguente: <root> <nuovo> <nome>b</nome> <nuovo> <nome>a</nome> testo1 </nuovo> <nuovo> <nome>c</nome> <nuovo> <nome>a</nome> </nuovo> testo2 <nuovo> <nome>d</nome> <nuovo> <nome>a</nome> testo3 </nuovo> </nuovo> </nuovo> testo4 <nuovo> <nome>a</nome> 11 </nuovo> </nuovo> </root> Soluzione <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml"/> <xsl:template match="/*"> <xsl:element name="{name()}"> <xsl:apply-templates/> </xsl:element> </xsl:template> <xsl:template match="*"> <nuovo> <nome> <xsl:value-of select="name()"/> </nome> <xsl:apply-templates/> </nuovo> </xsl:template> </xsl:stylesheet> Esercizio 6b Scrivere un foglio di stile XSL che, dato un documento XML, restituisce il documento tale che: 1) l’elemento radice `e uguale all’elemento radice del documento di input; 2) ogni elemento figlio dell’elemento radice viene trasformato in un elemento <z>, e il suo contenuto viene ricorsivamente trasformato; 3) ogni elemento che non `e n´e la radice n´e un figlio dell’elemento radice viene trasformato in un elemento nuovo, con valore dell’attributo elem uguale al nome dell’elemento, e il suo contenuto viene ricorsivamente trasformato; 4) tutte le parti testuali vengono copiate nel corrispondente elemento in output. Ad esempio, se il documento XML di input `e il seguente: <c> <b> <a>testo1</a> <c> <a/> testo2 <d> <a>testo3</a> </d> </c> 12 testo4 <a/> </b> <a> <b>testo1</b> testo5 <d/> </a> </c> il foglio di stile applicato al documento deve restituire il documento seguente: <c> <z> <nuovo elem="a">testo1</nuovo> <nuovo elem="c"> <nuovo elem="a"/> testo2 <nuovo elem="d"> <nuovo elem="a">testo3</nuovo> </nuovo> </nuovo> testo4 <nuovo elem="a"/> </z> <z> <nuovo elem="b">testo1</nuovo> testo5 <nuovo elem="d"/> </z> </c> Soluzione <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml"/> <xsl:template match="/*"> <xsl:element name="{name()}"> <xsl:apply-templates/> </xsl:element> </xsl:template> <xsl:template match="/*/*"> <z> <xsl:apply-templates/> 13 </z> </xsl:template> <xsl:template match="/*/*//*"> <xsl:element name="nuovo"> <xsl:attribute name="elem"> <xsl:value-of select="name()"/> </xsl:attribute> <xsl:apply-templates/> </xsl:element> </xsl:template> </xsl:stylesheet> 14
© Copyright 2024 Paperzz