编译原理:设计与实现一个简单词法分析器

设计与实现一个简单词法分析。具体内容是产生一个二元式文本文件,扩展名为dyd,可将Java或C程序(测试程序)分解成为一个一个的单词及类型。

(选做:并查“单词符号与种别对照表”得出其种别,用一数字表示。)

词法编译器基本功能包括:
(1) 输入源程序:输入C/java源程序;

(2) 输出单词,输出形式为:(序号,类型,单词);

(3) 输出出错信息,输出形式为:(出错行号,出错列号,出错信息);

为了运行代码并进行实验,需要满足以下条件:

1.Python环境:确保计算机上安装了Python,并且可以在命令行中运行python命令。

2.输入源程序文件:创建一个名为input.java或input.c的文件,其中包含想要进行词法分析的Java/C源程序。确保源程序的语法是正确的,否则可能会导致词法分析错误。

3.下载依赖:下载需要的依赖库。

4.查看输出文件:运行成功后,将生成一个名为output.dyd的文件,其中包含了词法分析的结果,包括单词及其类型的二元式信息。

词法分析器源程序文件:(lexer.py)

import re
import tkinter as tk
from tkinter import filedialog# 定义单词种别码
KEYWORD = 1
IDENTIFIER = 10
CONSTANT = 11
OPERATOR = 4
DELIMITER = 5# 定义关键字列表
keywords = ["if", "int", "for", "while", "do", "return", "break", "continue"]class LexicalAnalyzer:def __init__(self, window):# 窗口设置self.window = windowself.window.title("词法分析器")self.window.geometry("500x500")# 顶部文件选择与运行控制区域self.top_frame = tk.Frame(self.window)self.top_frame.pack(side=tk.TOP, pady=10, padx=10)# 文件选择按钮self.select_file_button = tk.Button(self.top_frame, text="选择文件", command=self.select_file)self.select_file_button.pack(side=tk.LEFT)# 运行按钮self.run_button = tk.Button(self.top_frame, text="运行", state=tk.DISABLED, command=self.run_analysis)self.run_button.pack(side=tk.RIGHT)# 中间的文本显示框self.text_frame = tk.Frame(self.window)self.text_frame.pack(pady=10)self.scrollbar = tk.Scrollbar(self.text_frame)self.scrollbar.pack(side=tk.RIGHT, fill=tk.Y)self.display_area = tk.Text(self.text_frame, wrap=tk.WORD, yscrollcommand=self.scrollbar.set)self.display_area.pack(side=tk.LEFT, fill=tk.BOTH)self.scrollbar.config(command=self.display_area.yview)# 底部状态栏区域self.status_bar = tk.Frame(self.window)self.status_bar.pack(side=tk.BOTTOM, pady=10)self.status_label = tk.Label(self.status_bar, text="请选择一个文件")self.status_label.pack()# 初始化属性self.input_file = Noneself.tokens = []def select_file(self):self.input_file = filedialog.askopenfilename(filetypes=[("C源程序", "*.c"), ("文本", "*.txt"), ("所有文件", "*.*")])if self.input_file:self.status_label.config(text=f"已选择文件:{self.input_file}")self.run_button.config(state=tk.NORMAL)def run_analysis(self):if not self.input_file:returnself.status_label.config(text="运行中,请稍候...")self.window.update()with open(self.input_file, 'r', encoding='utf-8') as file:lines = file.readlines()token_count = 0error_count = 0self.tokens.clear()for line_number, line in enumerate(lines, start=1):words = re.findall(r'[a-zA-Z_][a-zA-Z0-9_]*|\d+|&&|\|\||==|>=|<=|!=|[+\-*/=><,;(){}]', line)column_number = 1for word in words:category = classify_token(word)if category != -1:self.tokens.append((line_number, column_number, category, word))token_count += 1else:self.display_area.insert(tk.END, f'Invalid token: {word} at Line {line_number}, Column {column_number}\n')error_count += 1column_number += len(word) + 1if error_count == 0:self.status_label.config(text=f"词法分析完成,共生成 {token_count} 个二元式。")self.display_tokens()self.save_results()  # 保存结果到文件中else:self.status_label.config(text=f"词法分析失败,请查看输出窗口。")def display_tokens(self):self.display_area.delete('1.0', tk.END)for token in self.tokens:line_number, column_number, category, word = tokenself.display_area.insert(tk.END, f'({line_number},{column_number})\t{category}\t{word}\n')def save_results(self):output_file = filedialog.asksaveasfilename(defaultextension=".dyd", filetypes=[("二元式文件", "*.dyd")])if output_file:with open(output_file, 'w', encoding='utf-8') as file:for token in self.tokens:line_number, column_number, category, word = tokenfile.write(f"{line_number}\t{column_number}\t{category}\t{word}\n")self.status_label.config(text=f"结果已保存至文件:{output_file}")def show(self):self.window.mainloop()# 判断单词种别函数
def classify_token(word):if word in keywords:return KEYWORDelif re.match(r'^[a-zA-Z_][a-zA-Z0-9_]*$', word):return IDENTIFIERelif re.match(r'^\d+$', word):return CONSTANTelif word in ['+', '-', '*', '/', '=', '>', '<', '==', '>=', '<=', '!=', '&&', '||']:return OPERATORelif word in [',', ';', '(', ')', '{', '}']:return DELIMITERelse:return -1  # 无法分类的单词种别码if __name__ == '__main__':window = tk.Tk()analyzer = LexicalAnalyzer(window)analyzer.show()

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/188121.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS 多主题切换思路

