Apresente a Análise de Precedência de Operadores, com tratamento de erros, da entrada x + (x ^ + x)) (x * x x sobre a gramática a seguir.
G = ({S, T, P, F}, {+, *, ^, (, ), x}, P, S)
P = {S → S+T | T
T → T*P | P
P → P^F | F
F → (S) | x}
+ | * | ^ | ( | ) | x | $ | |
---|---|---|---|---|---|---|---|
+ | > | < | < | < | > | < | > |
* | > | > | < | < | > | < | > |
^ | > | > | < | < | > | < | > |
( | < | < | < | < | = | < | erro 1 |
) | > | > | > | erro 2 | > | erro 2 | > |
x | > | > | > | 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 * 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 |
---|---|---|---|---|
$ | < | x + (x ^ + x)) (x * x x $ | empilha x | |
$ x | > | + (x ^ + x)) (x * x x $ | reduz | F → x |
$ S | < | + (x ^ + x)) (x * x x $ | empilha + | |
$ S + | < | (x ^ + x)) (x * x x $ | empilha ( | |
$ S + ( | < | x ^ + x)) (x * x x $ | empilha x | |
$ S + ( x | > | ^ + x)) (x * x x $ | reduz | F → x |
$ S + ( S | < | ^ + x)) (x * x x $ | empilha ^ | |
$ S + ( S ^ | erro 4 | + x)) (x * x x $ | reduz | P → P^F |
$ S + ( S | < | + x)) (x * x x $ | empilha + | |
$ S + ( S + | < | x)) (x * x x $ | empilha x | |
$ S + ( S + x | > | )) (x * x x $ | reduz | F → x |
$ S + ( S + S | > | )) (x * x x $ | reduz | S → S+T |
$ S + ( S | = | )) (x * x x $ | empilha ) | |
$ S + ( S ) | > | ) (x * x x $ | reduz | F → (S) |
$ S + S | > | ) (x * x x $ | reduz | S → S+T |
$ S | erro 3 | ) (x * x x $ | descarta ) | |
$ S | < | (x * x x $ | empilha ( | |
$ S ( | < | x * x x $ | empilha x | |
$ S ( x | > | * x x $ | reduz | F → x |
$ S ( S | < | * x x $ | empilha * | |
$ S ( S * | < | x x $ | empilha x | |
$ S ( S * x | erro 2 | x $ | insere + | |
$ S ( S * x | > | + x $ | reduz | F → x |
$ S ( S * S | > | + x $ | reduz | T → T*P |
$ S ( S | < | + x $ | empilha + | |
$ S ( S + | < | x $ | empilha x | |
$ S ( S + x | > | $ | reduz | F → x |
$ S ( S + S | > | $ | reduz | S → S+T |
$ S ( S | erro 1 | $ | empilha ) | |
$ S ( S ) | > | $ | reduz | F → (S) |
$ S S | aceita | $ |