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