#include
#include p>#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 variablesestructura 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 errorint 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}, /*10*/{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 ,999,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 temporaldelos temp;delos gen[ 50][ 4];//Generó tres direccionescadena str[31]={"","int","if","else","float","print","identifier"," Constant" , "=","+","*","**",";","(",")", "{", "} ","[","]","-","/",",","&&","||","!", "=="," >" ,"<",">=","<=","!="};//Variablescadena *var;int varlen=0,nowvar=1;//Constantefloat *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; p> 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; devuelvefalso; }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) p> 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 flotantevoid 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); p > 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> 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); } p> 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); p> { 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=='!') p> { 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* ** *************************/
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; p> 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; devuelvefalso; }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) p> 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 flotantevoid 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); p > 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> 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); } p> 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); p> { 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=='!') p> { 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* ** *************************/
{ resultado[i].code=p3[i].code; p>
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; devuelvefalso; }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) p> 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 flotantevoid 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); p > 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> 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); } p> 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); p> { 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=='!') p> { 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* ** *************************/
var[i]=p1[i] ;
eliminar[] p1;
void renewconst()
flotante *p2 =myconst;
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
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) p>
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); p >
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);
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
else if(isdigital(ch))
{mientras (isdigital(ch)||ch=='.')
ch=myfile.get();
myfile.seekg(-1,ios::cur);
insertconst(strtoken,i);
else if(ch=='=')
{ ch=miarchivo.get();
if(ch=='=')
insertresult(rop_equal,0);
{insertresult(op_fuzhi,0);
else if(ch=='+')
{insertresult(op_add,0); p> p>
else if(ch=='*')
{ ch=myfile.get();
if( ch= ='*')
insertresult(op_2star,0);
{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);
} p>
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=='&')
if(ch=='&')
insertresult(rop_yu,0
else); p>
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=='!') p> { 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* ** *************************/
else if(ch=='|')
if(ch=='|')
insertresult(op_or,0
else);
cout<<"ERROR :"< } } else if(ch=='!') p> { 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* ** *************************/
else if(ch=='!') p>
insertresult(rop_uneql,0); > else
{insertresult(rop_fei,0);
else if(ch=='>')
if(ch=='= ')
insertresult(rop_buxiaoyu,0);
{insertresult(rop_dayu,0);
myfile.seekg( -1,ios::cur);
else if(ch=='<')
insertresult(rop_budayu,0
{insertresult(rop_xiaoyu,0);
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* ** *************************/
myfile.seekg(1,ios::cur);
myfile.close();
cout<<"¡¡Análisis léxico exitoso!!"< } /************************************Fin de la función de análisis léxico* ** *************************/
/************************************Fin de la función de análisis léxico* ** *************************/