Compiler construction 使用lex/创建扫描仪?

Compiler construction 使用lex/创建扫描仪?,compiler-construction,lex,lexical-analysis,Compiler Construction,Lex,Lexical Analysis,最近,我一直在学习有关词法分析的编译理论。 据我所知,有一些方法可以构建词汇扫描程序,如: 使用Lex/Flex自动生成扫描仪 建立你自己的一个。在示例中,我遇到了使用预读技术(模拟DFA、NFA)的交换机案例模型 我的问题是哪一个更适合实现基本编程语言(包括变量、条件、循环)? 如何在实践中使用它们?这两种语言都可以使用吗?lex对简单的语言很有用,但在语法复杂的语言中不可用(例如,flex/lex不使用用lex编写的扫描器来处理lex输入)。偶尔有人会问如何管理多个语法扫描程序(很久以前

最近,我一直在学习有关词法分析的编译理论。 据我所知,有一些方法可以构建词汇扫描程序,如:

  • 使用Lex/Flex自动生成扫描仪
  • 建立你自己的一个。在示例中,我遇到了使用预读技术(模拟DFA、NFA)的交换机案例模型
我的问题是哪一个更适合实现基本编程语言(包括变量、条件、循环)? 如何在实践中使用它们?这两种语言都可以使用吗?

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

为了进行实际演示,大多数语法突出显示模块都使用了lex/flex。不是全部。事实证明,Perl和ruby在lex/flex中过于复杂,无法处理,因为它们在嵌入正则表达式时几乎没有线索。另一方面,它为lex/lex提供了一个可用的(但很大的)扫描器——用lex编写。为了举例说明,我在(请参阅)中添加了一个副本


你可以列一个这样的清单,但一般来说,使用或不使用lex的原因是语法的复杂性。此外,管理错误恢复(据某些人说)是选择的原因。

词法扫描程序只将源代码划分为标记;它不会帮助您将标记解析为循环和条件等结构。如果您想构建真正的软件,请使用(f)lex;滚动您自己的词法扫描程序需要更多的工作,更易于维护,需要更多的调试,而且不太可能更快。您可以使用其中任何一个,但两者都使用是没有意义的。显然,像lex/flex这样的工具存在的原因是手动编写和维护扫描仪可能非常麻烦和耗时——特别是如果您正在开发编程语言以及lexer/parser。扫描仪与语法无关。我们可以就术语进行争论,但您显然有太多的空闲时间。