1.概述
本次实验通过用python语言,设计,编制,调试一个词法分析子程序,识别单词,实现一个python语法分析器,经过此过程可以加深对编译器解释的过程。
1.1.实验目的
理解并掌握语法分析的原理与方法,能够使用某种语言实现语法分析程序。
1.2.实验描述
本实验中将C语言单词符号分为三类:关键字,运算符,界符,将关键字初始在KeyWord列表中,将界符初始在KeyAmbit列表中,将运算符初始在KeySimple列表中。因此,从原文件字符串中识别出关键字,界符,运算符只能从中选取,其他的可以归类为变量,数字,格式变量,格式符,存放到列表中,字典存放这些变量的位置,方便确认报错位置。
1.3.实验要求
1.输入词法分析输出的单词序列,判断单词序列构成的程序是否符合语法语法规则。
2.记录语法错误信息,统一输出错误信息。
2.实验内容
2.1.实验代码
__author__='PythonStriker'
KeySimple=['*','-','/','=','>','<','>=','==','<=','%','+','+=','-=','*=','/='] #词法分析器中分别运算符
KeyAmbit=['(',')',',',';','.','{','}','<','>','"','[',']',"'"] #词法分析器中分别界符
KeyWord=[ 'bool','char' ,'char[','class','define','double','false','float','getchar','include','int','iostream','long','main','null','open','printf',
'private','public','put','read','return','short','scanf','signed','static','stdio','string','struct','true',
'unsigned','void']
TypeKeyWord=['int','long','unsign','double','float','string','struct','char','void','bool','class','short'] #语法分析定义类型
FunctionKeyWord=['getchar','open','printf','put','read','return','scanf','main'] #语法分析功能类型
#------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SourceProgram=[] #存放源程序代码
DeleteNote_SourceProgram=[] #存放去除注释源程序代码
Reader_SourceProgram=[] #存放类型判断后源程序
WordPositionList=[] #存放单词位置信息
#------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ErrorList={} #语法分析器错误储存报表(存储报错位置和类型)
WordType={} #词法类型字典
WordPosition={} #定位关键字位置
#------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Filepath='' #存放文件路径
#------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
LeftNoteFlag=0 #/*注释清除标记
RightNoteFlag=0 #*/注释清除标记
LeftBracketNumber=0 #成对界符的左标记
RighBracketNumber=0 #成对界符的右标记
NumberInString=0 #String中的下标
NumberinList=0 #List中的下标
#------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
class Assembly(): #封装成编译器
def IsLetter(self,Char):
if((Char<='z' and Char>='a') or( Char<='Z' and Char>='A') or Char=='_'):
return True
else:
return False
def IsNote(self,String):