AULA Nº 4.2

(Download da Aula)

<< anterior próxima >>
menu de aulas dúvidas
 
Exemplo de um programa para o Analisador Léxico
Colaboração de Rodrigo Aguiar Nascimento
                    e   Vivaldo José Thomazini
 

Atenção para as partes que implementam os estados no autômato (em azul).



Program Analisador_Lexico;

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.