DFA的VS的正则表达式实现一个词法分析器是什么时候?(DFAs vs Regexes when i

2019-08-07 11:58发布

(我只是学习如何编写一个编译器,所以请纠正我,如果我做任何不正确的索赔)

为什么有人仍然执行的DFA代码(goto语句,表驱动实现)时,他们可以简单地使用正则表达式? 据我了解,词法分析器采取字符的字符串,并生产出令牌其中,在语言的基本语法定义,是终端的列表,使得他们有可能通过正则表达式来描述。 那岂不是更容易只是遍历了一堆正则表达式的,终止循环,如果找到匹配?

Answer 1:

你是绝对正确的,它更容易写比DFA的正则表达式。 然而,一个很好的问题思考的是

如何将这些正则表达式匹配器的工作?

大多数非常快的正则表达式匹配器的实现通过编译到某种类型的自动机(可以是NFA或最小状态DFA)内部工作。 如果你想建立一个工作用正则表达式来描述令牌相匹配,然后通过所有这些循环扫描仪,你可以完全做到这一点,但是在内部他们很可能编译成有限自动机。

这是非常难得一见有人居然编写了DFA做扫描或分析,因为它只是这么复杂。 这就是为什么有像工具lexflex ,这也让你指定的正则表达式匹配,然后自动编译到DFA的幕后。 这样,你得到两全其美 - 你描述的使用正则表达式的更好的框架相匹配的东西,但你的幕后速度和DFA的效率。

关于建立一个巨大的DFA还有一个重要的细节是,它是不可能建立试图并行匹配多个不同的正则表达式的单个DFA。 这提高了效率,因为它可能在的方式,将同时搜索所有可能的正则表达式匹配字符串运行匹配DFA。

希望这可以帮助!



文章来源: DFAs vs Regexes when implementing a lexical analyzer?