编译器的中间代码生成器

时间:2018-11-22 04:27:20

标签: python

我正在为语法开发中间代码,但是我遇到了一些问题。我有一个令牌列表,其中包含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':条件内。你能帮助我吗?泰!

0 个答案:

没有答案