-
Notifications
You must be signed in to change notification settings - Fork 0
/
intermediario.py
115 lines (89 loc) · 4.76 KB
/
intermediario.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
from infix_postfix import infix_to_postfix
class Intermediario:
def __init__(self, list_tokens, list_id):
self.lista_tokens = list_tokens
self.lista_id = list(list_id.keys())
self.cod_intermediario = []
self.log_intermediario = open("log_intermediario.txt","w")
def inicia_geracao(self):
#Declarações de variaveis
for id in self.lista_id:
self.cod_intermediario.append('_Var {0}'.format(id))
self.log_intermediario.write("Declarado variavel {0}\n".format(id))
#Gramática
i=0
for token in self.lista_tokens:
if token[0] == 'tk_read' :
self.cod_intermediario.append("leia {0}".format(self.lista_tokens[i+2][1]))
self.log_intermediario.write("Comando de leitura da variavel {0} \n".format(self.lista_tokens[i+2][1]))
elif token[0] == 'tk_screen':
self.cod_intermediario.append("escreva {0}".format(self.lista_tokens[i+2][1]))
self.log_intermediario.write("Comando de escrita da variavel ou string {0}\n ".format(self.lista_tokens[i+2][1]))
elif token[0] == 'tk_atribuicao':
j=i+1
atribuicao =""
while self.lista_tokens[j][0] != ';':
atribuicao += " "+self.lista_tokens[j][1]
j+=1
self.cod_intermediario.append("{0} = {1}".format(self.lista_tokens[i-1][1], infix_to_postfix(atribuicao)))
self.log_intermediario.write("Atribuido à {0} a expressão {1}\n ".format(self.lista_tokens[i-1][1], infix_to_postfix(atribuicao)))
elif token[0] == 'tk_while':
j=i+1
condicao = " "
exp = ""
while self.lista_tokens[j][0] != ':':
if self.lista_tokens[j][0] == "op_logico":
condicao += infix_to_postfix(exp) + " "+self.lista_tokens[j][1]
exp = ""
j+=1
elif self.lista_tokens[j][0] == "c_logico":
condicao += infix_to_postfix(exp) + " "+self.lista_tokens[j][1]
exp = ""
j+=1
exp += " "+self.lista_tokens[j][1]
j+=1
condicao += infix_to_postfix(exp)
self.cod_intermediario.append("enquanto {0}".format(condicao))
self.log_intermediario.write("Laço de repetição `while` reconhecido\n ")
elif token[0] == 'tk_end_while':
self.cod_intermediario.append("fim_enquanto")
elif token[0] == 'tk_if':
j=i+1
condicao = " "
exp = ""
while self.lista_tokens[j][0] != ':':
if self.lista_tokens[j][0] == "op_logico":
condicao += infix_to_postfix(exp) + " "+self.lista_tokens[j][1]
exp = ""
j+=1
elif self.lista_tokens[j][0] == "c_logico":
condicao += infix_to_postfix(exp) + " "+self.lista_tokens[j][1]
exp = ""
j+=1
exp += " "+self.lista_tokens[j][1]
j+=1
condicao += infix_to_postfix(exp)
self.cod_intermediario.append("se {0} entao".format(condicao))
self.log_intermediario.write("Comando condicional `if` reconhecido\n ")
elif token[0] == 'tk_end_if':
self.cod_intermediario.append("fim_se")
elif token[0] == 'tk_else':
self.cod_intermediario.append("senao")
self.log_intermediario.write("Comando condicional `else` reconhecido\n ")
i+=1
self.log_intermediario.close()
self.getIntermediario()
#return self.write_intermediario(self.cod_intermediario)
def getIntermediario(self):
arquivo_intermediario = open ("arquivo_intermediario.txt","w")
for line in self.cod_intermediario:
arquivo_intermediario.write(line+"\n")
arquivo_intermediario.close()
def write_intermediario(self, cod):
intermediary = [str(a) for a in cod]
return "\n".join(intermediary)
def log_intermediary(self):
log_int = open("log_intermediario.txt","r")
for log in log_int:
print(log)
log_int.close()