【发布时间】:2012-09-14 10:39:53
【问题描述】:
我正在尝试编写一个程序来接受描述正则表达式的字符串。例如:
10(0U1)*
其中 U 是联合运算符,* 是 Kleene 星号(我们还可以看到隐含的串联)。
我考虑过标记字符串的原子并根据运算符和操作数构建机器。我想用类似于下面的规则对每个原子进行算法操作:http://www.cs.may.ie/staff/jpower/Courses/Previous/parsing/node5.html
我不确定如何以智能方式最好地解析这种类型的输入,以便以编程方式构建 NFA。
我的程序的目标是接收上述输入并输出将由其 5-touple 描述的相应 NFA。非常感谢任何有关实现该目标的建议。
【问题讨论】:
-
如果您尝试实施 NFA……它将如何运作?你会有大规模并行硬件来运行它吗?还是您会先在内部转换为 DFA?
-
很久没学计算理论了。 :) 这些正则表达式中是否有“操作顺序”?如果是这样,我可能会从我的解析开始(即,假设 Union 具有最高优先级......然后找到所有的 Unions,执行这些操作,转到下一个运算符等)
-
bdares:模拟 NFA 有一个几乎微不足道的算法(Dragon 中的算法 3.4,尽管在大多数算法教科书中都可以找到一些变体);它经常被用来引入双端队列的概念,(因为它很自然地适合,尽管龙算法只使用两个堆栈)。回到 grep、egrep 和 fgrep 都是独立程序的时代,grep 使用它(在 Thompson 构造生成 NFA 之后)。