编写的比较简单:
一、实验目的
通过本实验使学生进一步熟悉和掌握程序设计语言的词法分析程序的设计原理及相关的设计技术,如何针对确定的有限状态自动机进行编程序;熟悉和掌握程序设计语言的语法分析程序的设计原理、熟悉和掌握算符优先分析方法。
二、实验要求
本实验要求:①要求能熟练使用一种程序设计语言编程;②在上机之前要有详细的设计报告(预习报告);③要编写出完成相应任务的程序并在计算机上准确地运行;④实验结束后要写出上机实验报告。
三、实验题目
针对下面文法G(S):
S→ v = E
E→E+E│E-E│E*E│E/E│(E)│ v │ i
其中,v为标识符,i为整型或实型数。要求完成
① 使用自动机技术实现一个词法分析程序;
KW={'var':1,'int':2,'#':3,'=':4,'+':5,'-':6,'*':7,'/':8,'(':9,')':10}#var=>标识符 int=>数字 #=>结束标记
words=input('输入语句:')
index=0
flag=1
if(words[-1] != '#'):
print("error:输入表达式应以#结尾!")
flag=0
while(index+1<len(words) and flag==1):
ch=words[index]
if(ord(ch) in range(ord('a'),ord('z')+1) or ord(ch) in range(ord('A'),ord('Z')+1)):
#该字符为字母
Crs=ch
if(ord(words[index+1]) not in range(ord('a'),ord('z')+1) and ord(words[index+1]) not in range(ord('A'),ord('Z')+1)):
if(Crs in KW.keys()):
print('({},\'{}\')'.format(KW[Crs],Crs))
index+=1
else:
print('({},\'{}\')'.format(1,Crs))
index+=1
else:
while(ord(words[index+1]) in range(ord('a'),ord('z')+1) or ord(words[index+1]) in range(ord('A'),ord('Z')+1)):
Crs=Crs+words[index+1]
index+=1
if(words[index+1]=='#' or ord(words[index+1]) not in range(ord('a'),ord('z')+1) and ord(words[index+1]) not in range(ord('A'),ord('Z')+1)):
if(Crs in KW.keys()):
print('({},\'{}\')'.format(KW[Crs],Crs))
index+=1
break
else:
print('({},\'{}\')'.format(1,Crs))
index+=1
break
elif(ch==' '):
#该字符为空格
while(words[index+1]==' '):
index+=1
index+=1
elif(ch in ['=','+','-','*','/','(',')']):
#该字符为运算符
index+=1
print('({},\'{}\')'.format(KW[ch],ch))
elif(ch in ['0','1','2','3','4','5','6','7','8','9']):
#该字符为数字
num=ch
while(words[index+1] in ['0','1','2','3','4','5','6','7','8','9']):
num=num+words[index+1]
index+=1
index+=1
print('({},{})'.format(2,num))
if(words[index]=='#'):
print('(3,\'#\')')
break
#输入:#结尾的算符表达式
效果:
② 使用算符优先分析方法实现其语法分析程序;
OPE={ #操作符优先级字典
'+':{'+':'>','-':'>','*':'<','/':'<','(':'<',')':'>','#':'>'},
'-':{'+':'>','-':'>','*':'<','/':'<','(':'<',')':'>','#':'>'},
'*':{'+':'>','-':'>','*':'>','/':'>','(':'<',')':'>','#':'>'},
'/':{'+':'>','-':'>','*':'>','/':'>','(':'<',')':'>','#':'>'},
'(':{'+':'<','-':'<','*':'<','/':'<','(':'<',')':'=','#':'err'},
')':{'+':'>','-':'>','*':'>','/':'>','(':'err',')':'>','#':'>'},
'#':{'+':'<',