From e59f9fd477eccea7d69ea874186a124e3fc10a4c Mon Sep 17 00:00:00 2001 From: geno Date: Tue, 28 May 2024 10:43:29 +0200 Subject: updated readme and added exercises --- README.md | 3 +++ README.txt | 24 ------------------ resources/README.txt | 22 +++++++++++++++++ resources/es1.md | 27 ++++++++++++++++++++ resources/es2.md | 12 +++++++++ resources/es3.md | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 134 insertions(+), 24 deletions(-) create mode 100644 README.md delete mode 100644 README.txt create mode 100644 resources/README.txt create mode 100644 resources/es1.md create mode 100644 resources/es2.md create mode 100644 resources/es3.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..1f03a1c --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# CLP Project + +Project for the AA 2023/2024 **Complementi di programmazione**'s course of the Master Degree in Computer Science. diff --git a/README.txt b/README.txt deleted file mode 100644 index 0bcbb1d..0000000 --- a/README.txt +++ /dev/null @@ -1,24 +0,0 @@ -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...) - -Marco Bertoni, Cosimo Laneve \ No newline at end of file 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)) + +===== -- cgit v1.2.3-18-g5258