编译原理第五章-语法分析(自下而上)


     自下而上的分析是一种归约的算法,其基本思想是用一个寄存符号的先进后出栈,把输入符号一个一个地移进到栈里,当栈顶形成某个产生式的候选式时,即把栈顶的这一部分替换成(归约为)该产生式的左部符号。自下而上分析过程:边输入单词符号,边归约。其核心问题是识别可归约串。
    规范规约的几个基本概念:
   1. 短语:

        令G是一个文法,S是文法的开始符号,假定abd是文法G的一个句型

         其中α,β,d∈(VNVT)*A∈VN ,如果有

              则贝塔称是句型相对于非终结符A的短语。
   2.直接短语
      特别是,如果有,则称是句型相对于规则的直接短语。
    3.句柄
       一个句型的最左直接短语称为该句型的句柄。
    4.规范规约  

        规范归约是关于是一个最右推导的逆过程。  由于规范句型由最右推导推出的句型,故该句型的句柄右边只含有终结符号。
    5. 算符优先分析法     

              定义两个终结符‘a’与‘b’的优先关系
        a =.b   表示a的优先性等于b
        a >.b   表示a的优先性大于b

        a <.b   表示a的优先性小于b 
     6 .算符文法
          一个文法,如果它的任一产生式的右部都不含两个相继(并列)的非终结符,则我们称该文法为算符文法,也称OG文法 。

      

   算符优先分析算法和设计:句型的一般表示形式:#N1a1N2a2…NnanNn+1#,其中,每个ai都是终结符,Ni是可有可无的非  终结符

        定理:一个算符优先文法G的任何句型的最左素短语是满足如下条件的最左子串Njaj…NiaiNi+1,

     aj-1<.aj

     aj=. aj+1aj+1=. aj+2ai-1=. ai

     ai>. ai+1

        

      优先函数的定义:把每个终结符q与两个自然数f(q)g(q)相对应,使得

      若q1<.q2,则f(q1)< g(q2)

      若q1 =. q2,则f(q1)= g(q2)

      若q1 >. q2,则f(q1) >g(q2)

      f称为入栈优先函数,g称为比较优先函数。

      (1)优点:便于比较,节省空间;

      (2)缺点:原来不存在优先关系的两个终结符,由于自然数相对应,变成可以比较的。要进行一些特殊的判断。

   构造算符优先关系表
     (1)通过检查产生式的每一个候选式可以找出满足a=.b(即P→…ab…或P→…aQb…的产生式)
     (2)为了满足<.和>.,需对G中每个非终结符P构造两个集合FIRSTVT(P)和LASTVT(P):
          

   构造集合FIRSTVT(P)的算法
     按其定义,可用下面两条规则来构造集合FIRSTVT(P)

      ① 若有产生式P→a…或P→Qa…,则a∈FIRSTVT(P);

      ② 若a∈FIRSTVT(Q),且有产生式P→Q…,则a∈FIRSTVT(P)。即P每一步推导中第一个出现的终结符的集合。

    

     有了这两个集合之后,就可以通过检查每个产生式的候选式确定满足关系<.和>.的所有终结符对。
    (1)假定有个产生式的一个候选形为…aP… 那么,对任何bFIRSTVT(P),有a <. b。
    (2)假定有个产生式的一个候选形为…Pb… 那么,对任何aLASTVT(P),有a >. b。这样就可以求得优先表。

   LR分析法      

       LR分析器
       LR(0)分析表的构造
       项目、项目集、项目集规范族
       项目集的闭包(closure)
        有效项目
        LR分析法的归约过程是规范推导的逆过程,所以LR分析过程是一种规范归约过程
   LR分析器栈的结构_动作表和状态转换表    

    动作表:
ACTION[s,a]:
                       当状态s面临输入符号a时,应采取什么动作
                        每一项ACTION[s,a]所规定的四种动作:

                 <1>. 移进
                 <2>. 归约
                 <3>. 接受
                 <4>. 报错

    状态转换表:
GOTO[s,X]:

状态s面对文法符号X时,下一状态是什么
  

  LR(0)分析表的ACTION和GOTO表的构造步骤

  (1)若项目A→a•ab属于Ik,且转换函数GO(Ik,a)=Ij,当a为终结符时 ,则置ACTION[k,a]为Sj;

 (2)若项目A→a•属于Ik,则对a为任何终结符或“#”,置ACTION[k,a]=rj, j为产生式在文法G′中的编号;

 (3)若GO(Ik,A)=Ij,则置GOTO[k,A]=j,其中A为非终结符,j为某一状态号;      

  (4)若项目S′→S•属于Ik,则置ACTION[k,#]= acc;

 (5)其它填上“报错标志”。

     部分课后习题:
     



总结:
本章内容知识点比较多,很杂碎,很多概念性的东西理解的不透彻。感觉逻辑性越来越强了,课下还是得多花功夫去复习巩固,做课后题对内容的理解还是很有帮助的,本来不是很懂的知识点通过做题都会逐渐弄明白,希望之后的课程能够尽量跟上老师的节奏
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值