我正在为语法开发中间代码,但是我遇到了一些问题。我有一个令牌列表,其中包含lexeme | token | line | column(lista_tokens.txt)和下面的代码:
def geraCodigo(arg):
from infixToPostfix import infixToPostfix # Importação da função que faz a conversão de infixa pra posfixa
def verAtribuicao(variavel, i, cod, tok):
ex = ''
while tok[i][1] != 'fim_linha': # Enquanto não encontrar um token de fim linha
ex += ' ' + tok[i][0] # o buffer acumula os tokens encontrados
i += 1
return tac(variavel, infixToPostfix(ex), cod, i) # Chama a função tac (three address code) passando a variavel, expressao pos fixada, a lista e a iteração
def tac(var, expression, cod, it):
exp = expression.split()
stack = []
oper = ['+', '-', '*', '/']
for i in range(len(exp)):
if exp[i] in oper:
v1 = stack.pop()
v2 = stack.pop()
t = f'{v2} {exp[i]} {v1}'
if len(exp) == i+1:
cod.append(f'{var} := {t}')
else:
cod.append(f'_t{it} := {t}')
stack.append(f'_t{it}')
it += 1
else:
stack.append(exp[i])
# Abertura da lista de tokens retornada na análise léxica
with open("lista_tokens.txt", "r") as arquivo:
tk = arquivo.readlines()
# variáveis de controle
i = 0
c = 0
# declaração das listas de apoio
cod_intermediario = []
registro_log = []
tokens = []
# Loop apenas pra inserir as informações das linhas já delimitado
for j in tk:
tokens.append(j.split('|'))
# Faz a verificação da declaração das variáveis
for tk in tokens:
if tk[1] == 'id' and tokens[c-1][1] == 'tiponum':
cod_intermediario.append(f'INTEIRO {tk[0]}')
registro_log.append(f'Declaração da variável {tk[0]}')
c += 1
L = C = 1
while i < len(tokens):
expressao = ''
if tokens[i][1] == 'ler': # Verifica se o token é de leitura, mostra o token e pula 4 iterações
cod_intermediario.append(f'LEIA {tokens[i+2][0]}')
registro_log.append(f'Reconhecido comando leitura da variável {tokens[i+2][0]}')
i += 4
elif tokens[i][1] == 'escrever': # Verifica se o token é de escrita, mostra o token e pula 4 iterações
cod_intermediario.append(f'ESCREVA {tokens[i+2][0]}')
registro_log.append(f'Reconhecido comando de escrita')
i += 4
elif tokens[i][1] == 'atribuicao': # Verifica se o token é de atribuição e avança 1 iteração
variavel = tokens[i-1][0]
i += 1
registro_log.append(f'Reconhecido expressão atribuída para {tokens[i-2][0]}')
verAtribuicao(variavel, i, cod_intermediario, tokens)
elif tokens[i][1] == 'enquanto': # Verifica se o token encontrado é um enquanto
i += 2
while tokens[i][1] != 'parenteses_fecha': # enquanto não encontrar um fechamento de parenteses, acumula os tokens no buffer
expressao += ' ' + tokens[i][0]
i += 1
if expressao.split()[1] == '<=':
operador = '>'
elif expressao.split()[1] == '>=':
operador = '<'
elif expressao.split()[1] == '==':
operador = '='
cod_intermediario.append(f'_L{L}: if {expressao.split()[0]} {operador} {expressao.split()[2]} goto _L{L+1}')
cod_intermediario.append(f'_L{L+1}:')
registro_log.append(f'Reconhecido expressão enquanto para {expressao}')
L += 1
else:
i += 1
for c in registro_log:
print(c)
print('\n')
print('*' * 40, end='\n\n')
for j in cod_intermediario:
print(j)
这段代码基本上在令牌列表中导航,并进行一些检查,就像令牌是读,写,while等一样。while循环内具有以下条件:
elif tokens[i][1] == 'enquanto':
因此,在以下几行之间:
cod_intermediario.append(f'_L{L}: if {expressao.split()[0]} {operador} {expressao.split()[2]} goto _L{L+1}')
cod_intermediario.append(f'_L{L+1}:')
我想在while循环内创建其他条件,但要在 elif标记[i] [1] =='enquanto':条件内。你能帮助我吗?泰!