刚学完这两种分析方法,说两个故事总结一下:
某日小明上数学课,他的老师给了很多个不同的直角三角板让小明用尺子去量三角板的三个边,并将长度记录下来。两个小时过去,小明完成任务,把数据拿给老师。老师给他说,还有一个任务就是观察三条边之间的数量关系。又是两个小时,聪明的小明连蹦带跳走进了办公室,说:“老师,我找到了,三条边之中有两条,它们的平方和约等于另外一条的平方。”老师拍拍小明的头,“你今天学会了一个定理,勾股定理。它就是说直角三角形有两边平方和等于第三边的平方和”。
另一个故事,某日老师告诉小明“今天要教你一个定理,勾股定理。”小明说,“什么是勾股定理呢?”“勾股定理是说,直角三角形中有两条边的平方和等于第三边的平方。”然后老师给了一大堆直角三角板给小明,让他去验证。两个小时后,小明告诉老师定理是正确的(其实小明只用了一个小时,另外的一个小时是……,既然小明完成任务了,大家也就别问了^_^)。
两个故事刚好是语法分析里面对应的两个方法:第一个故事说的是自底向上的分析方法,第二个故事说的是自顶而下的分析方法。回到课程的内容,用两个例子说明这个问题:
设某语言的文法是:
(1)E → E+n (2)E → n
分析输入串:n+n+n
自底向上的分析思想:
从左到右看待分析串:
先是n,由(2)抽象为E;继续读+、n,得到E+n,由(1)抽象为E;继续+n,有E+n,将串E+n抽象为E。由于输入为空,成功分析!
自顶向下的分析思想:
从左往右观察串,分析(推导)过程为:
E => E+n ( using (1) )
=> E+n+n ( using (1) )
=> n+n+n ( using (2) )
推导结束,分析成功!
该推导过程利用了最左推导。
两种分析方法的根本区别是:自底向上的分析,从具体到抽象;自顶向下的分析,从抽象到具体。两种分析思路恰恰又是哲学思考问题的两大方向。计算机科学与哲学恰好在此结合起来。计算机科学思考问题有很多时候是与哲学相类似,上述就是一个例证。