|
|
Atenção para as partes que implementam os estados no autômato (em azul).
Uses Dos, crt;
Const
N = 50;
Primo = 51;
Letra = 'QWERTYUIOPASDFGHJKLZXCVBNM';
Numero = '1234567890';
Type
Apontador = ^Tipo_No;
Tipo_Chave = string[6];
Tipo_Item = record
chave: Tipo_Chave;
end;
Tipo_No = record
item: Tipo_Item;
prox: Apontador;
end;
Tipo_Lista = record
primeiro: Apontador;
ultimo: Apontador;
end;
Tipo_Tabela = array[0..(N-1)] of Tipo_Lista;
{Tipos de dados referente ao Analisador Lexico}
Alpha = record
simb: packed array [1..6] of char;
end;
Var
Tabela : Tipo_Tabela;
OPC,g : INTEGER;
ArqDados : file of Tipo_Item;
{ Variaveis do Analisador Lexico}
p1,p2 : Alpha;
p3 : Integer;
j,i : Integer;
E : array [1..80] of char;
linha: string[80];
ArqTexto : text;
nome_arquivo : string;
leusimbolo: integer;
aux2 : Tipo_Chave;
{************************************************************}
{** Funcao que retorna o valor do Indice na Tabela
Hashing **}
{************************************************************}
Function Transforma(x: Tipo_Item): Integer;
var
v,ind: integer;
sub: String[1];
begin
ind:= 0;
for v:= 1 to length(x.chave) do
begin
sub:= copy(x.chave,v,1);
ind:= ind + ord(SUB[1]);
end;
Transforma:= ind;
end;
{**********************************************************}
{*** Funcao que pesquisa uma elemento na Tabela
Hashing ***}
{**********************************************************}
Function Res(var Tabela: Tipo_Tabela; var palav:
Tipo_chave): boolean;
var
p: Apontador;
v: Integer;
x: Tipo_Item;
begin
x.chave:= palav;
{COLOCA TODAS AS LETRAS DA PALAVRA LIDA
EM MAIÚSCULAS}
FOR v:= 1 TO LENGTH(x.CHAVE) DO
x.CHAVE[v]:= UPCASE(x.CHAVE[v]);
v:= (TRANSFORMA(x) + 1) MOD PRIMO;
p := Tabela[v].primeiro;
while ( (p <> nil) and (p^.item.chave
<> x.chave) ) do
p := p^.prox;
if p^.item.chave = x.chave then
Res := true
else
Res := false;
end;
{******************************************************}
{*** Procedimento que insere um No na Tabela
Hashing **}
{******************************************************}
Procedure Inserir_No(var Tabela: Tipo_Tabela;
x: Tipo_Item ; v: Integer);
var
p: Apontador;
begin
New(p);
p^.item.chave := x.chave;
p^.prox := nil;
if Tabela[v].primeiro = nil then
Tabela[v].primeiro := p
else
(Tabela[v].ultimo)^.prox :=
p;
Tabela[v].ultimo := p;
end;
{*************************************************************}
{*** Procedimento que copia do arquivo para Tabela
Hashing ***}
{*************************************************************}
Procedure Transferir_Arquivo(var Tabela: Tipo_Tabela);
var
Dado : Tipo_Item;
v : Integer;
begin
Assign(ArqDados,'a:Dados.dat');
{Rewrite(ArqDados);}
Reset (ArqDados);
while not eof(ArqDados) do
begin
read(ArqDados,Dado);
v:= (TRANSFORMA(Dado) + 1)
MOD PRIMO;
Inserir_No(Tabela,Dado,v);
end;
end;
{******************************************************}
{******* Funcao que converte o valor Char para
********}
{*******
Inteiro (Binario)
********}
{******************************************************}
function Alphaint(c: char): integer;
var
bin,erro: integer;
begin
val(c,bin,erro);
alphaint:= bin;
end;
{*****************************************************}
{*** Funcao que verifica se o caracter e um Numero
***}
{*****************************************************}
function Num(c: char): boolean;
var
t: Integer;
begin
t:= 0;
t:= Pos(c,Numero);
if t > 0 then
Num:= True
else
Num:= False;
end;
{*****************************************************}
{*** Funcao que verifica se o caracter e uma
Letra ***}
{*****************************************************}
function Let(c: char): boolean;
var
t: Integer;
begin
t:= 0;
t:= Pos(upcase(c),Letra);
if t > 0 then
Let:= True
else
Let:= False;
end;
{*****************************************************}
{***
ACOES SEMANTICAS - a1 a
a9
***}
{*****************************************************}
Procedure a1;
begin
p2.simb:= '
';
j:= 1;
p2.simb[j]:= E[i];
end;
Procedure a2;
begin
j:= j+1;
if j <= 6 then
p2.simb[j]:= E[i];
end;
Procedure a3;
var
aux: Tipo_chave;
begin
aux:= p2.simb;
if res (Tabela,aux) then
p1:= p2
else
p1.simb:= 'IDEN ';
i:= i-1;
end;
Procedure a4;
begin
p3:= AlphaInt(E[i]);
end;
Procedure a5;
begin
p3:= p3 * 10 + AlphaInt(E[i]);
end;
Procedure a6;
begin
p1.simb:= 'NUMB ';
i:= i-1;
end;
Procedure a7;
var
aux: Tipo_Chave;
begin
p2.simb[2]:= E[i];
aux:= p2.simb;
if not res(Tabela,aux) then
begin
p2.simb[2]:= ' ';
i:= i-1;
end;
p1:= p2;
leusimbolo:= 1;
end;
Procedure a8;
begin
p1:= p2;
i:= i-1;
leusimbolo :=1;
end;
Procedure a9;
begin
p1.simb:= '$ ';
p2.simb:= '$ ';
end;
{****************************************************}
{*********** Procedimento Analisador Lexico *********}
{****************************************************}
Procedure Analex;
label 0,1,2,3,4,5,6,7,8,9;
begin
p1.simb:= #0#0#0#0#0#0;
p2:= p1;
p3:= 0;
leusimbolo:= 0;
0: i:= i+1;
if E[i] = ' ' then goto
0;
if Let(E[i]) then begin
a1; goto 1; end;
if Num(E[i]) then begin
a4; goto 2; end;
if {(not Let(E[i]))
and (not Num(E[i])) and} (E[i] <> '/')
and
(E[i]<>#0) then
begin a1; goto 3; end;
if E[i] = '/' then begin a1; goto 4; end;
goto 9;
1: i:= i+1;
if (Let(E[i])) or (Num(E[i]))
then begin a2; goto 1; end
else begin a3; goto
7; end;
2: i:= i+1;
if Num(E[i]) then begin
a5; goto 2; end
else begin a6; goto
7 end;
3: i:= i+1;
if (Let(e[i]))or(Num(E[i]))or(E[i]='
')then begin a8; goto 7; end
else begin a7; goto
7; end;
4: i:= i+1;
if E[i]<>'*'then
begin a8; goto 7; end
else goto 5;
5: i:=i+1;
if e[i]='*' then begin
goto 6; end
else goto 5;
6: i:=i+1;
if e[i]='*' then begin
goto 6; end;
if e[i]='/' then begin
goto 0; end
else goto 5;
7: if leusimbolo = 1 then
begin
aux2:= p1.simb;
if res(tabela,aux2)
= false then
p2.simb:= 'ERRO ';
leusimbolo:=
0;
end;
clrscr;
gotoxy(5,6);
write('Linha Que est
sendo Analisada: ',linha);
gotoxy(5,8);
write('p1 = ',p1.simb);
gotoxy(5,10);
write('p2 = ',p2.simb);
gotoxy(5,12);
write('p3 = ',p3);
readkey;
goto 9;
8: writeln ('ERRO'); readkey; goto 9;
9:
end;
{******************************************************}
{***************** Programa Principal *****************}
{******************************************************}
begin
TRANSFERIR_ARQUIVO(Tabela);
REPEAT
BEGIN
{MENU PRINCIPAL}
WINDOW(1, 1, 80,
24);
CLRSCR;
textcolor(9);
Gotoxy(01,02);
Write('FAESA -
Faculdades Associadas do Esp¡rito Santo');
gotoxy(01,03);
Write('FACIN -
Faculdade Capixaba de Inform tica');
Gotoxy(01,04);
Write('Trabalho
de Compiladores');
Gotoxy(01,05);
Write('Professor:
Silvana Rossy de Brito');
Gotoxy(01,06);
Write('Alunos:
Rodrigo Aguiar Nascimento');
Gotoxy(01,07);
Write('
Vivaldo Jos‚ Thomazini');
Gotoxy(01,08);
Write('Turma:
6§ B');
Gotoxy(30,10);
textcolor(10);
Write('Analisador
L‚xico');
Gotoxy(30,11);
Write('=================');
window(1,12,80,24);
textcolor(12);
Writeln;
Writeln('');
Writeln('1 - Ler
o Arquivo Fonte');
writeln('0 - Sair');
Writeln('');
WRITE('OPۂO:
');
READLN(OPC);
textcolor(15);
if opc = 1 then
begin
Gotoxy(15,11);
Write('Digite
o nome do arquivo: ');
readln(nome_arquivo);
{$I-}
Assign(ArqTexto,nome_arquivo);
Reset(ArqTexto);
{$I+}
while not eof(ArqTexto)
do
begin
read(ArqTexto,linha);
for
g:= 1 to length(linha) do
e[g]:= linha[g];
I:=
0;
while
(I < length(linha)) do
begin
Analex;
end;
readln(ArqTexto);
for
g:= 1 to length(linha) do e[g]:= #0;
end;
end;
END;
UNTIL OPC = 0;
CLOSE(ARQDADOS);
close(ArqTexto);
end.