从给定的正则表达式创建语法树(对于RE到DFA)

时间:2014-11-15 17:39:07

标签: regex dfa

我学习自动机理论并面临将RE直接转换为DFA的一些困难。此方法需要从RE创建语法树。但我无法生成。
我有一个正则表达式例如 a*b*(a|b)abc

现在我想从中生成一个语法树。我不想要程序,但我想手动完成。任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

你需要弄清楚这个表达式所代表的操作是什么,它们应用的顺序,以及它们的操作数。

例如a*表示:“将*运算符应用于a。在表达式树中,您将获得星型运算符的节点,以及运算符所依据的符号的a节点。

类似地,|表示交替,因此它将是树中的节点,子节点将是交替的子表达式。

顶级操作只是一个连接,它将是您的根节点。

以下是源自这些规则的完整AST:

a*b*(a|b)abc

--+ CONCAT
  |
  +-+ STAR
  | |
  | +-- a
  |
  +-+ STAR
  | |
  | +-- b
  |
  +-+ OR
  | |
  | +-- a
  | |
  | +-- b
  |
  +-- a
  |
  +-- b
  |
  +-- c
编辑:你要求一个二叉树,转换应该是直截了当的。我会留下两棵树让你弄明白:

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

请注意,上面的树使用左关联连接运算符。