算符优先分析法-思路方法在这里

为了方便,记录一下,因为本人也正在学编译原理,以便后续的学习复习,以下是自己整理的。

编写一个算符优先分析程序,能实现以下功能:

1.输入文法,判断是否为算符文法;
2.构造并输出该文法的每个非终结符的 FIRSTVT 集和 LASTVT 集;
3.构造并输出算符优先分析表,判断是否为算符优先文法,若不是提示无法进行分析;
4.任意输入一个输入串,可得到成功的分析或错误的提示,输出其分析过程或打印语法 分析树。

实验运行结果在这里插入图片描述
算符优先文法的特点:
我们构造了算符优先语法分析器,就可以忽略原来的文法,栈中的非终结符仅仅作为与这些非终结符相关的属性的占位符
难以处理像减号这样有不同优先级的符号
由于分析的语言的文法和算符优先语法分析器本身的关系不是很紧密,所以不能肯定语法分析器接受的就是所期望的语言

什么是算符文法?应满足什么条件
算符文法
设有一个文法G,若G中有形如U->Vw的产生式,即它的任意产生式的右部都不含两个相继的非终结符,则称G为算数文法,或称为OG文法。

算符优先文法
(1)是底向上分析法中的一种,虽然他不是规范规约,但具有分析速度快的特点,是和表达式分析。
(2)算符优先分析法就是仿照算数四则运算的运算过程。定义任意两个相继出现的终结符号a和b之间的优先关系,一点确定了这种优先关系,就可以用他确定“句柄”进行规约。
概述
   算符优先分析法(Operator Precedence Parse)是仿效四则运算的计算过程而构造的一种语法分析方法。算符优先分析法的关键是比较两个相继出现的终结符的优先级而决定应采取的动作。

   优点:简单,有效,适合表达式的分析。

   缺点:只适合于算符优先文法,是一个不大的文法类。
求FIRSTVT集和LASTVT集
FIRSTVT集

定义:FIRSTVT§={a|P=>a…,或P=>Qa…,a属于VT,Q 属于VN}

求法:

若P→a…或P→Qa…, 则a属于FIRSTVT(P);

若P→Q…, 则FIRSTVT(Q)含于FIRSTVT(P);

直至FIRSTVT(P)不再增大。
LASTVT集

定义:LASTVT§={a|P=>…a,或P=>…aQ,a含于VT,Q 含于VN}

求法:

若P→...a或P→…aQ, 则a属于LASTVT(P);

若P→...Q, 则LASTVT(Q)含于LASTVT(P);

直至LASTVT(P)不再增大。
构造算符优先关系表

以以下文法为例:

    E→E+T|T

    T→T*F|F 
    
    F→(E)|i
终结符之间的优先关系

对算符文法G, a,b属于VT 定义

(1)a=b: G中有P→. . .ab. . .或P→. . .aQb. . .

(2)a<b: G中有P→. . .aQ. . .且Q=>b…或Q=>Rb…

(3)a>b: G中有P→. . .Qb. . . 且Q=>. …a或Q=>…aR

算符优先关系表的构造

(1) 在文法中添加E→#E#。

(2) 求出FIRSTVT和LASTVT集

在这里插入图片描述

(3) 找出所有终结符,并画出关系表的结构

在这里插入图片描述

(4) 从文法中找出形为aQb(终结符+非终结符+终结符)和ab(终结符+终结符)的部分,本例中为(E)和#E#,然后在(和)与#和#相应的表格填=。

在这里插入图片描述

(5) 从文法中找出形为aQ(终结符+非终结符)的部分,a与Q的FIRSTVT集合中每一个元素在表格中的交叉点填小于号。

i.找出形为aQ的部分

在这里插入图片描述

ii.填小于号(终结符为竖排,非终结符中的元素为横排,以横排为基准填符号)

在这里插入图片描述

(6) 从文法中找出形为Qa(非终结符+终结符)的部分, Q的LASTVT集合中每一个元素与a在表格中的交叉点填大于号。
i.找出形如Qa的部分

在这里插入图片描述
ii.填大于号(非终结符中的元素为横排,终结符中的元素为竖排,以竖排为基准填符号)
在这里插入图片描述

(7) 合并后的结果为

在这里插入图片描述

从上表可知:

(1)相同终结符之间的优先关系未必是=

(2)有a<b,未必有b>a

(3)a、b之间未必一定有优先关系
分析过程

在这里插入图片描述

算符优先分析法最左规约串的确定
  1. 最左素短语的定义是什么?
素短语:某文法句型的短语它至少包含有一个终结符号,并且除它之外,不再包含任何更小的素短语。
最左素短语:任意句型最左边的素短语。
  1. 最左素短语的特征?如何根据其特征确定当前句型的最左可归约串?在这里插入图片描述
  2. 什么是“单非产生式”,算符优先分析法进行规约为什么速度快?
右部仅有一个非终结符的产生式
比用文法的优先关系矩阵节省内存,若有n个终结符号,优先关系矩阵占内存为(n+1)2,优先函数为2(n+1);
编程时便于比较运算,即用一般的关系运算即可;

由于时间原因,代码没来及上传。

猜你喜欢

转载自blog.csdn.net/qq_45893999/article/details/106163982