[编译原理]算符优先文法分析与实现

在算术表达式中,运算的优先顺序主要采用四则运算的口诀:先乘除后加减,从左算到右,这个口诀确定了乘除运算优先于加减运算,同级运算一律从左到右,即代数中的“左结合”法则。如果计算的每一步做一个运算,那么四则运算的每一步都是唯一的。

      算符优先分析法实质上就是仿效上述计算过程而设计的一种方法,它规定:用算符之间的运算优先关系来确定语句的合法性。并不是所有上下文无关文法都可以建立这样的关系,只有所谓的算符优先文法,才适合这种方法。

      一个文法G,如果它不含空产生式,并且任何产生式的右部都不含两个相连的非终结符,及即不含如下形式的产生式:P-->....QR....,其中P,Q,R,是非终结符。称该文法G为算符文法(operator grammar,也称OG文法。

(....)代表由终结符和非终结符组成的任意序列,包括空字。

 

2.实验步骤

花一周时间写出表达式的文法,优先符号表等理论准备。设计好程序结构,画出模块结构图,写出模块接口和调用关系。描述每个模块的功能。上机编制子模块代码,并测试。业余继续完成代码设计。第二次上机进行调试、修改,对照测试数据比对结果。第三次上机要求全部通过。有余力的同学可编制解释执行程序,对表达式进行求值(此时可不考虑赋值语句)。

 

算符优先分析算法

算符优先分析算法是以最左素短语可作为归约串的自下而上分析方法。下面首先引入最左素短语的概念,然后介绍算符优先分析算法。

 

素短语的概念:它是一个递归的定义,至少含有一个终结符,并且除它自身之外不再含任何更小的素短语,所谓最左素短语就是处于句型最左边的素短语的短语。而一个算符优先文法G的任何句型的最左素短语是满足以下条件的最左子串NaNbNcNdN(N是非终结符,a,b,c,d是终结符)

n素短语(Prime Phrase)

nSÞ* αAβ and AÞ+γ

nγ至少含一个终结符

n且不含更小的含终结符的短语,则称γ是句型αγβ的相对于变量A的素短语

实例:句型T+T*F+id,求出其语法树,可知,T*F最左素短语id也是素短语,但不是最左的。

最左素短语是指在具有多个素短语的句型中处于最左边的那个素短语。例如,文法G1的一个句型

i+F*i的语法图如图所示,其中,i1,F3i2是直接短语,i1是句柄,i1,F3,i2,F3*i2是短语,i1i2是素短语,i1最左素短语

 

现在考虑算符优先文法G,把它句型一般形式写成

#N1a1N2a2…NnanNn+1#

其中前一个#底符号,最后的#是句末符,此外的文法符号可能有一部分在里,另有一部分是尚未入的符号串。一开始,只有前一个#,其余的是整个尚未入的输入符号串,他们应当全是终结符。上述句型的特点是,每个a1均是终结符,每两个终结符之间至多只有一个非终结符,这是根据算符文法的定义可知的。

 

6.9算符优先分析时语法树的框架

 

  • 6
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
算符优先分析算法是一种自底向上的语法分析算法,用于判断输入源程序是否符合语法规则。该算法的主要思想是利用算符优先关系来进行语法分析。 下面是算符优先分析算法的实验步骤: 1. 定义文法:首先需要定义待分析文法,可以使用巴科斯范式(BNF)或扩展巴科斯范式(EBNF)来表示文法。 2. 构造算符优先关系表:根据文法中的终结符和运算符,构造算符优先关系表。其中,算符优先关系表是一个二维矩阵,行和列分别代表两个运算符,表中的值表示它们之间的优先关系。 3. 读入待分析的源程序:从文件中读入待分析的源程序,可以使用词法分析器将源程序转换成一个个单词。 4. 进行算符优先分析:根据算符优先关系表和输入的单词序列,利用栈来进行算符优先分析。具体过程如下: - 初始化栈,将结束符号 $ 和文法的开始符号压入栈中。 - 从输入的单词序列中读入一个单词。 - 判断栈顶符号和当前读入的单词之间的优先关系,如果栈顶符号的优先级高于当前单词,则进行规约操作,即将栈顶符号和它的子树弹出,然后根据规约产生式将它们替换成非终结符号。 - 如果栈顶符号和当前单词之间的优先级低于或等于当前单词,则进行移进操作,即将当前单词压入栈中。 - 重复上述步骤,直到栈中只剩下结束符号 $,并且输入的单词序列已经分析完毕。 5. 输出分析结果:如果分析成功,则输出“分析成功”;否则,输出“分析失败”。 以上就是算符优先分析算法的实验步骤,希望对你有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值