使用 yacc 和 lex 编写文本分析器
2008-11-13 08:32:06 来源:WEB开发网代码中的第二块由 %% 序列标识,其中包含了要识别的字符串输入和相应结果的定义。在上述的这些情况下,对于一个简单的单词,将打印出合适的响应。
生成 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
更多精彩
赞助商链接