使用 yacc 和 lex 编写文本分析器

使用 yacc 和 lex 编写文本分析器

ID:9750961

大小:155.46 KB

页数:39页

时间:2018-05-07

使用 yacc 和 lex 编写文本分析器_第1页
使用 yacc 和 lex 编写文本分析器_第2页
使用 yacc 和 lex 编写文本分析器_第3页
使用 yacc 和 lex 编写文本分析器_第4页
使用 yacc 和 lex 编写文本分析器_第5页
资源描述:

《使用 yacc 和 lex 编写文本分析器》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、使用yacc和lex编写文本分析器  本文将研究使用lex/flex和yacc/bison工具构建分析器所需的步骤。首先构建一个简单的计算器,然后深入地研究如何采用相同的原则进行文本分析。分析文本,即理解和提取文本中的关键部分,是许多应用程序中一个重要的部分。在UNIX®中,许多操作系统组成部分都依赖于文本分析,从用来与系统进行交互的shell,到诸如aething  清单2显示了一个非常简单的定义,它可以接受单词并根据提供的单词打印出一个字符串。  清单2.简单的lex定义%{#include<stdio.h>%}%%begin printf(St

2、artedn);hello printf(Helloyourself!n);thanksprintf(Yourwelen);end  printf(Stoppedn);%%  代码中的第一块由%{...%}定义,表示将其中的文本插入到生成的C源代码中。在本示例中,因为后面使用了printf()函数,所以必须确保包含了stdio.hHeader。  代码中的第二块由%%序列标识,其中包含了要识别的字符串输入和相应结果的定义。在上述的这些情况下,对于一个简单的单词,将打印出合适的响应。123456789下一页——感谢阅读这篇文章,..,生成C源代码  要生成能够真正分析输入

3、文本的C源代码,可以对清单1所示的文件运行lex(或flex)。Lex/flex文件点号后缀为'l',所以上面的文件可能名为exampleA.l。要生成相应的C源代码:$flexexampleA.l  不管您使用哪种工具,其输出都将为lex.yy.c。缺乏勇气的人往往不敢仔细研究这个文件,分析器内部的处理过程的确非常复杂,并且建立在基于表格的复杂分析系统的基础上,该系统可以根据原始lex定义中的定义对输入文本进行匹配。因为存在这样的关联,所以该代码相当占用内存,特别是对于那些很大且很复杂的文件。  与lex相比,flex的优点在于它提供了大量附加的选项以

4、改进性能(针对内存或速度)、调试选项和对扫描器行为更好的控制(例如,可以忽略某些情况)。在生成C源代码时,通过使用-l命令行选项,您可以生成与原始的lex工具生成的源代码非常接近的C源代码。  既然已经有了C源代码,那么您可以将其编译为相应的应用程序以测试该处理过程:$gcc-oexampleAlex.yy.c-lfl  flex库(使用-lfl进行包含,而lex则使用-ll)包含执行分析代码的简单的main()函数。当运行生成的应用程序时,它将等待输入。清单3显示了该应用程序的输入(和输出)。  清单3.简单lex应用程序的输入/输出$exampleAbeginSta

5、rtedhelloHelloyourself!endStoppedthanks Youricolonn);(   printf(Openparenthesesn);)   printf(Closeparenthesesn);%%  清单4中的示例应该是一目了然的,并且对于需要进行分析的任何正则表达式或特殊字符都可以使用相同的原则。  真正的标记化  前面的示例所构建的C源代码实质上是独立的。尽管使用这种方法没有什么问题,但是对于分析包含多个单词、短语或序列的给定指令中的文本或其他条目的情况,这种方法并不是很有价值。  使用这种方式分析序列需要一个语法分析器,而它将定义标

6、记序列。但是语法分析器必须知道要分析的是什么标记。在lex定义中,当识别标记时所进行的操作是回显字符串,如果要返回一个识别标记,那么需要对该操作进行更改。例如,您可以如清单5所示对原始示例进行重写。  清单5.返回标记%{#include<stdio.h>#include<y.tab.h>%}%%begin returnBEGIN;hello returnHELLO;thanksreturnTHANKS;end  returnEND;%%  现在,当识别了'hello'标记时,不再是打印一个字符串,而是返回标记的名称。在yacc中

7、,将使用这个名称来建立相应的语法。  在这个示例中,没有显式地定义这些标记名称。实际上是在y.tab.h文件中指定了这些标记名称,而在分析yacc语法文件时由yacc自动生成该文件。  提取变量数据  如果要提取一个值(例如,需要能够读取一个数值或字符串),那么您必须指定如何将输入转换为所需的类型。通常由于lex中的各种限制,这种做法并不是很有价值,但是当使用yacc工具来构建一个完整的分析器时,这是至关重要的。  通常可以使用两个变量来交换信息,yytext变量包含了在分析过程中由lex读取的原始数据,而yylval则用于在两个系统之间

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。