我正在研究将正则表达式转换为DFA的算法的实现。第一步涉及将输入正则表达式转换为语法树。例如, b (a | b)abc将转换为下面的树。
.
/ \
. c
/ \
. b
/ \
. a
/ \
/ \
/ \
. |
/ \ / \
* * a b
/ \
a b
此外,我正在处理的正则表达式相当简单,唯一的特殊字符是'\'(转义字符),'|' (OR运算符),'('')'(包围组的括号)和'*'(kleene star)。现在我遇到的问题是我对如何(在Python中)从输入生成(作为数据结构)这个树感到困惑。我知道如何手动完成,但通过一段代码进行操作导致我进入圈内。
为了进一步扩展这个问题,我是否会更好地从左到右或从右到左解析表达式?递归是必要的吗?假设我使用treelib创建树,我该如何处理这个问题。这不是我要求的代码作为我应该开始的解释或伪代码片段。我应该自己做这个还是有一个库可以让这更容易?任何有助于进一步了解如何执行此操作的答案都将非常感激。
答案 0 :(得分:0)
有几种可用于Python的lexing和解析工具,例如: ply(基本上是lex
和yacc
的Python实现。)
使用其中一种而不是自己编写。
答案 1 :(得分:0)
签出Dijkstra's Shunting Yard Algorithm。它可用于将算术表达式转换为语法树。只需进行一些更改,即可用于正则表达式。