将简化的正则表达式转换为语法树

时间:2016-03-29 10:45:08

标签: python regex

我正在研究将正则表达式转换为DFA的算法的实现。第一步涉及将输入正则表达式转换为语法树。例如, b (a | b)abc将转换为下面的树。

              .
             / \
            .   c
           / \
          .   b
         / \
        .   a
       / \
      /   \
     /     \
    .       |
   / \     / \
  *   *   a   b
 /     \
a       b

此外,我正在处理的正则表达式相当简单,唯一的特殊字符是'\'(转义字符),'|' (OR运算符),'('')'(包围组的括号)和'*'(kleene star)。现在我遇到的问题是我对如何(在Python中)从输入生成(作为数据结构)这个树感到困惑。我知道如何手动完成,但通过一段代码进行操作导致我进入圈内。

为了进一步扩展这个问题,我是否会更好地从左到右或从右到左解析表达式?递归是必要的吗?假设我使用treelib创建树,我该如何处理这个问题。这不是我要求的代码作为我应该开始的解释或伪代码片段。我应该自己做这个还是有一个库可以让这更容易?任何有助于进一步了解如何执行此操作的答案都将非常感激。

2 个答案:

答案 0 :(得分:0)

有几种可用于Python的lexing和解析工具,例如: ply(基本上是lexyacc的Python实现。)

使用其中一种而不是自己编写。

答案 1 :(得分:0)

签出Dijkstra's Shunting Yard Algorithm。它可用于将算术表达式转换为语法树。只需进行一些更改,即可用于正则表达式。

相关问题