编译原理 [0x03][0x01] ==(4.2) 语法分析--自上而下分析所遇到的问题

基本思想

  • 从文法的开始符号出发,向下推导,推出句子
  • 针对输入串,试图用一切可能的办法,从文法开始符号(根结点)出发,自上而下地为输入串建立一棵语法树

 自上而下分析示例

假定有文法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 \overset{}{+}\Rightarrow Pa

经过一步或者多步推导出来又能推出一个串,而这个串又已它自身开头,我们称这个文法是由左递归的

假设我们现在需要输入串aa

   左递归可能导致输入串的指针停滞不前,因为每次选择候选式pa,因为每次的得到的非终结符P都和输入串第一个a不对应,导致指针不会往后移动,但语法树无限增长陷入死循环

发布了43 篇原创文章 · 获赞 7 · 访问量 3337

猜你喜欢

转载自blog.csdn.net/Zeroooooo/article/details/103015636