编译词法源代码

时间:2016-11-12 14:53:24
【文件属性】:

文件名称:编译词法源代码

文件大小:5KB

文件格式:TXT

更新时间:2016-11-12 14:53:24

编译 原理 词法 源代码

编译原理,词法翻译源代码: #include #include #include #include using namespace std; char prog[80],token[8],s_error[80]; char ch; int syn,p,m=0,n,row,error; int flag;//标志正负 double sum=0; char *rwtab[6]={"begin","if","then","while","do","end"}; void scaner() { error = 0; /* 共分为三大块,分别是标示符、数字、符号,对应下面的 if else if 和 else */ for(n=0;n<8;n++) token[n]=NULL; ch=prog[p++]; while(ch==' ') { ch=prog[p]; p++; } if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) //可能是标示符或者变量名 { m=0; while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) { token[m++]=ch; ch=prog[p++]; } token[m++]='\0'; p--; syn=10; for(n=0;n<6;n++) //将识别出来的字符和已定义的标示符作比较, if(strcmp(token,rwtab[n])==0) { syn=n+1; break; } } else if((ch>='0'&&ch<='9')||(ch == '+')||(ch == '-')) //数字或+,- { strcpy(s_error,""); int pp=p-1; sum =0; syn = 11; flag=1;//默认为正 if(ch == '+'|| ch == '-') { if(prog[p]<'0' || prog[p]>'9')//就是+,- { syn=(ch=='+'?15:16); //if(ch == '+') // syn = 15; //else // syn = 16; token[0]=ch; } else//后面跟数字 if(ch == '-') flag =-1; } else//数字开头 { sum= ch-'0'; } if(syn == 11)//是数字 { syn=11; ch=prog[p++]; while(ch>='0'&&ch<='9') { sum = sum*10+ch-'0'; ch=prog[p++]; } sum*= flag; if(ch == '.')//有小数部分 { ch=prog[p++]; double round=0.1; if(ch<'0'||ch>'9') { syn = -1; error=1;//一号错误 for(int i=0;i='0'&&ch<='9') { sum+= round*(ch-'0'); ch=prog[p++]; round/= 10; } } if(ch == 'e' && syn>0)//是浮点数 { flag = 1; int temp=0; ch=prog[p++]; if((ch>='0'&&ch<='9')||(ch == '+')||(ch == '-')) { if((ch == '+')||(ch == '-')) { if(ch == '-') flag=-1; ch=prog[p++]; } if(ch<'0'||ch>'9') { syn = -1; error=2; for(int i=0;i='0'&&ch<='9') { temp= temp*10+ch-'0'; ch=prog[p++]; } } else { syn=-1; error = 2; for(int i=0;i='0'&&ch<='9')) { sum=sum*10+ch-'0'; ch=prog[p++]; } } p--; syn=11; if(sum>32767) syn=-1;*/ } else switch(ch) //其他字符 { case'<':m=0;token[m++]=ch; ch=prog[p++]; if(ch=='>') { syn=21; token[m++]=ch; } else if(ch=='=') { syn=22; token[m++]=ch; } else { syn=23; p--; } break; case'>':m=0;token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=24; token[m++]=ch; } else { syn=20; p--; } break; case':':m=0;token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=18; token[m++]=ch; } else { syn=17; p--; } break; case'*':syn=13;token[0]=ch;break; case'/': { if(prog[p]!='*') { syn=14; token[0]=ch; break; } else { syn=-10086; ch=prog[p++];//把*读进来 ch=prog[p++];//读下一个 while(!(ch=='*' && prog[p]=='/')) ch=prog[p++];//直到ch为*,下一个为/ ch=prog[p++];//读出/ break; } }


网友评论