Você está na página 1de 3

3º Projeto Analisador SINTÁTICO do compilador (diferente para cada grupo)

FONTE Léxico Sintático Semântico OBJ

Projeto do Analisador sintático

Obtenha uma gramática para a sua linguagem fonte e realize o analasidar sintático via mapeamento (método J.J.Neto) ou
empiricamente (método de tentativas).

Para o projeto do analisador sintático devemos determinar os não terminais, cujas máquinas de estados governarão o processo de
reconhecimento. O analisador sintático tem a função de verificar se a seqüência do texto fonte obedece à gramática da linguagem.
Desta forma, a saída deste módulo é apenas a aceitação ou não arquivo de entrada. Veremos no projeto #4 que, enquanto os testes
prosseguem, o texto objeto é gerado pela rotinas semânticas asssociadas a cada transição do autômato.

Para ilustrar a codificação de um analisador sintático, considere um caso hipotético

1
Código do analisador sintático:

% FSIN2.M

global OUT
global Posicao
global Arquivo
global PILHA % PILHA para look_ahead
global Carac
global PROC % arquivo da procedure atual
global ctr , ctr = 1; % contador das acoes semanticas
global pilha , pilha = []; % para numeracao de estados
global tabela , tabela = []; % tabela simbolos

look_ahead = [];
Topo_Pilha = 'ÿ';
PILHA = [ Topo_Pilha ];

IN = fopen('c:\entra.txt','r');
OUT = fopen('c:\sai.txt','w');

Arquivo = le_arq2( IN );
Posicao = 1;

RET = Gramatica( look_ahead ) ;

if RET ~= 0 & strcmp(PILHA(1,1),'ÿ' )

clc,home
disp(' ')
disp('####################### S U C E S S O ########################')

else

disp(' ')
disp('###################### ERRO SINTÁTICO #######################')

end

fclose( 'all' );

2
function ret = Gramatica( look_ahead )

global PILHA , PILHA = strvcat( look_ahead , PILHA );


global Carac
global Arquivo
global Posicao
E=1;

while (1)

if strcmp(PILHA(1,1), 'ÿ' )
Carac = flex2([]);
else
Carac = deblank(PILHA(1,:));
end

VALOR = Carac(6:length(Carac));
CLASSE = Carac(1);

if E==1 & strcmp( CLASSE, 'I'), PILHA=['ÿ']; E=2;


elseif E==2 & strcmp( VALOR, '>'), PILHA=['ÿ']; E=3;
elseif E==3 & ( strcmp( CLASSE, 'I')|strcmp( CLASSE, 'T')|strcmp( VALOR, 'E') ), PILHA=['ÿ'];E=4;
elseif E==4 & ( strcmp( CLASSE, 'I')|strcmp( CLASSE, 'T')|strcmp( VALOR, 'E') ), PILHA=['ÿ'];E=4;
elseif E==4 & strcmp( VALOR, '.'), PILHA=['ÿ']; E=5;
elseif E==5 & strcmp( VALOR, '('), PILHA=['ÿ']; E=6;
elseif E==5 & strcmp( CLASSE, 'I'), PILHA=['ÿ']; E=2;
elseif E==5 & strcmp( VALOR, 'ù'), PILHA=['ÿ']; E=9;
elseif E==6 & strcmp( CLASSE, 'I'), PILHA=['ÿ']; E=7;
elseif E==7 & strcmp( VALOR, ')'), PILHA=['ÿ']; E=8;
elseif E==8 & strcmp( CLASSE, 'I'), PILHA=['ÿ']; E=2;
elseif E==8 & strcmp( VALOR, 'ù'), PILHA=['ÿ']; E=9;
else
clc,home
disp(Arquivo(1:Posicao))
disp(' ')
disp('################################################################')
disp(' ')

switch E

case 1
disp('Esperava por um IDENTIFICADOR')
case 2
disp('Esperava por um ">"')
case 3
disp('Esperava por um IDENTIFICADOR ou TERMINAL ou VAZIO (E)')
case 4
disp('Esperava por um "."')
case 5
disp('Esperava por um IDENTIFICADOR ou um "("')
case 6
disp('Esperava por um IDENTIFICADOR')
case 7
disp('Esperava por um ")"')
case 8
disp('Esperava por um IDENTIFICADOR')
end

E=0;
end

if (E==0 | E==9 )
break
end

end

ret = E;

Você também pode gostar