使用 lex/创建扫描仪?
Using lex / creating scanner?
最近在研究关于词法分析的编译原理。
据我了解,有一些构建词法扫描器的方法,例如:
- 使用 Lex/Flex 自动生成扫描仪。
- 建立你自己的。在示例中,我遇到了使用预读技术(模拟 DFA、NFA)的 switch case 模型。
我的问题是哪一个更适合实现基本的编程语言(包括变量、条件、循环)?
它们应该如何在实践中使用?是否可以同时使用它们?
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 的原因是语法的复杂性。此外,管理错误恢复是(根据某些人的说法)选择的一个原因。
最近在研究关于词法分析的编译原理。 据我了解,有一些构建词法扫描器的方法,例如:
- 使用 Lex/Flex 自动生成扫描仪。
- 建立你自己的。在示例中,我遇到了使用预读技术(模拟 DFA、NFA)的 switch case 模型。
我的问题是哪一个更适合实现基本的编程语言(包括变量、条件、循环)? 它们应该如何在实践中使用?是否可以同时使用它们?
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 的原因是语法的复杂性。此外,管理错误恢复是(根据某些人的说法)选择的一个原因。