实验Yacc和ex快速入门.pptVIP

  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文档。上传文档
查看更多
Lex与Yacc 快速入门 Lex 和 Yacc 介绍 lex 和 yacc 是什么 Lex :Lexical Analyzar, 是一种生成扫描器的工具。 Yacc :Yet Another Compiler Compiler lex 和 yacc 是自动编译代码的工具,适合于解析简单的语言。 lex 和 yacc 是一对配对工具。lex 将文件分解为成组的“记号(tokens) ”,大体上类似于单词。yacc 接受成组的记号,并将它们装配为高层次的结构,类似于句子。 yacc 设计用来处理 lex 的输出,不过您也可以编写自己的代码来完成此任务。同样,lex 的输出很大程度上设计用于为某类解析器提供数据。 实验工具简介总揽(1/2) 实验工具简介总揽(2/2) 实验工具简介-LEX Lex:一个词汇分析器生成器 。 当 Lex 接收到文件或文本形式的输入时,它试图将文本与常规表达式进行匹配。它一次读入一个输入字符,直到找到一个匹配的模式。如果能够找到一个匹配的模式,Lex 就执行相关的动作(可能包括返回一个标记)。另一方面,如果没有可以匹配的常规表达式,将会停止进一步的处理,Lex 将显示一个错误消息。 程序有三个部分,用 %% 符号隔开。第一部分和最后一个部分是普通而古老的 C 代码。中间是有趣的一部分。它由一系列规则构成,lex 将这些规则翻译为词汇分析器。每一个规则依次包含一个正则表达式以及该正则表达式得到匹配时要运行的一些代码。任何没有得到匹配的文本则简单地拷贝到标准输出。 Lex 的常规表达式(1) Lex 的常规表达式(2) 常规表达式举例 标记声明举例 Lex 编程 Lex 编程可以分为三步: 以 Lex 可以理解的格式指定模式相关的动作。 在这一文件上运行 Lex,生成扫描器的 C 代码。 编译和链接 C 代码,生成可执行的扫描器。 Lex 的输入格式 一个 Lex 程序分为三个段: 第一段:是 C 和 Lex 的全局声明 第二段:包括模式(C 代码) 第三段:是补充的 C 函数。 这些段以%%来分界。 (1)C 和 Lex 的全局声明 这一段中我们可以增加 C 变量声明。 %{ int wordCount = 0; /*保存统计出来的字数 */ %} chars [A-Za-z] numbers ([0-9])+ delim [ \n\t] whitespace {delim}+ words {chars}+ %% 两个百分号标记指出了 Lex 程序中这一段的结束和三段中第二段的开始。 (2)Lex 的模式匹配规则 {words} { wordCount++; /* increase the word count by one*/ } {whitespace} { /* do nothing*/ } {numbers} { /* one may want to add some processing here*/ } %% (3)C 代码 Lex 编程的第三段,也就是最后一段覆盖了 C 的函数声明(有时是主函数)。Lex 有一套可供使用的函数和变量。 其中之一就是 yywrap。一般来说,yywrap() 的定义如下例。 void main() { yylex(); /* start the analysis*/ printf( No of words: %d\n, wordCount); } int yywrap() { return 1; } Lex 变量 Lex 有几个函数和变量提供了不同的信息,可以用来编译实现复杂函数的程序。下表中列出了一些变量和函数,以及它们的使用。 Lex 函数 例:识别PL/0单词的LEX程序 实验工具简介-YACC yacc:另一个编译器的编译器 将输入拆分为一连串的记号。现在您需要一些方法来识别高层次的模式。这就是 yacc 要做的:yacc 让您可以描述希望怎样处理记号。 用 Yacc 编写语法 如同 Lex 一样, 一个 Yacc 程序也用双百分号分为三段。它们是:声明、语法规则和 C 代码。 C 与 Yacc 的声明 C 声明可能会定义动作中使用的类型和变量,以及宏。还可以包含头文件。每个 Yacc 声明段声明了终端符号和非终端符号(标记)的名称,还可能描述操作符优先级和针对不同符号的数据类型。 lexer (Lex) 一般返回这些标记。所有这些标记都必须

文档评论(0)

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

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

1亿VIP精品文档

相关文档