From 3cdea7cda6b7516704b09aad094da0a7a803e4e0 Mon Sep 17 00:00:00 2001
From: zart
Date: Wed, 24 Apr 2024 15:19:14 +0800
Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=B8=80=E8=87=B4=E6=80=A7?=
=?UTF-8?q?=E6=A3=80=E6=9F=A5=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
data.py | 36 +++++++++++++++++++----------
main.py | 66 +++++++++++++++++++++++++++++++++++++++++++++---------
main_ui.py | 12 +++++-----
main_ui.ui | 2 +-
4 files changed, 86 insertions(+), 30 deletions(-)
diff --git a/data.py b/data.py
index d32d0b8..eb28590 100644
--- a/data.py
+++ b/data.py
@@ -250,19 +250,31 @@ def exp_to_treeNode_dict(exp_ls): # 返回嵌套节点字典
# 写一个函数从TreeNode中还原出表达式
def get_expression(TreeNode):
- stack = []
- for node in TreeNode:
- if node.NodeType == 'Value':
- stack.append(node.FaceValue)
- elif node.NodeType == 'Operator':
- if node.Ops in ('sin', 'cos', 'tan'): # 三角函数
- right = stack.pop() # 三角函数只有右操作数
- stack.append(f"{node.Ops}({right})")
+ root = TreeNode[-1]
+ def get_node_rlt(node):
+ if node.NodeType == 'Operator':
+ left_idx = node.LeftNodeID
+ right_idx = node.RightNodeID
+ if left_idx is not None:
+ left_node = find_node_by_id(left_idx, TreeNode)
+ left_rlt = get_node_rlt(left_node)
else:
- right = stack.pop()
- left = stack.pop()
- stack.append(f"({left}{node.Ops}{right})")
- return stack.pop()
+ left_rlt = None
+ if right_idx is not None:
+ right_node = find_node_by_id(right_idx, TreeNode)
+ right_rlt = get_node_rlt(right_node)
+ else:
+ right_rlt = None
+ if left_rlt is None and right_rlt is None:
+ return None
+ elif left_rlt is None and right_rlt is not None:
+ return f"{node.Ops}({right_rlt})"
+ else:
+ return f"({left_rlt}{node.Ops}{right_rlt})"
+ elif node.NodeType == 'Value':
+ return node.FaceValue
+ return get_node_rlt(root)
+
def ExpressionAnalyse(exp_ls): # 返回语法树
diff --git a/main.py b/main.py
index 4227ab9..c683b2f 100644
--- a/main.py
+++ b/main.py
@@ -44,6 +44,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.ex_node_ops.clicked.connect(self.exchange_ops_node) # 修改运算符节点
self.ex_node_self.clicked.connect(self.exchange_two_nodes) # 交换两个节点
self.pushButton_exp.clicked.connect(self.agent_exp) # 生成表达式
+ self.pushButton_check_te.clicked.connect(self.check_tree_and_expression) # 验证语法树和表达式是否匹配
def secen_clear(self):
self.scene.clear()
@@ -59,6 +60,13 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.lb_ops_selected.setText("") # 运算符显示
self.p1_selected.setStyleSheet("border-image: none;") # 清空已选牌面
+ self.pushButton_ast.setEnabled(True)
+ self.pushButton_allan.setEnabled(True)
+ self.pushButton_dtree.setEnabled(True)
+ self.pushButton_autosv.setEnabled(True)
+
+
+
def select_ops(self, ops):
self.lb_ops_selected.setText(ops)
@@ -126,8 +134,8 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.seq = 1 # 重置序号
for noed in self.TreeNode:
print("运算符节点", noed)
- exps = data.get_expression(self.TreeNode)
- print("表达式", exps)
+ # exps = data.get_expression(self.TreeNode)
+ # print("表达式", exps)
else:
QMessageBox.warning(self, '警告', '请先选择两个节点')
else:
@@ -149,7 +157,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
if self.TreeNode:
for node in self.TreeNode:
if node.NodeID == self.selected_id[0]:
- node.FaceValue = self.selected_value
+ node.FaceValue = str(self.selected_value)
for nodet in self.scene.items():
if isinstance(nodet, RoundedRectangleItem):
if nodet.id == self.selected_id[0]:
@@ -211,8 +219,6 @@ class MainWindow(QMainWindow, Ui_MainWindow):
elif item.id == self.selected_id[1]:
item.text = str(node_2.FaceValue)
item.update()
-
-
else:
QMessageBox.warning(self, '警告', '请选择两个节点')
@@ -247,7 +253,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
def load_image(self, path, Tree_4_nums, index):
def current_selection(value, path):
- self.selected_value = value
+ self.selected_value = str(value)
self.p1_selected.setStyleSheet(f"border-image: url({path});")
self.pushButton_ast.setEnabled(False)
self.pushButton_allan.setEnabled(False)
@@ -270,10 +276,6 @@ class MainWindow(QMainWindow, Ui_MainWindow):
def show_card(self):
self.secen_clear() # 清空画布
- self.pushButton_ast.setEnabled(True)
- self.pushButton_allan.setEnabled(True)
- self.pushButton_dtree.setEnabled(True)
- self.pushButton_autosv.setEnabled(True)
# 原始数组
self.lineEdit.clear()
self.label_result.setText(" =? ")
@@ -368,6 +370,48 @@ class MainWindow(QMainWindow, Ui_MainWindow):
if opl in ops and opr in ops:
return True
+ def check_tree_and_expression(self): # 检查节点树和表达式是否一致
+ if self.TreeNode is not None:
+ aexp = self.lineEdit.text()
+ if aexp == '':
+ QMessageBox.warning(self, '警告', '请输入表达式')
+ return
+ try:
+ exp_ls = data.get_postfix_expression(aexp) # 获取后缀表达式列表
+ TreeNode2 = data.ExpressionAnalyse(exp_ls) # 将后缀表达式转化为节点树
+ if self.check_tree(self.TreeNode, TreeNode2):
+ QMessageBox.information(self, '提示', '节点树与表达式一致')
+ else:
+ QMessageBox.warning(self, '警告', '节点树与表达式不一致')
+ except Exception as e:
+ QMessageBox.warning(self, '警告', '表达式错误')
+ return
+ else:
+ QMessageBox.warning(self, '警告', '当前无语法树')
+
+
+ # 检查两个节点树是否一致的函数
+
+ def check_tree(self, TreeNode1, TreeNode2):
+ if len(TreeNode1) != len(TreeNode2):
+ return False
+ for i in range(len(TreeNode1)):
+ if TreeNode1[i].NodeID != TreeNode2[i].NodeID:
+ return False
+ if TreeNode1[i].NodeType != TreeNode2[i].NodeType:
+ return False
+ if TreeNode1[i].Ops != TreeNode2[i].Ops:
+ return False
+ if TreeNode1[i].FaceValue != TreeNode2[i].FaceValue:
+ return False
+ if TreeNode1[i].LeftNodeID != TreeNode2[i].LeftNodeID:
+ return False
+ if TreeNode1[i].RightNodeID != TreeNode2[i].RightNodeID:
+ return False
+ return True
+
+
+
def draw_tree(self):
self.scene.clear()
aexp = self.lineEdit.text()
@@ -457,7 +501,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.label_TF.setStyleSheet("color: red;background-color:rgb(219, 205, 166)")
def agent_exp(self):
- if self.TreeNode is not None:
+ if len(self.TreeNode) > 0:
exp_str = data.get_expression(self.TreeNode)
if exp_str is not None:
self.label_result.clear() # 清空显示结果
diff --git a/main_ui.py b/main_ui.py
index c8b787c..9a50678 100644
--- a/main_ui.py
+++ b/main_ui.py
@@ -121,10 +121,10 @@ class Ui_MainWindow(object):
self.pushButton_ast.setObjectName(u"pushButton_ast")
self.pushButton_ast.setGeometry(QRect(690, 270, 141, 41))
self.pushButton_ast.setFont(font1)
- self.pushButton_9 = QPushButton(self.frame)
- self.pushButton_9.setObjectName(u"pushButton_9")
- self.pushButton_9.setGeometry(QRect(860, 270, 141, 41))
- self.pushButton_9.setFont(font1)
+ self.pushButton_check_te = QPushButton(self.frame)
+ self.pushButton_check_te.setObjectName(u"pushButton_check_te")
+ self.pushButton_check_te.setGeometry(QRect(860, 270, 141, 41))
+ self.pushButton_check_te.setFont(font1)
self.label = QLabel(self.frame)
self.label.setObjectName(u"label")
self.label.setGeometry(QRect(760, 170, 101, 31))
@@ -267,9 +267,9 @@ class Ui_MainWindow(object):
#endif // QT_CONFIG(tooltip)
self.pushButton_ast.setText(QCoreApplication.translate("MainWindow", u"\u751f\u6210\u8bed\u6cd5\u6811", None))
#if QT_CONFIG(tooltip)
- self.pushButton_9.setToolTip(QCoreApplication.translate("MainWindow", u"
\u68c0\u67e5\u8868\u8fbe\u5f0f\u548c\u8bed\u6cd5\u6811\u662f\u5426\u7b49\u6548\u3002
", None))
+ self.pushButton_check_te.setToolTip(QCoreApplication.translate("MainWindow", u"\u68c0\u67e5\u8868\u8fbe\u5f0f\u548c\u8bed\u6cd5\u6811\u662f\u5426\u7b49\u6548\u3002
", None))
#endif // QT_CONFIG(tooltip)
- self.pushButton_9.setText(QCoreApplication.translate("MainWindow", u"\u4e00\u81f4\u6027\u68c0\u67e5", None))
+ self.pushButton_check_te.setText(QCoreApplication.translate("MainWindow", u"\u4e00\u81f4\u6027\u68c0\u67e5", None))
self.label.setText(QCoreApplication.translate("MainWindow", u"\u5df2\u9009\u724c\u9762", None))
self.p1_selected.setText("")
self.pushButton_add.setText(QCoreApplication.translate("MainWindow", u"+", None))
diff --git a/main_ui.ui b/main_ui.ui
index 9bd0070..f99bde6 100644
--- a/main_ui.ui
+++ b/main_ui.ui
@@ -343,7 +343,7 @@
生成语法树
-
+
860