Postfix Self Expression

本文详细介绍了Swift语言中的后缀自表达式(postfix self expression)概念及其使用方法。后缀自表达式由表达式或类型名后跟 .self 构成,可用于获取表达式的值或类型的自身引用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Postfix Self Expression

A postfix self expression consists of an expression or the name of a type, immediately followed by .self. It has the following forms:

  • expression.self
  • type.self

The first form evaluates to the value of the expression. For example, x.self evaluates to x.

The second form evaluates to the value of the type. Use this form to access a type as a value. For example, because SomeClass.self evaluates to the SomeClass type itself, you can pass it to a function or method that accepts a type-level argument.

GRAMMAR OF A SELF EXPRESSION

postfix-self-expression → postfix-expression­self­

 

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Expressions.html#//apple_ref/swift/grammar/postfix-self-expression

转载于:https://www.cnblogs.com/feng9exe/p/9092315.html

这是上题的代码:def infix_to_postfix(expression): precedence = {'!': 3, '&': 2, '|': 1, '(': 0} op_stack = [] postfix_list = [] token_list = expression.split() for token in token_list: if token.isalnum(): postfix_list.append(token) elif token == '(': op_stack.append(token) elif token == ')': top_token = op_stack.pop() while top_token != '(': postfix_list.append(top_token) top_token = op_stack.pop() else: # operator while op_stack and precedence[op_stack[-1]] >= precedence[token]: postfix_list.append(op_stack.pop()) op_stack.append(token) while op_stack: postfix_list.append(op_stack.pop()) return ' '.join(postfix_list) class Node: def __init__(self, value): self.value = value self.left_child = None self.right_child = None def build_expression_tree(postfix_expr): operator_stack = [] token_list = postfix_expr.split() for token in token_list: if token.isalnum(): node = Node(token) operator_stack.append(node) else: right_node = operator_stack.pop() left_node = operator_stack.pop() node = Node(token) node.left_child = left_node node.right_child = right_node operator_stack.append(node) return operator_stack.pop() def evaluate_expression_tree(node, variable_values): if node.value.isalnum(): return variable_values[node.value] else: left_value = evaluate_expression_tree(node.left_child, variable_values) right_value = evaluate_expression_tree(node.right_child, variable_values) if node.value == '!': return not left_value elif node.value == '&': return left_value and right_value elif node.value == '|': return left_value or right_value expression = "!a & (b | c)" postfix_expression = infix_to_postfix(expression) expression_tree = build_expression_tree(postfix_expression) variable_values = {'a': True, 'b': False, 'c': True} result = evaluate_expression_tree(expression_tree, variable_values) print(result)
06-12
写一下下面代码的后缀求值表达式的流程图class Stack: def __init__(self): self.items = [] def push(self, item): self.items.append(item) def pop(self): if not self.is_empty(): return self.items.pop() raise IndexError("Pop from empty stack") def peek(self): if not self.is_empty(): return self.items[-1] raise IndexError("Peek from empty stack") def is_empty(self): return len(self.items) == 0 def infix_to_postfix(infix_expr): precedence = {'+': 1, '-': 1, '*': 2, '/': 2, '^': 3} stack = Stack() postfix = [] for token in infix_expr.split(): if token.isdigit(): postfix.append(token) elif token == '(': stack.push(token) elif token == ')': while not stack.is_empty() and stack.peek() != '(': postfix.append(stack.pop()) stack.pop() else: while (not stack.is_empty() and stack.peek() != '(' and precedence.get(stack.peek(), 0) >= precedence.get(token, 0)): postfix.append(stack.pop()) stack.push(token) while not stack.is_empty(): postfix.append(stack.pop()) return ' '.join(postfix) def evaluate_postfix(postfix_expr): stack = Stack() for token in postfix_expr.split(): if token.isdigit(): stack.push(int(token)) else: right = stack.pop() left = stack.pop() if token == '+': stack.push(left + right) elif token == '-': stack.push(left - right) elif token == '*': stack.push(left * right) elif token == '/': stack.push(left / right) elif token == '^': stack.push(left ** right) return stack.pop() if __name__ == "__main__": infix_expr = input("中缀表达式:") # print("中缀表达式:", infix_expr) postfix_expr = infix_to_postfix(infix_expr) print("后缀表达式:", postfix_expr) result = evaluate_postfix(postfix_expr) print("计算结果:", result)
06-30
import tkinter as tk from tkinter import messagebox # 先前定义的函数保持不变 precedence = {'NOT': 3, 'AND': 2, 'OR': 1, '(': 0, ')': 0} def tokenize(expression): tokens = [] i = 0 while i < len(expression): ch = expression[i] if ch.isspace(): i += 1 continue if ch in '()': tokens.append(ch) i += 1 elif ch.isalnum() or ch == '_': token = ch i += 1 while i < len(expression) and (expression[i].isalnum() or expression[i] == '_'): token += expression[i] i += 1 tokens.append(token) else: if expression.startswith('AND', i): tokens.append('AND') i += 3 elif expression.startswith('OR', i): tokens.append('OR') i += 2 elif expression.startswith('NOT', i): tokens.append('NOT') i += 3 else: raise ValueError(f"未知字符或操作符:{ch}") return tokens def to_postfix(tokens): output = [] stack = [] for token in tokens: if token.isalnum() or '_' in token: output.append(token) elif token == '(': stack.append(token) elif token == ')': while stack and stack[-1] != '(': output.append(stack.pop()) if stack and stack[-1] == '(': stack.pop() else: raise ValueError("括号不匹配") else: while stack and precedence.get(stack[-1], 0) >= precedence.get(token, 0): output.append(stack.pop()) stack.append(token) while stack: top = stack.pop() if top == '(' or top == ')': raise ValueError("括号不匹配") output.append(top) return output def generate_quads(postfix_tokens): quads = [] stack = [] temp_var_count = 0 def new_temp(): nonlocal temp_var_count temp_var_count += 1 return f't{temp_var_count}' for token in postfix_tokens: if token.isalnum() or '_' in token: stack.append(token) elif token == 'NOT': if not stack: raise ValueError("缺少操作数") op2 = stack.pop() result = new_temp() quads.append((token, op2, '', result)) stack.append(result) elif token in ['AND', 'OR']: if len(stack) < 2: raise ValueError("缺少操作数") op2 = stack.pop() op1 = stack.pop() result = new_temp() quads.append((token, op1, op2, result)) stack.append(result) else: raise ValueError(f"未知操作符:{token}") return quads def main(): def convert(): print("开始转换...") # 调试信息 output_text.delete('1.0', tk.END) expr = entry.get() print(f"输入:{expr}") # 调试 if not expr.strip(): messagebox.showinfo("提示", "请输入布尔表达式!") return try: tokens = tokenize(expr) print(f"词法分析:{tokens}") # 调试 postfix = to_postfix(tokens) print(f"后缀表达式:{postfix}") # 调试 quads = generate_quads(postfix) # 输出四元式到文本框 for idx, q in enumerate(quads): output_text.insert(tk.END, f"{idx+1}: {q}\n") print("转换完成!") # 调试 except Exception as e: messagebox.showerror("错误", f"转换失败:{e}") print(f"异常:{e}") root = tk.Tk() root.title("布尔表达式转四元式") lbl = tk.Label(root, text="请输入布尔表达式(支持 AND, OR, NOT, 括号):") lbl.pack() entry = tk.Entry(root, width=80) entry.pack() btn = tk.Button(root, text="转换", command=convert) btn.pack() output_text = tk.Text(root, width=80, height=20) output_text.pack() root.mainloop() if __name__ == "__main__": main() 这个代码在转换完成后不能将结果显示在已经弹出的GUI界面上请帮我找出原因并修改
06-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值