52 lines
892 B
Python
Executable File
52 lines
892 B
Python
Executable File
#! /usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
# vim:fenc=utf-8
|
|
#
|
|
# Copyright © 2019 pavle <pavle.portic@tilda.center>
|
|
#
|
|
# Distributed under terms of the BSD-3-Clause license.
|
|
|
|
from lexer import Lexer
|
|
from interpreter import Interpreter, InterpreterError
|
|
from constants import DEC
|
|
|
|
|
|
def print_stack(interpreter, stack):
|
|
for item in stack:
|
|
if interpreter.mode == DEC:
|
|
if item.is_integer():
|
|
print(int(item))
|
|
else:
|
|
print(round(float(item), 4))
|
|
else:
|
|
print(interpreter.mode_func(item))
|
|
|
|
|
|
def rpncalc():
|
|
interpreter = Interpreter()
|
|
|
|
while True:
|
|
try:
|
|
text = input('> ')
|
|
except (EOFError, KeyboardInterrupt):
|
|
break
|
|
|
|
if not text:
|
|
continue
|
|
|
|
if text == 'exit':
|
|
break
|
|
|
|
lexer = Lexer(text)
|
|
try:
|
|
stack = interpreter.parse(lexer)
|
|
except InterpreterError as err:
|
|
print(err)
|
|
|
|
print_stack(interpreter, stack)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
rpncalc()
|
|
|