Organizei melhor os arquivos de cabeçalho para evitar dependências cíclicas.
Iniciei a construção do “backend”. As duas opções de geração de código para fatores (identificadores ou números) já estão implementadas sem otimização.
Reduzi os nomes das funções de registro de erros e do “backend”.
Mudei os nomes das funções da tabela de símbolos colocando em discurso direto (verbo + objeto).
Mudei uma pá de nomes, tanto de variáveis quanto de funções. Acho que ficou melhor, apesar de menos estruturado.
Adicionei uma versão da função para marcação de erros no código que usa por padrão a posição da ficha léxica atual.
Removi a necessidade da variável global “last_token” no analisador sintático. A variável em si vai continuar no código caso seja necessária futuramente. Esqueci de apontar na última versão, mas também desdobrei a função “assert” em duas: “recognize” que faz o teste e avança caso haja sucesso em reconhecer a ficha e “verify” que somente executa o teste.
Consertei alguns probleminhas de lógica por causa da mudança de “assert” para “verify”.
Ajustei os nomes das funções do “backend” para começarem com o verbo “write” para que fique claro sua intenção. A maior mudança, no entanto, foi a divisão da função “assert” original em quatro versões que podem avançar ou não na análise e mostrar ou não erros de compilação. Com isto, o código pode ser otimizado, evitando verificações redundantes (uma vez que estas funções já verificam se o símbolo atual é o passado como parâmetro).