深度优先遍历在编译器中的妙用

关于“司马”文档我们先放一下,来看看下面这个算法,AHO 教给了我们那么多好东西,可我笨的不能理解其思想所在,今天早上上班路上总算有了所收获,拿出来跟大家分享一下。

 

 

Aho 提到了这个算法,小弟之前的理解是,自己做一个存储结构,像数据结构书中那样用这个算法遍历它,这个想法很愚蠢,它并非普通图的“深度优先便利”,书上说到哪里你想到哪里,照搬而不能灵活,这成了什么?这样的看书是不行的。这个算法的思想并不能局限在这种范围,我们拿到这个算法后应该灵活地拓展它,小弟会尽量用语言把它讲清楚。这个算法应用到自顶向下分析器上对表达式翻译会很有帮助,请注意“计算N的综合属性”处,这是整个算法的递归出口,一般的,“综合属性”都在最后的终结符上。为什么说它很适合“自顶向下”分析器?因为它的遍历过程跟这种分析器遍历“分析树”方向完全一致,都是先序遍历。大家都知道这种顺序是很难得到“综合属性”的,相反地,“递归向上”分析器很容易得到它,但是这种分析却很难得到“继承属性”,解决此问题,应用上面这个算法可以达到最好的平衡。

 

下面的概念面非常重要,弄清楚后它对语法分析器会有更深的理解。下面的两个句子其实一样(O),都是在遍历语法树,其区别就在于,第一个句型的规模比第二个大,第二个只是些字母。语法分析根本原理就是在遍历树,这个树是广义的,它的一个节点就是一个模块,在C语言中称作“函数”,把这些函数用树的结构串联起来,然后根据“语法规则”进行遍历。这便是语法分析的原理。总结为一句话,这句话在“司马”的源代码中到处可见即“分析是一个遍历过程”。

 

O:语法定义:变量=〉类型 字符串 分号

    对应的语句:int gtkings ;

    语法定义:字母字符串=〉S T S T;

    S=> a

    T=>b

    对应的语句:ababab

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值