天津理工大学编译原理实验3语义分析.docx

上传人:b****0 文档编号:8941792 上传时间:2023-05-16 格式:DOCX 页数:26 大小:97.23KB
下载 相关 举报
天津理工大学编译原理实验3语义分析.docx_第1页
第1页 / 共26页
天津理工大学编译原理实验3语义分析.docx_第2页
第2页 / 共26页
天津理工大学编译原理实验3语义分析.docx_第3页
第3页 / 共26页
天津理工大学编译原理实验3语义分析.docx_第4页
第4页 / 共26页
天津理工大学编译原理实验3语义分析.docx_第5页
第5页 / 共26页
天津理工大学编译原理实验3语义分析.docx_第6页
第6页 / 共26页
天津理工大学编译原理实验3语义分析.docx_第7页
第7页 / 共26页
天津理工大学编译原理实验3语义分析.docx_第8页
第8页 / 共26页
天津理工大学编译原理实验3语义分析.docx_第9页
第9页 / 共26页
天津理工大学编译原理实验3语义分析.docx_第10页
第10页 / 共26页
天津理工大学编译原理实验3语义分析.docx_第11页
第11页 / 共26页
天津理工大学编译原理实验3语义分析.docx_第12页
第12页 / 共26页
天津理工大学编译原理实验3语义分析.docx_第13页
第13页 / 共26页
天津理工大学编译原理实验3语义分析.docx_第14页
第14页 / 共26页
天津理工大学编译原理实验3语义分析.docx_第15页
第15页 / 共26页
天津理工大学编译原理实验3语义分析.docx_第16页
第16页 / 共26页
天津理工大学编译原理实验3语义分析.docx_第17页
第17页 / 共26页
天津理工大学编译原理实验3语义分析.docx_第18页
第18页 / 共26页
天津理工大学编译原理实验3语义分析.docx_第19页
第19页 / 共26页
天津理工大学编译原理实验3语义分析.docx_第20页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

天津理工大学编译原理实验3语义分析.docx

《天津理工大学编译原理实验3语义分析.docx》由会员分享,可在线阅读,更多相关《天津理工大学编译原理实验3语义分析.docx(26页珍藏版)》请在冰点文库上搜索。

天津理工大学编译原理实验3语义分析.docx

天津理工大学编译原理实验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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2