yacc原理.docVIP

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

Stephen C. Johnson Bell Laboratories Murray Hill, New Jersey 07974 翻译:寒蝉退士 译者声明: 译者对译文不做任何担保,译者对译文不拥有任何权利并且不负担任何责任和义务。 原文:/7thEdMan/vol2/yacc.bun 摘要 计算机程序的输入通常有某种结构;实际上,可以认为每个需要输入的计算机程序都定义了一门它所接受的“输入语言”。输入语言可以像编程语言那么复杂,或者像一序列的数那么简单。不幸的是,通常的输入设施是有限的、难于使用的,并经常疏于检查它们的输入的有效性。 Yacc 提供了一个通用工具来描述计算机程序的输入。Yacc 用户规定它的输入的结构,连同在识别每个这种结构的时候调用的代码。Yacc 把这样的规定转换成操作输入处理的一个子例程;用这个子例程处理用户应用中的多数控制流经常是方便和适当的。 Yacc 生成的输入子例程调用用户提供的一个例程来返回下一个基本输入项目(item)。所以,用户可以以单个的输入字符的方式,或以更高层构造如名字和数的方式来规定它的输入。通过用户提供的例程还可以处理惯用的特征如注释和(行)接续约定,这些东西典型的违反容易的文法规定。 Yacc 是用可移植的 C 语言写成的。接受的规定类别是非常一般性的: 带有去歧义规则的 LALR(1) 文法。 除了用于 C、APL、Pascal、RATFOR 等编译器之外,Yacc 还用于非常规语言,包括一个照相排版机语言、一些桌面计算器语言、一个文档检索系统、和一个 Fortran 调试系统。 July 31,1978 目录 0: 介绍 1: 基本规定 2: 动作 3: 词法分析 4: 解析器如何工作 5: 歧义和冲突 6: 优先级 7: 错误处理 8: Yacc 环境 9: 对准备规定的提示 输入样式 左递归 词法搭配 保留字 10: 高级主题 在动作中模拟错误和接受 访问外围规则中的值 支持任意的值类型 11: 致谢 引用 附录 A: 简单的例子 附录 B: Yacc 输入语法 附录 C: 高级的例子 附录 D: 支持但不鼓励的旧特征 0: 介绍 Yacc 提供了一个通用工具来在计算机程序的输入上施加结构。Yacc 用户准备输入处理的规定;它包括描述输入结构的规则,在识别了这些规则的时候调用的代码,和做基本输入的一个低层例程。Yacc 接着生成一个函数来控制输入处理。这个函数叫做解析器(parser),它调用用户提供的低层输入例程(词法分析器(analyzer))来从输入流中选取基本项目(叫做记号(token))。依据叫做文法规则的输入结构规则来组织这些记号;在识别了这些规则中的某一个的时候,接着调用为这个规则提供的叫做动作的用户代码;动作有能力返回值并使用其他动作的值。 Yacc 是用 C[1] 语言的一个可移植方言写成的,并且动作和输出的例程也一样使用 C 语言。此外,Yacc 的很多语法约定依从 C 语言。 输入规定的心脏是一组文法规则。每个规则描述一个允许的结构并给它一个名字。例如,下面的文法规则 date : month_name day , year ; 这里的 date、month_name、day、和 year 表示在输入处理中它感兴趣的那些结构;month_name、day 和 year 大概是在其他地方定义的。逗号“,”包围在单引号之中;这暗示了逗号在输入中是作为文字(literal)出现的。冒号和分号只是充当规则中的标点符号,而对控制输入没有意义。所以,有着正确定义的输入 July 4, 1776 可以匹配上述规则。 输入处理的一个重要部分是完成词法分析器。这个用户例程读取输入流,识别低层结构,并把这些记号传达到解析器。出于历史原因,词法分析器识别的结构叫做终结符(terminal symbol),而解析器识别的结构叫做非终结符(nonterminal symbol)。为了避免混淆,终结符通常会称呼为记号。 在使用词法分析器还是使用文法解析器之间有相当可观的回旋余地。例如,规则 month_name : J a n ; month_name : F e b ; . . . month_name : D e c ; 可以用于上述例子。这个文法解析器只需要识别单个字母,而 month_name 将是一个非终结符。这种低层规则趋向于浪费时间和空间,并可能使规则复杂得超越了 Yacc 的处理能力。通常的,词法分析器将识别月份名字,并返回见到

文档评论(0)

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

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

1亿VIP精品文档

相关文档