WEB开发网
开发学院操作系统Linux/Unix 使用 yacc 和 lex 编写文本分析器 阅读

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

 2008-11-13 08:32:06 来源:WEB开发网   
核心提示: 代码中的第二块由 %% 序列标识,其中包含了要识别的字符串输入和相应结果的定义,使用 yacc 和 lex 编写文本分析器(4),在上述的这些情况下,对于一个简单的单词,当运行生成的应用程序时,它将等待输入,将打印出合适的响应,生成 C 源代码要生成能够真正分析输入文本的 C 源代码

代码中的第二块由 %% 序列标识,其中包含了要识别的字符串输入和相应结果的定义。在上述的这些情况下,对于一个简单的单词,将打印出合适的响应。

生成 C 源代码

要生成能够真正分析输入文本的 C 源代码,可以对清单 1 所示的文件运行 lex(或 flex)。Lex/flex 文件点号后缀为 'l',所以上面的文件可能名为 exampleA.l。要生成相应的 C 源代码:

$ flex exampleA.l

不管您使用哪种工具,其输出都将为 lex.yy.c。缺乏勇气的人往往不敢仔细研究这个文件,分析器内部的处理过程的确非常复杂,并且建立在基于表格的复杂分析系统的基础上,该系统可以根据原始 lex 定义中的定义对输入文本进行匹配。因为存在这样的关联,所以该代码相当占用内存,特别是对于那些很大且很复杂的文件。

与 lex 相比,flex 的优点在于它提供了大量附加的选项以改进性能(针对内存或速度)、调试选项和对扫描器行为更好的控制(例如,可以忽略某些情况)。在生成 C 源代码时,通过使用 -l 命令行选项,您可以生成与原始的 lex 工具生成的源代码非常接近的 C 源代码。

既然已经有了 C 源代码,那么您可以将其编译为相应的应用程序以测试该处理过程:

$ gcc -o exampleA lex.yy.c -lfl

flex 库(使用 -lfl 进行包含,而 lex 则使用 -ll)包含执行分析代码的简单的 main() 函数。当运行生成的应用程序时,它将等待输入。清单 3 显示了该应用程序的输入(和输出)。

清单 3. 简单 lex 应用程序的输入/输出

$ exampleA
begin
Started
hello
Hello yourself!
end
Stopped
thanks 
Your welcome
hello thanks
Hello yourself!
Your welcome
hello Robert
Hello yourself!
Robert

上一页  1 2 3 4 5 6 7 8 9  下一页

Tags:使用 yacc lex

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接