Red de conocimiento informático - Problemas con los teléfonos móviles - vc++ como analizador léxico

vc++ como analizador léxico

#include

#include

#include

#include

#include

usando el espacio de nombres std;

#define zhengshu 1 //int

#define IF 2 //if

#define ELSE 3 //else

#define shishu 4 //flotador

#define PRINT 5 //imprimir

#define ID 6 //identificar

#define CONSTANT 7 //constante

#define op_fuzhi 8 //=

#define op_add 9 //+

#define op_mul 10 //*

#define op_2star 11 //**

#define div_fenhao 12 //;

#define syl_ls 13 //(

#define syl_rs 14 //)

#define syl_lb 15 //{

#define syl_rb 16 //}

#define sbl_lm 17 //[

#define sbl_rm 18 //]

#define op_sub 19 //-

#define op_div 20 / / /

#define div_douhao 21 //,

#define rop_yu 22 //&&

#define op_or 23 //||

#define rop_fei 24 //!

#define rop_equal 25 //==

#define rop_dayu 26 //>

#define rop_xiaoyu 27 / /<

#definir rop_buxiaoyu 28 //>=

#definir rop_buxiaoyu 29

//<=

#define rop_uneql 30 //!=

#define TEMP 31

#define NULL 0

#define JMP 32

#define GOTO 33 //ir al logotipo

/*************************** *** ****Comienza la declaración de estructuras de datos importantes************************/

struct delos

{

int código,valor;

}*resultado; //resultado

//tabla de variables

estructura analizar

{

int state;

char sign;

};

struct list

{

int value;

list *next;

};

//LR(1) análisis de Tabla de declaraciones condicionales, 110 significa aceptación, 999 significa error

int table[38][20]={

/*0*/{3,999,999,999,999,999,999,999,999,999,999,999,4,999,1,2,999,999,999,999},

/*1*/{999,999,999,999,999,999,999,999,999,999,999,999,999,110,999,999,999,9999,999},

9,999,74,74,999,999,999,999,5,999},

/*3*/{999, 6,999,999,999,999,999,999,99999,9999999999999999999999999999999999999999999ES 999},

/*4*/{999,999,999,999,7,999,999,999,999, 999,999,999,999,999,999,999,999,999,999,999},

/*5*/{999,999,999,999,999, 999,999,999,999,999,999,999,999,61,999,999,999, 999,999,999},

/*6 */{999,12,999,999,999,999,999,9,999,999,999,11,13,999,999,999,8,10,999,999},

/*7*/{999,12,999,999,999,999,999,999,999, 999,999,11,13,999,999,999,999,14,999,999},

/ *8*/{999,999,15,999,999,16,17,999,999,999,999,999,999,999,999,999,999,999,999,999},

/*9*/{999,12,999,999,999,999,999, 9,999,999,999,11,13,999,999,999,18,10,999,999},

/*1

0*/{999,999,999,999,999,999,999,999,19,20,21,999,999,999,999,999,999,999,999,999},

/*11*/{999,12,999,999,999,999,999, 999,999,999,999,11,13,999,999,999,999,22,999,999},

/*12* /{ 999,12,999,999,999,999,999,999,999,999,999,11,13,999,999,999,999,23,999,999},

/*13*/{999,999,73,73,999,73,73,999,73, 7 3,73,999,999,73,999,999,999,999,999,999},

/*14*/{999,999,999,64,999,999,999,999,999,20,21,999,999,64,999,999,999,999,999,999},

99,999,999,999,999,999,74,74,999,999,999,999,24,999},

/*16* /{74,999,999,999,999,999,999,999,999,999,999,999,74,74,999,999,999,999,999,25},

/*17*/{74,999,999,999,999,999,999 ,999, 999,999,999,999,74,74,999,999,999,999,999,26},

/*18 */{999,999,67,999,999, 67,67,999,999,999,999,999,999,999,999,999,999,999,999,999},

/*19*/{999,12,999,999,999,999,999,99 9,999,999,999,11,13,9 99,999,999,999,27,999,999},

/*20* /{999,12,999,999,999,999,999,999,999,999,999,11,13,999,999,999,999, 28,999,999},

/*21*/{999,12,999,999,999,999,999,999, 999,999,999,11,13,999,999,999,999,29,999,999},

