flex词法分析器 :flex词法分析器

更新时间:2024-09-21 00:59

flex词法分析器是替代lex的免费开源软件。它是一个生成词法分析器(也称为“扫描仪”或“词法分析器”)的计算机程序。它经常在BSD派生的操作系统上与Berkeley Yacc解析器生成器一起用作lex实现(因为lex和yacc都是POSIX的一部分),或者与GNU bison(一个版本的 yacc)在* BSD端口和Linux发行版中。与Bison不同,flex不是GNU项目的一部分,也不是根据GNU通用公共许可证发布的。

历史

Vern Paxson于1987年以c语言写作了flex。他引用了Jef Poskanzer为Ratfor写作的词法分析器。

实例

这是用于指令编程语言PL / 0的Flex扫描器的示例。

识别的标记是:'+',' - ','*','/','=','(',')',',',';','。',':=', '\u003c','\u003c=','\u003c\u003e','\u003e','\u003e ='; 数字:0-9 {0-9};

标识符:a-zA-Z {a-zA-Z0-9}

关键字:begin,call,const,do,end,if,odd,procedure,then,var,while。

内部

这些程序通过使用确定性有限自动机(DFA)执行字符解析和标记化。 DFA是接受常规语言的理论机器。这些机器是图灵机系列的一部分。 DFA相当于只读右移图灵机。语法基于正则表达式的使用。另见非确定性有限自动机。

相关问题

时间复杂度

Flex词法分析器通常在输入的长度上具有时间复杂度{\ displaystyle O(n)} O(n)。也就是说,它对每个输入符号执行恒定数量的操作。此常量非常低:GCC为DFA匹配循环生成12条指令。[需要引用]请注意,常量与令牌的长度,正则表达式的长度和DFA的大小无关。

但是,在具有匹配极长令牌的扫描仪中使用REJECT宏可能会导致Flex生成具有非线性性能的扫描仪。此功能是可选的。在这种情况下,程序员已明确告诉Flex在已经匹配某些输入之后“返回并重试”。这将导致DFA回溯以找到其他接受状态。默认情况下不启用REJECT功能,并且由于其性能影响,在Flex手册中不鼓励使用它。

重入

默认情况下,Flex生成的扫描程序不可重入。对于从不同线程使用生成的扫描程序的程序,这可能会导致严重问题。为了解决这个问题,Flex提供了一些选项以实现重入。有关这些选项的详细说明,请参阅Flex手册。

非Unix环境下的使用

通常,生成的扫描程序包含对Unix特定的unistd.h头文件的引用。为避免生成包含unistd.h的代码,应使用%option nounistd。另一个问题是调用isatty(一个Unix库函数),它可以在生成的代码中找到。 %选项从不互动强制flex生成不使用isatty的代码。

使用其他语言的flex

Flex只能为C和C ++生成代码。要使用flex从其他语言生成的扫描程序代码,可以使用SWIG等语言绑定工具。

Flex++

flex ++是一个类似于C ++的词法扫描程序,它作为flex包的一部分包含在内。生成的代码不依赖于任何运行时或外部库,除了内存分配器(malloc或用户提供的替代),除非输入也依赖于它。这在传统操作系统或C运行时设施可能不可用的嵌入式和类似情况下非常有用。

flex ++生成的C ++扫描程序包含头文件FlexLexer.h,它定义了两个C ++生成的类的接口。

参考资料

免责声明
隐私政策
用户协议
目录 22
0{{catalogNumber[index]}}. {{item.title}}
{{item.title}}
友情链接: