Ybadoo - Soluções em Software Livre
Tutoriais
Compiladores

Apresente a Análise de Precedência de Operadores, com tratamento de erros, da entrada (a; (a; a) a; (a) sobre a gramática a seguir.

G = ({S, L}, {a, ;, (, )}, P, S)
P = {S → (L) | a
LL;S | S}

 

Tabela de precedência de operadores da gramática G
 a;()$
aerro 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 ; define 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 (a; (a; a) a; (a)
PilhaRelaçãoEntradaAçãoHandle
$<(a; (a; a) a; (a) $empilha ( 
$ (<a; (a; a) a; (a) $empilha a 
$ (a>; (a; a) a; (a) $reduzS → a
$ ( S<; (a; a) a; (a) $empilha ; 
$ ( S ;<(a; a) a; (a) $empilha ( 
$ ( S ; (<a; a) a; (a) $empilha a 
$ ( S ; ( a>; a) a; (a) $reduzS → a
$ ( S ; ( S<; a) a; (a) $empilha ; 
$ ( S ; ( S ;<a) a; (a) $empilha a 
$ ( S ; ( S ; a>) a; (a) $reduzS → a
$ ( S ; ( S ; S>) a; (a) $reduzLL;S
$ ( S ; ( S=) a; (a) $empilha ) 
$ ( S ; ( S )erro 2a; (a) $inserir ; 
$ ( S ; ( S )>; a; (a) $reduzS → (L)
$ ( S ; S>; a; (a) $reduzLL;S
$ ( S<; a; (a) $empilha ; 
$ ( S ;<a; (a) $empilha a 
$ ( S ; a>; (a) $reduzS → a
$ ( S ; S>; (a) $reduzLL;S
$ ( S<; (a) $empilha ; 
$ ( S ;<(a) $empilha ( 
$ ( S ; (<a) $empilha a 
$ ( S ; ( a>) $reduzS → a
$ ( S ; ( S=) $empilha ) 
$ ( S ; ( S )>$reduzS → (L)
$ ( S ; S>$reduzLL;S
$ ( Serro 1$empilha ) 
$ ( S )>$reduzS → (L)
$ Saceita$