Alternativa C - Deslocar o operador *
Análise da Questão
Esta questão envolve análise sintática LR(1), um método de parsing bottom-up utilizado em compiladores para verificar se uma entrada pertence à linguagem definida por uma gramática.
Compreendendo a Gramática
A gramática apresentada define expressões aritméticas com precedência de operadores:
| Regra | Produção | Significado |
|---|
| 1 | S → E | Expressão principal |
| 2 | E → E + T | Adição (menor precedência) |
| 3 | E → T | Expressão básica |
| 4 | T → T * F | Multiplicação (maior precedência) |
| 5 | T → F | Termo básico |
| 6 | F → ( E ) | Parênteses |
| 7 | F → id | Identificador |
Traçando a Análise LR(1)
Para a entrada **id + id * id**, acompanhamos o processo:
Estado inicial: pilha = [0], entrada = id + id * id $
Passo a passo:
- Shift 'id' → reduz para F → reduz para T → reduz para E
- Shift '+' → adiciona ao estado
- Shift 'id' → reduz para F → reduz para T → reduz para E
No momento crítico: após reconhecer "id + id" e antes do "*"
| Elemento na Pilha | Próximo Símbolo | Ação Correta |
|---|
| E (do primeiro id) | + | Manter |
| E + T (segundo id) | * | SHIFT |
Por que Deslocar (*)?
Conflito de Precedência: O analisador LR deve decidir entre:
- REDUZIR (aplicar regra E → E + T)
- SHIFT (deslocar o próximo símbolo)
Como '*' tem maior precedência que '+', a ação correta é deslocar para garantir que a multiplicação seja avaliada antes da adição.
Árvore de Derivação Esperada
E
/|\
E + T
/|\
T * F
| |
F id
|
id
Conclusão
Quando o analisador chega ao ponto onde "id id" foi reconhecido (contexto: id + [id id]), ele deve:
- Deslocar o operador * (alternativa C)
Isso garante a precedência correta dos operadores, permitindo que a multiplicação seja resolvida antes da adição.
Alternativa C.