Skip to content

Instantly share code, notes, and snippets.

@Mjkim-Programming
Last active November 24, 2025 06:57
Show Gist options
  • Select an option

  • Save Mjkim-Programming/bf80f9e9b94cad7d7ebff91a55779476 to your computer and use it in GitHub Desktop.

Select an option

Save Mjkim-Programming/bf80f9e9b94cad7d7ebff91a55779476 to your computer and use it in GitHub Desktop.
Something About Calculating Stuff I dont know why I created this
from enum import Enum
class Operation(Enum):
EXIT = 0
ADD = 1
SUBTRACT = 2
MULTIPLY = 3
DIVIDE = 4
REMAINDER = 5
QUOTIENT = 6
POWER = 7
TokenMap = {
"더하기": Operation.ADD,
"빼기": Operation.SUBTRACT,
"곱하기": Operation.MULTIPLY,
"나누기": Operation.DIVIDE,
"몫": Operation.QUOTIENT,
"나머지": Operation.REMAINDER,
"거듭제곱": Operation.POWER,
"종료": Operation.EXIT
}
def error(message):
print(f"\033[31m오류 : {message}\033[0m")
def out(message):
print(f"\033[32m출력 ] {message}\033[0m")
def debug(message):
print(f"\033[94m디버그 ] {message}\033[0m")
def tokenize(expr: str):
tokens = []
buf = ""
for ch in expr:
if ch in "()" :
if buf.strip():
tokens.append(buf.strip())
buf = ""
tokens.append(ch)
elif ch.isspace():
if buf.strip():
tokens.append(buf.strip())
buf = ""
else:
buf += ch
if buf.strip():
tokens.append(buf.strip())
return tokens
def parse_expression(tokens, pos=0):
if tokens[pos] == "(":
pos += 1
op_token = tokens[pos]
pos += 1
if op_token not in TokenMap:
raise ValueError(f"알 수 없는 연산자: {op_token}")
op = TokenMap[op_token]
arg1, pos = parse_expression(tokens, pos)
arg2, pos = parse_expression(tokens, pos)
if tokens[pos] != ")":
raise ValueError("닫는 괄호가 필요합니다.")
pos += 1
return [op, arg1, arg2], pos
else:
tok = tokens[pos]
if tok.lstrip("-").isdigit():
return int(tok), pos + 1
if tok in TokenMap:
op = TokenMap[tok]
arg1, np = parse_expression(tokens, pos + 1)
arg2, pos2 = parse_expression(tokens, np)
return [op, arg1, arg2], pos2
raise ValueError(f"알 수 없는 토큰: {tok}")
def parse(tokens):
expr, pos = parse_expression(tokens, 0)
if pos != len(tokens):
raise ValueError("남는 토큰이 있습니다.")
return expr
def evaluate(expr):
if isinstance(expr, int):
return expr
op, a, b = expr
a = evaluate(a)
b = evaluate(b)
if op == Operation.ADD:
return a + b
if op == Operation.SUBTRACT:
return a - b
if op == Operation.MULTIPLY:
return a * b
if op == Operation.DIVIDE:
return a / b
if op == Operation.QUOTIENT:
return a // b
if op == Operation.REMAINDER:
return a % b
if op == Operation.POWER:
return a ** b
raise ValueError("지원하지 않는 연산")
print("계산기 v0.1.0")
print("=" * 25)
flag = False
while True:
try:
line = input("입력 > ").strip()
if not line:
continue
parts = line.split(";")
for part in parts:
part = part.strip()
if not part:
continue
if part == "종료" or part == "(종료)":
print("종료합니다.")
flag = True
break
tokens = tokenize(part)
expr = parse(tokens)
result = evaluate(expr)
out(result)
debug(tokens)
except Exception as e:
error(str(e))
if flag:
break
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment