没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示


试读
11页
python+pyqt5手工编写一个含交互界面的简易词法分析器 @author:x1nge. 编译原理基础实验 基础 在之前的一篇博文中我记录了一个不含交互界面的简易词法分析器程序编写内容 点击此处查看 在本文我将用pyqt5写一个简单的交互界面,也修改了部分代码使得程序更加完整。 具体实验分析 本文全部源码见本文末尾,上次编写的不含交互界面的源码也可点此处下载 交互界面可以用QtDesigner快速编写,或者自己写,我采用的是用可视化界面创建了一个大致的框架,然后再手动添加其他需要的控件,或者微调一些属性。 我简单设计的交互界面如图所示: 有话说: 这边以C和C++为输入语言,其他语言有
资源详情
资源评论
资源推荐

用用python+pyqt5手工编写一个含交互界面的简易的词法分析器手工编写一个含交互界面的简易的词法分析器
python+pyqt5手工编写一个含交互界面的简易词法分析器手工编写一个含交互界面的简易词法分析器
@author:x1nge.
编译原理基础实验编译原理基础实验
基础基础
在之前的一篇博文中我记录了一个不含交互界面的简易词法分析器程序编写内容 点击此处查看
在本文我将用pyqt5写一个简单的交互界面,也修改了部分代码使得程序更加完整。
具体实验分析具体实验分析
本文全部源码见本文末尾,上次编写的不含交互界面的源码也可点此处下载本文全部源码见本文末尾,上次编写的不含交互界面的源码也可点此处下载
交互界面可以用QtDesigner快速编写,或者自己写,我采用的是用可视化界面创建了一个大致的框架,然后再手动添加其他需要的控
件,或者微调一些属性。
我简单设计的交互界面如图所示:
有话说:有话说: 这边以C和C++为输入语言,其他语言有一些差别,可以自行修改代码。
UI设计部分,主题代码由pyuic转换后自动获得,分析一下代码,会发现其实很简单,也便于我们之后修改代码或属性。
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(694, 470)
MainWindow.setFixedSize(694,470)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.text_input = QtWidgets.QTextEdit(self.centralwidget)
self.text_input.setGeometry(QtCore.QRect(20, 40, 241, 351))
self.text_input.setObjectName("text_input")
self.btn_local = QtWidgets.QPushButton(self.centralwidget)
self.btn_local.setGeometry(QtCore.QRect(20, 400, 101, 30))
self.btn_local.setObjectName("btn_local")
self.text_address = QtWidgets.QTextEdit(self.centralwidget)
self.text_address.setGeometry(QtCore.QRect(136, 400, 396, 30))
self.text_address.setObjectName("text_address")
self.btn_get = QtWidgets.QPushButton(self.centralwidget)
self.btn_get.setGeometry(QtCore.QRect(556, 400, 126, 30))
self.btn_get.setObjectName("btn_get")
self.btn_clear_address = QtWidgets.QPushButton(self.centralwidget)
self.btn_clear_address.setGeometry(QtCore.QRect(570, 360, 101, 26))
self.btn_clear_address.setObjectName("btn_clear_address")
self.lb_text = QtWidgets.QLabel(self.centralwidget)
self.lb_text.setGeometry(QtCore.QRect(20, 20, 91, 16))

