资源描述:
《编译原理--语义分析》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、编译原理--语义分析#include#include#include#include#include#includeusingnamespacestd;#defineMAXN20000constdoubleeps=1e-7;structQ{charres[100];charag1[100];charop[12];charag2[100];}q[300];//保存最后的结果三地址指令格式intcount=0,error;//记录结果集的条数in
2、tsyn,p,sum,kk,m,n,row,k,len;doubledsum,pos;charindex[800];//记录指数形式的浮点数charr[6][10]={"function","if","then","while","do","endfunc"};chartoken[MAXN],s[MAXN];charch;boolis_letter(charc){returnc>='a'&&c<='z'
3、
4、c>='A'&&c<='Z';}boolis_digtial(charc){returnc>='0'&&c<='9';}boolis_dot
5、(charc){returnc==','
6、
7、c==';';}voididentifier()//标示符的判断{m=0;while(ch>='a'&&ch<='z'
8、
9、ch>='0'&&ch<='9'){token[m++]=ch;ch=s[++p];}token[m]=' ';ch=s[--p];syn=10;for(n=0;n<6;n++)if(strcmp(token,r[n])==0){syn=n+1;break;}}voiddigit(boolpositive)//数字的判断{len=sum=0;ch=s[p];while(ch>='
10、0'&&ch<='9'){sum=sum*10+ch-'0';ch=s[++p];}if(ch=='.'){dsum=sum;syn=12;ch=s[++p];pos=0.1;while(ch>='0'&&ch<='9'){dsum=dsum+(ch-'0')*pos;pos=pos*0.1;ch=s[++p];}if(ch=='e'){index[len++]=ch;ch=s[++p];if(ch=='-'
11、
12、ch=='+'){index[len++]=ch;ch=s[++p];}if(!(ch>='0'&&ch<='9')){//cout<
13、<"Looooooooooook"<='0'&&ch<='9'){index[len++]=ch;ch=s[++p];}}}if(syn==-1
14、
15、(ch>='a'&&ch<='z')
16、
17、ch=='.'){syn=-1;//对数字开头的标识符进行判错。while(ch>='0'&&ch<='9'
18、
19、ch>='a'&&ch<='z'
20、
21、ch=='.')ch=s[++p];//找到下一次要判断的开头ch=s[--p];}else{ch=s[--p];syn=12;if(!positive)ds
22、um*=-1.0;}}else{if(ch>='a'&&ch<='z'){syn=-1;//对数字开头的标识符进行判错。while(ch>='0'&&ch<='9'
23、
24、ch>='a'&&ch<='z')ch=s[++p];//找到下一次要判断的开头ch=s[--p];}else{ch=s[--p];syn=11;if(!positive)sum*=-1;}}}voidTo_double(){inti;printf("(%d,%lf",syn,dsum);if(len){for(i=0;i25、);len=0;}printf(")");}boolcheck_behind_digit(){inti=p+1;while(s[i]!=' '){if(s[i]>='0'&&s[i]<='9')returntrue;elseif(s[i]!=''&&s[i]!='t'&&s[i]!='')returnfalse;i++;}returnfalse;}boolcheck_pre_prog(){inti=p-1;while(i>=0){if(s[i]!=''&&s[i]!='t'&&s[i]!=''){if(s[i]>='0'&&s
26、[i]<='9'
27、
28、s[i]>='a'&&s[i]<='z')returnfalse;elsereturntrue;}i--;}returntrue;