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

上传人:hs****ma 文档编号:448424350 上传时间:2022-07-28 格式:DOCX 页数:10 大小:290.82KB
返回 下载 相关 举报
实验四编译用Yacc工具构造语法分析器_第1页
第1页 / 共10页
实验四编译用Yacc工具构造语法分析器_第2页
第2页 / 共10页
实验四编译用Yacc工具构造语法分析器_第3页
第3页 / 共10页
实验四编译用Yacc工具构造语法分析器_第4页
第4页 / 共10页
实验四编译用Yacc工具构造语法分析器_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《实验四编译用Yacc工具构造语法分析器》由会员分享,可在线阅读,更多相关《实验四编译用Yacc工具构造语法分析器(10页珍藏版)》请在金锄头文库上搜索。

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

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

3、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#include#inc

4、lude#include#include myYacc.tab.h%delim tnwsdelim+letterA-Za-zdigit0-9%ws ifprintf(IF );return(IF);elseprintf(ELSE );return(ELSE);intprintf(INT ); return(BASIC);floatprintf(FLOAT ); return(BASIC);breakprintf(BREAK);return(BREAK);doprintf(DO );return(DO);whileprintf(WHILE );return(WHILE);trueprintf(T

5、RUE );return(TRUE);indexprintf(INDEX ); return(INDEX);boolprintf(BOOL ); return(BASIC);charprintf(CHAR ); return(BASIC);realprintf(real);return(REAL);falseprintf(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);printf(

6、LT );return();=+-();,&|%printf(EQ );return(EQ);printf(NE );return(NE);printf(GT );return();printf(GE );return(GE);printf(+ );return(+);printf(- );return(-);printf( );return();printf( );return();printf();return();printf();return();printf();return();printf();return();printf(;);return(;);printf(,);retu

7、rn(,);printf(&);return(AND);printf(|);return(OR);Myyacc.y%#include#includeextern int yylex();extern int yyerror();%token NUM%token ID%token IF WHILE DO BREAK REAL TRUE FALSE BASIC ELSE INDEX GE LENE EQ AND OR%program : block printf(program-blockn); ;block : decls stmts printf(block-decls stmtsn); ;d

8、ecls :| decls decl printf(decls-decls decln); ;decl : type ID ; printf(decl-type id;n); ;type : type NUM printf(type-typenumn); | BASIC printf(type-basicn); ;stmts :| stmts stmt printf(stmts-stmts stmtn); ;stmt : matched_stmt printf(stmt-matched_stmtn);| open_stmt printf(stmt-open_stmtn);open_stmt:

9、IF ( booL ) stmt printf(open_stmt-if(bool)stmtn);| IF ( booL ) matched_stmt ELSE open_stmt printf(open_stmt-if(bool)matched_stmt else open_stmtn);matched_stmt: IF ( booL ) matched_stmt ELSE matched_stmt printf(matched_stmt-if(bool) matched_stmt else matched_stmtn); | other printf(matched_stmt-othern

10、);other: loc = booL ; printf(stmt-loc=bool;n); | WHILE ( booL ) stmt printf(stmt-while(bool)stmtn); | DO stmt WHILE ( booL ) ; printf(stmt-do stmt while(bool);n); | BREAK ; printf(stmt-break;n); | block printf(stmt-blockn); ;loc : loc booL printf(loc-locbooln); | ID printf(loc-idn); ;booL : booL OR

11、join printf(bool-bool|joinn); | join printf(bool-joinn); ;join : join AND equality printf(join-join&equalityn); | equality printf(join-equalityn); ;equality : equality EQ rel printf(equality-equality=reln); | equality NE rel printf(equality-equality!=reln); | rel printf(equality-reln); ;rel : expr exprexprexpr=exprn); | expr expr printf(rel-exprexprn); | expr printf(rel-exprn); ;expr : expr + term pri

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 外语文库 > 英语学习

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号