- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
试验三语法分析
0810309科3李君林
一.试验目的:
通过使用、剖析和扩充TINY语言的语义分析程序,掌握编译器的语义分析程序的构造措施。
二.试验内容
(一)运行TINY的语义分析程序(二)扩充TINY的语法分析程序提醒:
考虑作用域(如:函数)和数组时也许需要修改符号表。
三.试验环节
1.先读懂TINY语义程序(有关联的文献:MAIN.CANALYZE.CANALYZE.H)
(1)buildSymtab(syntaxTree);//根据语法树建立符号表通过递归调用traverse(syntaxTree,insertNode,nullProc);
进行staticvoidinsertNode(TreeNode*t),这样将碰到与ID有关的Node信息通过voidst_insert(char*name,intlineno,intloc,intlen)加入到hashTable[h]数据构造中。
(2)接着调用typeCheck(syntaxTree);进行类型检测
通过递归调用traverse(syntaxTree,nullProc,checkNode);将语法树遍历,然后调用staticvoidcheckNode(TreeNode*t)对节点进行类型检测
2.扩充TINY的语法分析程序
本次试验我首先将源程序实现的功能改成符合C_MINUS的符号表与类型检测然后加入没申明调用与数组调用错误即数组没申明而调用数组类型。
四.试验成果
1.对的的测试程序/**/
intgcd(intu,intv[])
if(v==0)
returnu;
else
returngcd(v,u);}
voidmain(void)
intx;inty;
readx;x=y=2;
while(x0)y=y-1;
writey;
return(gcd(x,y);
/**/
运行成果:
经检查测试程序代码无语义错误2.错误测试程序
/**/
intgcd(intu,intv[J){
if(v==0)
returnu;
else
returngcd(v,u);}
voidmain(void){
intx;inty;readx;
t=1;
x=y=2;
x[2]=2;
while(x0)
y=y-1;writey;
return(gcd(x,y);
/**/
试验成果:
检测到13行t没有申明
检测到15行x不是一种数组
五.试验心得
通过本次试验学会了使用、剖析和扩充TINY语言的语义分析程序,掌握编译器的语义分析程序的构造措施。加深了对书本语义分析的理解,感受到学以致用的快感,增强对本课程的爱好。试验中碰到的最大问题:怎样查询符号表判断数组,背面在其数据构造中增长了一种属性Len,假如不是数组将其赋为-1.
六.关键程序代码(ANALYZE.C)
/****************************************************//*File:analyze.c
/*Semanticanalyzerimplementation/*fortheTINYcompiler
/*CompilerConstruction:PrinciplesandPractice*/
/*KennethC.Louden
/****************************************************/
#includeglobals.h#includesymtab.h#includeanalyze.h
/*counterforvariablememorylocations*/staticintlocation=0;
/*Proceduretraverseisagenericrecursive*syntaxtreetraversalroutine:
*itappliespreProcinpreorderandpostProc*inpostordertotreepointedtobyt
*/
staticvoidtraverse(TreeNode*t,
void(*preProc)(TreeNode*),void(*postProc)(TreeNode*))
{if(t!=NULL)
{preProc(t
原创力文档


文档评论(0)