【问题标题】:How is maximal-munch implemented?最大咀嚼是如何实现的?
【发布时间】:2013-11-22 10:33:22
【问题描述】:

我正在研究编译器并且正在学习词法分析。我知道将每个词素指定为正则表达式,并使用flex,可以自动生成词法分析器。我正在进一步了解如何将正则表达式转换为 NFA,然后再将其转换为 DFA,以便对其进行快速评估。

但是,我的问题是,ma​​ximal-munch rule 是如何实施的?在内部,词法分析器如何知道“继续”以找到可能最长的词素?

谢谢!

【问题讨论】:

  • 我认为你的意思是用用于词法分析器的 flex-lexer 来标记它;不是用于 Adob​​e/Apache UI 框架的 Flex。我更改了标记。
  • 我猜在 DFA 中它就像在记住最后一个可接受的状态时获取尽可能多的字符一样简单。
  • @JoSo:很好的基本答案。将 DFA 视为具有在运行时转换的状态更容易一些。每个状态都标记为“接受”或“不接受”(例如,绿色和红色状态);它在运行时可能会经历多个绿色和红色状态。最终到达下一个输入字符没有有效出口的状态;如果该状态为绿色,则它接受,否则它会抱怨。所以它并不需要记住最后一个接受状态;当它终止时,它要么合二为一,要么不合。
  • @IraBaxter:如果我的令牌字母表是 {a,ab,aaa} 并且我有输入 aab 怎么办?如果不记得 a 是可以接受的,这会在使用 aa 而不是产生令牌列表 [a,ab] 后失败,不是吗?
  • 你是对的;每个状态都必须指向最后一个接受状态(例如,“aa”的状态不能在字符“b”上转换,但可以引用“a”作为接受状态)。关键是扫描仪不需要记住任何东西,只需检查当前状态。

标签: regex parsing unix compiler-construction flex-lexer


【解决方案1】:

maximal munch 算法是通过向 DFA 执行器添加少量可变状态来实现的,并添加 DFA 执行器“倒带”输入的能力:实际上,为它提供了 tell() 和 @ 之类的功能987654322@.

还值得注意的是,DFA 并不完整,即过渡功能不完整。一些{state, input} 对没有定义的结果。 [注2]

考虑到这一点,算法如下:

Set Accepted NFA State to ⊥
Set Accepted Position to Tell(Input Stream)
Set State to Starting State
Repeat:
  If State ∈ Accepting:
    Set Accepted NFA State to Accepting NFA State for State  [Note 1]
    Set Accepted Position to Tell(Input Stream)
  Read one symbol from Input Stream into Next Symbol
  If there is a transition from {State, Next Symbol} to New State:
    Set State to New State
    Continue the loop
  Otherwise:
    Rewind Input Stream to Accepted Position
    Return Accepted NFA State

如果算法返回 ⊥,则表示没有识别到​​任何标记,输入流将被倒回到初始位置。


注意事项:

  1. NFA 通常在状态和接受动作之间具有明确的同态性,但 DFA 构造算法可能会将两个接受 NFA 状态与不同的动作结合起来。在这种情况下,flex算法是优先考虑输入文件中的第一个动作。在上述算法中,我们通过将每个接受 DFA 状态映射到具有优先级的接受 NFA 状态的组件来表示。

  2. 通过添加一个额外的(且唯一的)sink 状态很容易使 DFA 完整,该状态是不接受的,并且只有自身的转换。然后我们可以添加sink 状态作为任何其他未指定转换的转换。如果我们调用sink 状态 ⊥那么如何修改提供的算法就很清楚了;实际上,这根本没有必要,因为实际上我们并不关心 DFA 是否不完整。不过,它确实对状态最小化算法有一些影响。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    相关资源
    最近更新 更多