龙空技术网

编译程序中的词法分析器(python)

WBB2425 118

前言:

目前你们对“词法分析器识别程序段输出种别码”都比较注意,姐妹们都想要分析一些“词法分析器识别程序段输出种别码”的相关内容。那么小编同时在网络上搜集了一些有关“词法分析器识别程序段输出种别码””的相关内容,希望小伙伴们能喜欢,咱们一起来了解一下吧!

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

代码实现:

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

运行效果图:

图1.运行效果

输出结果截图:

图2.分析结果

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

标签: #词法分析器识别程序段输出种别码 #词法分析主要算法 #编译原理预测分析算法 #c语言实现语法分析器 #c语言词法分析器代码