Esercitazione 7 - Dipartimento di Informatica e Sistemistica

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