【发布时间】:2014-03-18 08:08:43
【问题描述】:
我最近一直在学习基础知识,作为一种实践,我决定在 C++ 的上下文中实现 DFA。所以基本上它是正则表达式。当我从头开始构建树时效果很好,但是我不确定如何处理正则表达式。
我的意思是,如果我有一个正则表达式,例如(test)*,我必须将其转换为 DFA。问题是,为了做到这一点,我必须解析正则表达式。这似乎是一个恶性循环(更糟糕的是,因为我实际上需要一个支持括号的解析器,正则表达式在这里不起作用)。
那么怎么处理呢?我完全理解我们现在有工具可以做到这一点(例如 Flex 和 Bison),但是这些工具是基于正则表达式的(嗯,至少标记器是)。那么一开始发生了什么?如何从头开始编写正则表达式解析器?任何对书籍/文章的引用表示赞赏。
【问题讨论】:
-
在解析器生成器出现之前,人们手动对其进行编程。就像他们在高级语言编译器出现之前编写汇编代码一样。
-
@Barmar 我明白这一点。但是我不确定如何编写一个没有正则表达式的解析器?也许我只是把事情复杂化了,我只是想学习一些东西。
-
你写了很多
if或switch语句。 -
如果您从来没有编写过语言解析器而没有使用正则表达式引擎来处理您的 DFA,那么认为自己很幸运(而且我对您的任何算法语言和编译器设计课程的质量感到非常失望拿)。在您编写一个标记器以符合您已经手工制作的 DFA 手工之前,您还没有真正生活。这是它自己的“特殊”世界。
-
@TonyD 提示我的简单 Regex Parser written with Boost Spirit? :)