【问题标题】:Using lex / creating scanner?使用 lex / 创建扫描仪?
【发布时间】:2015-09-18 18:41:08
【问题描述】:

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

  • 使用 Lex/Flex 自动生成扫描仪。
  • 构建您自己的。在示例中,我遇到了使用预读技术(模拟 DFA、NFA)的 switch case 模型。

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

【问题讨论】:

  • 词法扫描器仅将源划分为标记;它不会帮助您将标记解析为循环和条件等结构。如果要构建真正的软件,请使用 (f)lex;滚动你自己的词法扫描器需要更多的工作,更容易维护,需要更多的调试,而且不太可能更快。
  • 你可以使用其中任何一个,但同时使用这两个没有意义。显然,像 lex/flex 这样的工具存在的原因是手动编写和维护扫描仪可能非常麻烦和耗时 - 特别是如果您正在改进编程语言以及词法分析器/解析器。

标签: compiler-construction lex lexical-analysis


【解决方案1】:

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

对于实际演示,vi-like-emacs 将 lex/flex 用于大多数语法高亮模块。不是全部。 Perl 和 ruby​​ 在 lex/flex 中被证明太复杂了,因为它们嵌入正则表达式的方式几乎没有线索。另一方面,它有一个可行的(但很大的)lex/lex 扫描器——用 lex 编写。例如,我将其副本添加到vile's FAQ(请参阅result)。

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

【讨论】:

  • 扫描器与语法无关。
  • 我们可以争论术语,但您显然有太多空闲时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多