calculator: add executable calculator

It can both evaluate and print the given expression.

It uses `click` to parse its CLI options.
This commit is contained in:
Bruno BELANYI 2019-11-30 19:24:37 +01:00
parent 2f240fa78c
commit 0a4966ae95

50
calculator/run.py Executable file
View file

@ -0,0 +1,50 @@
#! /usr/bin/env python
import click
from calculator.eval import Evaluator
from calculator.parse import parse_infix, parse_postfix, parse_prefix
from calculator.print import Printer
STR_TO_PARSER = {
"infix": parse_infix,
"prefix": parse_prefix,
"postfix": parse_postfix,
}
@click.group(invoke_without_command=True, chain=True)
@click.option(
"--expr-type",
default="infix",
type=click.Choice(["infix", "prefix", "postfix"], case_sensitive=False),
)
@click.pass_context
def cli(ctx, expr_type):
ctx.ensure_object(dict)
ctx.obj["input"] = STR_TO_PARSER[expr_type](
input(f"Input your {expr_type} expression: ")
)
if ctx.invoked_subcommand is None:
ctx.invoke(eval_tree)
@cli.command(name="print")
@click.pass_context
def print_tree(ctx):
"""
Print the parsed AST.
"""
Printer().print(ctx.obj["input"])
@cli.command(name="eval")
@click.pass_context
def eval_tree(ctx):
"""
Evaluate the parsed expression.
"""
print(Evaluator().visit_and_get_value(ctx.obj["input"]))
if __name__ == "__main__":
cli(obj={})