天津理工大学编译原理实验3语义分析.docx
- 文档编号:23349136
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:26
- 大小:97.23KB
天津理工大学编译原理实验3语义分析.docx
《天津理工大学编译原理实验3语义分析.docx》由会员分享,可在线阅读,更多相关《天津理工大学编译原理实验3语义分析.docx(26页珍藏版)》请在冰豆网上搜索。
天津理工大学编译原理实验3语义分析
实验报告
学院名称:
计算机科学与工程学院
姓名
学号
专业
计算机科学与技术
班级
实验项目
实验三:
语义分析与中间代码生成
课程名称
编译原理
课程代码
0668056
实验时间
2018年6月6日第*、*节
2018年6月11日第*、*节
实验地点
软件实验室7-***
软件实验室7-***
实验成绩考核评定分析
实验过程
综合评价
30分
实验目标
结果评价
20分
程序设计
规范性评价
20分
实验报告
完整性评价
30分
实验报告
雷同分析
分类标注
实验
成绩
■实验过程认真专注,能独立完成设计与调试任务30分
■实验过程认真,能较好完成设计与编成调试任务25分
■实验过程较认真,能完成设计与编成调试任务20分
■实验过程态度较好,基本完成设计与编成调试任务15分
■实验过程态度欠端正,未完成设计与编成调试任务10分
■功能完善,且人机交互界面友好20分
■满足功能要求,但人机交互界面一般15分
■基本满足功能需求,人机交互界面欠缺10分
■功能缺失5分
■程序易读性好20分
■程序易读性较好15分
■程序易读性欠缺10分
■程序易读性较差5分
**注:
易读性要求标识符命名见名知意,程序编制采用嵌套方式,层次结构清晰可读,关键部分具有简明注释。
■报告完整30分
■报告较完整25分
■报告内容一般20分
■报告内容极少10分
凡雷同报告将不再重复评价前四项考核内容,实验成绩将按低学号雷同学生成绩除雷同人数计算而定。
标记为:
S组号-人数(组分)
前四项评价分数之总和
(**雷同报告按第五项标准核算**)
实验内容:
已知G[E]:
E→E+T|E-T|T
T→T*F|T/F|F
F→P^F|P
P→(E)|i
要求构造出符合语义分析要求的属性文法描述,并在完成实验二(语法分析)的基础上,进行语义分析程序设计,最终输出与测试用例等价的四元式中间代码序列。
实验目的:
1.掌握语法制导翻译的基本功能,巩固对语义分析的基本功能和原理的认识;
3.能够基于语法制导翻译的知识进行语义分析,掌握文法规则相应语义动作的设计方法;
5.理解并处理语义分析中的异常和错误。
实验要求:
1.在实验二的基础上,实现语法制导翻译功能,输出翻译后所得四元式序列;
2.要求详细描述所选分析方法进行制导翻译的设计过程;
3.完成对所设计分析器的功能测试,并给出测试数据和实验结果;
4.为增加程序可读性,请在程序中进行适当注释说明;
5.整理上机步骤,总结经验和体会,认真完成并按时提交实验报告。
******实验报告内容详述******
程序流程图
实验结果:
源代码:
#include
#include
#definesize1024
usingnamespacestd;
intstep=0;
typedefstructvariable_T
{
charoperate;//操作符stringvar1;//变量1stringvar2;//变量2intnum;//第几个变量}variable_T;variable_Tt[size];//记录四元式变量的变量inttsize=-1;//表示是第tsize+1个变量
typedefstructchar_stack
{
charcontent;//当前字符stringendchar;//这个符号代表的中间变量可以是i,也可以是t1,t2,等等intnum;//和该字符相关的中间变量的序号
}char_stack;
stringtable[19][13]={//+-*/^)#(iET
FP
/*0*/"err","err","err","err","err","err","err","s5","s6","1","2","3","4",
/*1*/"s7","s8","err","err","err","err","acc","err","err","err","err","err","err",
/*2*/"r3","r3","s9","s10","err","r3","r3","err","err","err","err","err","err",
/*3*/"r6","r6","r6","r6","err","r6","r6","err","err","err","err","err","err",
/*4*/"r8","r8","r8","r8","s11","r8","r8","err","err","err","err","err","err",
/*5*/"err","err","err","err","err","err","err","s5","s6","c","2","3","4",
/*6*/"r10","r10","r10","r10","r10","r10","r10","err","err","err","err","err","err",
/*7*/"err","err","err","err","err","err","err","s5","s6","err","d","3","4",
/*8*/"err","err","err","err","err","err","err","s5","s6","err","e","3","4",
/*9*/"err","err","err","err","err","err","err","s5","s6","err","err","f","4",
/*10*/"err","err","err","err","err","err","err","s5","s6","err","err","g","4",
/*11*/"err","err","err","err","err","err","err","s5","s6","err","err","h","4",
/*12*/"s7","s8","err","err","err","s18","err","err","err","err","err","err","err",
/*13*/"r1","r1","s9","s10","err","r1","r1","err","err","err","err","err","err",
/*14*/"r2","r2","s9","s10","err","r2","r2","err","err","err","err","err","err",
/*15*/"r4","r4","r4","r4","err","r4","r4","err","err","err","err","err","err",
/*16*/"r5","r5","r5","r5","err","r5","r5","err","err","err","err","err","err",
/*17*/"r7","r7","r7","r7","err","r7","r7","err","err","err","err","err","err",
/*18*/"r9","r9","r9","r9","r9","r9","r9","err","err","err","err","err","err"};
intgetLength(charstr[size])
{
inti=0;
while(str[i]!
='\0')
i++;
returni;
}
intgetLengthc(char_stackstr[size])
{
inti=0;
while(str[i].content!
='\0')
i++;
returni;
}
intgetstringLength(stringstr)
{
inti=0;
while(str[i]!
='\0')
i++;
returni;
}
chargettop(charstack[size],inttop)
{
if(stack[top]!
='\0')
returnstack[top];
else
return'#';
}
voidpopstack(char*stack,int*pointer,inttimes)
{
intp;
for(inti=1;i<=times;i++)
{
p=*pointer;
stack[p]='\0';
(*pointer)--;
}
}
voidpopstackc(char_stack*stack,int*pointer,inttimes)
{
intp;
for(inti=1;i<=times;i++)
{
p=*pointer;
stack[p].content='\0';
(*pointer)--;
}
}
voidpushstack(char_stack*stack,int*pointer,char*stack_state,int*pointer_state,charstr,charsx,intx)
{
inti=0;
if(x==0)cout<<"\t\t\t状态"< elseif(x==1)cout<<"状态"< if(str! ='#') { cout< (*pointer)++; stack[(*pointer)].content=str; } (*pointer_state)++; stack_state[(*pointer_state)]=sx; } intgetcol(chartop) { switch(top) { case'+': return0; case'-': return1; case'*': return2; case'/': return3; case'^': return4; case')': return5; case'#': return6; case'(': return7; case'i': return8; case'E': return9; case'T': return10; case'F': return11; case'P': return12; default: cout<<"Error! Thischaracterstringisnotthisgrammer`ssentence."< return-1; } } intgetraw(charraw) { switch(raw) { case'0': return0; case'1': return1; case'2': return2; case'3': return3; case'4': return4; case'5': return5; case'6': return6; case'7': return7; case'8': return8; case'9': return9; case'a': return10; case'b': return11; case'c': return12; case'd': return13; case'e': return14; case'f': return15; case'g': return16; case'h': return17; case'i': return18; default: cout<<"Error! Thischaracterstringisnotthisgrammer`ssentence."< return-1; } } chargetraw_content(stringstr) { if(str=="1") return'1'; elseif(str=="2") return'2'; elseif(str=="3") return'3'; elseif(str=="4") return'4'; elseif(str=="c") return'c'; elseif(str=="d") return'd'; elseif(str=="e") return'e'; elseif(str=="f") return'f'; elseif(str=="g") return'g'; elseif(str=="h") return'h'; elseif(str=="i") return'i'; } stringget_tx(intnum) { switch(num) { case1: return"t1"; case2: return"t2"; case3: return"t3"; case4: return"t4"; case5: return"t5"; case6: return"t6"; case7: return"t7"; case8: return"t8"; case9: return"t9"; case10: return"t10"; case11: return"t11"; case12: return"t12"; case13: return"t13"; case14: return"t14"; case15: return"t15"; case16: return"t16";//......本程序暂时用到这么多,等有时间编写合适的可以将数字转换为字符串的函数时,即可更改本函数 } } voidshow(charstr[size],intindex) { intlength=getLength(str); if(index! =-1) cout<<"\t"; for(inti=index+1;i cout< } voidshowc(char_stackstr[size],intindex) { intlength=getLengthc(str); if(index! =-1) cout<<"\t"; for(inti=index+1;i cout< } voidswitch_method(char_stack*stack,int*pointer,char*state_stack,int*pointer_state,string production,char*str,int*index) { step++;cout<<"\n"< if(production=="err") { cout<<"Error! Thischaracterstringisnotthisgrammer`ssentence."< return; } elseif(production=="s5") { charsx='5'; (*index)++; pushstack(stack,pointer,state_stack,pointer_state,c,sx,0); } elseif(production=="s6") { charsx='6'; (*index)++; pushstack(stack,pointer,state_stack,pointer_state,c,sx,0); } elseif(production=="s7") { charsx='7'; (*index)++; pushstack(stack,pointer,state_stack,pointer_state,c,sx,0); } elseif(production=="s8") { charsx='8'; (*index)++; pushstack(stack,pointer,state_stack,pointer_state,c,sx,0); } elseif(production=="s9") { charsx='9'; (*index)++; pushstack(stack,pointer,state_stack,pointer_state,c,sx,0); } elseif(production=="s10") { charsx='a'; (*index)++; pushstack(stack,pointer,state_stack,pointer_state,c,sx,0); } elseif(production=="s11") { charsx='b'; (*index)++; pushstack(stack,pointer,state_stack,pointer_state,c,sx,0); } elseif(production=="s18") { charsx='i'; (*index)++; pushstack(stack,pointer,state_stack,pointer_state,c,sx,0); } elseif(production=="r1") { intpo=(*pointer);//用P规约该表达式,有效变量在E的endchar中,需要找到E的位置,即下面的操作stringst=stack[po].endchar;//对应F po-=2;stringse=stack[po].endchar;//在规约之前记录下要规约的字符所代表的变量。 对应T tsize++;//新增临时变量t[tsize].num=tsize+1;//下面四个表达式是按照上面的规约式进行的赋值 t[tsize].operate='+'; t[tsize].var1=se; t[tsize].var2=st; cout<<"\t("< intp=(*pointer_state); p-=3; charsecond=state_stack[p]; inti=getraw(second); intj=getcol('E'); charc_out=getraw_content(table[i][j]);cout<<"\tr1: 用E-->E+T规约且";popstack(state_stack,pointer_state,3); popstackc(stack,pointer,3); charc='E';//str[(*index)]; pushstack(stack,pointer,state_stack,pointer_state,c,c_out,1); strings=get_tx(t[tsize].num);stack[(*pointer)].endchar=s;//把保存E+T规约的结果的变量保存至当前字符的终结符 } elseif(production=="r2") { intpo=(*pointer);//用P规约该表达式,有效变量在E的endchar中,需要找到E的位置,即下面的操作stringst=stack[po].endchar;//对应T po-=2;stringse=stack[po].endchar;//在规约之前记录下要规约的字符所代表的变量。 对应E tsize++;//新增临时变量t[tsize].num=tsize+1;//下面四个表达式是按照上面的规约式进行的赋值 t[tsize].operate='-'; t[tsize].var1=se; t[tsize].var2=st; cout<<"\t("< intp=(*pointer_state); p-=3; charsecond=state_stack[p]; inti=getraw(second); intj=getcol('E'); charc_out=getraw_content(table[i][j]);cout<<"\tr2: 用E-->E-T规约且"; popstack(state_stack,pointer_state,3); popstackc(stack,pointer,3); charc='E';//str[(*index)]; pushstack(stack,pointer,state_stack,pointer_state,c,c_out,1); strings=get_tx(t[ts
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 天津 理工大学 编译 原理 实验 语义 分析
![提示](https://static.bdocx.com/images/bang_tan.gif)