Estrutura de um Compilador
Last updated
Last updated
No processamento de uma linguagem a análise semântica deve, sempre que possível, garantir que o programa faz sentido.
Erros semânticos comuns:
Variável/função não definida.
Tipos incompatíveis (ex. atribuir um número real a uma variável inteira).
Definir instrução num contexto errado (ex. utilizar em Java a instrução break fora de um ciclo switch).
Aplicação sem sentido de instrução (ex. importar um pacote inexistente).
Em alguns casos, estes erros podem ser avaliados ainda durante a análise sintática, em outros casos só é possível fazer essa verificação após uma análise sintática bem sucedida, fazendo uso da informação retirada dessa análise.
No processamento de linguagens, a avaliação semântica pode ser feita associando informação e acções às regras sintácticas da gramática (i.e. aos nós da árvore sintáctica).
Este procedimento designa-se por avaliação dirigida pela sintaxe.
Por exemplo, numa gramática para expressões aritméticas podemos associar aos nós da árvore uma variável com o tipo da expressão, e acções que permitam verificar a sua correcção (e não permitir, por exemplo, que se tente somar um booleano com um inteiro).
Em ANTLR4, a associação de atributos e acções à árvore sintáctica, pode ser feita durante a própria análise sintáctica, e/ou posteriormente recorrendo a visitors e/ou listeners.
A variação de cada propriedade semântica de uma linguagem pode ser feita em dois tempos distintos:
Tempo dinâmico: durante o tempo de execução.
Tempo estático: durante o tempo de compilação.
Só os compiladores fazem verificações estáticas de propriedades semânticas.
Em interpretadores as fases de análise e síntese da linguagem são ambas feitas em tempo de execução, pelo que as verificações são sempre dinâmicas.
A verificação estática tem a vantagem de garantir, em tempo de execução, que certos erros nunca vão ocorrer (dispensando a necessidade de proceder à sua depuração e teste).