Existem muitas linguagens de programação que têm suas próprias características exclusivas. Mas para que um programa escrito em qualquer um deles funcione, você precisa transmiti-lo. Às vezes, as linguagens de programação são desenvolvidas para suas próprias necessidades (por exemplo, suporte para automação em grandes aplicativos) e então torna-se necessário escrever um tradutor.
Necessário
- - gramática natural ou BNF do idioma de origem;
- - ferramentas de desenvolvimento.
Instruções
Passo 1
Prepare os dados para a análise lexical do texto no idioma de origem. Liste todos os tokens no idioma. Divida-os em categorias (palavras-chave, literais numéricos e de string, identificadores, espaços em branco, pontuação, etc.).
Passo 2
Implemente um módulo ou lexer. Na entrada, ele deve receber um fluxo de dados "bruto" e, na saída, uma lista de elementos contendo tokens e seus identificadores de tipo na sequência em que ocorrem no texto fonte. O programa de análise pode ser bastante simples " scanner de nível único. Implementar a recuperação de erros não faz sentido. Os caracteres inválidos devem ser tratados como erros.
etapa 3
Prepare os dados para análise. Com base na gramática natural ou BNF do idioma de origem, componha sua gramática LL1. Com base nesse tipo de gramática, elabore um esquema de análise em termos das categorias de tokens válidos e construções semânticas da linguagem.
Passo 4
Implemente um módulo ou analisador. Na entrada, ele deve receber uma lista de tokens preparados na fase de análise lexical. Desenvolva algoritmos de verificação de sintaxe recursiva usando o esquema que você criou na etapa três. Se necessário, implemente mecanismos de recuperação de erros. Adicione funcionalidade aos algoritmos de análise para construir uma árvore para calcular funções, métodos de classe. Com a estrutura correta de algoritmos de análise, essa funcionalidade pode ser implementada sem problemas. Isso evita a necessidade de implementá-lo como um módulo separado. As estruturas de dados criadas devem conter listas de instruções na forma de sequências "planas" (expressões aritméticas expandidas em forma pós-fixada adequadas para computação em uma máquina de pilha, loops convertidos em combinações de sequências de instruções computacionais e saltos condicionais ou incondicionais, etc.).
Etapa 5
Crie um módulo de otimização, se necessário. Ele deve processar e transformar as estruturas de dados preparadas na etapa anterior. Os algoritmos e métodos de otimização são muito diversos.
Etapa 6
Desenvolva um gerador de código. Ao processar as estruturas preparadas na quarta ou quinta etapas, deve-se simplesmente transformar as sequências de instruções abstratas em instruções de execução em uma plataforma específica.
Etapa 7
Crie um programa de fichário (vinculador), se necessário. Deve formar o módulo executável resultante, escolhendo a localização dos segmentos de código, calculando os endereços dos rótulos, etc.