(Enade, 2021) Um compilador é um software que traduz um programa descrito em uma linguagem de alto nível para um programa equivalente em código de máquina para um processador. Em geral, um compilador não produz diretamente o código de máquina, mas sim, um programa em linguagem simbólica (assembly) semanticamente equivalente ao programa em linguagem de alto nível. O programa em linguagem simbólica é, então, traduzido para o programa em linguagem de máquina através de montadores. Para realizar esta tarefa, o compilador executa a análise léxica, sintática e semântica do código-fonte do programa que está sendo executado em linguagem abstrata para depois gerar o código de máquina.
BRANCO, G. A. Jr.; TAMAE, R. Y. Uma breve introdução ao estudo e implementação de compiladores.
Revista Científica Eletrônica de Psicologia. Ano V, n. 08, fev. 2008 (adaptado).
Considerando as informações do texto, avalie as assertivas a seguir.
É correto apenas o que se afirma
a. nas assertivas I e II.
b. nas assertivas I e III.
c. nas assertivas II e III.
d. nas assertivas II e IV.
e. nas assertivas III e IV.
Vamos analisar cada uma das afirmações com cuidado, relacionando-as às funções típicas das fases do compilador.
I. O analisador sintático tem a função de verificar se a sequência de símbolos gerada pelo analisador léxico compõe um programa válido ou não.
A análise sintática (ou parsing) verifica se a sequência de tokens (símbolos) gerados pelo analisador léxico obedece à gramática da linguagem. Se a estrutura do programa estiver incorreta (por exemplo, uma expressão mal formada como if x 5), o analisador sintático identificará o erro.
II. Na análise léxica, o analisador irá identificar cada símbolo que tenha significado para linguagem, gerando a mesma classificação para Java, Pascal ou outra linguagem.
Embora a análise léxica identifique os símbolos da linguagem (como identificadores, palavras-chave, operadores), ela é específica para cada linguagem. Ou seja, a classificação léxica depende da linguagem de programação. O que é uma palavra-chave em Java pode não ser em Pascal, e os operadores podem variar. Portanto, a afirmação de que gera a "mesma classificação" para diferentes linguagens está errada.
III. O analisador semântico utiliza o código fonte para verificar incoerências quanto ao significado das construções implementadas.
A análise semântica verifica coerência de significados: tipos compatíveis, variáveis declaradas antes de usar, número de argumentos em chamadas de função, entre outros. Por exemplo, tentar somar uma string com um número pode ser detectado aqui.
IV. O analisador sintático pode apresentar ao programador erros que incluem divergências de tipo entre operadores e operandos.
Divergências de tipo (como tentar somar uma string com um inteiro) são erros semânticos, e não sintáticos. O analisador sintático só verifica estrutura, como a ordem dos tokens, uso correto de parênteses, etc., não o significado nem tipos.
Conforme exposto, é correto apenas o que se afirma
b. nas assertivas I e III.