leo is an expression parser and calculator.
From string inputs, leo can handle basic math operations, variables, and calling external functions.
leo is actually a library and a repl. To build just the library (ie, for use in other
programs), just run make
. To build the repl, run make repl
.
Try things out to see what you can do. If you experience unexpected results, please let me know!
Variables are rather lax; they can be multiple characters long and
contain any character that is not ()+-/*^ ,
.
A "variable" followed by a (
is considered to be a function.
External function call support relies on the system having x86_64
system-V ABI compliance. Functions are whitelisted by passing an array to
rpn_calc
: char *whitelist[] = {"allowed func 1", "allowed func 2", NULL}
.
Optionally, the whitelist can be NULL
to disallow any functions, or {"*", NULL}
to allow all.
I wrote leo mostly from scratch, but following this page for guidelines on how to design the algorithms.
leo implements a tokenizer (to convert the user input string into tokens), a shunting-yard algorithm (to convert the infix tokens into reverse polish notation), and a reverse polish notation calculator (to compute the value of the expression). To support these parts, it also implements a simple stack and queue.
As always, most things are written in ANSI C, with the exception of run_function.c
, since
it relies on the asm()
"function" that wasn't part of the original C standard.