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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
| # 42jerrykim.github.io에서 더 많은 정보를 확인 할 수 있다
from abc import ABC, abstractmethod
from typing import Dict
# Context - 변수 저장소
class Context:
def __init__(self):
self.variables: Dict[str, float] = {}
def set_variable(self, name: str, value: float):
self.variables[name] = value
def get_variable(self, name: str) -> float:
return self.variables.get(name, 0)
# AbstractExpression
class Expression(ABC):
@abstractmethod
def interpret(self, context: Context) -> float:
pass
# TerminalExpression - 숫자
class NumberExpression(Expression):
def __init__(self, value: float):
self.value = value
def interpret(self, context: Context) -> float:
return self.value
# TerminalExpression - 변수
class VariableExpression(Expression):
def __init__(self, name: str):
self.name = name
def interpret(self, context: Context) -> float:
return context.get_variable(self.name)
# NonterminalExpression - 덧셈
class AddExpression(Expression):
def __init__(self, left: Expression, right: Expression):
self.left = left
self.right = right
def interpret(self, context: Context) -> float:
return self.left.interpret(context) + self.right.interpret(context)
# NonterminalExpression - 뺄셈
class SubtractExpression(Expression):
def __init__(self, left: Expression, right: Expression):
self.left = left
self.right = right
def interpret(self, context: Context) -> float:
return self.left.interpret(context) - self.right.interpret(context)
# NonterminalExpression - 곱셈
class MultiplyExpression(Expression):
def __init__(self, left: Expression, right: Expression):
self.left = left
self.right = right
def interpret(self, context: Context) -> float:
return self.left.interpret(context) * self.right.interpret(context)
# NonterminalExpression - 나눗셈
class DivideExpression(Expression):
def __init__(self, left: Expression, right: Expression):
self.left = left
self.right = right
def interpret(self, context: Context) -> float:
right_val = self.right.interpret(context)
if right_val == 0:
raise ValueError("Division by zero")
return self.left.interpret(context) / right_val
# 사용 예제
if __name__ == "__main__":
context = Context()
context.set_variable("x", 10)
context.set_variable("y", 5)
# (x + y) * 2 - 10
expression = SubtractExpression(
MultiplyExpression(
AddExpression(
VariableExpression("x"),
VariableExpression("y")
),
NumberExpression(2)
),
NumberExpression(10)
)
print(f"x = {context.get_variable('x')}, y = {context.get_variable('y')}")
print(f"(x + y) * 2 - 10 = {expression.interpret(context)}")
# x / y + 3
expression2 = AddExpression(
DivideExpression(
VariableExpression("x"),
VariableExpression("y")
),
NumberExpression(3)
)
print(f"x / y + 3 = {expression2.interpret(context)}")
|