Construção de compiladores/Tradução dirigida por sintaxe
Tradução dirigida por sintaxe é uma técnica de especificação de compiladores tradutores que permite associar ações semânticas às regras da gramática. Essa técnica é utilizada em quase todos os compiladores modernos.
Nesta tradução do código de alto nível para o do processador está a associação para traduzir para a linguagem-alvo, obtida para as diversas expressões do program, a representação da árvore Gramatical.
Embora tal atividade possa ser realizada ao fim da análise sintática para toda árvore, ela é realmente concluída com as ações semânticas, numa associação à aplicação das regras de reconhecimento do analisador sintático.
Para se gerar o código, não é necessário ir diretamente para a linguagem assembly do processador-alvo, pois o analisador sintático gera o mesmo com uma linguagem próxima para uma máquina abstrata, isso independente de processadores específicos. Depois esse código produzido traduz para a linguagem assembly desejada que se deseja. Ganha-se que grande parte do compilador é liberada para ser reaproveitada em trabalhos de tipos de processadores díspares.
Na tradução dirigida pela sintaxe assume-se que os terminais tenham somente atributos sintetizados quando as definições não apresentam nenhuma regra semântica . Esses atributos são bastante usados na prática, onde uma sintaxe com os mesmos é chamada de definição S-atribuída.
Os valores para os atributos dos terminais geralmente são fornecidos por este léxico:
F ->dígito F.val= dígito.lexval
Eles costumam ser avaliados de baixo para cima, das folhas para a raiz.
Em resumo:
> É uma tradução de linguagens guiada por gramáticas livres de contexto;
> faz uma amarração de atributos, que representam valores (tipo, endereço, etc.), aos símbolos gramaticais de regras de produção, onde são representada as construções de linguagens;
> Faz associação de regras semânticas às produções, a fim de realizar cálculos dos valores de atributos amarrados.
Definições Dirigidas pela Sintaxe
editarSão definições que usam uma gramática livre, onde cada símbolo gramatical possui um conjunto associado de atributos.
Atributos do Símbolo
editar- Sintetizados: O valor é computado a partir dos valores dos atributos dos filhos do nó.
- Herdados: O valor é computado a partir dos valores dos atributos do pai e dos irmãos do nó.
Formas de Representação Intermediária
editarNormalmente a tradução do programa fonte no programa objeto é feita em dois passos, e uma representação intermediária do programa fonte deve ser construída. Tipicamente, essa representação intermediária assume uma de duas formas: uma árvore (árvore sintática) ou uma seqüência de comandos em uma linguagem intermediária, cuja forma mais comum é a de quádruplas, ou seja, de comandos compostos de um operador e de três operandos, que quase sempre são endereços. Por exemplo, o comando de atribuição:
x: = (a+b) * c
Árvores Sintáticas
editarA primeira árvore que se poderia usar como base para uma representação intermediária é a árvore de derivação correspondente ao programa fonte, de acordo com a gramática da linguagem fonte usada na construção do analisador sintático. Entretanto, essa árvore de derivação em geral não é conveniente, uma vez que inclui muitos detalhes desnecessários, que foram incluídos na sintaxe da linguagem fonte para resolver problemas de ambigüidade, precedência, pontuação, clareza, legibilidade, etc. Por essa razão, em alguns casos é conveniente a definição de uma segunda sintaxe, chamada sintaxe abstrata, que ignora todos os aspectos não essenciais da sintaxe original, conhecida como sintaxe concreta.