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

开通VIP
 

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

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

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(实验四编译用Yacc工具构造语法分析器.doc)为本站上传会员【丰****】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

实验四编译用Yacc工具构造语法分析器.doc

1、实验4 用Yacc工具构造语法分析器 一、实验目的 掌握移进-归约技术语法分析技术,利用语法分析器生成工具Yacc/Bison实现语法分析器的构造。 二、实验内容 利用语法分析器生成工具Yacc/Bison编写一个语法分析程序,与词法分析器结合,能够根据语言的上下文无关文法,识别输入的单词序列是否文法的句子。 源语言的文法定义见教材附录 A.1,p394,要求实现完整的语言。 三、实验要求 1.个人完成,提交实验报告。 2.实验报告中给出采用测试源代码片断,及其对应的最右推导过程(形式可以自行考虑,如依次给出推导使用的产生式)。 例如,程序片断 四、实验思路 本次实

2、验是一次实现词法分析和语法分析的过程,词法分析的内容与第二次实验类似,对关键词,数字,标识符以及其他类型的字符进行识别,分别返回对应的数据类型,这个过程相对来说是比较简单的,由于有特定的词法分析过程的格式,很容易将代码编写出来。语法分析的过程则给出了文法以及相应的语义动作,代码的编写相对比较复杂。 首先,在D:\FlexBison的目录下建立一个文件夹,我命名为expmt3,将bison.exe和flex.exe放到expmt3目录下。然后编写mylex.l文件和myyacc.y文件,在dos下切换到expmt3目录下,先用命令flex mylex.l生成lex.yy.c文件,再用命令bis

3、on –d myyacc.y生成myyacc.tab.c文件和myyacc.tab.h文件,在这个目录中再新建一个example.c文件,用vc++打开这个文件,然后编译这个文件,再将前两步生成的lex.yy.c、myyacc.tab.c和myyacc.tab.h文件加入到工程中,再编译并连接生成可执行文件。最后测试程序的正确性要在expmt3的debug目录下创建一个测试文件test.txt,将测试片段放入其中,然后在dos界面运行程序,知道产生正确的结果,实验就完成了。 五、具体代码 Mylex.l %option noyywrap %{ #include

4、 #include #include #include #include "myYacc.tab.h" %} delim [ \t\n] ws {delim}+ letter [A-Za-z] digit [0-9] %% {ws} { } "if" {printf("IF ");return(IF);} "else" {printf("ELSE ");return(ELSE);} "int" {printf("INT "); return(BASI

5、C);} "float" {printf("FLOAT "); return(BASIC);} "break" {printf("BREAK");return(BREAK);} "do" {printf("DO ");return(DO);} "while" {printf("WHILE ");return(WHILE);} "true" {printf("TRUE ");return(TRUE);} "index" {printf("INDEX "); return(INDEX);} "bool" {printf("BOOL "); ret

6、urn(BASIC);} "char" {printf("CHAR "); return(BASIC);} "real" {printf("real");return(REAL);} "false" {printf("FLASE "); return(FALSE);} [a-zA-Z_][a-zA-Z0-9_]* {printf("ID");return(ID);} [+-]?[0-9]+ {printf("NUM");return(NUM);} [+-]?[0-9]*[.][0-9]+ {printf("NUM");return(NUM);}

