关于“司马”文档我们先放一下,来看看下面这个算法,AHO 教给了我们那么多好东西,可我笨的不能理解其思想所在,今天早上上班路上总算有了所收获,拿出来跟大家分享一下。
Aho 提到了这个算法,小弟之前的理解是,自己做一个存储结构,像数据结构书中那样用这个算法遍历它,这个想法很愚蠢,它并非普通图的“深度优先便利”,书上说到哪里你想到哪里,照搬而不能灵活,这成了什么?这样的看书是不行的。这个算法的思想并不能局限在这种范围,我们拿到这个算法后应该灵活地拓展它,小弟会尽量用语言把它讲清楚。这个算法应用到自顶向下分析器上对表达式翻译会很有帮助,请注意“计算N的综合属性”处,这是整个算法的递归出口,一般的,“综合属性”都在最后的终结符上。为什么说它很适合“自顶向下”分析器?因为它的遍历过程跟这种分析器遍历“分析树”方向完全一致,都是先序遍历。大家都知道这种顺序是很难得到“综合属性”的,相反地,“递归向上”分析器很容易得到它,但是这种分析却很难得到“继承属性”,解决此问题,应用上面这个算法可以达到最好的平衡。
下面的概念面非常重要,弄清楚后它对语法分析器会有更深的理解。下面的两个句子其实一样(O),都是在遍历语法树,其区别就在于,第一个句型的规模比第二个大,第二个只是些字母。语法分析根本原理就是在遍历树,这个树是广义的,它的一个节点就是一个模块,在C语言中称作“函数”,把这些函数用树的结构串联起来,然后根据“语法规则”进行遍历。这便是语法分析的原理。总结为一句话,这句话在“司马”的源代码中到处可见即“分析是一个遍历过程”。
O:语法定义:变量=〉类型 字符串 分号
对应的语句:int gtkings ;
语法定义:字母字符串=〉S T S T;
S=> a
T=>b
对应的语句:ababab