Last active
November 24, 2025 06:57
-
-
Save Mjkim-Programming/bf80f9e9b94cad7d7ebff91a55779476 to your computer and use it in GitHub Desktop.
Something About Calculating Stuff I dont know why I created this
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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