Skip to content

Commit bccf1f3

Browse files
committed
Migliorata implementazione del MENTRE
1 parent e841979 commit bccf1f3

File tree

3 files changed

+38
-28
lines changed

3 files changed

+38
-28
lines changed

Examples/tabellinadue.psc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
PROGRAMMA tabellina del due
2+
INIZIO
3+
num <- 0
4+
MENTRE(num <= 10)
5+
SCRIVI(num*2)
6+
num <- num+1
7+
ALTRIMENTI
8+
FINE
9+
FINE.

Manual.py

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
legend = {
2-
"Opzioni da console": '-show ti permette di visualizzare il codice python risultato della conversione\n-file ti permette di aprire un file ed eseguirlo\n-output ti permette di salvare il codice python in un file esterno\n-replace ti permette di sostituire il file se già esistente, senza chiedere conferma',
2+
"Opzioni da console": '-show ti permette di visualizzare il codice python risultato della conversione\n-file ti permette di aprire un file ed eseguirlo\n-output ti permette di salvare il codice python in un file esterno\n-replace ti permette di sostituire il file se già esistente, senza chiedere conferma.',
33
"PROGRAMMA": "Sintassi: PROGRAMMA nomeprogramma\nÈ il primo comando in un programma scritto in pseudocodice, dà il nome al programma.",
44
"INIZIO": "Necessario in ogni programma scritto in pseudocodice, è il punto di partenza del programma.",
55
"LEGGI": "Sintassi: LEGGI(nomevariabile)\nChiede l'input dell'utente e lo salva in una variabile.",
66
"SCRIVI": "Sintassi: SCRIVI(valore)\nScrive sulla console il valore che gli viene dato.",
77
"SE": "Sintassi: SE(condizione)\nEsegue il codice all'interno se e solo se la condizione è VERA.",
8-
"FINE": "Indica la fine di un blocco condizionale o altri comandi che raggruppano varie linee di codice",
9-
"FINE.": "Esce da un blocco MENTRE; esce dal programma quando usato per uscire da un blocco INIZIO"
8+
"ALTRIMENTI": "Esegue il codice all'interno se e solo se la condizione precedente risulta FALSA.",
9+
"MENTRE": "Sintassi: MENTRE(condizione)\nEsegue il codice all'interno mentre la condizione è VERA.",
10+
"FINE": "Indica la fine di un blocco condizionale o altri comandi che raggruppano varie linee di codice.",
11+
"FINE.": "Esce dal programma."
1012
}
1113
def autotype(value):
1214
try:
@@ -18,25 +20,19 @@ def sep():
1820
def open():
1921
while True:
2022
for i, x in zip(legend.keys(), range(1, len(legend)+1)):
21-
print(f"{x}. {i}")
23+
print(f"{x}." + i.rjust(1+int(len(str(max(range(1, len(legend)+1))) + '.') - len(f"{x}.") + len(i))))
2224
print('X. Esci')
2325
choice = autotype(input('-> '))
24-
if type(choice) == int:
25-
try:
26+
try:
27+
if type(choice) == int:
2628
sep()
27-
print(list(legend.keys())[choice-1])
28-
print(legend[list(legend.keys())[choice-1]])
29+
print(f"{list(legend.keys())[choice-1]}\n{legend[list(legend.keys())[choice-1]]}")
2930
sep()
30-
except IndexError:
31-
print(f"{choice} non è un'opzione valida. riprova")
32-
else:
33-
if choice.lower() == 'x':
34-
break
35-
try:
31+
else:
32+
if choice.lower() == 'x':
33+
break
3634
sep()
37-
print(choice)
38-
print(legend[choice])
35+
print(f"{choice}\n{legend[choice]}")
3936
sep()
40-
except KeyError:
41-
print(f"{choice} non è un'opzione valida. riprova")
42-
37+
except (IndexError, KeyError):
38+
print(f"{choice} non è un'opzione valida. riprova")

main.py

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
import re, sys
33
sep = lambda: print('='*30)
44
def convert(code): # Funzione usata per la traslazione in codice python
5-
result = """def autotype(value):
5+
result = """import sys
6+
def autotype(value):
67
try:
78
return int(value)
89
except:
@@ -11,7 +12,7 @@ def convert(code): # Funzione usata per la traslazione in codice python
1112
#NON È RISULTATO DELLA CONVERSIONE.
1213
1314
"""
14-
indent = 0
15+
indent = []
1516
if re.search("^PROGRAMMA .*",code[0]): # La prima stringa del programma deve contenere l'istruzione PROGRAMMA seguita dal nome del programma.
1617
result += re.sub("^PROGRAMMA (.*)", r"#\1",code[0]) # Aggiunge un commento alla prima riga del codice convertito che indica il nome del programma.
1718
else:
@@ -26,33 +27,37 @@ def convert(code): # Funzione usata per la traslazione in codice python
2627
i = i.strip()
2728
if len(i) == 0:
2829
continue
29-
result += (' '*4)*indent
30+
result += (' '*4)*len(indent)
3031
if re.search("^#", i):
3132
result += i # Aggiunta dei commenti senza effettuare modifiche.
3233
elif re.search("ALTRIMENTI SE\(", i):
3334
result = result[:-4]
3435
result += re.sub("ALTRIMENTI SE\((.*)\)", r"elif(\1):", i)
3536
elif re.search("MENTRE\(", i):
36-
indent += 1
37+
indent.append('break')
3738
result += re.sub("MENTRE\((.*)\)", r"while(\1):",i)
3839
elif re.search("SE\(", i):
39-
indent += 1
40+
indent.append('')
4041
result += re.sub("SE\((.*)\)", r"if(\1):",i)
4142
elif re.search("ALTRIMENTI", i):
43+
if indent[-1] == 'break':
44+
indent[-1] = 'pass'
4245
result = result[:-4]
4346
result += re.sub("ALTRIMENTI", r"else:", i)
4447
elif re.search(".*<-",i):
4548
result += re.sub("(.*)<-(.*)", rf"\1=\2", i) # Assegnazione variabili.
4649
elif re.search("^PROGRAMMA .*", i):
4750
result += ' ' # Codice necessario per aggiungere i commenti per il comando PROGRAMMA.
4851
elif re.search("^INIZIO", i):
49-
indent += 1
52+
indent.append('')
5053
result += 'while __name__ == "__main__":' # Codice che dà l'entrata al main.
5154
elif re.search("FINE.", i):
52-
result += "break"
55+
result += "sys.exit()"
5356
elif re.search("FINE", i):
54-
indent -= 1
55-
result += ' '
57+
if len(indent[-1]) != 0:
58+
result += indent[-1]
59+
indent.pop()
60+
result += ' '
5661
elif re.search("LEGGI\(",i):
5762
result += re.sub("LEGGI\((.*)\)", rf"\1 = autotype(input('\1: '))", i) # Prende un input dall'utente e lo salva in una variabile.
5863
elif re.search("SCRIVI\(",i):

0 commit comments

Comments
 (0)