单词的词法分析程序设计

单词的词法分析程序设计

对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

测试用例
运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丁拾陆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值