(我刚刚学习如何编写编译器,所以如果我做出任何不正确的声明,请纠正我)
为什么当人们可以简单地使用正则表达式时,是否还会在代码(goto语句,表驱动的实现)中实现DFA?据我所知,词法分析器接收一串字符并生成一个令牌列表,这些令牌在语言的语法定义中是终端,使得它们可以用正则表达式来描述。绕过一堆正则表达式会不会更容易,如果发现匹配就会突破循环?
答案 0 :(得分:5)
你说正则表达式比DFA更容易,你是绝对正确的。但是,要考虑的一个好问题是
这些正则表达式匹配器如何工作?
正则表达式匹配器的大多数非常快速的实现都是通过在内部编译为某种类型的自动机(NFA或最小状态DFA)来实现的。如果你想构建一个通过使用正则表达式来描述哪些令牌匹配然后循环遍历所有这些令牌的扫描程序,你绝对可以这样做,但在内部它们可能会编译为DFA。
很少见到任何人实际编写DFA进行扫描或解析,因为它太复杂了。这就是为什么有lex
或flex
这样的工具,它们允许您指定匹配的正则表达式,然后在后台自动编译为DFA。这样,您就可以获得两全其美的效果 - 您可以使用更好的正则表达框架来描述要匹配的内容,但是您可以在幕后获得DFA的速度和效率。
构建巨型DFA的另一个重要细节是,可以构建一个单独的DFA,尝试并行匹配多个不同的正则表达式。这样可以提高效率,因为可以在字符串上运行匹配的DFA,同时搜索所有可能的正则表达式匹配。
希望这有帮助!