thinking in tree

树,这可能是我们最经常面对的结构,它有很好的性质,我们表达树,分析树,转换树,似乎树也是非常适合人脑思考的一种模式。这里,我随想几个例子。

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
        
        你说看的有点眼熟?对,这就是一种行为树

你可能感兴趣的:(thinking in tree)