我学习自动机理论并面临将RE直接转换为DFA的一些困难。此方法需要从RE创建语法树。但我无法生成。
我有一个正则表达式例如 a*b*(a|b)abc
现在我想从中生成一个语法树。我不想要程序,但我想手动完成。任何人都可以帮助我吗?
答案 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
请注意,上面的树使用左关联连接运算符。