Ybadoo - Soluções em Software Livre
Tutoriais
Compiladores

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 = {EEvT | T
TT&F | F
F → (E) | id}

 

Tabela de precedência de operadores da gramática G
 idv&()$
iderro 2>>erro 2>>
v<><<>>
&<>><>>
(<<<<=erro 1
)erro 2>>erro 2>>
$<<<<erro 3aceita

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.

Movimentos do analisador de precedência de operadores para id & (v id))
PilhaRelaçãoEntradaAçãoHandle
$<id & (v id)) $empilha id 
$ id>& (v id)) $reduzF → id
$ E<& (v id)) $empilha & 
$ E &<(v id)) $empilha ( 
$ E & (<v id)) $empilha v 
$ E & ( v<id)) $empilha id 
$ E & ( v id>)) $reduzF → id
$ E & ( v Eerro 4)) $reduzEEvT
$ E & ( E=)) $empilha ) 
$ E & ( E )>) $reduzF → (E)
$ E & E>) $reduzTT&F
$ Eerro 3) $descarta ) 
$ Eaceita$