Corso di Linguaggi di Programmazione — Paradigmi di

Transcript

Corso di Linguaggi di Programmazione — Paradigmi di
Corso di Linguaggi di Programmazione — Paradigmi di Programmazione
Prova scritta del 16 settembre 2015.
Tempo a disposizione: ore 2.
Svolgere gli esercizi 1-4 e 5-8 su due fogli differenti.
Per Paradigmi: svolgere solo: 1,5,6,7,8.
1. Si costruisca l’automa più semplice che riconosca il linguaggio L = {an | n = 3k + 1, k ≥ 0}.
2. Si consideri la grammatica G con simbolo iniziale S:
S
A
B
→ AB
→ aAb | → bB | (i) Determinare il linguaggio L(G). (ii) L(G) è regolare?
3. Si consideri la grammatica G del punto precedente. (i) Verificare che G è di classe LL(1). (ii)
Riempire la tabella di parsing LL(1). (iii) Mostrare il funzionamento del parser LL(1) per input
abb.
4. Si consideri la grammatica G con simbolo iniziale S:
S
A
B
→ AB | → a|
→ b|
(i) Verificare che G è ambigua. (ii) G è di classe LR(0)? (iii) Fornire una grammatica regolare G0 ,
equivalente a G, ma non ambigua. (iv) Può esistere una qualche grammatica G00 per il linguaggio
L(G) che sia di classe LR(0)?
5. Si consideri il seguente frammento:
void power
z = 1;
while y
{z
y
}
}
( int x , y , z ){
> 0 do
= z*x;
= y -1
Limitandosi al passaggio per valore e per riferimento, si elenchino tutte le combinazioni di modalità
di passaggio dei parametri che possono essere usate affinché la chiamata power(a,a,c) lasci in c il
valore c = aa , assumendo che:
(i) i parametri attuali a e c siano nomi con L-valori distinti;
(ii) i parametri attuali a e c siano nomi che denotano la stessa locazione di memoria.
6. Si consideri l’implementazione dello scope statico mediante display. Si dica, motivando la risposta,
se la dimensione massima del display puòò essere determinata durante la compilazione.
7. Si consideri uno pseudolinguaggio con gestione delle eccezioni, scope statico e passaggio per valore.
Cosa stampa il seguente frammento?
int x = 1;
void g ( int z ){
x = z +1;
throw E ;
x = z +1;
}
void foo ( int y ){
try { g ( x + y );} catch E { write ( x );}
}
{ int x = 10;
x = x +1;
try { foo ( x );} catch E { write ( x );}
try { g ( x );}
catch E { write ( x );}
}
write ( x );
8. In un linguaggio ad oggetti con selezione dinamica dei metodi (cioè nel quale tutti i metodi sono
“virtuali member functions”, nella terminologia C++), si dica cosa stampa il seguente frammento:
class A {
int x = 4;
void s3 (){
x = 3;
}
void f (){
x = 8;
s3 ();
}
}
class B extends A {
int x = 5;
void f (){
x = 10;
s3 ();
}
}
A a = new B ();
B b = (B) a;
a . f ();
print ( b . x );
print ( a . x );