1 / 17
文档名称:

实验三语义分析.doc

格式:doc   大小:39KB   页数:17页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

实验三语义分析.doc

上传人:wxc6688 2019/11/20 文件大小:39 KB

下载得到文件列表

实验三语义分析.doc

文档介绍

文档介绍:、原理和方法,为为代码优化、生成做准备。:选择所学过的语义分析技术之一实现下面文法G的语义分析程序。文法G:简单算术表达式的文法E→ T{+T|-T}T→ F{*F|/F}F→(E)|a|b|c简单算术表达式的运算分量只能是单词符号a、b、c要求:如果是文法正确句子,输出相应的四元组        输出是Error        不是文法正确句子例如输入 a+b*c#     输出  (*,entry(b),entry(c),t1)(+,entry(a),t1,t2)输入 a+c+b*c-a#   输出  (+,entry(a),entry(c),t1)(*,entry(b),entry(c),t2)(+,t1,t2,t3)(-,t3,entry(a),t4)输入 d+f#      输出 error输入 a+b*+c#    输出 error输入 a(b)#      输出 :(1)上机前编写完整的实验报告,报告中要体现分析设计实现等几个过程;如无实验报告,则取消本次上机资格,实验成绩以0分记。(2)严禁相互抄袭,否则实验成绩以0分记;(3)有完整的源代码,源码有规范的注释,无明显的语法错误;(1)分析与设计(2)1设置语义过程(1)emit(char*result,char*arg1,char*op,char*ag2)该函数功能是生成一个三地址语句送到四元式表中。四元式表的结构如下:struct{charresult[8];charag1[8];charop[8];charag2[8];}quad[20];(2)  char*newtemp()该函数回送一个新的临时变量名,临时变量名产生的顺序为T1,T2,….Char*newtemp(void){char*p;charm[8];p=(char*)malloc(8);k++;itoa(k,m,10);strcpy(p+1,m);p[0]=’t’;return(p);}(3)编码实现//对字符的扫描voidscaner(){ 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')) { if((ch>='a'&&ch<='c')||(ch>='A'&&ch<='C')){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;  }}}elsecout<<"Error!"<<endl;}elseif((ch>='0'&&ch<='9')) { {  sum=0;while((ch>='0'&&ch<='9'))  {  sum=sum*10+ch-'0';  ch=prog[p++];}} p--; syn=11; if(sum>32767)  syn=-1;}elseswitch(ch) {case'<':m=0;token[m++]=ch; ch=prog[p++];if(ch=='>') { syn=21; token[m++]=ch;}elseif(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'/':syn=14;token[0]=ch;break;case'+':syn=15;token[0]=ch;break;case'-':syn=16;token[0]=ch;break;case'=':syn=25;token[0]=ch;break;case';':syn=26;token