前言 本篇仅提供多主题切换思路&#xff0c;示例简单且清晰。 实现 步骤一&#xff1a;多主题(颜色)定义 定义根伪类 :root&#xff0c;代码第 2 和 7 行。分别定义了默认和带参数的伪类&#xff1b;定义 CSS 变量&#xff0c;注意变量名需要以两个减号&#xff08;--&…

adb修改android系统时间 adb shell date必须要root权限

adb Command adb root //需要root权限 adb shell setprop persist.sys.timezone GMT //校准时区 adb shell date MMDDhhmmYY.ss set //修改系统时间这里是GMT格林尼治时间&#xff0c;北京时间得转换一下 8小时 adb shell hwclock -w //同步硬件时间adb shell date 0201030422…

初识Linux:权限

目录 提示&#xff1a;以下指令均在Xshell 7 中进行 Linux 的权限 内核&#xff1a; 查看操作系统版本 查看cpu信息 查看内存信息 外部程序&#xff1a; 用户&#xff1a; 普通用户变为超级用户&#xff1a; su 和 su-的区别&#xff1a; root用户变成普通用户&#…

机器人最优控制开源库 Model-based Optimization for Robotics

系列文章目录 文章目录 系列文章目录前言一、开源的库和工具箱1.1 ACADO1.2 CasADi1.3 Control Toolbox1.4 Crocoddyl1.5 Ipopt1.6 Manopt1.7 LexLS1.8 NLOpt1.9 qpOASES1.10 qpSWIFT1.11 Roboptim 二、其他库和工具箱2.1 MUSCOD2.2 OCPID-DAE12.3 SNOPT 前言 机器人&#xff…

【论文阅读】1 SkyChain:一个深度强化学习的动态区块链分片系统

SkyChain 一、文献简介二、引言及重要信息2.1 研究背景2.2 研究目的和意义2.3 文献的创新点 三、研究内容3.1模型3.2自适应分类账协议3.2.1状态块创建3.2.2合并过程3.2.3拆分过程 3.3评价框架3.3.1性能3.3.1.1共识延迟3.3.1.2重新分片延迟3.3.1.3处理事务数3.3.1.4 约束 3.3.2 …

【代码】基于麻雀搜索优化Kmeans图像分割算法

程序名称&#xff1a;基于麻雀搜索优化Kmeans图像分割算法 实现平台&#xff1a;matlab 代码简介&#xff1a;首先使用麻雀搜索优化算法来确定 K-means 算法的初始质心位置&#xff0c;然后进行传统的 K-means 聚类。这样做的目的是为了避免 K-means 算法陷入局部最优解&…

使用Docker安装部署Swagger Editor并远程访问编辑API文档

文章目录 Swagger Editor本地接口文档公网远程访问1. 部署Swagger Editor2. Linux安装Cpolar3. 配置Swagger Editor公网地址4. 远程访问Swagger Editor5. 固定Swagger Editor公网地址 Swagger Editor本地接口文档公网远程访问 Swagger Editor是一个用于编写OpenAPI规范的开源编…

还得是字节出来的,太秀了...

前段时间公司缺人&#xff0c;也面了许多测试&#xff0c;一开始瞄准的就是中级水准&#xff0c;当然也没指望能来大牛&#xff0c;提供的薪资在15-20k这个范围&#xff0c;来面试的人有很多&#xff0c;但是平均水平真的让人很失望。看了简历很多上面都是写有4年工作经验&…

MatrixOne Meetup回顾 | 深圳站

11月11日&#xff0c;MatrixOne 社区在深圳成功举办了第二次 MatrixOne Meetup。活动当天&#xff0c;数十位外部小伙伴到场参与&#xff0c;一同分享云原生数据库相关知识内容。此次活动&#xff0c;我们也邀请了来自深圳素问智能的外部讲师&#xff0c;分享了目前火爆的大模型…

