基本思想
- 从文法的开始符号出发,向下推导,推出句子
- 针对输入串,试图用一切可能的办法,从文法开始符号(根结点)出发,自上而下地为输入串建立一棵语法树
自上而下分析示例
假定有文法G(S):
(1) S→xAy
(2) A→**|*
分析输入串x*y(记为a)。
Ps:IP是输入串指针,指向谁就是谁(图中是步骤1、2、3、4、5、6、7)
此时由此例子引出了多个候选式带来的问题
多个产生式候选带来的问题
回溯问题
- 分析过程中,当一个非终结符用某一个候选匹配成功时,这种匹配可能是暂时的
- 出错时,不得不“回溯”
Ps:正如上面的例子,我们并没有一遍得到结果,因为 “(2) A→**|* ” 这个有两个候选式,我们默认从左往右一个一个试,第一个候选式A→**并不符合要求,即错误的结果,我们就回溯一次,重新选择第二个候选式 A→*,当候选式足够多,这样的回溯次数是不可控制和预估的
文法左递归问题
一个文法是含有左递归的,如果存在非终结符P
P
经过一步或者多步推导出来又能推出一个串,而这个串又已它自身开头,我们称这个文法是由左递归的
假设我们现在需要输入串aa
左递归可能导致输入串的指针停滞不前,因为每次选择候选式pa,因为每次的得到的非终结符P都和输入串第一个a不对应,导致指针不会往后移动,但语法树无限增长陷入死循环