Ybadoo - Soluções em Software Livre
Tutoriais
Compiladores

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 = {AB OR A | B
BC XOR B | C
CD AND C | D
D → NOT E | E
E → ( A ) | F
F → a | b | c | d | e}

 

Tabela de precedência de operadores da gramática G
 ORXORANDNOT()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.

Movimentos do analisador de precedência de operadores para a NOT (b XOR OR d) e
PilhaRelaçãoEntradaAçãoHandle
$<a NOT (b XOR OR d) e $empilha a 
$ a>NOT (b XOR OR d) e $reduzF → 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 $reduzF → b
$ A NOT ( A<XOR OR d) e $empilha XOR 
$ A NOT ( A XORerro 4OR d) e $reduzBC XOR B
$ A NOT ( A<OR d) e $empilha OR 
$ A NOT ( A OR<d) e $empilha d 
$ A NOT ( A OR d>) e $reduzF → d
$ A NOT ( A OR A>) e $reduzAB OR A
$ A NOT ( A=) e $empilha ) 
$ A NOT ( A )erro 2e $insere OR 
$ A NOT ( A )>OR e $reduzE → ( A )
$ A NOT A>OR e $reduzD → NOT E
$ A A<OR e $empilha OR 
$ A A OR<e $empilha e 
$ A A OR e>$reduzF → e
$ A A OR A>$reduzAB OR A
$ A Aaceita$