summaryrefslogtreecommitdiff
path: root/resources
diff options
context:
space:
mode:
authorgeno <gabriele.genovese2@studio.unibo.it>2024-05-28 10:43:29 +0200
committergeno <gabriele.genovese2@studio.unibo.it>2024-05-28 10:43:29 +0200
commite59f9fd477eccea7d69ea874186a124e3fc10a4c (patch)
tree7bb7e03bfc9fc795a1951c3f39fcdb79ea0fba10 /resources
parentf05d888a0b621ca4e99e2b0fb6e23c097006fe41 (diff)
updated readme and added exercises
Diffstat (limited to 'resources')
-rw-r--r--resources/README.txt22
-rw-r--r--resources/es1.md27
-rw-r--r--resources/es2.md12
-rw-r--r--resources/es3.md70
4 files changed, 131 insertions, 0 deletions
diff --git a/resources/README.txt b/resources/README.txt
new file mode 100644
index 0000000..7d6390d
--- /dev/null
+++ b/resources/README.txt
@@ -0,0 +1,22 @@
+Python3 Package
+
+* nella cartella src ci sono lexer e parser per Python3 semplificati per il corso
+di CLP (non ci interessa analizzare qualunque programma Python)
+
+* sempre nella cartella src ci sono i file Python3LexerBase.java e
+Python3ParserBase.java. Questi non sono nostri e vanno tenuti nella stessa cartella.
+
+* Attraverso Python3Parser.g4 è possibile generare il parser tramite ANTLR e quindi tutti
+i file relativi (Visitor, Listener, etc.)
+
+* Nella cartella src ci sono 2 file che ha fatto Marco Bertoni per creare l'albero sintattico
+di un programma che si trova in progs/test.py (il file Main.java) oppure per creare gli
+alberi sintattici di tutti i programmi nella cartella progs (il file ParseAll.java). Gli
+alberi sintattici sono visualizzati nella cartella trees che verra` creata eseguendo i
+due programmi. Abbiamo usato questi codici perche` ANTLR pare sia rotto su questi codici (non
+genera alberi sintattici!)
+
+* i programmi della cartella progs sono 870. Li abbiamo presi da un database di programmi
+semplici e riusciamo a parsarli tutti. Le sottocartelle dont_care e unparsable_programs contengono programmi con feature che lasciam perdere (classi o lambdas) e programmi che
+non riusciamo a parsare (abbiamo semplificato la sintassi per avere alberi piu` semplici: non
+abbiam capito perche` non riusciamo ad analizzarli...) \ No newline at end of file
diff --git a/resources/es1.md b/resources/es1.md
new file mode 100644
index 0000000..84267d7
--- /dev/null
+++ b/resources/es1.md
@@ -0,0 +1,27 @@
+ESERCIZIO 1
+
+Definire l'analisi semantica per Python3 che verifica
+ 1.a) presenza di variabili non inizializzate
+ 1.b) presenza di variabili multiple nei parametri formali delle funzioni
+ 1.c) altro (?)
+
+Per quanto riguarda 1.a), questo programma e` sbagliato
+
+x = 2
+y = z
+def f(x, y):
+ return x+y
+
+print(f(5,3) + x + y)
+
+Per quanto riguarda 1.b) questo programma e` sbagliato
+
+x = 2 ; y = 3
+
+def f(x, x):
+ return x+y
+
+print(f(5,3)+ x + y)
+
+
+SUGGERIMENTO: Fare riferimento alla funzione checkSemantics in SimpleLan2 \ No newline at end of file
diff --git a/resources/es2.md b/resources/es2.md
new file mode 100644
index 0000000..00c61e0
--- /dev/null
+++ b/resources/es2.md
@@ -0,0 +1,12 @@
+ESERCIZIO 2
+
+2.a Concordare con il docente una delle tre ottimizzazioni nelle slide CodeOptimizations.pdf
+e implementare quella assegnata.
+
+[Occorrerà una funzione che stampi il codice python rappresentato dall'albero sintattico]
+
+2.b Quindi prendere 5 codici tra quelli che si trovano nella cartella del progetto, perturbarli
+in maniera tale da poter applicare l'ottimizzazione del punto 2.a e poi verificare con
+chatGPT se il riconoscimento dei due codici (quello ottimizzato e quello no) cambia o meno.
+Le perturbazioni di sopra devono essere di tipologia differente, se possibile.
+
diff --git a/resources/es3.md b/resources/es3.md
new file mode 100644
index 0000000..4f38f0c
--- /dev/null
+++ b/resources/es3.md
@@ -0,0 +1,70 @@
+ESERCIZIO 3
+
+Generare codice intermedio per il seguente frammento di Python:
+
+ * costanti intere e booleane
+ * le espressioni sono solo espressioni aritmetiche (operatori +,-,*,/,% ; / e` la
+ divisione intera); espressioni booleane (and, or, not); espressioni di confronto
+ (>,<, >=, <=, !=, ==)
+ * i comandi sono (a) assegnamento (unico formato possibile "a = exp"),
+ (b) condizionale, (c) invocazione di funzioni, (d) blocchi, ma senza dichiarazioni di
+ funzioni [quindi non ci sono funzioni annidate]
+ * ci sono funzioni ricorsive ma non mutuamente ricorsive
+ * ATTENZIONE: e` possibile accedere a variabili non locali.
+
+
+ESEMPI DI CODICI DA VERIFICARE
+
+def prime_num(num, div):
+ if (num >=1):
+ if (div*div <= num/2):
+ if (num % div) == 0:
+ return False
+ else:
+ return prime_num(num,div+1)
+ else:
+ return True
+ else:
+ return False
+
+print(prime_num(29,2))
+
+=====
+
+num = 29
+
+def prime_numBIS(div):
+ if (num >=1):
+ if (div*div <= num/2):
+ if (num % div) == 0:
+ return False
+ else:
+ return prime_numBIS(div+1)
+ else:
+ return True
+ else:
+ return False
+
+print(prime_numBIS(2))
+
+=====
+
+def fibonacci(n):
+ if ((n == 0) or (n == 1)):
+ return 1
+ else:
+ return (fibonacci(n-1) + fibonacci(n-2))
+
+print(fibonacci(6))
+
+=====
+
+def fibonacciIT(n,a,b):
+ if ((n == 0) or (n == 1)):
+ return a
+ else:
+ return (fibonacciIT(n-1, a+b, a))
+
+print(fibonacciIT(6,1,1))
+
+=====