ImageVerifierCode 换一换
格式:DOCX , 页数:8 ,大小:17.75KB ,
资源ID:21344617      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/21344617.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(实验四用语法分析器生成工具实现语法分析器文档格式.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

实验四用语法分析器生成工具实现语法分析器文档格式.docx

1、delim tnws delim+letter A-Za-zdigit 0-9%ws if printf(IF );return(IF);elseELSE return(ELSE);intINT return(BASIC);floatFLOAT breakBREAKreturn(BREAK);doDO return(DO);whileWHILE return(WHILE);trueTRUE return(TRUE);indexINDEX return(INDEX);boolBOOL charCHAR realreturn(REAL);falseFLASE return(FALSE);a-zA-

2、Z_a-zA-Z0-9_* printf(IDreturn(ID);+-?0-9+ printf(NUMreturn(NUM);0-9*.0-9+ printf(GT GE return(GE);+ +- - ();,&return(AND);|return(OR);%token NUM%token ID %token IF WHILE DO BREAK REAL TRUE FALSE BASIC ELSE INDEX GE LE NE EQ AND ORprogram : block printf(program-blockn ;block : decls stmts printf(bloc

3、k-decls stmtsndecls : | decls decl printf(decls-decls declndecl : type ID decl-type id;ntype : type NUM type-typenumn | BASIC printf(basicnstmts : | stmts stmt printf(stmts-stmts stmtnstmt : matched_stmt printf(stmt-matched_stmtn | open_stmt printf(open_stmtnopen_stmt: IF booL stmt printf(open_stmt-

4、if(bool)stmtn | IF matched_stmt ELSE open_stmt printf(if(bool) matched_stmt else open_stmtnmatched_stmt: matched_stmt ELSE matched_stmt printf(matched_stmt-if(bool) matched_stmt else matched_stmtn | other printf(othernother: loc loc=bool; | WHILE while(bool)stmtn | DO stmt WHILE do stmt while(bool);

5、 | BREAK break; | block printf(loc :loc-locbooln | ID printf(idnbooL : booL OR join printf(bool-bool|joinn | join printf(joinnjoin : join AND equality printf(join-join&equalityn | equality printf(equality : equality EQ rel printf(equality-equality=reln | equality NE rel printf(equality!=reln | rel p

6、rintf(relnrel : expr expr printf(rel-expr | expr | expr printf(expr : term printf(expr-expr+termnexpr-termn | term printf(termnterm : term * unary printf(term-term*unaryn | term /term/unaryn | unary printf(unarynunary :unary- | -unaryn | factor printf(factornfactor :factor-(bool)n | loc printf(locn

7、| NUM printf(numn | REAL printf(realn | TRUE printf(truen | FALSE printf(falsen#includelex.yy.cmain(int argc,char *argv) yyparse();yyerror(char *s) fprintf(stderr,error:%sn,s);六、实验结果Lex.l词法分析结果:Yacc.y语法分析结果:.七、实验总结遇到的问题1):刚开始在window环境下使用lex和yacc工具,编写lex.l文件的时候,在识别到if时,return(IF),提示IF没有定义,定义#define I

8、F 265后,在yacc.y文件中,再定义%token IF,发生重定义错误。解决办法:在lex.l文件中,无须定义#define IF 265,只在yacc.y文件中定义%token IF即可,不过在yacc.y中要加入#include”,使两个文件关联起来。遇到的问题2):在使用yacc工具编译yacc.y文件时,提示缺少bison.simple。上网下载一个bison.simple,放到yacc工具主目录下。遇到的问题3):在lex.l和yacc.y文件的第三部分同时写了main函数,导致错误。Lex.l文件中第三部分为空,不需要任何函数。因为关联lex.l和yacc.y后,yypars

9、e()会自动调用yylex()。遇到的问题4):生成yacc.tab.c文件后,放入VC+编译器中编译,提示错误如下:error LNK2001: unresolved external symbol _yyerrorDebug/main.exe : fatal error LNK1120: 1 unresolved externals未找到解决办法,无奈只能放弃window环境,改用linux环境编写。遇到的问题5):IF bool stmt-if(bool)stmtn stmt ELSE stmt printf(if(bool)stmt else stmtn存在冲突。改为:遇到的问题6):

10、这是一个致命性的问题,由于使用的linux下的lex版本太低,导致照抄课本上的ID和NUM正则表达式无法识别,困扰了我很久很久。多亏了朋友的帮助,终于发现错误,把letter(letter|digit)*改为a-zA-Z_a-zA-Z0-9_*;把digit+(.digit+)?(E+-?digit+)?改为+-?0-9+和+-?0-9*.0-9+,分别用于识别整数和浮点数。遇到的问题7):一些小错误,比如词法分析中,漏识别while等,还有把=误当做了EQ。仔细检查lex.l,对错漏的部分进行改补。遇到的问题8):对IF 和IF ELSE消除二义性后,依然存在冲突如下:尚未找到解决办法。本次

11、实验主要是学习结合lex和yacc工具进行语法分析,通过工具文档,了解lex和yacc的编写规则,然后使用教程后的源语言定义规则,即语法分析的各个文法即可编写出正确的yacc.y。在linux下使用lex和yacc比较容易,而在window下使用,就相对麻烦,会遇到的各种问题,所以该实验选用linux环境是不二选择。其次,linux环境可能存在lex和yacc的版本比较低,导致一些教程上的一些正则表达式无法识别,这个错误比较难发现。总之,通过本次实验,用了近一天的时间调试程序,对词法分析和语法分析有了进一步的认识,同时对程序纠错有了进一步的体会,再者更加熟悉了linux环境操作,更加体会到了linux功能的强大。但本实验还有一些令人不太满意的地方,比如*.y文件中依然存在冲突没有解决彻底,而且*.l文件中对于浮点数的识别还是具有一定的局限性,不能识别所有可能出现的浮点数。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1