语义分析实验报告_第1页
语义分析实验报告_第2页
语义分析实验报告_第3页
语义分析实验报告_第4页
语义分析实验报告_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一、实验内容简介1).实验目的:通过实验,掌握语义分析的,掌握汇编代码的分析过程。2).实验内容: 设计、编制、调试一个语义分析子程序,并将语义分析得到的汇编代码在模拟机上运行,在屏幕上输出模拟机运行结果。其中运用到了词法分析得到的单词表和语法分析对单词表的分析结果,在语法分析过程中语义分析得到汇编代码。从理论和实践上掌握高级语言对源文件的得到的中间代码的分析能力。3).实验要求:1.清楚了解 test 语言的语义,并能对其进行合理分析和运算2.根据test 语言的语义结构,得到正确的中间代码,并能对中间代码进行正确的运行,得到正确结果。3.增加如 do_while 等语句,并合理的与 tes

2、t 其它语句相结合,模0实验名称语义分析程序设计实验类型设计、指导曾立胜小组成员学号小组分工20111598实验地点东六 E109实验时间第 11、12 周三上午第一讲拟机运行不错误4.增加%,-等符号,使得 test 语言功能更加强大5.增加STR 类型6.对于和的测试数据能通过7.提交实验报告4).测试数据要求:1.提示(或默认)输入测试的源程序文件名,如 incf1.t;(1 为测试文件序号,t 指test 文件后缀)2.提示(或默认)输出的单词表文件名,如 outyf1.dat;(yf 为语法的拼音缩写)3.语义分析过程中,对首先输出程序所有指令,然后把程序运行过程中令和结果显示到屏幕

3、上。5).数据的逻辑结构分析:LOAD D 将D 中的内容加载到操作数栈LOADIa 将常量 a 压入操作数栈STO D 将操作数栈栈顶单元内容存入 D,且栈顶单元内容保持不变POP 栈顶单元内容出栈ADD将次栈顶单元与栈顶单元内容出栈并相加,和置于栈顶SUB将次栈顶单元与栈顶单元内容出栈并相减,和置于栈顶MULT将次栈顶单元与栈顶单元内容出栈并相乘,和置于栈顶1DIV将次栈顶单元与栈顶单元内容出栈并相除,和置于栈顶REM将次栈顶单元与栈顶单元内容出栈并求余,和置于栈顶BR lab无条件转移到 labBRF lab 检查栈顶单元逻辑值并出栈,若为假(0)则转移到labEQ 将栈顶两单元做等于比

4、较并出栈,并将结果真假(1 或 0)至于栈顶NOTEQ 将栈顶两单元做不等于比较并出栈,并将结果真假(1或 0)至于栈顶GT 将次栈顶与栈顶做大于比较并出栈,并将结果真假(1 或 0)至于栈顶LES 将次栈顶与栈顶做小于比较并出栈,并将结果真假(1 或 0)至于栈顶GE 将次栈顶与栈顶做大于等于比较并出栈,并将结果真假(1或 0)至于栈顶LE 将次栈顶与栈顶做小于等于比较并出栈,并将结果真假(1或 0)至于栈顶OR 将栈顶两单元做逻辑或运算并出栈,并将结果真假(1 或 0)至于栈顶NOT 将栈顶的逻辑值取反VNOT 将栈顶的逻辑值取反IN 从标准输入(键盘)读入一个整形数据,并入栈OUT 将栈

5、顶单元内容出栈,并输出到标准输出上(显示器)2LOADS STR 输出字符串STOP 停止执行6).结构:语义分析过程中了中间代码的和模拟机运行时文件的显示。程序运行过程中,各个部分有不同的指令在文件中,二、实验过程语1、主要功能: 法语义分析分中间代码的生成和模拟机运行中间代码的过程。模拟机运行的过程也就是对源程序运行的过程,通过模拟机可以得到 析所编写的源程序想要得到的结或数据。束文件的存储也就结束3。2、流程图开始打开文件结束Y是否已经所有指令文件是否读完YN内容是否为标号将下一个code所代表的Y标号位置是否为“LOAD”Y地址内容入栈NN将下一个code作为常量入栈是否为“LOADI

6、”Y文件并将内容存到codeN将操作数栈栈顶单元内容存入下一个code所代将次栈顶单元与栈顶单元内容出栈并求余,和置于栈顶是否为“STO”Y表地址,且栈顶单元内容保持不变是否为“REM”YNNN无条件转移到下一个code代表编号的位置是否为“POP”栈顶单元内容出栈Y是否为“BR”YNN检查栈顶单元逻辑值并出栈,若为假(0)则转移到下一个code所代表编号的位置将次栈顶单元与栈顶单元内容出栈并相加,和是否为“ADD”Y是否为“BRF”Y置于栈顶NN将栈顶两单元做等于比较并出栈,并将结果真假(1或0)至于栈顶将次栈顶单元与栈顶单元内容出栈并相减,和是否为“EQ”Y是否为“SUB”Y置于栈顶NN将

