新增一致性检查功能

main
zart 10 months ago
parent 8033ff39bd
commit 3cdea7cda6

@ -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): # 返回语法树

@ -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() # 清空显示结果

@ -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"<html><head/><body><p>\u68c0\u67e5\u8868\u8fbe\u5f0f\u548c\u8bed\u6cd5\u6811\u662f\u5426\u7b49\u6548\u3002</p></body></html>", None))
self.pushButton_check_te.setToolTip(QCoreApplication.translate("MainWindow", u"<html><head/><body><p>\u68c0\u67e5\u8868\u8fbe\u5f0f\u548c\u8bed\u6cd5\u6811\u662f\u5426\u7b49\u6548\u3002</p></body></html>", 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))

@ -343,7 +343,7 @@
<string>生成语法树</string>
</property>
</widget>
<widget class="QPushButton" name="pushButton_9">
<widget class="QPushButton" name="pushButton_check_te">
<property name="geometry">
<rect>
<x>860</x>

Loading…
Cancel
Save