Analisadores de precedência de operadores operam sobre a classe das gramáticas de operadores, ou seja, gramáticas que os não-terminais aparecem sempre separados por símbolos terminais e que as produções não derivam a palavra vazia. A análise de precedência de operadores é bastante eficiente e é aplicada, principalmente, no reconhecimento de expressões, como expressões aritméticas e lógicas. Considerando a tabela de precedência de operadores apresentada a seguir, apresente a sequência de movimentos para o reconhecimento da entrada a * b (c) d.
G = ({A, B, C, D}, {+, *, a, b, c, d, (, )}, P, A)
P = {A → A + B | B
B → B * C | C
C → (A) | D} D → a | b | c | d}| + | * | a..d | ( | ) | $ | |
|---|---|---|---|---|---|---|
| + | < | < | < | < | > | > |
| * | > | > | < | < | > | > |
| a..d | > | > | erro 2 | erro 2 | > | > |
| ( | < | < | < | < | = | erro 1 |
| ) | > | > | erro 2 | erro 2 | > | > |
| $ | < | < | < | < | erro 3 | aceita |
Erros na consulta a matriz:
erro 1 - empilha ) e emite a mensagem: falta de parêntese à direita.
erro 2 - insere + na entrada e emite a mensagem: operador esperado.
erro 3 - descarta ) da entrada e emite a mensagem: parêntese direito ilegal.
Erros na redução do handle:
erro 4 - se + ou * definem um handle, verificar se existem variáveis em ambos os lados do operador. Em caso negativo, executar a redução e emitir a mensagem: falta expressão.
erro 5 - se o par ( ) deve ser reduzido, verificar se existe uma variável entre os parênteses. Em caso negativo, executar a redução e emitir a mensagem: expressão nula entre parênteses.
| Pilha | Relação | Entrada | Ação | Handle |
|---|---|---|---|---|
| $ | < | a * b (c) d $ | empilha a | |
| $ a | > | * b (c) d $ | reduz | D → a |
| $ A | < | * b (c) d $ | empilha * | |
| $ A * | < | b (c) d $ | empilha b | |
| $ A * b | erro 2 | (c) d $ | insere + | |
| $ A * b | > | + (c) d $ | reduz | D → b |
| $ A * A | > | + (c) d $ | reduz | B → B * C |
| $ A | < | + (c) d $ | empilha + | |
| $ A + | < | (c) d $ | empilha ( | |
| $ A + ( | < | c) d $ | empilha c | |
| $ A + ( c | > | ) d $ | reduz | D → c |
| $ A + ( A | = | ) d $ | empilha ) | |
| $ A + ( A ) | erro 2 | d $ | insere + | |
| $ A + ( A ) | > | + d $ | reduz | C → (A) |
| $ A + A | < | + d $ | empilha + | |
| $ A + A + | < | d $ | empilha d | |
| $ A + A + d | > | $ | reduz | D → d |
| $ A + A + A | > | $ | reduz | A → A + B |
| $ A + A | > | $ | reduz | A → A + B |
| $ A | aceita | $ |