Escolar Documentos
Profissional Documentos
Cultura Documentos
Proj1 098 1 Semestre 2001
Proj1 098 1 Semestre 2001
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
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
E = 1; T = 0; VAR = [];
[C_lido,T] = le_car2([]);
while (1)
if strcmp(C_lido,'ù')
S = ['SB ' C_lido];
break
end
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
end
4
Rotinas auxiliares do analisador léxico
else
Transicoes = 5; % Outros Simbolos T(5)
end
j = 0;
5
Teste do Analisador léxico
% MAIN PROGRAM
IN = fopen('c:\fonte.txt','r');
OUT = fopen('c:\token.txt','w');
Arquivo = le_arq2( IN );
Posicao = 1; i = 1;
while (S ~= 'ù' )
i = i + 1;
i, S = flex2([]),pause % exibe o token formado e o numero da linha
end
fclose( 'all' );