aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/tests/if-else.py
blob: f97322a39e933c6a51b4d1aff72cf7dac03184fb (plain) (blame)
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()