1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
class AssignNode:
def __init__(self, variable, value):
self.variable = variable
self.value = value
class ComparisonNode:
def __init__(self, operator, left, right):
self.operator = operator
self.left = left
self.right = right
class IfNode:
def __init__(self, condition, body):
self.condition = condition
self.body = body
class ReplyNode:
def __init__(self, message):
self.message = message
import ast
def parse_code(code):
tree = ast.parse(code)
return parse_node(tree.body[0])
def parse_node(node):
if isinstance(node, ast.Assign):
variable = node.targets[0].id
value = parse_node(node.value)
return AssignNode(variable, value)
elif isinstance(node, ast.Compare):
operator = node.ops[0]
left = parse_node(node.left)
right = parse_node(node.comparators[0])
return ComparisonNode(operator, left, right)
elif isinstance(node, ast.If):
condition = parse_node(node.test)
body = parse_node(node.body[0])
return IfNode(condition, body)
elif isinstance(node, ast.Expr):
return ReplyNode(node.value.s)
elif isinstance(node, ast.Name):
return node.id
elif isinstance(node, ast.Num):
return node.n
def execute_ast(ast, environment):
if isinstance(ast, AssignNode):
environment[ast.variable] = ast.value
elif isinstance(ast, ComparisonNode):
left = execute_ast(ast.left, environment)
right = execute_ast(ast.right, environment)
if ast.operator == '==':
return left == right
elif ast.operator == '!=':
return left != right
elif ast.operator == '<':
return left < right
elif ast.operator == '>':
return left > right
elif isinstance(ast, IfNode):
if condition := execute_ast(ast.condition, environment):
execute_ast(ast.body, environment)
elif isinstance(ast, ReplyNode):
message = ast.message.format(**environment)
print(message)
def main():
code = input("请输入代码: ")
ast = parse_code(code)
environment = {}
execute_ast(ast, environment)
if __name__ == "__main__":
main()
|