网站大量收购独家精品文档,联系QQ:2885784924

Yacc使用指南.pdfVIP

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Yacc使用指南

YACC (BISON )使用指南 YACC (Yet Another Compile-Compiler )是语法分析器生成工具,它生成的是LALR 分 析器。Yacc 于上世纪70 年代产生,是美国贝尔实验室的产品,已经用于帮助实现了几百个 编译器。 Yacc 是linux 下的工具,本实验使用的编译工具是cygwin (cygwin 在windows 下模拟 一个linux 环境)下的bison ,它与Yacc 的使用方法基本相同,只有很少的差别。 一.YACC 的使用方法: 1. 用户按照 Yacc 规定的规则写出文法说明文件,该文件一般以.y 为扩展名(有的系统 以.grm 为扩展名。) 2. Yacc 编译器将此文法说明文件 (假设该文件为filename.y )转换成用C 编写的语法分析 器文件 filename.tab.c (如果在编译时加上某些参数还可以生成头文件filename.tab.h )。 这个文件里至少应该包含语法分析驱动程序yyparse() 以及LALR 分析表。在这个文件里, 语法分析驱动程序调用yylex()这个函数获取输入记号,每次调用yylex()都能获取一个输 入记号。yylex()可以由lex 生成,也可以自己用c 语言写一个yylex() 函数,只要每次调 用该函数时返回一个记号即可。 3. 用C 编译器(本实验所给工具为cygwin 下的gcc )将filename.tab.c 编译为可执行文件 (cygwin 下默认为a.exe )。 4. a.exe 即为可执行的语法分析器。 二.文法说明文件 (即Yacc 源程序)的写法: 文法说明文件,顾名思义,就是将一个语言的文法说清楚。在Yacc 中,这个说明文件 可以分为三部分,以符号%%分开: [第一部分:定义段] %% 第二部分:规则段 [%% 第三部分:辅助函数段] 其中,第一部分及第三部分和第三部分之上的%%都可以省略 (即上述方括号括起的部 分可以省略)。以%开头的符号和关键字,或者是规则段的各个规则一般顶着行首来写,前 面没有空格。 1. 第一部分定义段的写法: 定义段可以分为两部分: 第一部分以符号%{和%}包裹,里面为以C 语法写的一些定义和声明:例如,文件包含, 宏定义,全局变量定义,函数声明等。 第二部分主要是对文法的终结符和非终结符做一些相关声明。这些声明主要有如下一 些:%token,%left ,%right,%nonassoc,%union,%type,%start 。下面分别说明它们的用 法。 %token 定义文法中使用了哪些终结符,定义形式为: %token TOKEN1 TOKEN2 TOKEN3 …. 其中TOKEN1,TOKEN2 等为终结符,终结符一般全大写。 %left,%right,%nonassoc 也是定义文法中使用的终结符,定义形式与%token 类似,但 是他们定义的终结符具有某种优先级和结合性,%left 表示左结合,%right 表示右结 合,%nonassoc 表示不可结合(即它定义的终结符不能连续出现:例如,如果文法中不允 许出现形如 abc 的句子,则就是不可结合的)。而优先级关系则是以他们定义出现的顺 序决定的,先定义的优先级低,最后定义的优先级最高,同时定义的优先级相同。例如,如 果有如下定义: %left A B %nonassoc C %right D 则表示优先级关系为: A=B C D ,而结合性关系为:A,B 左结合,C 不可结合,D 右结 合。 %start 指定文法的开始符号(非终结符),定义形式为: %start startsym ,其中 startsym 为文法的开始符号。如果不使用%start 定义文法开始符号,则默认在第二部分规则 段中定义的第一条产生式规则的左部非终结符为开始符号。 %union 和%type 用来处理文法中各符号所带的属性。在词法分析的学习中,我们知道 记号是由记号名和记号的属性值两部分组成的,文法中的终结符就是记号,他们有属性值, 同样,非终结符也是可以有属性值的。 Yacc 维护一个栈来保存文法符号的“属性值”,这个栈与移进-归约分析中的文法符号栈 是对应的:即,

文档评论(0)

yaobanwd + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档