使用 lex 命令来生成词法分析器
lex 命令有助于写能接收字符流输入并将其转换为程序操作的 C 语言程序。
要使用 lex 命令,必须提供或编写包含以下内容的规范文件:
- 扩展的正则表达式
- 已生成的词法分析器所识别的字符模式。
- 操作语句
- 定义生成的词法分析器如何对它识别的扩展的正则表达式作出反应的 C 语言程序段。
lex 命令生成的 C 语言程序能够使用说明文件中的信息分析输入流。 然后,lex 命令将输出程序存储在 lex.yy.c 文件中。 如果输出程序识别简单的单字 (word) 输入结构,您就能够使用下面的命令编译 lex.yy.c 输出文件,生成可执行词法分析器:
cc lex.yy.c -ll但是,如果词法分析器必须识别更复杂的语法,您可以创建与输出文件一起使用的解析器程序,以确保正确处理任何输入。
如果 lex.yy.c 输出文件有支持 lex 库功能的 C 编译器,那么可以将它移动到其他系统。
已编译的词法分析器执行下述功能:
- 读取字符输入流。
- 将输入流复制到输出流。
- 将输入流分成更小的字符串,这些字符串与 lex 说明文件中的扩展的正则表达式匹配。
- 对它识别的每个扩展的正则表达式执行操作。 这些操作是 lex 说明文件中的 C 语言程序段。 每个操作片段都能调用其外部的操作或者子例程。
lex 命令所生成的词法分析器使用称为确定性有限状态自动机的分析方法。 此方法提供词法分析器能存在的一定数量的条件,以及决定词法分析器状态的规则。
自动机允许生成的词法分析器预测输入流中一个或两个以上的字符。 例如,假设您在 lex 规范文件中定义了两个规则: 一个用于查找字符串ab另一个会查找字符串abcdefg. 如果词法分析器接收到abcdefh,它在确定它与字符串不匹配之前,将字符读取到输入字符串的末尾abcdefg. 然后,词法分析器返回到查找字符串的规则ab,决定它与部分输入相匹配,并开始尝试使用剩余的输入找到另一个匹配项cdefh.
编译词法分析器
要编译 lex
程序,请执行以下操作:
- 使用 lex 程序将说明文件更改为 C 语言程序。 结果程序在 lex.yy.c 文件中。
- 使用带有 -ll 标记的 cc 命令编译并链接带有 lex 子例程库的程序。 结果可执行程序在 a.out 文件中。
例如,如果 lex 说明文件称为 lextest,请输入下面的命令:
lex lextest
cc lex.yy.c -ll