树,这可能是我们最经常面对的结构,它有很好的性质,我们表达树,分析树,转换树,似乎树也是非常适合人脑思考的一种模式。这里,我随想几个例子。
1. parse过程,输入将符号流,根据一个BNF规则,翻译输出为语法树,
1.1 BNF的表达
token作为原子,
and, or 两种复合结点类型,表示顺序和选择,如果从复合结点连线到子结点,其实表示的是一个图,而我们把递归处的子结点收起来,表示成一颗树。
1.2 语法树生成
这里只讨论,最简单的递归向下算法,是自上而下,自左而右,遍历1.1 的树进行匹配,需要注意左递归问题,解决方法
1.2.1
改写树,为非左递归,此处也可处理公共因子提取等优化
1.2.2
递归结点加访问标记,是否符号流有step,决定是否匹配
2.状态机
我想抽象出一个可复合的状态机表示,类似于例1里的BNF,我们势必需要规定出,原子状态,复合状态,(这里我舍弃掉符号动作的问题,我用动作本身表示为状态)
持续结点(state)
原子
goto
eat
并发状态(par)
比如说,人走路同时吃东西
par
walking
eating
顺序状态(seq)
比如说,人先走到A点,然后走到B点,
seq
run2A
run2B
将状态机理解成一个类的对象,每一个状态其实就是一个动作的发生,一个API的调用,如何结构化呢,
增加一些可用的结点,
决策结点(pred)
原子
是否到了A点,
与(and)
或(or)
非(not)
条件(if)
这样我们足以表达一些这个带有逻辑的状态机
我打算走到A,然后去到B,我一路吃完fa,接着吃fb,到达目的地我就不能够再进食,
walking =
seq
goto('A')
goto('B')
set_flag('stop_flag'))
eating =
if
not('stop_flag'),
seq
eat('fa')
eat('fb')
trip =
par
walking
eating
你说看的有点眼熟?对,这就是一种行为树