天津理工大学编译原理实验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;icout<}
voidshowc(char_stackstr[size],intindex)
{
intlength=getLengthc(str);
if(index!
=-1)
cout<<"\t";
for(inti=index+1;icout<}
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