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, 121, 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, 179, 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, 211, 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, 279, 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(