南华大学
计 算 机 科 学 与 技 术 学 院
实 验 报 告
( 20 ~20 学年度 第 2 学期 )
课程名称
实验名称
词法分析程序设计与实现
姓名
学号
专业
软件工程
班级
地点
教师
南华大学计算机科学与技术学院 实验报告
1.实验目的及要求
目的:
加深对语法分析器工作过程的理解;加强对算符优先分析法实现语法分析程
序的掌握;能够采用一种编程语言实现简单的语法分析程序;能够使用自己编写
的分析程序对简单的程序段进行语法翻译。
要求:
1. 对语法规则有明确的定义
2. 编写的分析程序能够对实验一的结果进行正确的语法分析
3. 对于遇到的语法错误,能够做出简单的错误处理,给出简单的错误提示,
保证顺利完成语法分析过程
2.实验步骤
1.定义目标语言的语法规则;
2.求解预测分析方法需要的符号集和分析表;
3.依次读入实验一的分析结果,根据预测分析的方法进行语法分析,直到源
程序结束;
4.对遇到的语法错误做出错误处理。
3. 实验内容
文法设计如下:
关键算法如下
算符分析算法:
使用两个工作栈。一个叫做 OPTR,用以寄存运算符,一个叫 OPND,用以寄存操作数或结果
[1]首先置操作数栈为空栈,将表达式起始符;作为运算符栈的栈底元素。
[2]依次读入表达式中每个单词,若是操作数则进 OPND 栈,若是运算符则转[3]。
[3]将此运算符θ1 与 OPTR 栈顶元素θ2 进行比较,即查上表,若 θ1>θ2,则:θ1
进栈,转[2]
南华大学计算机科学与技术学院 实验报告
若 θ1=θ2 ,如θ1 为;,则分析成功,否则 OPTR 栈顶元素出栈,并转[2]
若 θ1<θ2,则出栈 OPND 栈顶元素至 b,又出栈其栈顶元素至 a,出栈 OPTR 栈顶元素至
t,进行运算 r=a t b(t 为运算符),并将结果 r 存入栈 OPND 后转[3]。
若θ1 和θ2 之间无优先关系,则报错。
错误定位算法:
当 OPND 长度小于 2 时,但算法执行需要 pop 出两个 OPND 元素进行规约,说明输入串
不符合文法 G,此时将 RESULT 顶部前一个规约串取出,获取此规约串所进行的四则算法
算符位置,定位此位置为错误发生位置,并生成相应的错误定位字符串 ‘>错误字符<‘
实现错误定位。
流程图
整体流程如下:
南华大学计算机科学与技术学院 实验报告
规约流程如下:
S 为符号栈,用于寄存规约,或待规约串,对应代码中的 OPND 栈,a 是从 OPTR
中读取的一个字符,对应代码中的 read_char
程序源代码:
从文件读取文法模块:
def read_file(path=None):
if(path==None):
raise RuntimeError('读取文件路径不能为空。')
with open(path,'r') as f:
txt_lines=f.readlines()
for line in txt_lines:
南华大学计算机科学与技术学院 实验报告
yield line
def getOneProduction(path='test.txt'):
for line in read_file(path):
productionStr=line
vn=productionStr[0]
index=0
for i in range(len(productionStr)-2):
if (productionStr[i] == '-') & (productionStr[i+1]
== '>'):
index+=2
break
index+=1
RES=productionStr[index:].strip('\n')
yield vn,RES
def getG():
G = []
for oneProduction in getOneProduction():
G.append(oneProduction)
return G
算符分析模块:
from produceG import getG
#定义终结符和非终结符
vn = ['S', 'E', 'T', 'F']
vt = [ '+', '*', '-', '/','i','(', ')', '#']
F={}
L={}
FIRST_STACK=[]
LAST_STACK=[]
G=getG()
def InsertFirstStack(P, a):
if F[P,a] == False:
F[P,a] = True
FIRST_STACK.append((P, a))
def InsertLastStack(P, a):
if L[P,a] == False: