Apresente a Análise de Precedência de Operadores, com tratamento de erros, da entrada a NOT (b XOR OR d) e sobre a gramática a seguir.
G = ({A, B, C, D, E, F}, {OR, XOR, AND, NOT, (, ), a, b, c, d, e}, P, A)
P = {A → B OR A | B
B → C XOR B | C
C → D AND C | D
D → NOT E | E
E → ( A ) | F
F → a | b | c | d | e}| OR | XOR | AND | NOT | ( | ) | a..e | $ | |
|---|---|---|---|---|---|---|---|---|
| OR | > | < | < | < | < | > | < | > |
| XOR | > | > | < | < | < | > | < | > |
| AND | > | > | > | < | < | > | < | > |
| NOT | > | > | > | > | < | > | < | > |
| ( | < | < | < | < | < | = | < | erro 1 |
| ) | > | > | > | > | erro 2 | > | erro 2 | > |
| a..e | > | > | > | > | 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 OR 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 OR, XOR ou AND 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 NOT define um handle, verificar se existe uma variável no lado direito do operador. Em caso negativo, executar a redução e emitir a mensagem: falta expressão.
erro 6 - 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 NOT (b XOR OR d) e $ | empilha a | |
| $ a | > | NOT (b XOR OR d) e $ | reduz | F → a |
| $ A | < | NOT (b XOR OR d) e $ | empilha NOT | |
| $ A NOT | < | (b XOR OR d) e $ | empilha ( | |
| $ A NOT ( | < | b XOR OR d) e $ | empilha b | |
| $ A NOT ( b | > | XOR OR d) e $ | reduz | F → b |
| $ A NOT ( A | < | XOR OR d) e $ | empilha XOR | |
| $ A NOT ( A XOR | erro 4 | OR d) e $ | reduz | B → C XOR B |
| $ A NOT ( A | < | OR d) e $ | empilha OR | |
| $ A NOT ( A OR | < | d) e $ | empilha d | |
| $ A NOT ( A OR d | > | ) e $ | reduz | F → d |
| $ A NOT ( A OR A | > | ) e $ | reduz | A → B OR A |
| $ A NOT ( A | = | ) e $ | empilha ) | |
| $ A NOT ( A ) | erro 2 | e $ | insere OR | |
| $ A NOT ( A ) | > | OR e $ | reduz | E → ( A ) |
| $ A NOT A | > | OR e $ | reduz | D → NOT E |
| $ A A | < | OR e $ | empilha OR | |
| $ A A OR | < | e $ | empilha e | |
| $ A A OR e | > | $ | reduz | F → e |
| $ A A OR A | > | $ | reduz | A → B OR A |
| $ A A | aceita | $ |