self.lb_text.setObjectName("lb_text")
self.rbtn_java = QtWidgets.QRadioButton(self.centralwidget)
self.rbtn_java.setGeometry(QtCore.QRect(570, 90, 115, 19))
self.rbtn_java.setObjectName("rbtn_java")
self.rbtn_java.setEnabled(False)
self.buttonGroup = QtWidgets.QButtonGroup(MainWindow)
self.buttonGroup.setObjectName("buttonGroup")
self.buttonGroup.addButton(self.rbtn_java)
self.rbtn_python = QtWidgets.QRadioButton(self.centralwidget)
self.rbtn_python.setEnabled(False)
self.rbtn_python.setGeometry(QtCore.QRect(570, 120, 115, 19))
self.rbtn_python.setObjectName("rbtn_python")
self.buttonGroup.addButton(self.rbtn_python)
self.rbtn_c = QtWidgets.QRadioButton(self.centralwidget)
self.rbtn_c.setEnabled(True)
self.rbtn_c.setGeometry(QtCore.QRect(570, 150, 115, 19))
self.rbtn_c.setObjectName("rbtn_c")
self.rbtn_c.setChecked(True)
self.buttonGroup.addButton(self.rbtn_c)
self.rbtn_cpp = QtWidgets.QRadioButton(self.centralwidget)
self.rbtn_cpp.setGeometry(QtCore.QRect(570, 180, 115, 19))
self.rbtn_cpp.setObjectName("rbtn_cpp")
self.buttonGroup.addButton(self.rbtn_cpp)
self.rbtn_html = QtWidgets.QRadioButton(self.centralwidget)
self.rbtn_html.setEnabled(False)
self.rbtn_html.setGeometry(QtCore.QRect(570, 210, 115, 19))
self.rbtn_html.setObjectName("rbtn_html")
self.buttonGroup.addButton(self.rbtn_html)
self.lb_choice = QtWidgets.QLabel(self.centralwidget)
self.lb_choice.setGeometry(QtCore.QRect(570, 60, 72, 15))
self.lb_choice.setObjectName("lb_choice")
self.text_output = QtWidgets.QTextEdit(self.centralwidget)
self.text_output.setGeometry(QtCore.QRect(280, 40, 251, 351))
self.text_output.setObjectName("text_output")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(280, 20, 72, 15))
self.label.setObjectName("label")
self.btn_run = QtWidgets.QPushButton(self.centralwidget)
self.btn_run.setGeometry(QtCore.QRect(570, 240, 101, 26))
self.btn_run.setObjectName("btn_run")
self.lb_name = QtWidgets.QLabel(self.centralwidget)
self.lb_name.setEnabled(True)
self.lb_name.setGeometry(QtCore.QRect(650, 446, 51, 20))
self.lb_name.setObjectName("lb_name")
self.btn_clear_input = QtWidgets.QPushButton(self.centralwidget)
self.btn_clear_input.setGeometry(QtCore.QRect(570, 280, 101, 26))
self.btn_clear_input.setObjectName("btn_clear_input")
self.btn_clear_output = QtWidgets.QPushButton(self.centralwidget)
self.btn_clear_output.setGeometry(QtCore.QRect(570, 320, 101, 26))
self.btn_clear_output.setObjectName("btn_clear_output")
# MainWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
# MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "LexicalAnalyzer"))
self.lb_text.setText(_translate("MainWindow", "待分析代码:"))
self.rbtn_java.setText(_translate("MainWindow", "JAVA"))
self.rbtn_python.setText(_translate("MainWindow", "PYTHON"))
self.rbtn_c.setText(_translate("MainWindow", "C"))
self.rbtn_cpp.setText(_translate("MainWindow", "C++"))
self.rbtn_html.setText(_translate("MainWindow", "HTML"))
self.lb_choice.setText(_translate("MainWindow", "语言:"))
self.label.setText(_translate("MainWindow", "输出:"))
self.btn_run.setText(_translate("MainWindow", "分析"))
self.lb_name.setText(_translate("MainWindow", "x1nge."))
self.btn_clear_input.setText(_translate("MainWindow", "清空待分析"))
self.btn_local.setText(_translate("MainWindow", "浏览"))
self.text_address.setText(_translate("MainWindow", "可在此手动输入路径(目前支持txt文件)"))
self.btn_clear_output.setText(_translate("MainWindow", "清空输出"))
self.btn_clear_address.setText(_translate("MainWindow", "清空路径"))
self.btn_get.setText(_translate("MainWindow", "手动获取路径文本"))
设计主体代码(包含返回按钮的事件):
有话说:有话说: 接下来的部分涉及到一些监听事件以及旧代码的修改,同一个类的代码可能拆开分析,全部源码见下文
初始化:初始化:

