An expression parser supporting multiple types.
Key Features:
- Multiple types (number, bool, datetime, string and error)
- Memory managed by user (no allocs)
- Iterator based interface
- Supporting variables
- Stateless
- Expressions can be compiled (RPN stack)
- Fully compile-time checked syntax
- Documented grammar
- Standard C11 code
- No dependencies
# Numerical calculations
sin((-1 + 2) * PI)
# Dates
datetrunc(now(), "day")
# Strings
"hi " + upper("bob") + trim(" ! ")
# Conditionals
ifelse(1 < 5 && length($alphabet) > 25, "case1", "case2")
# Find the missing letter
replace($alphabet, substr($alphabet, 25 - random(0, length($alphabet)), 1), "")
#include <stdio.h>
#include <string.h>
#include "expr.h"
int main()
{
yy_token_t data[64] = {0};
yy_stack_t stack = {.data = data, .reserved = 64};
const char *txt = "1 + 1";
yy_token_t result = yy_eval_number(txt, txt + strlen(txt), &stack, NULL, NULL);
printf("%s = %g\n", txt, result.number_val);
}
Compile previous code using:
gcc -o example example.c expr.c -lm
Follow these steps to compile and run the tests and examples.
make
cd build
tests
calc
Name | Contribution |
---|---|
Gerard Torrent | Initial work Code maintainer |
skeeto | Fuzzer analysis (reddit post) |
This project is licensed under the MIT License - see the LICENSE file for details.