概述
实验目的
通过设计、编制、调试一个典型的赋值语句的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查,进一步掌握常用的语法分析方法。
实验要求
设计出给定源语言中包含有算术表达式、关系表达式和逻辑表达式的赋值语句的文法,文法满足采用的语法分析方法的要求。
选择最有代表性的语法分析方法,如算符优先法(或简单优先法)、递归下降分析法、LL分析法和LR分析法之一进行语法分析。
选择对各种常见程序语言都通用的语法结构,以文本文件形式输入源程序,把其中赋值语句作为分析对象进行语法检查,输出分析结果。
实验设计
实验手段
实验使用ll(1)预测分析法,实验所用到的预测分析表为事先写好的,由程序读入。
实验使用的文法
G[S]:
(1)S→i=E
(2)E→TE′
(3)E′→ATE′|ε
(4)T→FT′
(5)T′→MFT′|ε
(6)F→ (E)|i
(7)A→+|-
(8)M→*|/ (9)V→i
由该文法构造的预测分析表
实验过程设计
1,实验有三个类构成。LL_1类,用来实现ll(1)预测分析法的分析过程。LL1_list类,用来储存预测分析表。Stack类,将其作为栈,来配合分析过程的栈操作。
2,由主程序读入程序,按行分割,将;替换成结束符#。
3,由ll_1类中进行句子分析,逐个读取字符。(#注:此处程序没有词法分析,不能对标识符进行分析,采用i作为所有标识符)。
4,在根据从左到右的分析规则,将输入串从后向前逐个压入CinStack栈中。将#号和开始符S压入AnStack栈中。
5,从取分析栈和输入栈中栈顶元素,两个对比。如果都为终结符,做匹配操作(如果不等,则返回错误)。如果分析栈中为非终结符,做匹配操作(如果查得为faslse,返回错误)。
6,重复操作,直至错误返回,或者匹配到结束符#返回成功。
7,根据返回值,将句子保存到正确句子字典或者错误句子字典。
7,将字典写入文件。
调试过程
调试过程截图
实验不足
实验不足之处,实验的文法中没有假如对单目运算符的分析(如i=i++)这样的合理赋值语句,由于没有可以推到++的非终结符,故程序会认为其是错的。此外程序无法自主生成ll(1)预测分析表,需要手动写入文件中。因为没有加入词法分析,所以只是模拟ll(1)预测分析法分析简单赋值语句的过程。
核心代码
def analyse(self):
'''进行分析'''
self.AnStack.push('#') # #号入栈
self.AnStack.push('S') #开始符入栈
anstr='' #当前分析字符
cinstr=self.CinStack.top() #取输入栈栈顶元素
while 1:
#print("分析栈"+self.AnStack.show())
#print("输入栈"+self.CinStack.show())
anstr=self.AnStack.top() #取分析栈栈顶元素
if cinstr=='#' and cinstr==anstr: #当都为#号符时,分析结束,结果正确
return True
elif anstr==cinstr: #都为终结符,且相同,此时可进行匹配
self.Vtequal() #进行匹配
cinstr=self.CinStack.top()#取输入符栈顶元素,
else:
nextstr=self.excel.search(anstr, cinstr)
if False==nextstr or nextstr=='false':
return False
else: #分析栈中非终结符可以推到此时输入符,进行替换操作
self.VnNext(nextstr) #进行替换操作
最后
以上就是大胆钢笔为你收集整理的编译原理实验,赋值语句的语法分析程序设计实验目的实验要求实验设计调试过程的全部内容,希望文章能够帮你解决编译原理实验,赋值语句的语法分析程序设计实验目的实验要求实验设计调试过程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复