自下而上的分析法(笔记) b站课堂:BV11t411V74n?p=18

基本思想:

  从输入串开始,逐步进行归纳,直到文法的开始符号

  归纳:根据文法的产生式规则,把产生式的右部替换成左部符号。

  从树末端开始,构造语法树

 

 

归约相关概念:

规范归约和最右推导,前者从右到左,后者从左到右,两者互为逆过程

只有规范归约出来的句型才能叫归约句型

 采用 移进-归约 的方法(使用符号栈,以#开始或者结尾)

符号栈的使用例子:

 

 

 

 

句柄 就是可归约串

 在符号栈里,一旦栈顶出现句柄就进行归约

符号栈的内容和剩下的输入串一定构成一个归约句型

归约核心还是关于句柄的可归约算法。关键在于句柄的判断和选择才能进行归约,才能有效形成语法分析树

 

可归约算法: 

  算符优先分析法:

    按照算符的优先关系和结合性质进行语法分析

    适合分析表达式

   基本思想:

    起决定作用的是相邻的两个算符(终结符)之间的优先关系。所谓算符优先分析法就是定义算符之间的某种优先关系,借助于这种关系寻找可归约串进行归约。

    优先关系的定义:定义任何两个可能相继出现的终结符a与b的三种优先关系(与顺序有关,a一定出现在b的左边,且a、b相邻)

 

    相关概念添加:

    

 

      

        例子:

    

 

    

 

      说明:空意味着不能连续出现,列为左边先出现

     

 

        

 

     

 

 

     构造FIRSTVT(P): 

    

 

    

 

     同理,LASTVT(P)也是如此。

    例子:

     

 

     

 

      

     素短语概念:

    

 

     最左素短语:句型最左边的素短语  

     

     注意

     

 

    算法优化:

    事实上优化了查表的速度,空间 。

    

 

 

 

 

 

   有些优先关系表没有优先函数,例子:

     

 

 

     优先函数存在,但不唯一(大小关系确定但是数的大小可以+常量,所有有无数个)

     构造方法:

    

 

     证明:

    

 

     

    

 

     

 

     算法实际思想:根据非终结符的优先关系寻找最左素短语进行归约,其中可以使用优先函数进行优化。

    

  LR分析法:

    规范归纳

    基本思想: 

    规范归约的关键也是寻找句柄:要从历史(已经一如栈的内容)、展望(根据产生式预测的输入)和现实(当前输入的符号)进行操作。

  

 

 

 

  下面从优先表的使用再到优先表的产生进行实现LR分析法。

    LR分析方法(优先表就是LR分析程序中进行分析的依据):

    

     LR分析表例子:

    

    Action中以S开头的,以r开头的

    acc结束

    以分析表具体分析过程例子:

     

 

 

     

 

 

     示例:见视频

    相关概念:LR(K)文法

     

 

 

     LR文法真包含于无二义文法。

    👇LR优先表的产生:

    首先继续明确一下句柄在栈的体现:

    

 

 

     相关概念:子的前缀,活前缀

    

     产生优先表的思想:  使用一个DFA使得栈中始终是活前缀

    

    相关概念:

     

    

    

 

 

    对于每个产生式都可以构造对应的项目,所有的项目可以形成一个NFA,都可以改进成如下的黄图

    ,只有项目有效就可以进行形成句柄

    但是,有时候可能有多个接受项目,所以需要改进 ,例子如下,对于bc,三个项目都有

  

 

      改进:

     

 

     使用闭包

     

 

      

 

   小结:

 

posted @ 2020-05-16 21:29  J0K3Rzz  阅读(451)  评论(0编辑  收藏  举报