使用 lex/创建扫描仪?

Using lex / creating scanner?

最近在研究关于词法分析的编译原理。 据我了解,有一些构建词法扫描器的方法,例如:

我的问题是哪一个更适合实现基本的编程语言(包括变量、条件、循环)? 它们应该如何在实践中使用?是否可以同时使用它们?

lex 对于 简单 语言很有用,但不适用于 复杂 语法的语言(例如 flex/lex不要使用用 lex 编写的扫描器来处理 lex 输入)。偶尔有人会问如何管理多个语法扫描器(很久以前,我帮助某人处理一个具有多个 lex yacc 文件的程序 — 使用 sed,因为这是在 flex/bison带有帮助重命名的选项)。

对于实际演示,vi-like-emacs uses lex/flex for most of the syntax highlighting modules. Not all. Perl and ruby turn out to be too complex to bother with in lex/flex, due to the way they embed regular expressions with little clue. On the other hand, it has a workable (but large) scanner for lex/lex — written in lex. For the sake of example, I added a copy of that to vile's FAQ (see result)。

人们可以列出类似的东西,但通常,使用或不使用 lex 的原因是语法的复杂性。此外,管理错误恢复是(根据某些人的说法)选择的一个原因。