Added additional example and info.

This commit is contained in:
Lewis Van Winkle
2016-05-05 17:12:02 -05:00
parent cf03962b1c
commit 4791163e24
4 changed files with 64 additions and 2 deletions

View File

@@ -3,7 +3,7 @@ CCFLAGS = -ansi -Wall -Wshadow -O2
LFLAGS = -lm
all: test bench example example2
all: test bench example example2 example3
test: test.o tinyexpr.o
@@ -20,6 +20,9 @@ example: example.o tinyexpr.o
example2: example2.o tinyexpr.o
$(CC) $(CCFLAGS) -o $@ $^ $(LFLAGS)
example3: example3.o tinyexpr.o
$(CC) $(CCFLAGS) -o $@ $^ $(LFLAGS)
.c.o:
$(CC) -c $(CCFLAGS) $< -o $@

View File

@@ -15,6 +15,7 @@ the standard C math functions and runtime binding of variables.
- Simple and fast.
- Implements standard operators precedence.
- Exposes standard C math functions (sin, sqrt, ln, etc.).
- Can add custom functions and variables easily.
- Can bind variables at eval-time.
- Released under the zlib license - free for nearly any use.
- Easy to use and integrate with your code
@@ -168,6 +169,23 @@ This produces the output:
5.000000
##Binding to Custom Functions
TinyExpr can also call to custom functions implemented in C. Here is a short example:
```C
double my_sum(double a, double b) {
/* Example C function that adds two numbers together. */
return a + b;
}
te_variable vars[] = {
{"mysum", my_sum, TE_FUNCTION2} /* TE_FUNCTION2 used because my_sum takes two arguments. */
};
te_expr *n = te_compile("mysum(5, 6)", vars, 1, 0);
```
##How it works
@@ -219,7 +237,12 @@ TinyExpr parses the following grammar:
<term> = <factor> {("*" | "/" | "%") <factor>}
<factor> = <power> {"^" <power>}
<power> = {("-" | "+")} <base>
<base> = <constant> | <variable> | <function-0> {"(" ")"} | <function-1> <power> | <function-2> "(" <expr> "," <expr> ")" | "(" <list> ")"
<base> = <constant>
| <variable>
| <function-0> {"(" ")"}
| <function-1> <power>
| <function-X> "(" <expr> {"," <expr>} ")"
| "(" <list> ")"
In addition, whitespace between tokens is ignored.

35
example3.c Normal file
View File

@@ -0,0 +1,35 @@
#include "tinyexpr.h"
#include <stdio.h>
/* An example of calling a C function. */
double my_sum(double a, double b) {
printf("Called C function with %f and %f.\n", a, b);
return a + b;
}
int main(int argc, char *argv[])
{
te_variable vars[] = {
{"mysum", my_sum, TE_FUNCTION2}
};
const char *expression = "mysum(5, 6)";
printf("Evaluating:\n\t%s\n", expression);
int err;
te_expr *n = te_compile(expression, vars, 1, &err);
if (n) {
const double r = te_eval(n);
printf("Result:\n\t%f\n", r);
te_free(n);
} else {
/* Show the user where the error is at. */
printf("\t%*s^\nError near here", err-1, "");
}
return 0;
}

1
test.c
View File

@@ -495,6 +495,7 @@ void test_optimize() {
{"5+5", 10},
{"pow(2,2)", 4},
{"sqrt 100", 10},
{"pi * 2", 6.2832},
};
int i;