7、栈顶两单元做不等于比较并出栈,并将结果真假(1或0)至于栈顶将次栈顶单元与栈顶单元内容出栈并相乘,和是否为“NOTEQ”Y是否为“MULT”Y置于栈顶NNN将次栈顶与栈顶做大于比较并出栈,并将结果真假(1或0)至于栈顶将次栈顶单元与栈顶单元内容出栈并相除,和是否为“GT”Y是否为“DIV”Y置于栈顶N将次栈顶与栈顶做小于比较并出栈,并将结果将栈顶的逻辑值取反,是否为“NOT”Y是否为“LES”Y结果至于栈顶真假(1或0)至于栈顶NN将次栈顶与栈顶做大于将栈顶的值取反,结果等于比较并出栈,并将结果真假(1或0)至于栈顶是否为“VNOT”Y是否为“GE”至于栈顶YNN是否是否NN将栈顶单元内容出栈

8、,将栈顶两单元做逻辑与运算并出栈,并将结果真假(1或0)至于栈顶是否为”OUT“并输出到标准输出Y是否为“AND”Y上(显示器)NN将栈顶两单元做逻辑或运算并出栈,并将结果真假(1或0)至于栈顶是否为“LOADS”输出字符串Y是否为“OR”YNN是否为“STOP”Y停止执行4为“IN”Y从标准输入(键盘)读入一个整形数据,并入栈为“LE”Y将次栈顶与栈顶做小于等于比较并出栈,并将结果真假(1或0)至于栈顶文件并将内容存到code3、主要代码:负号运算的添加: 语法分析部分:if (strcmp(token,"-") = 0)log = 1;es = file_scan();

9、 if(es > 0)return es;printf("%s %sn", token, token1);if (strcmp(token, "(") = 0)es = file_scan(); if(es > 0)return es;printf("%s %sn", token, token1); es = expression();if (es > 0)return es;if (strcmp(token, ")")es = 6; return es;es = file_scan(); if(

10、es > 0)return es;printf("%s %sn", token, token1); if (log = 1)fprintf(fout2,"VNOTn");elseif (strcmp(token, "ID") = 0)int address;es = lookup(token1,&address);5if (es > 0)return es;fprintf(fout2," es = file_scan(); if(es > 0)return es;LOAD %dn",add

11、ress);printf("%s %sn", token, token1); if (log = 1)fprintf(fout2,"VNOTn");return es;if (strcmp(token, "NUM") = 0)fprintf(fout2," es = file_scan(); if(es > 0)return es;LOADI %sn",token1);printf("%s %sn", token, token1); if (log = 1)fprintf(fout2,&q

12、uot;VNOTn");return es;elsees = 7; return es;模拟机代码部分:/VNOT 将栈顶的逻辑值取反if (strcmp(codei,"VNOT") = 0)stackstacktop-1 = -stackstacktop-1;添加字符串:6语法分析部分:if (strcmp(token,"STR") = 0)fprintf(fout2," es = file_scan(); if(es > 0)return es;LOADS %sn",token1);printf("%s

13、%sn", token, token1); if (strcmp(token, "")es = 4; return es;es = file_scan(); if(es > 0)return es;printf("%s %sn", token, token1);模拟机部分:/LOADS 输出字符串if (strcmp(codei,"LOADS") = 0)i+;cout << codei << endl;添加取模运算语法分析部分while(strcmp(token,"*")=

14、0 strcmp(token, "%") = 0)char token220; strcpy(token2,token); es = file_scan();if(es > 0)return es;printf("%s %sn", token, token1); es = factor();if (es > 0)return es;if (strcmp(token2,"*") = 0)|strcmp(token,"/")=0|7fprintf(fout2,"MULTn");if (s

15、trcmp(token2,"/") = 0)fprintf(fout2,"DIVn");if (strcmp(token2,"%") = 0)fprintf(fout2,"REMn");模拟机部分:/REM 将次栈顶单元与栈顶单元内容出栈并求余,和置于栈顶if (strcmp(codei, "REM") = 0)stackstacktop-2 = stackstacktop-2 % stackstacktop-1; stacktop-;三、自我测试及结果分析1)测试表达语句和负号:2)测试for 语句83)测试while4)测试do_while5)测试read96)测试write7)测试if8)测试复合语句109)测试求余数10)综合测试四、现场测试及结果分析1)测试标识符定义和 if112)测试标识符定义和 write3)测试表达式4)测试if125)测试if 越界6)测试for 整形越界7)测试do_while138)测试readwritefor9)测试求余数10)测试while14五、实验完善及解结果总结本次实验是编译原理课

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论