Ybadoo - Soluções em Software Livre
Tutoriais
Compiladores

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 = {SS+T | T
TT*P | P
PP^F | F
F → (S) | x}

 

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

Movimentos do analisador de precedência de operadores para x + (x ^ + x)) (x * x x
PilhaRelaçãoEntradaAçãoHandle
$<x + (x ^ + x)) (x * x x $empilha x 
$ x>+ (x ^ + x)) (x * x x $reduzF → 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 $reduzF → x
$ S + ( S<^ + x)) (x * x x $empilha ^ 
$ S + ( S ^erro 4+ x)) (x * x x $reduzPP^F
$ S + ( S<+ x)) (x * x x $empilha + 
$ S + ( S +<x)) (x * x x $empilha x 
$ S + ( S + x>)) (x * x x $reduzF → x
$ S + ( S + S>)) (x * x x $reduzSS+T
$ S + ( S=)) (x * x x $empilha ) 
$ S + ( S )>) (x * x x $reduzF → (S)
$ S + S>) (x * x x $reduzSS+T
$ Serro 3) (x * x x $descarta ) 
$ S<(x * x x $empilha ( 
$ S (<x * x x $empilha x 
$ S ( x>* x x $reduzF → x
$ S ( S<* x x $empilha * 
$ S ( S *<x x $empilha x 
$ S ( S * xerro 2x $insere + 
$ S ( S * x>+ x $reduzF → x
$ S ( S * S>+ x $reduzTT*P
$ S ( S<+ x $empilha + 
$ S ( S +<x $empilha x 
$ S ( S + x>$reduzF → x
$ S ( S + S>$reduzSS+T
$ S ( Serro 1$empilha ) 
$ S ( S )>$reduzF → (S)
$ S Saceita$