,71,71,999,71 ,71,999, 71,71,71,999,999,71,999,999,999,999,999,999},

/*23*/{999,999,30,999,999,999,999,999,999,20,21,999,999,999,999 ,999,999 ,999,999,999},

/*24*/{3,999,999,999,999,999,999,999,999,999,999,999 ,4,999,999,31,999,999,999,999} ,

/*25*/{999,12,999,999,999,999,999,9,999,999,999,11,13,999,999,999,32,10,999,999},

/*26*/{999,12,999,999 ,99

9,999,999,9,999,999,999,11,13,999,999,999,33,10,999,999},

/*27*/{999,999,68,999,999,68,68,999,999,20,21,999,999,999,9 99.999.999.999.999.999},

/ *28* /{999,999,69,69,999,69,69,999,69,69,21,999,999,69,999,999,999,999,999,999},

/*29*/{999,999,70,70,999,70,70,999,70,7 0 ,7 0,999,999, 70,999,999,999,999,999,999},

/*30*/{999,999,72,72,999,72,72,999,72,72,72,999,999,72,999,999,999,999,999, 999},

31*/{ 999,999,999, 75,999,999,999,999,999,999,999,999,999,63,999,999,999,999,999,34},

/{999,999,65,999,999,65,65,999,999,999 ,999,99 9,999,999,999,999,999,999,999,999},

/*33*/{999,999,66,999,999,16,66,999,999,999,999,999,999,999,999,999,999,999 ,999,999 } ,

/*34*/{999,999,999,35,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999},

999,999,999,999,999,9 99,999,999,74,74,999,999,999,999,36,999},

/* 36*/{3,999,999,999,999,999,999,999,999,999,999,999 ,4,999,999,37,999,999,999,999},

99,999,999,999,999,999,62,999,999,999,999,999,999}

};

/*** ************* *******************Fin de la declaración de estructuras de datos importantes****************** *******/

/************************************Comienza la declaración de variables generales**** **************************/

int lugar=1;

int nextpos=1 ;

pila stknext;

pila stktrue;

pila stkfalse;

stack stkpos;

stack stktemp;//Constante, variable, variable temporal

delos temp;

delos gen[ 50][ 4]

;//Generó tres direcciones

cadena str[31]={"","int","if","else","float","print","identifier"," Constant" ,

"=","+","*","**",";","(",")",

"{", "} ","[","]","-","/",",","&&","||","!",

"=="," >" ,"<",">=","<=","!="};

//Variables

cadena *var;

int varlen=0,nowvar=1;

//Constante

float *myconst;

int constlen=0,nowconst=1;

int resultlen=0,nowresult=0;

/****************************** * ***Fin de la declaración de variable global******************************/

void renewresult()

