• 编译原理-算符运算优先


    一、概念

    1、移动规约分析法:

    自底向上的语法分析方法,也称为移动归约分析法

    • 最易于实现的一种移动归约分析方法,叫做算符优先分析法
    • 而更一般的移动归约分析方法叫做LR分析法,LR分析法可以用作许多自动的语法分析器的生成器。

    2、文法G[S]

      S  =>αAδ且A  => b则称b是句型αb δ相对于非终结符A的短语

    素短语与最左素短语

    G的句型的素短语是一个短语,它至少包含一个终结符,且除自身外不再包含其他素短语。处于句型最左边的素短语为最左素短语

    句柄:一个句型的最左直接短语称为该句型的句柄。 

    通俗理解:

    短语:一棵子树的所有叶子自左至右排列起来形成一个相对于子树根的短语。 
    直接短语:仅有父子两代的一棵子树,它的所有叶子自左至右排列起来所形成的符号串。 
    句柄:一个句型的分析树中最左那棵只有父子两代的子树的所有叶子的自左至右排列。 

    Example:

    文法G[E]
    (1) E→E+T
    (2) E→T
    (3) T→T*F
    (4) T→F
    (5) F→P
    ­F|P
    (6) P
    →(E)
    (7) P→i


    句型T+T*F+i
    其短语有:
    T+T*F+i
    T+T*F
    T
    T*F
    i




    素短语为T*Fi

    最左素短语为T*F

    句型T+T+i的素短语为T+Ti

    句型T+T+F的素短语为T+T


    3、算符优先文法的定义:

    如果不含空产生式的上下文无关文法G中没有形如A®BC的产生式,其中BC∈VN则称G为算符文法OG)。



    性质1:在算符文法中任何句型都不包含两个相邻的非终结符.
    性质2:如 Ab 或 bA 出现在算符文法的 句型  中,其中  A∈VN,b∈VT, 则  中任何 含 b 的短语必含有A。


    4、
    在OG中 定义  (算符优先关系)
     a = b        G中有形如:A->…ab…
              或A -> …aBb...的产生式。       
     a < b        G中有形如: A-> …aB…的产生式, 而   B  =>   b…   或B  =>   Cb… 
     a > b         G中有形如: A => …Bb…的产生式,而  B => …a 或  B =>… aC



    规定  若 S=>  a…或    S => Ca…    则    # < a
          若 S  => …a   或  S =>…aC   则    a > #



    在 OG文法  G 中,若任意两个终结符间至多有一种算符优先关系存在,则称G 为算符优先文法(OPG)。
    注意:允许b>c, c>b;
    不允许 b>c, b<c, b=c中任两个 同时存在。




    5、首先定义如下两个集合:
    FIRSTVT(B)={b|B => b… 或 B=> Cb…}


    LASTVT(B)={a|B =>…a 或 B =>…aC}
    按如下算法计算出给定文法中任何两个终结符对(a,b)之间的优先关系:

    1) ‘=‘关系
    直接看产生式的右部,若出现了A →…ab…或  A →…aBb,则a=b
      2)’<‘关系
    求出每个非终结符B的FIRSTVT(B)
    若A→…aB…,则任意b∈FIRSTVT(B),则a<b
      3)’>’关系
    求出每个非终结符B的LASTVT(B)
    若A→…Bb…,则任意a∈LASTVT(B),则a>b·

    算符优先分析伪代码:

    k:= 1; S [ k ] := “#”
    	repeat  read 下一符号到a;
    	            if  S[ k ]   Vt then j := k else j := k-1;
    	            while S[ j ] > a do
    	              { repeat 
    	                    Q := S[ j ];
    	                     if   S[ j-1]  Vt  then j := j-1
    	                                              else j:= j-2
    	                  until  S [ j ] < Q;
     将 S[ j+1] S[ j+2 ]…S[ k ]归约到某个N;//
    	                   k := j+1;
    	                   S[ k ]:= N;
    	                }
    	              if ( S [ j ] <  a  or  S[ j ] = a)
    	               then   { k := k+1; S[ k] := a}
    	                else  error
    	  until  a = “#”
    
    


    二、算法优先关系构造算法

    (一)首先对于优先关系进行如下定义:

    • a的优先级低于b 
      a < b: 文法中有形如A→…aB…的产生式而B+b…或B+Cb…
    • a的优先级等于b 
      a = b: 文法中有形如A→…ab…或者A→…aBb…的产生式
    • a的优先级高于b 
      a > b: 文法中有形如A…Bb…的产生式,而B+…a或B+…aC
    • 算符的优先关系是有序的 
      • 如果a > b,不能推出b < a
      • 如果a > b,有可能b > a
      • 如果a > b, b > c,不一定a > c 
        根据这个大小关系的定义,我们知道为了确定两个终止符的优先关系,我们需要知道它的在所有的产生式中和前后非终止符的关系,那么我们做一个如(二)预处理:

    (二)定义并构造FIRSTVT和LASTVT两个集合

    FIRSTVT(P)={a|P+aP+Qa}

    LASTVT(P)={a|P+aP+aQ}
    FIRSTVT(P)直接根据定义递归的构造即可:

    • a) 若有产生式 P→a••• 或 p→Qa•••  
      则 a∈FIRSTVT(P)

    • b) 若有产生式 P→Q••• , 
      若 a∈FIRSTVT(Q) 
      则 a∈FIRSTVT(P)

    LASTVT(P)直接根据定义递归的构造即可:

    • a) 若有产生式 P→•••a 或 p→•••aQ  
      则 a∈LASTVT(P)

    • b) 若有产生式 P→•••Q , 
      若 a∈LASTVT(Q) 
      则 a∈LASTVT(P)



  • 相关阅读:
    Django框架(二十三)-- Django rest_framework-视图组件
    Django框架 --序列化组件(serializer)
    Django框架(十六)-- 中间件、CSRF跨站请求伪造
    leetcode 之 两数之和
    vue中webpack相关的配置
    vue-cli3 初始化创建项目
    vue之模块化开发
    vue基础之常用方法
    凯哥带你用python撸算法之雪花算法
    docker数据卷之持久化操作
  • 原文地址:https://www.cnblogs.com/bryce1010/p/9387110.html
Copyright © 2020-2023  润新知