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) sobre a gramática a seguir.

G = ({A, B, C}, {x, +, ., (, )}, P, A)
P = {A → (B) | x
BB+C | C
CC.A | A}

 

Tabela de precedência de operadores da gramática G
 x+.()$
xerro 2>>erro 2>>
+<><<>>
.<>><>>
(<<<<=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 + 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 . 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)
PilhaRelaçãoEntradaAçãoHandle
$<(x (x + x) . (x) $empilha ( 
$ (<x (x + x) . (x) $empilha x 
$ ( xerro 2(x + x) . (x) $insere + 
$ ( x>+ (x + x) . (x) $reduzA → x
$ ( A<+ (x + x) . (x) $empilha + 
$ ( A +<(x + x) . (x) $empilha ( 
$ ( A + (<x + x) . (x) $empilha x 
$ ( A + ( x>+ x) . (x) $reduzA → x
$ ( A + ( A<+ x) . (x) $empilha + 
$ ( A + ( A +<x) . (x) $empilha x 
$ ( A + ( A + x>) . (x) $reduzA → x
$ ( A + ( A + A>) . (x) $reduzBB+C
$ ( A + ( A=) . (x) $empilha ) 
$ ( A + ( A )>. (x) $reduzA → (B)
$ ( A + A<. (x) $empilha . 
$ ( A + A .<(x) $empilha ( 
$ ( A + A . (<x) $empilha x 
$ ( A + A . ( x>) $reduzA → x
$ ( A + A . ( A=) $empilha ) 
$ ( A + A . ( A )>$reduzA → (B)
$ ( A + A . A>$reduzCC.A
$ ( A + A>$reduzBB+C
$ ( Aerro 1$empilha ) 
$ ( A )>$reduzA → (B)
$ Aaceita$