Ybadoo - Soluções em Software Livre
Turmas
2º Semestre de 2025

(Enade, 2023) É chamado de compilação o processo de conversão do código escrito pelo programador para um arquivo binário que o computador consegue executar. Esse processo é realizado por um programa chamado compilador. Entre as diversas tarefas de um compilador, destaca-se a de identificar os possíveis erros sintáticos e semânticos. Com base nessas informações, considere uma linguagem de programação em que a sintaxe de uma operação aritmética seja dada pela seguinte gramática livre de contexto:

G = ({S, E, T}, {=, ;, +, -, *, /, (, ), a, b}, P, S)
P = {ST = E; | T = E; S
EE + E | E - E | E * E | E / E | (E) | T
T → a | b}

Inspirado nessa gramática, um profissional submete a seguinte sentença ao compilador dessa linguagem de programação:

a = a / (b - b);

Com base na gramática da linguagem de programação e acerca do processo de análise sintática e semântica da sentença proposta pelo profissional, é correto afirmar que

a. a gramática gera a sentença apresentada, porém o analisador semântico transmitirá uma mensagem de erro.

b. a gramática gera a sentença apresentada e o erro presente na expressão está fora do escopo das análises sintática e semântica.

c. o analisador léxico transmitirá uma mensagem de erro, pois a gramática não gera a sentença apresentada.

d. o analisador semântico transmitirá uma mensagem de erro, pois a gramática não gera a sentença apresentada.

e. a gramática gera a sentença apresentada, porém o analisador léxico transmitirá uma mensagem de erro.

Vamos analisar a sentença fornecida a = a / (b - b); de acordo com a gramática dada, para determinar qual é o erro que ocorre durante a análise léxica, sintática e semântica.

Análise léxica

Todos os tokens presentes na sentença ({=, ;, -, /, (, ), a, b}) estão presentes no conjunto de terminais da gramática ({=, ;, +, -, *, /, (, ), a, b}), ou seja, o analisador léxico não terá problemas com a sentença.

Análise sintática

A sentença é reconhecida pela gramática, conforme apresentado na Árvore de Derivação a seguir, indicando que o analisador sintático também não terá problemas com a sentença.

Árvore de Derivação
Árvore de derivação da expressão aritmética a = a / (b - b);

Análise semântica

O analisador semântico irá identificar uma divisão por zero, em (b - b), emitindo uma mensagem de erro. Em linguagens de programação mais antigas, muitas vezes o compilador não chega a acusar um erro, mas normalmente apresenta um aviso, como no caso do gcc - warning: division by zero [-Wdiv-by-zero].

Diante do exposto, vamos analisar cada uma das afirmações a seguir.

a. a gramática gera a sentença apresentada, porém o analisador semântico transmitirá uma mensagem de erro.

O problema é que a expressão b - b resulta em zero. A operação de divisão por zero não é permitida, e isso é um erro semântico. Portanto, esta alternativa é a correta, pois a gramática gera a sentença, mas a operação a / (b - b) resulta em uma divisão por zero, o que causará um erro semântico.

b. a gramática gera a sentença apresentada e o erro presente na expressão está fora do escopo das análises sintática e semântica.

Esta alternativa está errada, pois o erro é semântico, e não fora do escopo das análises.

c. o analisador léxico transmitirá uma mensagem de erro, pois a gramática não gera a sentença apresentada.

Esta alternativa está errada, porque o analisador léxico não terá problemas com a sentença, já que todos os tokens são válidos, e a gramática gera a sentença corretamente.

d. o analisador semântico transmitirá uma mensagem de erro, pois a gramática não gera a sentença apresentada.

Esta alternativa está errada, pois a gramática gera a sentença corretamente. O erro é semântico, não sintático.

e. a gramática gera a sentença apresentada, porém o analisador léxico transmitirá uma mensagem de erro.

Esta alternativa está errada, pois o analisador léxico não identificará erros, já que a sentença é lexicalmente válida.