本文比较基本,但整个过程框架已经比较清楚了。应重点看
第二篇:《使用 yacc 和 lex 编写文本分析器》,原文比较长就直接粘过来了
本文讲的相对复杂一点。有了第一篇的基础后较为深入的可以看这篇。重点侧重在例子,
我们在后面的练习中有可能用到。
本文将研究使用 lex/flex 和 yacc/bison 工具构建分析器所需的步骤。首先构建一个简单的计算
器,然后深入地研究如何采用相同的原则进行文本分析。分析文本,即理解和提取文本中的关键部分,是
许多应用程序中一个重要的部分。在 UNIX® 中,许多操作系统组成部分都依赖于文本分析,从用来与系
统进行交互的 shell,到诸如 awk or Perl 等各种常用的工具和命令,再到用来构建软件和应用程序的 C
编译器。您可以在 UNIX 应用程序(以及其他的应用程序)中使用分析器来构建简单的配置分析器,甚至
构建最终的目标:您自己的编程语言。
开始之前
UNIX® 程序员常常发现他们需要去理解文本和其他一些具有灵活的标准化格式的结构。通过使用 lex 和
yacc 工具,您可以构建一个分析引擎,根据特定的规则来处理文本。然后,可以将它集成到您的应用程
序中以完成各项工作,从配置分析到构建您自己的编程语言。在学习了本教程之后,您将了解如何定义词
法元素、编写 yacc 规则,并使用相应的规则机制来构建和定义各种不同的分析引擎和应用程序。
关于本教程
在 UNIX 中,有许多用来理解和提取文本的方法。您可以使用 grep、awk、Perl 和其他的解决方案。
但有的时候,您需要理解和提取结构化的但格式不受限制的数据。在这种情况下,UNIX lex 和 yacc 工
具就很有用处了。前面提到的那些工具,如 awk、Perl 以及 shell 和许多其他的编程语言,都使用 lex
和 yacc 来生成分析应用程序以分析和理解文本,并将其转换为所需的信息或数据结构。
Lex 是一种词法分析工具,它可以用来从源文本识别特定结构的文本字符串。Yacc 是一种语法分析器,
它可以读取文本并用来将单词序列转换为便于处理的结构化的格式。
在本教程中,首先您将研究如何使用 lex 和 yacc 来构建一个计算器。使用该计算器作为示例,您将进
一步研究 lex 和 yacc 系统生成的输出和信息,并学习如何使用它来分析其他类型的信息。
使用 lex 进行词法分析
编写文本分析器的第一步是要能够识别所读取的内容。有许多不同的方法可以完成这项任务,但是最简单
的方法是使用 lex,它是将输入信息转换为一系列标记的工具。
什么是词法分析?
当使用编程语言编写程序或在命令行中输入命令时,您是否想过究竟执行了什么操作将您输入的内容转换
为一组指令呢?
这个处理过程非常简单,却又相当复杂。它很复杂,这是因为对于可能输入的信息,表面上看起来似乎存
在无限种可能的组合和序列。例如,要使用 Perl 语言遍历一个哈希表,您可以使用如清单 1
所示的序列。
清单 1. 在 Perl 中遍历一个哈希表
foreach $key (keys %hash)
{
...
}