TINY扩充语言的语法分析_第1页
TINY扩充语言的语法分析_第2页
TINY扩充语言的语法分析_第3页
TINY扩充语言的语法分析_第4页
TINY扩充语言的语法分析_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

需求分析程序功能:TINY扩充语言的语法分析扩充的语法规则:实现while、dowhile、for语句和求余计算式子。界面要求:采用MFC界面实现。提供一个源程序的编辑界面,以让用户输入源程序(可保存、打开源程序),可由用户选择是否生成语法树,并可查看所生成的语法树。概要设计具体文法规则设计:(1)While-stmt-->whileexpdostmt-sequenceendwhile(2)Dowhile-stmt-->dostmt-sequencewhileexp(3)For-stmt-->foridentifier:=simple-expto|downtosimple-expdostmt-sequenceenddoto步长递增1,downto步长递减1在课本附录B代码的基础上进行以上文法的扩充。详细设计扩充文法while、dowhile、for语句的语法图:更改变量名因为附录B代码中的变量TokenType和ERROR在MFC中已经预先被使用,所以将它们改名为TokenType2和ERROR2.修改typedefenum{}TokenType2增加保留字: WHILE、DO、TO、DOWNTO、FOR、ENDDO、ENDWHILE增加求余运算符:MOD修改typedefenum{}StmtKind增加语句类型:WhileK、DoWhileK、ForK修改staticstruct{char*str;TokenType2tok;}reservedWords[MAXRESERVED]={}增加保留字关联字符{{"while",WHILE},{"endwhile",ENDWHILE}, {"do",DO},{"to",TO},{"downto",DOWNTO},{"for",FOR},{"enddo",ENDDO}};修改TreeNode*stmt_sequence(void){}函数增加stmt_sequence文法的follow集:(token!=ENDWHILE)&&(token!=WHILE)&&(token!=ENDDO)在parse.c文件中添加以下文法:TreeNode*while_stmt(void)//扩充的while语句文法{TreeNode*t=newStmtNode(WhileK);match(WHILE);if(t!=NULL)t->child[0]=exp();match(DO);if(t!=NULL)t->child[1]=stmt_sequence();match(ENDWHILE);returnt;}TreeNode*dowhile_stmt(void)//扩充的dowhile语句文法{TreeNode*t=newStmtNode(DoWhileK);match(DO);if(t!=NULL)t->child[0]=stmt_sequence();match(WHILE);if(t!=NULL)t->child[1]=exp();returnt;}TreeNode*for_stmt(void)//扩充的for语句文法{TreeNode*t=newStmtNode(ForK);match(FOR);if((t!=NULL)&&(token==ID))t->=copyString(tokenString);match(ID);match(ASSIGN);if(t!=NULL)t->child[0]=simple_exp();if(token==TO)//步长递增1 match(TO);if(token==DOWNTO)//步长递减1 match(DOWNTO);if(t!=NULL) t->child[1]=simple_exp();match(DO);if(t!=NULL) t->child[2]=stmt_sequence();match(ENDDO);returnt;}MFC实现细节:本程序在建立MFC工程时选用单文档的应用程序类型,最后的基类选择CEditView。这样建立起来的工程文件就提供了一个可编辑的输入界面。生成语法树和查看语法树在MFC中的实现:voidCMainFrame::OnTree()//生成语法树按钮{TreeNode*syntaxTree;charpgm[120];/*sourcecodefilename*/CStringstr;GetWindowText(str);//获取窗口文件路径strcpy(pgm,str);pgm[strlen(str)-8]='\0';//去掉文件路径中无效的部分if(strchr(pgm,'.')==NULL)//保证文件后缀是.tnystrcat(pgm,".tny");source=fopen(pgm,"r+");if(source==NULL){fprintf(stderr,"File%snotfound\n",pgm);exit(1);}listing=fopen("Syntax_tree.txt","w+");//输出语法树到文本文件Syntax_tree.txt中fprintf(listing,"\nTINYCOMPILATION:%s\n",pgm);syntaxTree=parse();//生成语法树if(TraceParse){fprintf(listing,"\nSyntaxtree:\n");printTree(syntaxTree);}fclose(source);fclose(listing);MessageBox("语法树已生成!");}voidCMainFrame::OnShowTree()//查看语法树按钮{ //TODO:Addyourcommandhandlercodehere ShellExecute(NULL,"open","Syntax_tree.txt",NULL,NULL,SW_SHOW);//打开文本文件}调试分析设计中遇到的问题及解决:在程序编写过程中遇到的主要问题是没有修改TreeNode*stmt_sequence(void){}函数,给stmt_sequence文法增加follow集:(token!=ENDWHILE)&&(token!=WHILE)&&(token!=ENDDO)。最后通过调试提示enddo或endwhile不是tiny程序正常结束的符号发现了这个问题。在用MFC实现时由于不知道TokenType和ERROR这两个变量在MFC中已经是预先被使用了的,所以程序老是出现错误提示,又找不出问题。后来经过调试发现了这两个变量在MFC中已经被使用了。通过更名解决了这个问题。调试总结:由于本程序大部分是使用了附录B中的代码,通过阅读理解后再使用,所以减少了程序编写中的不了问题。本程序虽然是实现了功能需求,但做得还是比较简陋。生成的语法树也只是把它保存在一个文本文件中,再通过调用ShellExecute函数打开它显示。用户手册本程序的运行环境为MFC界面,可执行文件为:parse.exe用户打开程序即可看到如下主界面:按下“打开”可以选择tiny源文件打开,注意打开的源文件后缀为.tny按下“保存”可以保存输入的tiny源程序,注意保存的文件后缀为.tny按下“查看语法树”下拉菜单的“生成语法树”就可以生成语法树了,如果源程序是直接输入的话,要先保存后才能生成语法树。按下“查看语法树”下拉菜单的“查看语法树”就可以查看生成的语法树。测试结果For语句文法测试:1)测试文件for_test.tny:readx;{inputaninteger}forx:=1toy+5dofact:=1;repeatfact:=fact*x;x:=x%2untilx=0;writefactenddo2)生成的语法树:Syntaxtree:Read:xForConst:1Op:+Id:yConst:5Assignto:factConst:1RepeatAssignto:factOp:*Id:factId:xAssignto:xOp:%Id:xConst:2Op:=Id:xConst:0WriteId:factWhile语句文法测试:1)测试文件while_test.tny:readx;{inputaninteger}while0<xdofact:=1;repeatfact:=fact*x;x:=x%2untilx=0;writefactendwhile2)生成的语法树:Syntaxtree:Read:xWhileOp:<Const:0Id:xAssignto:factConst:1RepeatAssignto:factOp:*Id:factId:xAssignto:xOp:%Id:xConst:2Op:=Id:xConst:0WriteId:factDowhile语句文法测试:1)测试文件dowhile_test.tny:readx;{inputaninteger}dofact:=1;repeatfact:=fact*x;x:=x%2untilx=0;writefactwhilex=02)生成的语法树:Syntaxtree:Read:xDoAssignto:factConst:1RepeatAssignto:factOp:*Id:factId:

温馨提示

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

评论

0/150

提交评论