大学学 院实验报告学号:姓名:专业:班级:第周课程名称编译原理课程设计实验课时实验项目基于 YACC的语法分析器实验时间实验目的1.学习基于 YACC的语法分析器的构造方法。2.学习 C-的语法结构。实验环境Parser GeneratorVC++ 实 验 内 容(算法、程序、步骤和方法)基于 YACC构造词法分析器的方法1 YACC文件格式Lex 文件分成三个部分,分别为definitions、rules 以及auxiliary routines,中间用 %%分割开。Definitions包括要加入到生成的C程序的头部的代码, 包括#include语句、#define 语句及一些全局变量的定义。token 也在Definitions部分定义,YACC规定,必须自己定义 token ,他将 token定义为一系列从 258 开始的正整数,如在Definition部分加入了如下定义:%token NUMBER, 则在生成的 C代码中:#define NUMBER 258。当然这个值也可以由用户定义。Definitions中同时还定义了YACC中的返回值类型,由于rules 部分是由固定符号来代替一个Symbol 的返回值,其默认类型为 int ,如果用户希望返回其他类型的值 (如 ParseTree 树结点),则可以在 Definition中定义 Symbol的返回值。首先使用一个%union{⋯} 包含所有需要的返回值类型,定义%type { ⋯} 其中包含所有返回值为t 的 Symbol。Definitions中可以定义语法的结合性来消除二义性,包括两个符号 %left 表示左结合和 %right 表示右结合。rules 部分定义所有语法,以及语法识别出后执行的操作。例如:declaration : var_declaration { $$ = $1; }| fun_declaration { $$ = $1; };%%表示产生式左边, $n 表示产生式右边第n 个字符的返回值,这条规则表示 var_declaration或 fun_declaration识别出后,将其赋值给 declaration。Auxiliary部分包括 rules部分使用的一些辅助函数,同时,main 函数也在其中定义。 YACC中会自动调用 yylex() 获取 token ,默认 yylex() 返回 int ,代表识别出的 token ,如果文件结束返回0。因此一般会进行如下定义:static Type yylex(void){ return getToken(); }Type 就是 int ,专门代表 token 值。Auxiliary部分还可以定义 YACC的出错处理函数,yyerror(char *s) ,其中 s 是 YACC在遇到错误时产生的错误信息。YACC的入口函数为: yyparse() ,调用这个函数即开始语法分析过程。2 数据结构我们需要再 YACC中构造 Parse Tree, 必须定义树结点,...