7、 "<" {printf("LT ");return('<');} "<=" {printf("LE ");return(LE);} "=" {printf("= ");return('=');} "==" {printf("EQ ");return(EQ);} "!=" {printf("NE ");return(NE);} ">" {printf("GT ");return('>');} ">=" {printf("GE ");return(GE);} "+" {printf("+ ");

8、return('+');} "-" {printf("- ");return('-');} "[" {printf("[ ");return('[');} "]" {printf("] ");return(']');} "{" {printf("{");return('{');} "}" {printf("}");return('}');} "(" {printf("(");return('(');} ")" {printf(")");return(')');} ";" {pri

9、ntf(";");return(';');} "," {printf(",");return(',');} "&&" {printf("&&");return(AND);} "||" {printf("||");return(OR);} %% Myyacc.y %{ #include #include extern int yylex(); extern int yyerror(); %} %token NUM %token ID %token IF WHILE DO BREAK REAL TRU

10、E FALSE BASIC ELSE INDEX GE LE NE EQ AND OR %% program : block { printf("program-->block\n"); } ; block : '{' decls stmts '}' { printf("block-->{decls stmts}\n"); } ; decls : | decls decl { printf("decls-->decls decl\n"); } ; decl : type ID ';' { printf("decl-->typ

11、e id;\n"); } ; type : type '[' NUM ']' { printf("type-->type[num]\n"); } | BASIC { printf("type-->basic\n"); } ; stmts : | stmts stmt { printf("stmts-->stmts stmt\n"); } ; stmt : matched_stmt { printf("stmt-->matched_stmt\n");} | open_stmt { printf("stmt-->op

12、en_stmt\n");} ; open_stmt: IF '(' booL ')' stmt { printf("open_stmt-->if(bool)stmt\n");} | IF '(' booL ')' matched_stmt ELSE open_stmt { printf("open_stmt-->if(bool) matched_stmt else open_stmt\n");} ; matched_stmt: IF '(' booL ')' matched_stmt ELSE matched_stmt { printf("matche

13、d_stmt-->if(bool) matched_stmt else matched_stmt\n");} | other { printf("matched_stmt-->other\n");} ; other: loc '=' booL ';' { printf("stmt-->loc=bool;\n"); } | WHILE '(' booL ')' stmt { printf("stmt-->while(bool)stmt\n"); } | DO stmt WHILE '(' booL ')' ';' { printf(

14、"stmt-->do stmt while(bool);\n"); } | BREAK ';' { printf("stmt-->break;\n"); } | block { printf("stmt-->block\n"); } ; loc : loc '[' booL ']' { printf("loc-->loc[bool]\n"); } | ID { printf("loc-->id\n"); } ; booL : booL OR join { printf("bool-->bool||join\n"); } |

15、 join { printf("bool-->join\n"); } ; join : join AND equality { printf("join-->join&&equality\n"); } | equality { printf("join-->equality\n"); } ; equality : equality EQ rel { printf("equality-->equality==rel\n"); } | equality NE rel { printf("equality-->equality!=rel\n

16、"); } | rel { printf("equality-->rel\n"); } ; rel : expr '<' expr { printf("rel-->exprexpr<=expr\n"); } | expr GE expr { printf("rel-->expr>=expr\n"); } | expr '>' expr { printf("rel-->expr>expr\n"); } | expr { printf("rel-->ex

17、pr\n"); } ; expr : expr '+' term { printf("expr-->expr+term\n"); } | expr '-' term { printf("expr-->expr-term\n"); } | term { printf("expr-->term\n"); } ; term : term '*' unary { printf("term-->term*unary\n"); } | term '/' unary { printf("term-->term/unary\n"); }

18、 | unary { printf("term-->unary\n"); } ; unary : '!' unary { printf("unary-->!unary\n"); } | '-' unary { printf("unary-->-unary\n"); } | factor { printf("unary-->factor\n"); } ; factor : '(' booL ')' { printf("factor-->(bool)\n"); } | loc { printf("factor-->loc

19、\n"); } | NUM { printf("factor-->num\n"); } | REAL { printf("factor-->real\n"); } | TRUE { printf("factor-->true\n"); } | FALSE { printf("factor-->false\n"); } ; %% int yyerror(s) char *s; { fprintf(stderr,"syntactic error:%s\n",s); return 0; } 六、 实验结果

20、 七、 实验总结 实验中的注意事项: (1)一个由 Yacc 生成的解析器调用 yylex() 函数来获得标记。对于由 Lex 生成的 lexer 来说,要和 Yacc 结合使用,每当 Lex 中匹配一个模式时都必须返回一个标记。 因此 Lex 中匹配模式时的动作一般格式为: {pattern} { /* do smthg*/ return TOKEN_NAME; } 于是 Yacc 就会获得返回的标记。当 Yacc 编译一个带有 _d 标记的myyacc .y文件时,会生成一个头文件myyacc.tab.h,它对每个标记都有 #define 的定义。 如果 Lex 和 Yacc 一起使用的话,头文件必须在相应的 Lex 文件mylex.l中的 C 声明段中包括。 (2)在myyacc.y中要加入对函数int yylex()和函数int yyerror()的外部声明。 (3)对文件放置的位置也要很小心,不然很容易就造成错误 (4)这次的实验使我对语法分析的过程更加了解,更多的掌握了移进——规约技术语法分析,对理论知识起到了巩固的作用,加强了编译整个理论体系的认识,也对flex &bison的操作有了更深一步的了解。

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服