Você está na página 1de 6

1º Projeto Analisador LÉXICO geral (1º semestre 2001)

FONTE Léxico Sintático Semântico OBJ

Projeto do Analisador léxico


Para facilitar a documentação, vamos permitir que a linguagem de entrada admita comentários que iniciam em qualquer posição
da linha com "//" e se estendem até o final da linha. O reconhecedor também se incumbe de eliminar comentários, brancos e
mudanças de linha para a fase sintática.

Os terminais da linguagem serão quaisquer caracteres de comprimento unitário (SBL). Dependendo de cada projeto, poderão ser
criados terminais de comprimento maior, a exemplo de Identificadores (IDE), Simbolos Compostos (XSB), Numeros (NUM), etc.

O autômato de cada projeto deve ser realizado na forma de um diagrama de estados, tal como no projeto #0. A cada transição
deve haver um conjunto de ações capazes de compor os terminais da linguagem ou descartar caracteres quando for o caso de
caracteres brancos e/ou comentários. O léxico deve ser uma função ("procedure") que será chamada pelo analisador sintático
(projeto #2) cada vez que este precisar de um átomo ("token"). O diagrama abaixo é um exemplo de um Léxico cujos tokens são:
SBL, IDE e NUM.

não é fim de
4 barra 5 linha( NL )
7

outros ( SBL )

( SBL ) barra ( )

brancos

( NUM ) ( IDE ) ( IDE )


letra
número

Número/
6 número 2 3 letra
Número/
letra

1
EXEMPLO

NUM 1234567
// fonte com texto qualquer
NUM 123
NUM 4567
IDE E1
1234567 123 4567 SBL ;
IDE E1234567890
E1 ; SBL #
SBL @
E1234567890# // COMENTARIO
SBL #
@#$%^& *()+ SBL $
SBL %
SBL ^
SBL &
SBL *
SBL (
SBL )
SBL +

Léxico

2
A título de ilustração, fornecemos abaixo um "código" de um Léxico hipotético:

A .. Z A .. Z
4 2 0 .. 9

outros

brancos
* 7 1

/

* todos
/

todos 6 * 5 3
todos

function S = flex2 ( void )

global OUT Posicao Arquivo

E = 1; T = 0; VAR = [];
[C_lido,T] = le_car2([]);

while (1)

if strcmp(C_lido,'ù')
S = ['SB ' C_lido];
break
end

if ( E==1 & T==4 ),


Posicao = Posicao + 1;
[C_lido,T] = le_car2([]);
E=1;
elseif ( E==1 & T==2 ),
VAR = [ C_lido ];
Posicao = Posicao + 1;
[C_lido,T] = le_car2([]);
E=2;
elseif ( E==1 & T==3 ),
VAR = [ C_lido ];
Posicao = Posicao + 1;
[C_lido,T] = le_car2([]);
E=3;
elseif ( E==1 & ~(T==2|T==3|T==4|T ==6) ),
VAR = [ C_lido ];
Posicao = Posicao + 1;
[C_lido,T] = le_car2([]);
E=4;

elseif ( E==2 & (T==1|T==2) ),


VAR = [ VAR C_lido ];
Posicao = Posicao + 1;
[C_lido,T] = le_car2([]);
E=2;

3
elseif ( E==2 & ~(T==1|T==2) ),
S = ['ID ' VAR];
VAR = ['ID ' VAR];
escreve2( VAR ); % SÓ LOOK_AHEAD
break
E=1;
elseif ( E==3 & ~(T==3) ),
VAR = [ VAR C_lido ];
Posicao = Posicao + 1;
[C_lido,T] = le_car2([]);
E=3;
elseif ( E==3 & T==3 ),
S = ['TE ' VAR C_lido ];
VAR = ['TE ' VAR C_lido ];
escreve2( VAR );
Posicao = Posicao + 1;
[C_lido,T] = le_car2([]);
break
E=1;
elseif ( E==4 ),
S = ['SB ' VAR ];
VAR = ['SB ' VAR ];
escreve2( VAR ); % SÓ LOOK_AHEAD
break
E=1;
% subrede para comentarios

elseif ( E==1 & T==6 ),


VAR = [ C_lido ];
Posicao = Posicao + 1;
[C_lido,T] = le_car2([]);
E=5;
elseif ( E==5 & ~(T==7) ),
S = ['SB ' '/' ];
VAR = ['SB ' '/' ];
escreve2( VAR ); % SÓ LOOK_AHEAD
break
E=1;
elseif ( E==5 & T==7 ),
Posicao = Posicao + 1;
[C_lido,T] = le_car2([]);
E=6;
elseif ( E==6 & ~(T==7) ),
Posicao = Posicao + 1;
[C_lido,T] = le_car2([]);
E=6;
elseif ( E==6 & T==7 ),
Posicao = Posicao + 1;
[C_lido,T] = le_car2([]);
E=7;
elseif ( E==7 & T==7 ),
Posicao = Posicao + 1;
[C_lido,T] = le_car2([]);
E=7;
elseif ( E==7 & ~(T==7|T==6) ),
Posicao = Posicao + 1;
[C_lido,T] = le_car2([]);
E=6;
elseif ( E==7 & T==6 ),
Posicao = Posicao + 1;
[C_lido,T] = le_car2([]);
E=1;
end

end

4
Rotinas auxiliares do analisador léxico

function Info = escreve2( String_Escrever )

global OUT Posicao Arquivo


fprintf( OUT,'%s\n', String_Escrever );

function [Caracter, Transicoes] = le_car2( void )

global OUT Posicao Arquivo


Caracter = Arquivo(Posicao);

if ( Caracter >= '0' ) & ( Caracter <= '9' )


Transicoes = 1; % Numero T(1)

elseif ( (Caracter >= 'A') & (Caracter <= 'Z') | ...


(Caracter >= 'a') & (Caracter <= 'z') )
Transicoes = 2; % Letra T(2)

elseif ( Caracter == '"' )


Transicoes = 3; % Aspas T(3)

elseif ( abs(Caracter) == 13 | ... % Newline T(4)


abs(Caracter) == 10 | ... % Return
abs(Caracter) == 32 | ... % Branco
abs(Caracter) == 9 ) % Tab
Transicoes = 4;

elseif ( Caracter == '/' )


Transicoes = 6; % Barra T(6)

elseif ( Caracter == '*' )


Transicoes = 7; % Estrela T(7)

else
Transicoes = 5; % Outros Simbolos T(5)

end

function Arquivo = le_arq2( FID )

j = 0;

while feof(FID) ~= 1, % enquanto nao e finalde arquivo


S = fgets(FID); % o tamanho se S é da linha
for i = 1:max(size(S));
j = j + 1;
Arquivo(j) = S(i);
end
end

Arquivo(j+1) = ' '; % espaço


Arquivo(j+2) = 'ù'; % marca final de arquivo <ALT>+151

5
Teste do Analisador léxico

% MAIN PROGRAM 

global OUT Posicao Arquivo

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

Arquivo = le_arq2( IN );
Posicao = 1; i = 1;

i, S = flex2([]),pause % flex2([]) é a chamada da função LÉXICO

while (S ~= 'ù' )

i = i + 1;
i, S = flex2([]),pause % exibe o token formado e o numero da linha

end

fclose( 'all' );

O analisador LÉXICO ( função flex ) e a estrutura do compilador

Você também pode gostar

  • O Efeito de País de Comercialização Enanpad 2013 VF
    O Efeito de País de Comercialização Enanpad 2013 VF
    Documento16 páginas
    O Efeito de País de Comercialização Enanpad 2013 VF
    Caio Henrique Noronha Junior
    Ainda não há avaliações
  • Proj2 098
    Proj2 098
    Documento6 páginas
    Proj2 098
    Caio Henrique Noronha Junior
    Ainda não há avaliações
  • Proj1 098
    Proj1 098
    Documento7 páginas
    Proj1 098
    Caio Henrique Noronha Junior
    Ainda não há avaliações
  • Proj3 098
    Proj3 098
    Documento5 páginas
    Proj3 098
    Caio Henrique Noronha Junior
    Ainda não há avaliações
  • Proj3 098 2 Semestre 2002
    Proj3 098 2 Semestre 2002
    Documento3 páginas
    Proj3 098 2 Semestre 2002
    Caio Henrique Noronha Junior
    Ainda não há avaliações
  • Aula 07
    Aula 07
    Documento16 páginas
    Aula 07
    Caio Henrique Noronha Junior
    Ainda não há avaliações
  • Aula 06
    Aula 06
    Documento8 páginas
    Aula 06
    Caio Henrique Noronha Junior
    Ainda não há avaliações
  • Aula 04
    Aula 04
    Documento7 páginas
    Aula 04
    Caio Henrique Noronha Junior
    Ainda não há avaliações
  • Aula 05
    Aula 05
    Documento8 páginas
    Aula 05
    Caio Henrique Noronha Junior
    Ainda não há avaliações
  • Aula 08
    Aula 08
    Documento12 páginas
    Aula 08
    Caio Henrique Noronha Junior
    Ainda não há avaliações
  • Aula 03
    Aula 03
    Documento11 páginas
    Aula 03
    Caio Henrique Noronha Junior
    Ainda não há avaliações
  • Planilha AHP
    Planilha AHP
    Documento12 páginas
    Planilha AHP
    Caio Henrique Noronha Junior
    Ainda não há avaliações
  • Aula 01
    Aula 01
    Documento11 páginas
    Aula 01
    Caio Henrique Noronha Junior
    Ainda não há avaliações
  • Aula 02
    Aula 02
    Documento8 páginas
    Aula 02
    Caio Henrique Noronha Junior
    Ainda não há avaliações