{

delos *p3=resultado;

int i

resultadolen+=10;

resultado =nuevos delos[ resultado];

for(i=0;i

{ resultado[i].code=p3[i].code;

resultado[i].value=p3[i].value;

}

eliminar[] p3;

}

void renewvar()

{

cadena *p1=var;

int i;

varlen+=10;

var=nueva cadena[varlen];

for(i=0;i

var[i]=p1[i] ;

eliminar[] p1;

}

void renewconst()

{

flotante *p2 =myconst;

int i;

constlen+=10;

myconst=new float[constlen];

for(i= 0;i< nowconst;i++)

myconst[i]=p2[i];

eliminar[] p2;

}

bool isletter (char c) //Determina si es una letra

{

if(c>64&&c<91||c>96&&c<123)

devuelve verdadero;

devuelve falso;

}

bool isdigital(char c) //determina si es digital

{ if(c>47&&c<58 )

devuelve verdadero;

devuelve

falso;

}

int reserve(char c[],int i)

{

cadena s(c,0, i);

for(int j=1;j<7;j++)

if(s==str[j])

return j;

retorna 0;

}

void insertresult(int code,int value)

{ if(nowresult>resultlen)

renovarresult();

resultado[nowresult].code=code;

resultado[nowresult++].value=valor;

}

void insertid(char c[],int i)

{ string s(c,0,i);

insertresult(ID,nowvar);

if(nowvar>varlen)

renewvar();

var[nowvar++]=s;

}

//Insertar constante, que es de tipo punto flotante

void insertconst(char c[],int i)

{ int d=0,j;

float a=0,b=1;

while(c[d]!='.'&&d

d++;

para ( j=d-1;j>=0;j--)

{ a=a+(c[j]-48)*b;

b=b*10

}

b=10;

for(j=d+1;j

{a = a+(c[j]-48)/b;

b=b*10;

}

insertresult(CONSTANT,nowconst);

if(nowconst>constlen)

renewconst();

myconst[nowconst++]=a;

}

/************************************ Se inicia la función de análisis léxico******* ********** ************/

void wordanalyse()

{

char strtoken[10];

int i=0,código;

char ch;

ifstream miarchivo;

miarchivo.open( "sourcefile.txt");

if(!myfile)

{ cout<<"¡No se puede abrir el archivo de entrada!"<

return ;

}

while(!miarchivo.eof())

{ i=0;

for(ch=miarchivo. get();ch==' '| |ch==13||ch==10;ch=miarchivo.get())

;

if(isletter(ch))

{ while(isletter(ch)||isdigital(ch))

{strtoken[i++]=ch;

ch=miarchivo.get();

}

miarchivo.seekg(-1,ios::cur);

code=reserve(strtoken,i);

if(code==0)

insertid(strtoken,i

else

<); p> {insertresult(code,0);

}

}

else if(isdigital(ch))

{mientras (isdigital(ch)||ch=='.')

{strtoken[i++]=ch;

ch=myfile.get();

}

myfile.seekg(-1,ios::cur);

insertconst(strtoken,i);

}

else if(ch=='=')

{ ch=miarchivo.get();

if(ch=='=')

insertresult(rop_equal,0);

else

{insertresult(op_fuzhi,0);

myfile.seekg(-1,ios::cur);

}

}

else if(ch=='+')

{insertresult(op_add,0); p>

}

else if(ch=='*')

{ ch=myfile.get();

if( ch= ='*')

insertresult(op_2star,0);

else

{insertresult(op_mul,0);

miarchivo .seekg(-1,ios::cur);

}

}

else if(ch==';')

{ insertresult(div_fenhao,0);

}

else if(ch=='(')

{insertresult(syl_ls,0)

}

else if(ch==')')

{insertresult(syl_rs,0);

}

else if(ch=='{')

{ insertresult(syl_lb,0);

}

else if( ch= ='}')

{ insertresult(syl_rb,0);

}

else if(ch=='[')

{ insertresult(sbl_lm,0);

}

else if(ch==']')

{ insertresult(sbl_rm,0) );

/p>

}

else if(ch=='-')

{ insertresult(op_sub,0);

}

else if(ch=='/')

{ insertresult(op_div,0);

}

else if(ch== ',')

{ insertresult(div_douhao,0);

}

else if(ch=='&')

{ ch=myfile.get();

if(ch=='&')

insertresult(rop_yu,0

else

{

miarchivo.seekg(-1,ios::cur);

miarchivo.get(strtoken,10);

cout <<"ERROR:"<

}

}

else if(ch=='|')

{ ch=myfile.get();

if(ch=='|')

insertresult(op_or,0

else);

{

miarchivo.seekg(-1,ios::cur);

miarchivo.get(strtoken,10);

cout<<"ERROR :"<

}

}

else if(ch=='!')

{ ch=myfile.get();

if(ch=='=')

insertresult(rop_uneql,0); > else

{insertresult(rop_fei,0);

myfile.seekg(-1,ios::cur);

}

}

else if(ch=='>')

{ ch=miarchivo.get();

if(ch=='= ')

insertresult(rop_buxiaoyu,0);

else

{insertresult(rop_dayu,0);

myfile.seekg( -1,ios::cur);

}

}

else if(ch=='<')

{ ch=myfile.get();

if(ch=='=')

insertresult(rop_budayu,0

else

);

{insertresult(rop_xiaoyu,0);

myfile.seekg(-1,ios::cur);

}

}

si no

{si

(ch!=-1)

{myfile.seekg(-1,ios::cur);

myfile.get(strtoken,10);

cout<<"ERROR:"<

myfile.seekg(1,ios::cur);

}

}

}

myfile.close();

cout<<"¡¡Análisis léxico exitoso!!"<

}

/************************************Fin de la función de análisis léxico* ** *************************/