自底向上语法分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验3 自底向上语法分析
——算符优先OP
一、实验目的
理解自底向上语法分析的基本思想。
理解算符优先文法的概念。
掌握算符分析表和优先函数的构造。
掌握算符优先分析器的工作原理和工作流程。
二、实验原理
算符优先分析法是一种简单、直观、广为使用的语法分析方法,这种方法特别适用于程序设计语言中的表达式的分析。算符优先分析法就是仿照算术表达式的运算过程而提出的一种自底向上的语法分析方法,基本思想是:根据文法终结符之间的优先关系,通过比较相邻算符的优先次序来确定句型的最左素短语,并进行归约。
所谓的算符优先文法是指:对算符文法中任意两个终结符对(a,b)之间至多有一种优先关系成立的文法,而算符文法G中的任何一个产生式都不包含两个非终结符相邻的情况。对于满足这样条件的文法,即可用算符优先分析法对其进行分析。
确定了符合要求的文法之后,自底向上的分析方法的关键就是如何在当前的句型中寻找可归约的子串,算符优先分析法在归约过程中,通过终结符之间的优先关系确定当前的句型中的最左素短语,与非终结符无关,只需知道把当前句型中的最左素短语归约为一非终结符。
在算符优先分析法分析过程中,可以设置一个栈S,用来存放归约或者待形成最左素短语的符号串,用一个工作单元sym存放当前读入的输入符号,归约成功的标志是当前读入的输入符号是句子的结束符号#,栈S中只剩下#和文法开始符号。
三、实验任务
(一)准备:
1.阅读课本有关章节,考虑好设计方案;
2.设计出模块结构、测试数据,初步编制好程序。
(二)上课上机:
将源代码拷贝到机上调试,发现错误,再修改完善。
(三)程序要求:
给定一个上下文无关文法G构造其算符优先分析器,从而判定该文法G是否是算符优先文法,生成的算符优先分析器能够判断出句子的正确与否。
G[B]:B→BoT|T T→TaF|F F→nF|(B)|t|f
步骤:
1.编写程序,构造上述文法G的FIRSTVT和LASTVT集,并生成算符优先关系表。
(选做)
2.根据给定的优先关系表判别句子是否为文法的句子(必须完成,跳过第一步
的同学,请参考P121 表6.15)。
参考流程:
初始化优先关系表;
栈内仅有#号;sym=’’;读头ip指向第一个输入带上的符号;
While (!(栈内只剩一个#和S and 输入串上符号只剩#))
{读一个符号到sym
if (a<⋅sym) or (a=sym) then
begin /* 移进* /
把sym推入栈中;
使ip前进到下一个符号;
end
if a⋅>sym then /* 归约* /
repeat
从栈中弹出符号
until 栈顶终结符号<⋅最近弹出的终结符号;
else error}
可以简单得出句子正确与否的结论,亦可按如下格式输出:
对输入的串ntofat#
步骤符号栈当前符号剩余输入串动作
1 # n ntofat# 移进
2 #n t tofat# 移进
3 ……
四、实验报告
编制并调试程序程序,运行通过后,书写实验报告,报告包括以下内容。
1.实验题目与要求
2.总的设计思想,及环境语言、工具等
3.数据结构与模块说明(功能与框图)
4.源程序(核心代码)
5.运行结果与运行情况
6.总结