class main_window(QtWidgets.QWidget,Ui_MainWindow):
def __init__(self):
super(main_window,self).__init__()
self.setupUi(self)
self.text_output.clear()
测试是否能够正常连接至数据库:测试是否能够正常连接至数据库:
try:
check_client = pymongo.MongoClient("mongodb://localhost:27017/")
check_db = check_client["PrincipleOfCompiler"] check_col = check_db["ReservedWord"] except:
self.text_output.append("info:当前未连接至预设的mongodb保留字库,保留字将被识别为可以合法 定义的标识符或"
"整常数\n--------------------------")
有话所:有话所: 这里用的是mongodb,做这个测试是为了告知用户如果未连接到保留字数据库的操作,因为在分析过程中查询出错会导致程
序退出,所以设置了如果无法连接则默认为未查询到保留字。
设置监听:设置监听:
# 设置监听器
self.btn_clear_input.clicked.connect(self.btn_clear_input_click)
self.btn_clear_output.clicked.connect(self.btn_clear_output_click)
self.btn_run.clicked.connect(self.btn_run_click)
self.btn_local.clicked.connect(self.btn_openfile_click)
self.btn_get.clicked.connect(self.btn_load_address_click)
self.btn_clear_address.clicked.connect(self.btn_clear_address_click)
功能、监听函数编写:功能、监听函数编写:
# 功能函数编写
def btn_clear_input_click(self):
self.text_input.clear()
def btn_clear_output_click(self):
self.text_output.clear()
# 调用python函数浏览本地文件,读出txt文件内容并显示路径
def btn_openfile_click(self):
filename,_ = QFileDialog.getOpenFileName()
self.text_address.setText(filename)
text = open(filename,'r').read()
self.text_input.setText(text)
# 读取路径所指定的txt文件内容并显示到文本框内
def btn_load_address_click(self):
f = open(self.text_address.toPlainText(),'r')
res = f.read()
self.text_input.setText(res)
f.close()
def btn_clear_address_click(self):
self.text_address.clear()
# 分析按钮主体代码,这里添加了一个结束符防止越界产生的程序退出,分析结果将追加到输出框中
def btn_run_click(self):
res = self.text_input.toPlainText().replace('\n','').replace('\t','').replace(' ',' ')
res_lst1 = list(res)
res_lst1.append("\0")
print(res)
print(res_lst1)
global p
p = 0
while p in range(len(res_lst1)):
if res_lst1[p] == "\0":
break
temp_output = ','.join(check_code(res_lst1))
self.text_output.append(temp_output)
主要分析功能函数编写:主要分析功能函数编写:
该部分详细分析见上次发布的博文,文章开头也有提到。
p = 0 # 初始化
def check_code(res_lst):
# 初始化
result = [] str_get = [] ch = get_char(res_lst)
new_ch = get_blank_ch(ch,res_lst)
# 识别标识符
if new_ch.isalpha() or new_ch == '_' or new_ch == '$':
剩余10页未读,继续阅读

















weixin_38677725
- 粉丝: 5
- 资源: 932
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 计算机工程与应用期刊写作模块(最新)
- jsp 查看页显示图片(使用a标签的形式)
- n_objectracker.m
- gin-demo我自己写的gindemo
- 2023-加速度-DevOps-状态报告-中国DevOps社区版
- Framework-CoreKit-2023.12.07.unitypackage
- Rsync+Sersync
- rustdesk-1.2.3-aarch64-signed.apk.1
- ee240课程,基于斯坦福A Basic Introduction to the gm ID-Based Design
- R214-0762(III)SG-2-D-20231130连廊补三四层变更_t3.dwg
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制

评论0