Analise a seguinte gramática LR(1): 1. S -> E 2. E -> E + T 3. E -> T 4. T -> T * F 5. T -> F 6. F -> ( E ) 7. F -> id Considere a entrada id + id * id. Qual é a ação que o analisador LR(1) deve tomar quando chegar ao ponto onde id * id foi reconhecido?
Questão
Analise a seguinte gramática LR(1):
- S -> E
- E -> E + T
- E -> T
- T -> T * F
- T -> F
- F -> ( E )
- F -> id
Considere a entrada id + id * id. Qual é a ação que o analisador LR(1) deve tomar quando chegar ao ponto onde id * id foi reconhecido?
Alternativas
a) Reduzir a produção T -> F.
b) Reduzir a produção F -> id.
c) Deslocar o operador *.
d) Entrar em um estado de erro.
e) Reduzir a produção E -> T.
Explicação
Para a gramática dada (expressões aritméticas clássicas), a precedência é codificada pela própria hierarquia de não-terminais:
- trata de soma:
- trata de multiplicação:
- trata de parênteses/identificador:
Na entrada id + id * id, quando o analisador já leu id + id e está exatamente no ponto em que reconheceu o trecho id (o primeiro id do segmento id * id) e o próximo símbolo de entrada é *, a decisão correta do LR(1) é:
- O id reconhecido pode ser reduzido para (via ), e então para (via ).
- Mas, ao ver o lookahead *, o analisador não deve “fechar” a expressão como (ou forçar uma redução que impeça a multiplicação), porque a multiplicação tem maior precedência e deve ser associada dentro de .
Em termos de comportamento LR(1): com lookahead * após reconhecer um fator/termo inicial, a ação necessária é deslocar (shift) o operador * para permitir aplicar depois a produção e reconhecer id * id como um antes de combinar com o + no nível de .
Portanto, a ação correta nesse ponto é deslocar o operador *.
Alternativa correta: (c).