单词的词法分析程序设计
单词的词法分析程序设计
对C++进行简单的词法分析
1,读取含有c++源程序的文件作为输入,保存到content
2,将content作为参数,实例化一个对象dfa。
3,由于c++保留字过多,故将c++保留字提前写在txt文件中,在dfa被实例化时,会使用__init__函数,该函数会读取c++保留字文件,并将内容保存到列表ResWord中.
4,调用startanalysis函数,开始启动分析。该函数会逐字符读取content。舍弃换行和横向制表符。读取普通字符时,保存在str中,读取运算符时,保存到opstr中。
当读取到界符时,调用calldfa函数对当前str(不为空时)进行分析。
当读取到运算符时,调用calldfa函数对str(不为空时)进行分析。
当读取一段运算符后读取到普通字符时,调用operdfa对opstr(不为空时)进行分析
5,调用calldfa函数时,即表示进入状态表的初态。
当str首符为数字时,认为该字符串为无符号数,调用numdfa进行分析。
当str首符为下划线或者字母时,认为为标识符或者保留字。调用reslatdfa进行分析。
6,当调用numdfa时,进入状态1(无符号dfa),循环读取字符(字符比须为数字或者小数点)当在状态1的情况下读取到小数点后,进入状态2。在状态2中读取的字符只有为数字才是合法可以进行。如不满足任一条件,则将该字符保存到其他字符列表。
7,当调用reslatdfa时,进入状态1(保留字或者标识符)。
首先判断传递过来的str是否在保留字列表中,如果时,则直接进入MaterRes,结束。
如果不是,则循环读取单个字符,单个字符为字母,数字,下划线,才为合法。否则放入其他字符列表。
8,调用merage,将保存信息列表整合成字典,并返回。
核心代码:
'''启动分析'''
def startanalysis(self):
str=''
opstr=''
for i in self.content:
if i!='\n'and i!='\t':#除去换行,横向制表符
if i in self.Operation: #如果为运算符
opstr=opstr+i
self.calldfa(str)
str=''
elif i in self.LimBoumd: #如果是界符
if i!=' ': #不为空格
self.MateLim.append(i)#保存该界符
self.calldfa(str)
str=''
else:
str=str+i
if opstr!='':
self.operdfa(opstr)
opstr=''
'''无符号数解析'''
def numdfa(self,str):
state=1; #由初态进入为状态1
for i in str:
if i>='0'and i<='9' or i=='.': #为数字或者小数点
if i=='.': #当第一次出现小数点时,进入状态2
if state==1:
state=2
else: #出现第二次小数点,则不是合法无符号数,进入未定义识别列表
self.MaterOther.append(str)
return 0
else: #出现非数字或小数点,则不是合法无符号数
self.MaterOther.append(str)
return 0
self.MaterNum.append(str)
'''标识符和关键字解析'''
def reslatdfa(self,str):
state=1; #进入状态1
if str in self.ResWord: #判断str是否为保留字
self.MaterRes.append(str)
else:
for i in str:
if i>='a' and i<='z' or i>='A' and i<='Z' or i>='0' and i<='9' or i=='_':#c++标识符构词内容
state=1
else:
self.MaterOther.append(str)
return 0
self.MaterTag.append(str)
return 0
本文作者:发呆鱼
本文链接:https://www.cnblogs.com/dyiblog/articles/15929736.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步