Analizador lexico o analizador lexicografico c++

Que es analizador lexico:

Es la primera fase antes de la compilación, la cual identifica los token palabras u otros clasificándolas para luego pasarlos al analizador sintáctico.

Bueno cierto dia empeze a leer algo sobre compiladores aunque esa vez no tenia la menor idea donde podria aplicar esto ahora bien ya se donde hacer esto y para que nos puede servir.

El siguiente programa esta escrito en c++, el IDE que use es codeblocks ya que este incluye el compilador de mingw c++, aunque se puede hacer con el visualc++, bueno esto lee un archivo de tipo pascal para luego pasarlo al analizador para que identifique delimitarores, palabras reservadas o tokes, operadores matematicas, y otros, esto pasa una vez que se alla abierto el archivo pascal.

Bueno los probe en borlan c++, g++ y visualc++ y funciono pero como para fines de entretenimiento use g++ ya que es gratuito.

archivo cpp:

/*
Autor: mynor rene choc cac.

*/

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#define NULL 0

using namespace std;

FILE *fp;
char Entrada;
char *Reservada[9]={«DO»,»BEGIN»,»ELSE»,»END»,»IF»,»THEN»,»VAR»,»WHILE»,»REAL»};
char *Delimitador[6]={«,»,»;»,»:=»,».»,»(«,»)»};
char *Matematica[4]={«+»,»-«,»*»,»/»};
char *Asignacion[7]={«<«,»<=»,»=»,»>»,»>=»,»<>»,»!»};
int contaRese=0;
int contaDeli=0;
int contaMat=0;
int contaAsig=0;
int contaVari=0;
int contacost=0;

int Lexico(char Analizar[],int Decision);
char Principal(char Limite);
char Digito(char Limite);
char Otro(char Limite);

int main()
{
if ((fp=fopen(«choccac.pas»,»r»))==NULL)
cout  << «nCrear el Archivo *.pasn»;
else
{
Entrada = fgetc(fp);
while (Entrada!=EOF)
{
if (issalpha(Entrada))
Entrada=Principal(Entrada);
else if (isdigsit(Entrada))
Entrada=Digito(Entrada);
else Entrada=Otro(Entrada);
}
cout << «nSe llego en fin del archivo pas.n»;
}
system(«PAUSE»);
return 0;
}

int Lexico(char Analizar[],int Decision)
{
int i=0;

switch (Decision)
{
case 1:
for (i=0;i<=9;i++)
{
if (strcmp(Reservada[i],Analizar)==0)
return(i+1);
}
case 2:
{
for (i=0;i<=5;i++)
{
if (strcmp(Delimitador[i],Analizar)==0)
return(i+1);
}
return(0);
}
case 3:
{
for (i=0;i<=3;i++)
{
if (strcmp(Matematica[i],Analizar)==0)
{
return(i+1);
}
}
return(0);
}
case 4:
{
for (i=0;i<=6;i++)
{
if (strcmp(Asignacion[i],Analizar)==0)
{
return(i+1);
}
}
return(0);
}
}
}

char Principal(char Limite)
{
int Proto;
int i=-1;
char IniComp[20];

while((isalpha(Limite))||(isdigit(Limite)))
{
IniComp[++i]=Limite;
Limite=fgetc(fp);
}

IniComp[i+1]=»;
if (Proto=Lexico(IniComp,1))
{
cout << IniComp << » (1,» << (Proto-1) << «)n»;
contaRese++;
cout << «ttPalabras Reservadas: » << contaRese << «nn»;
} else
{
Proto=Lexico(IniComp,6);
cout << IniComp << » (6,» << (Proto-1) << «)n»;
contaVari++;
cout << «ttVariables: » << contaVari << «nn»;
}
return(Limite);
}

char Digito(char Limite)
{
int i=-1;
char DigiTipo[20];
int TipDat;

while((isdigit(Limite)))
{
DigiTipo[++i]=Limite;
Limite=fgetc(fp);
}

DigiTipo[i+1]=»;
TipDat=Lexico(DigiTipo,5);
cout << DigiTipo << » (5,» << (TipDat-1) << «)n»;
contacost++;
cout << «ttConstantes numericos: » << contacost << «nn»;
return(Limite);
}

char Otro(char Limite)
{
char OtrTipo[20];
int AsigYN,AsigXN;
OtrTipo[0]=Limite;
OtrTipo[1]=»;

if (AsigYN=Lexico(OtrTipo,3))
{
cout << OtrTipo << » (3,» << (AsigYN-1) << «)n»;
Limite=fgetc(fp);
contaMat++;
cout << «ttOperador Matematico: » << contaMat << «nn»;
goto Brincar;
}

if (AsigYN=Lexico(OtrTipo,4))
{
Limite=fgetc(fp);
OtrTipo[1]=Limite;
OtrTipo[2]=»;

if (AsigXN=Lexico(OtrTipo,4))
{
cout << OtrTipo << » (4,» << (AsigXN-1) << «)n»;
contaAsig++;
cout << «ttAsignacion: » << contaAsig << «nn»;
goto Brincar;
}   else
OtrTipo[1]=»;
cout << OtrTipo << » (4,» << (AsigYN-1) << «)n»;
contaAsig++;
cout << «ttAsignacion: » << contaAsig << «nn»;
goto Brincar;
}

if (Limite==’:’)
{
Limite=fgetc(fp);
if (Limite==’=’)
{
cout << «:= (2,2)n»;
contaAsig++;
cout << «ttAsignacion: » << contaAsig << «n»;
}
Limite=fgetc(fp);
goto Brincar;
} else
{
if (AsigYN=Lexico(OtrTipo,2))
{
cout << OtrTipo << » (2,» << (AsigYN-1) << «)n»;
contaDeli++;
cout << «ttDelimitador: » << contaDeli << «nn»;
Limite=fgetc(fp);
goto Brincar;
}
}

if ((Limite!=’n’)&&(Limite!=’ ‘))
cout << «nVerificar sintaxis……n»<< Limite;
Limite=fgetc(fp);
Brincar: return(Limite);
}

Archivo Pascal(guardar con el nombre de choccac.pas):

BEGIN
VAR
A,B,C! REAL;
A:=2;
B:=3;
C:=A+B
IF (A<2);
WHILE (B=4)
A<5;
C:=A-B
C:=A*B
C:=A/B
C:=A+B
END.

autor ->> Mynor Rene Choc Cac.

Esta entrada fue publicada en Analizador Lexico. Guarda el enlace permanente.