【每日OJ —— 144. 二叉树的前序遍历】

每日OJ —— 144. 二叉树的前序遍历 1.题目&#xff1a;144. 二叉树的前序遍历2.方法讲解2.1.算法讲解2.2.代码实现2.3.提交通过展示 1.题目&#xff1a;144. 二叉树的前序遍历 2.方法讲解 2.1.算法讲解 1.首先如果在每次每个节点遍历的时候都去为数组开辟空间&#xff0c;这样…

steam搬砖项目到底能不能做?

在Steam的世界里&#xff0c;有一款引人注目的游戏——《CSGO》游戏设备和配件的搬运项目。它就像一个桥梁&#xff0c;连接着全球的游戏世界&#xff0c;为玩家们提供着精彩的设备和配件。原则上&#xff0c;这是一个低买高卖的过程&#xff0c;通过汇率差来赚取利润。比如&am…

从PDF和图像中提取文本,以供大型语言模型使用

想法 大型语言模型已经席卷了互联网&#xff0c;导致更多的人没有认真关注使用这些模型最重要的部分&#xff1a;高质量的数据&#xff01;本文旨在提供一些有效从任何类型文档中提取文本的技术。 Python库 本文专注于Pytesseract、easyOCR、PyPDF2和LangChain库。实验数据是一…

C 中的结构 - 存储、指针、函数和自引用结构

0. 结构体的内存分配 当声明某种类型的结构变量时&#xff0c;结构成员被分配连续&#xff08;相邻&#xff09;的内存位置。 struct student{char name[20];int roll;char gender;int marks[5];} stu1; 此处&#xff0c;内存将分配给name[20]、roll、gender和marks[5]。st1这…

zabbix 监控

zabbit 监控 非常成熟的监控软件。 运维人员&#xff0c;尽快系统服务器的状态&#xff0c;网站的流量&#xff0c;服务进程的运行状态。 保证整个集群的工作正常。7*24 zabbix是什么&#xff1a; web界面提供的一种可视化监控服务软件。 分布式的方式系统监控以及网络监控…

ts学习05-typeScript中的类

类的定义 class Person {name: string; //属性 前面省略了public关键词constructor(n: string) {//构造函数 实例化类的时候触发的方法this.name n;}run(): void {console.log(this.name);} } var p new Person("张三");p.run();class Person {name: string;//…

JOSEF约瑟 剩余电流保护器 CLJ3-100A+LH30 导轨安装

CLJ3系列剩余电流动作继电器 系列型号&#xff1a; CLJ3-100A剩余电流动作继电器 CLJ3-250A剩余电流动作继电器 CLJ3-400A剩余电流动作继电器 CLJ3-630A剩余电流动作继电器 LH30剩余电流互感器 LH80剩余电流互感器 LH100剩余电流互感器 LH140剩余电流互感器 一、产品概…

特征融合12种经典魔改方案汇总,附配套模型和代码

特征融合&#xff08;Feature Fusion&#xff09;是深度学习中的一种重要技术&#xff0c;它可以帮助模型更好地理解数据的内在结构和规律&#xff0c;提高模型的性能和泛化能力。另外&#xff0c;特征融合还可以提高模型的分类准确率&#xff0c;减少过拟合风险&#xff0c;帮…

Java核心知识点整理大全25-笔记

目录 25. Hadoop 25.1.1. 概念 25.1.2. HDFS 25.1.2.1. Client 25.1.2.2. NameNode 25.1.2.3. Secondary NameNode 25.1.2.4. DataNode 25.1.3. MapReduce 25.1.3.1. Client 25.1.3.2. JobTracker 25.1.3.3. TaskTracker 25.1.3.4. Task 25.1.3.5. Reduce Task 执行…

CSS特效024:旋转的通透立方体

CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧&#xff0c;主要包含CSS布局&#xff0c;CSS特效&#xff0c;CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点&#xff0c;CSS特效主要是一些动画示例&#xff0c;CSS花边是描述了一些CSS…

15分钟了解国外Lead广告联盟,为什么做国外广告联盟要用到指纹浏览器?

说到国外Lead广告联盟&#xff0c;可能很多人会问这是啥&#xff1f;其实呢&#xff0c;作为搞外贸的&#xff0c;如果你想增加你的收入&#xff0c;做国外广告联盟也是不错的选择&#xff0c;只要你有正确的方法和策略&#xff0c;就能够成功赚取丰厚的佣金。今天龙哥我就给大…