import sys variables = {} def expression(exprString): exprString = exprString.strip() openBracket = exprString.find("(") if openBracket != -1: closeBracket = exprString.find(")") beforeBracket = exprString[:openBracket] insideBracket = exprString[openBracket + 1:closeBracket] afterBracket = exprString[closeBracket + 1:] if beforeBracket == "tonumber": innerValue = expression(insideBracket) try: if '.' in str(innerValue): result = float(innerValue) else: result = int(innerValue) except (ValueError, TypeError): result = 0 bracketResult = str(result) newExprString = bracketResult + afterBracket else: bracketResult = expression(insideBracket) newExprString = beforeBracket + bracketResult + afterBracket exprString = newExprString.strip() if "(" in exprString: return expression(exprString) splitParts = exprString.split("+") parts = [] for part in splitParts: strippedPart = part.strip() parts.append(strippedPart) values = [] for part in parts: firstChar = part[0] if firstChar == '"': value = part[1:-1] else: try: float(part) if '.' in part: value = float(part) else: value = int(part) except ValueError: value = variables.get(part, "") values.append(value) isAllNumbers = True for v in values: if not isinstance(v, (int, float)): isAllNumbers = False break if isAllNumbers: result = sum(values) else: resultParts = [] for v in values: resultParts.append(str(v)) result = "".join(resultParts) finalResult = str(result) return finalResult def condition(condString): condString = condString.strip() openBracket = condString.find("(") if openBracket != -1: closeBracket = condString.find(")") beforeBracket = condString[:openBracket] insideBracket = condString[openBracket + 1:closeBracket] afterBracket = condString[closeBracket + 1:] bracketResult = condition(insideBracket) if bracketResult: resultStr = "true" else: resultStr = "false" condString = (beforeBracket + resultStr + afterBracket).strip() operators = ["==", "!=", "<=", ">=", "<", ">"] for op in operators: if op in condString: split = condString.split(op, 1) leftExpr = split[0].strip() rightExpr = split[1].strip() leftVal = expression(leftExpr) rightVal = expression(rightExpr) try: leftNum = float(leftVal) rightNum = float(rightVal) leftVal = leftNum rightVal = rightNum except (ValueError, TypeError): pass if op == "==": return leftVal == rightVal elif op == "!=": return leftVal != rightVal elif op == "<": return leftVal < rightVal elif op == ">": return leftVal > rightVal elif op == "<=": return leftVal <= rightVal elif op == ">=": return leftVal >= rightVal return False def file(text): lines = text.splitlines() i = 0 while i < len(lines): line = lines[i] if line.strip().lower().startswith("if "): conditionExpr = line.strip()[3:] condResult = condition(conditionExpr) i += 1 block_lines = [] nesting_depth = 1 while i < len(lines) and nesting_depth > 0: current_line = lines[i] if current_line.strip().lower().startswith("if "): nesting_depth += 1 block_lines.append(current_line) elif current_line.strip().lower() == "endif": nesting_depth -= 1 if nesting_depth > 0: block_lines.append(current_line) else: block_lines.append(current_line) i += 1 if condResult: block_text = "\n".join(block_lines) file(block_text) elif line.strip().lower() == "endif": i += 1 else: runline(line) i += 1 def repl(): while True: try: line = input("jank> ") if line.strip().lower().startswith("if "): conditionExpr = line.strip()[3:] condResult = condition(conditionExpr) block_lines = [] nesting_depth = 1 while nesting_depth > 0: line = input("... ") if line.strip().lower().startswith("if "): nesting_depth += 1 block_lines.append(line) elif line.strip().lower() == "endif": nesting_depth -= 1 if nesting_depth > 0: block_lines.append(line) else: block_lines.append(line) if condResult: block_text = "\n".join(block_lines) file(block_text) else: runline(line) except EOFError: break def runline(line): line = line.strip() parts = line.split(" ", 1) command = parts[0].lower() try: match command: case "output": expr = parts[1] result = expression(expr) print(result) case "set": expr = parts[1] split = expr.split("=", 1) varName = split[0].strip() valueExpr = split[1].strip() result = expression(valueExpr) variables[varName] = result case "input": expr = parts[1] split = expr.split("=", 1) varName = split[0].strip() valueExpr = split[1].strip() result = expression(valueExpr) inputValue = input(result) variables[varName] = inputValue case "exit": exit() case _: print(f"Unknown command: {command}") except Exception as e: print(f"Error processing line '{line}': {e}") if __name__ == "__main__": if len(sys.argv) > 1: try: with open(sys.argv[1], 'r') as f: text = f.read() file(text) except Exception as e: print(f"Error reading file: {e}") else: repl()