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 | $ |