识别程序自动系统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简介

识别程序自动系统YACC简介 YACC是识别程序自动生成工具中的典型代表,它自20世纪问世以来,几经改进用来开发了许多编译系统。 YACC接受了LALR类文法,生成了LALR分析表,如果在构造分析表过程中发现存在冲突,它便按照用户提供的信息(包括优先级与结合性等)对每个状态作出正确的动作选择。YACC解决冲突的基本思想是:可以对各个重写规则和各个终结符号给以一个优先级。解决冲突的缺省规则如下。 如果发生归约_归约冲突,则按排列在前的规则归约;如果发生移入_归约冲突,例如,在输入符号为a时不能确定是按规则U::=u直接归约还是执行移入动作,便比较该规则U::=u与终结符号a的优先级。如果规则的优先级高,便按规则执行归约动作,否则便执行移入动作。允许用户指定优先级,如果不指定,则让规则U::=u的优先级与u的最右终结符号的优先级相同。 由于某些终结符号可能具有相同的优先级,例如+与-、*与/等等,因此YA CC也允许给出关于相同优先级的信息。关于结合性,YACC允许指明某终结符号具有右结合性还是左结合性,而且还允许对于不具有结合性的运算符指明不可结合性。 文法连同优先级与结合性等信息在YACC说明书中给出,它由YACC编译器翻译为识别程序源程序(C语言),再由C编译器编译连接成可执行的识别程序。因此YACC说明书也称YACC源程序。 YACC说明书一般由三部分组成,即说明部分、翻译规则部分与支持例行程序部分,其间用%%隔开。 说明部分给出与后面两部分相关的说明,例如包含(include)字句与变量说明等,他们的书写形式与C语言的规定一致。说明部分还可能定义文法的识别符号以及文法的终结符号(可能连同相应的内部表示)。 翻译规则部分给出文法规则和相关的语义动作。文法中的每一个重写规则 U::=u1|u2|---|un 在YACC说明书中写成: U:u1{语义动作1} |u2{语义动作2} ------- |un{语义动作n} 这些语义动作都是C语句序列,每当所生成的识别程序在识别过程中按照某个规则归约时便执行相应的语义动作。在这些语义动作语句序列中可能包含有YACC提供的内部伪变量(如$$等)。 支持例行程序部分包含又C语言写出一些例行程序,包括词法分析子程序、出错处理子程序以及为翻译规则部分调用的一些语义动作子程序等。 Lex 和 Yacc 是 UNIX 两个非常重要的、功能强大的工具。事实上,如果你熟练掌握 Lex 和 Yacc 的话,它们的强大功能使创建 FORTRAN 和 C 的编译器如同儿戏。Ashish Bansal 为您详细的讨论了编写自己的语言和编译器所用到的这两种工具,包括常规表达式、声明、匹配模式、变量、Yacc 语法和解析器代码。最后,他解释了怎样把 Lex 和 Yacc 结合起来。 Lex 代表 Lexical Analyzar。Yacc 代表 Yet Another Compiler Compiler。Lex 是一种生成扫描器的工具。扫描器是一种识别文本中的词汇模式的程序。这些词汇模式(或者常规表达式)在一种特殊的句子结构中定义,这个我们一会儿就要讨论。 一种匹配的常规表达式可能会包含相关的动作。这一动作可能还包括返回一个标记。当 Lex 接收到文件或文本形式的输入时,它试图将文本与常规表达式进行匹配。它一次读入一个输入字符,直到找到一个匹配的模式。如果能够找到一个匹配的模式,Lex 就执行相关的动作(可能包括返回一个标记)。另一方面,如果没有可以匹配的常规表达式,将会停止进一步的处理,Lex 将显示一个错误消息。 Lex 和 C 是强耦合的。一个 .lex 文件(Lex 文件具有 .lex 的扩展名)通过 lex 公用程序来传递,并生成 C 的输出文件。这些文件被编译为词法分析器的可执行版本。 Lex 的常规表达式。 常规表达式是一种使用元语言的模式描述。表达式由符号组成。符号一般是字符和数字,但是 Lex 中还有一些具有特殊含义的其他标记。 下面两个表格定义了 Lex 中使用的一些标记并给出了几个典型的例子。 用 Lex 定义常规表达式 字符 含义 A-Z, 0-9, a-z 构成了部分模式的字符和数字。 . 匹配任意字符,除了 \n。 - 用来指定范围。例如:A-Z 指从 A 到 Z 之间的所有字符。 [ ] 一个字符集合。匹配括号内的 任意 字符。如果第一个字符是 ^ 那么它表示否定模式。例如: [abC] 匹配 a, b, 和 C中的任何一个。 * 匹配 0个或者多个上述的模式。 + 匹配 1个或者多个上述模式。 ? 匹配 0个或1个上述模式。 $ 作为

文档评论(0)

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

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

版权声明书
用户编号:6111134150000003

1亿VIP精品文档

相关文档