语法分析器yacc实验报告.doc

上传人:scccc 文档编号:14686182 上传时间:2022-02-11 格式:DOC 页数:6 大小:62.50KB
返回 下载 相关 举报
语法分析器yacc实验报告.doc_第1页
第1页 / 共6页
语法分析器yacc实验报告.doc_第2页
第2页 / 共6页
语法分析器yacc实验报告.doc_第3页
第3页 / 共6页
亲,该文档总共6页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《语法分析器yacc实验报告.doc》由会员分享,可在线阅读,更多相关《语法分析器yacc实验报告.doc(6页珍藏版)》请在三一文库上搜索。

1、大学学院实验报告学号:姓名:专业:班级:第 周课程名称编译原理课程设计实验课时实验项目基于YACC的语法分析器实验时间实验目的1. 学习基于YACC的语法分析器的构造方法。2. 学习C-的语法结构。实验环境Parser Gen eratorVC+实验内容(算法、程 序、步骤和 方法)基于YACC构造词法分析器的方法1 YACC文件格式Lex文件分成三个部分,分别为definitions、rules以及auxiliary routines,中间用%分割开。Definitions包括要加入到生成的C程序的头部的代码,包括 #include语句、#define语句及一些全局变量的定义。token也在

2、 Definitions部分定义,YACC规定,必须自己定义token,他将token 定义为一系列从258开始的正整数,如在Definition部分加入了如 下定义:%token NUMBER,则在生成的C代码中:#define NUMBER 258。当然这个值也可以由用户定义。Definitions中同时还定义了 YACC中的返回值类型,由于rules 部分是由固定符号来代替一个 Symbol的返回值,其默认类型为int, 如果用户布望返回其他类型的值(如 ParseTree树结点),则可以 在 Definition中定义Symbol的返回值。首先使用一个 %union包 含所有需要的返回

3、值类型,定义 type 其中包含所有返回值 为 t 的 Symbol。Definitions中可以定义语法的结合性来消除二义性,包括两个 符号%left表示左结合和%right表示右结合。rules部分定义所有语法,以及语法识别出后执行的操作。例如:declaration:var_declaration $ = $1; |fun_declaration $ = $1; J%表示产生式左边,$n表示产生式右边第n个字符的返回值, 这条规则表示var_declaration或fun_declaration识别出后,将其赋 值给 declaration。Auxiliary部分包括rules部分使用的

4、一些辅助函数,同时,main 函数也在其中定义。YACC中会自动调用yylex()获取token,默认 yylex()返回int,代表识别出的token,如果文件结束返回0。因此 一般会进行如下定义:static Type yylex(void) return getToke n(); Type就是int,专门代表token值。Auxiliary部分还可以定义YACC的出错处理函数,yyerror(char*s),其中s是YACC在遇到错误时产生的错误信息。YACC的入口函数为:yyparse(),调用这个函数即开始语法分 析过程。2数据结构我们需要再YACC中构造Parse Tree必须定义

5、树结点,观察 C- 的语法,我们可以将语法分为三类:Declaration :包括函数与变量的声明。Stateme nt :包括各种语句,如循环语句,选择语句等。Expressi on :包括各种表达式及各种变量、常量。我们也将节点类型分为Dec、Stmt、Expo节点类型定义如下:typedef struct treeNode果有NUM,则立刻用一个变量暂存,因为后面的识别会把 Toke nV alue覆盖掉。女口: type_specifier id LBRACKET NUM /* 记录 NUM*/ currentNum = atoi(toke nStr in g); RBRACKET S

6、EMICOLON2如果有ID,与NUM同理,用立刻一个字符串暂存。3如果产生式右边有多余一个的Symbol,则必须为$建立结点, 并将右面的Symbo作为他的儿子,如果有ID、NUM、type_specfier, 和关键字,则不需建立结点,直接赋值给结点中的变量或忽略(结 点类型自动说明)。如:iteration_stmt:WHILE LPARENTHESIS expressi on RPARENTHESISstateme nt$ = newStmtNode(WhileK);$ - child0 = $3;$ - child1 = $5;4.如果右边仅有一个 Symbol,如果为Token,则

7、返回Token 值,如果为 Non termi nal,直接 $ = $1。如:stateme nt:expressi on _stmt $ = $1; 5如果有左递归,则统一用下面代码处理,注意,左递归的结 点存储在sibling中而不是child中。tateme nt_list:stateme nt_list stateme ntTreeNode* t = $1;if( t != NULL )while(t-sibling != NULL)t = t-sibli ng;t-sibli ng = $2;$ = $1;else$ = $2;|$ = NULL;YACC是由yylex()提供To

8、ken,因此需要编写getToken()函数, 使用lex或手工实现均可,但需注意,其返回的Token值必须是YACC 中定义的int,也就是说,不能在别处定义 TokenTypeo在main函数中调用yyparse()即可进行编译。实验源程序如下:/* a program to perform select ion sort on a 10 eleme nt array. */int x10;int mini oc( int a, int low, int high )数据记录和计算int i; int x; int k;k = low;x = alow;i = low + 1;while

9、( i high )if ( ai x )x = ai;k = i; return k;结论 (结果)生成的Parse Tree如下所示:|_Arr n ame:x, type:INT|_Number type:INT, value:10|_Fun Dec n ame: mini oc, retur n:INT|_ArrParam n ame:a, type:INT|_ValParam n ame:low, type:INT|_ValParam n ame:high, type:INT|_Comp|_Var n ame:i, type:INT|_Var n ame:x, type:INT|_V

10、ar n ame:k, type:INT|_Assign|_VarId n ame:k|_VarId n ame:low|_Assign|_VarId n ame:x|_ArrId n ame:low|_VarId n ame:low|_Assign|_VarId n ame:i|_Expressi on type:+|_VarId n ame:low|_Number type:INT, value:1|_While|_Expressi on type:|_VarId n ame:i|_VarId n ame:high|_Comp|_Return|_VarId n ame:k可见ParseTr

11、ee中所需结点都被生成,并且ID、NUM、type specifier都被记录在结点中。1.通过本实验,我熟悉了C-的语法规则,学习了 ParseTree的构造方法。2.学习了通过YACC构造语法分析器的方法,了解了YACC的三个部分:declarations、rules、auxiliary的声明、实现以及如何与Scanner进行继承。事实上YACC与 Scanner的联系之处便在于统一的token疋义(疋义小结为一系列int),以及一个获取函数yylex()。3.学习了 Parse的打印方法,模仿 Windows中的目录树,使用符号|和_,达到了不错的效果。指导老师评议成绩评定:指导教师签名:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1