【问题标题】:Use of regex in lexical analysis在词法分析中使用正则表达式
【发布时间】:2013-05-28 15:49:21
【问题描述】:

我试图了解自下而上解析的实现方式。

我知道正则表达式先转换为 NFA,然后再转换为 DFA,以及如何将 DFA 表示为二维表。

问题是那不是一张相当大的表格,其中一侧列出了字母表中的所有内容吗?这真的是它应该实现的方式吗?

另一个问题是,据我所知,大多数语言都有一些现成的正则表达式实现。这些 Regex 实用程序是否可以用作词法分析部分的现成实现,然后可以直接继续将解析表输出为输出?

【问题讨论】:

  • 这些 Regex 实用程序能否用作词法分析部分的现成实现:当然,但 DFA 比常见(回溯)regex 库快得多。
  • 正则表达式与任何类型的解析无关,无论是自下而上、自上而下、从左到右还是从右到左。它们用于扫描仪,而不是解析器。生成 NFA 和 DFA 的过程先于两者。它发生在编译时。

标签: regex parsing compiler-construction lexical-analysis


【解决方案1】:

我试图了解自下而上解析的实现方式。

不,你不是。你的问题是关于词法分析的。与解析无关。

我知道正则表达式先转换为 NFA,然后再转换为 DFA,以及如何将 DFA 表示为二维表。

同样,这与解析无关。它也与实际的词法分析无关。这是一个关于词法分析器生成的问题。你现在从你陈述的主题中删除了两个步骤。

问题是那不是一张相当大的桌子,字母表中的所有内容都列在它的一侧吗?

它将与代表 DFA 所需的一样大,而这又取决于您指定的规则。不是一个真正的问题。

这真的是它应该实现的方式吗?

有很多方法可以表示 DFA。 flex(1) 提供了三个或四个选项,例如,每个选项都有不同的空间/时间折衷。您几乎肯定会从实现字符类开始,这将立即消除“在其一侧列出的字母表中的所有内容”。

另一个问题是,据我所知,大多数语言都有一些现成的正则表达式实现。这些 Regex 实用程序是否可以用作词法分析部分的现成实现,然后可以直接继续将解析表输出为输出?

  1. 同样,解析与词法分析无关。
  2. DFA已经是“词法分析的现成实现”。
  3. 根据@Qtax 的评论,整个规则集的单个DFA 比一系列正则表达式快得多。它几乎肯定也更紧凑。

【讨论】:

  • amazon.com/Compilers-Principles-Techniques-Tools-2nd/dp/… 这是我正在关注的书。如果你能介绍一本关于实际解析的书,我会很高兴。
  • @Vahid 您引用的《绿龙》一书是关于词法分析、解析、语义分析、 代码生成、 优化、 寄存器分配、 流分析,以及许多其他事情。您的问题是关于生成词法分析器的。
  • 其实我是在解析之后。我只是从书中假设词法分析是解析的一些基础。我想我错了。谢谢你的回答。
  • 那么您应该查看有关 DPDA 和 LALR 解析器的部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多