【python】编译程序中的词法分析器的设计与实现

这个学期选了编译原理这门课,还附带一个课程设计,经过几天的鏖战,终于算是告一段落了,下面是我对词法分析器的一些设计,希望可以帮到和我有相同遭遇的博友们……



代码实现:
from tkinter import *
import threading

#预定义的可以分析的各种字符和关键字,依个人需求可进行修改
#运算符
a = ['*', '-', '/', '=', '>', '<', '>=', '=', '<=', '+','<>']
#界符
b = ['(', ')', '"', ';', '!']
#关键字
c = ['long','float','static',
   'char','short','switch','int',
   'const','if','then','else','for'
   ,'while','break']

 #GUI的实现
def GUI():
   root = Tk()
   root.title("编译原理课程设计")
   root.geometry("350x180+500+300")
   lb = Label(root, text="请输入程序文件的绝对地址:")
   lb.grid(row=0, column=0)
   entry = Entry(root)
   entry.grid(row=0, column=1)
   btn = Button(root, text="开始分析", fg='black', relief="raised",         bd="9")
   btn.grid(row=1, column=1)
   btn.bind("<Button-1>",
            lambda x: xiancheng(entry))
   root.mainloop()


#判断是否字符
def IsLetter(Char):
   if ((Char >= 'a' and Char <= 'z') or (Char >= 'A' and Char <= 'Z')):
      return True
   else:
      return False

#判断是否是数字
def IsDigit(Char):
   if (Char <= '9' and Char >= '0'):
      return True
   else:
      return False

#判断是否是空格
def IsSpace(Char):
   if (Char == ' '):
      return True
   else:
      return False

#词法分析的核心算法,将文件中代码按关键字,界符,运算符等进行分离,并把结果以列表形式返回
def fenli(List):
   ResultList = []
   for String in List:
      Letter = ''
      letter = ''
      index = 0
      for Char in String:
         if (index < len(String) - 1):
            index += 1
         if (IsLetter(Char) or IsDigit(Char)):
            if (IsLetter(String[index]) or IsDigit(String[index])):
               Letter += Char
            elif (IsSpace(String[index]) or (String[index] in b) or (
                    String[index] in a) or (String[index:index + 2] in a)):
               Letter += Char
               ResultList.append(Letter)
               Letter = ''
         elif Char in b:
                     ResultList.append(Char)
         elif Char in a:
                     letter += Char
                     if (String[index] in a):
                           letter += String[index]
                           ResultList.append(letter)
                           letter = ''
                     else:
                           ResultList.append(letter)
                           letter = ''
         elif IsSpace(Char):
                           pass
   return ResultList

#对fenli()方法中返回的列表进行遍历判断,并输出所述类别
def panduan(char):
   for i in char:
      if i in a:
         print("<运算符,"+i+">")
      elif i in b:
         print("<界符,"+i+">")
      elif i in c:
         print("<关键字,"+i+">")
      elif i.isdigit():
         print("<常数,"+i+">")
      elif i.isalnum():
         print("<标识符," + i + ">")
      else:
         print("语法错误:"+i+"不是合法字符!!!")

def center(entry):
   p=[]
   #打开代码文件
   with open(entry.get(),'r') as f:
      #按行进行读取
      m=f.readlines()
      #按行进行遍历
      for i in m:
         #消除每行两边的空格
         n=i.strip()
         #追加到预定义列表中
         p.append(n)
      #代码的所有内容传给fenli()方法进行分离
      y=fenli(p)
      panduan(y)

def xiancheng(entry):
   # 创建一个线程
   t = threading.Thread(
      target=center, args=(entry,))
   # 设置守护线程,主线程退出不用等待子线程完成
   t.setDaemon(True)
   # 开始
   t.start()

if __name__=="__main__":
   GUI()
运行效果图:

在这里插入图片描述

输出结果截图:

在这里插入图片描述



以上就是WBB对词法分析器的设计,如果有帮助到各位博友记的点赞加关注吧!!!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

"WBB"

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

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

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

打赏作者

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

抵扣说明:

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

余额充值