1*8975f5c5SAndroid Build Coastguard Worker# ceval 2*8975f5c5SAndroid Build Coastguard WorkerA C/C++ header for parsing and evaluation of arithmetic expressions. 3*8975f5c5SAndroid Build Coastguard Worker 4*8975f5c5SAndroid Build Coastguard Worker[README file is almost identical to that of the <a href="https://github.com/erstan/ceval#readme">ceval</a> library] 5*8975f5c5SAndroid Build Coastguard Worker 6*8975f5c5SAndroid Build Coastguard Worker## Functions accessibe from main() 7*8975f5c5SAndroid Build Coastguard Worker<table> 8*8975f5c5SAndroid Build Coastguard Worker<thead><th>Function</th><th>Argument(s)</th><th>Return Value</th></thead> 9*8975f5c5SAndroid Build Coastguard Worker<tbody> 10*8975f5c5SAndroid Build Coastguard Worker <tr> 11*8975f5c5SAndroid Build Coastguard Worker <td><code>ceval_result()</code></td> 12*8975f5c5SAndroid Build Coastguard Worker <td>A mathematical expression in the form of a character array or a CPP string</td> 13*8975f5c5SAndroid Build Coastguard Worker <td>The result of the expression as a floating point number</td> 14*8975f5c5SAndroid Build Coastguard Worker</tr> 15*8975f5c5SAndroid Build Coastguard Worker<tr> 16*8975f5c5SAndroid Build Coastguard Worker <td><code>ceval_tree()</code></td> 17*8975f5c5SAndroid Build Coastguard Worker <td>A mathematical expression in the form of a character array or a CPP string</td> 18*8975f5c5SAndroid Build Coastguard Worker <td>The function prints the parse tree with each node properly indented depending on it's location in the tree structure</td> 19*8975f5c5SAndroid Build Coastguard Worker</tr> 20*8975f5c5SAndroid Build Coastguard Worker</tbody> 21*8975f5c5SAndroid Build Coastguard Worker</table> 22*8975f5c5SAndroid Build Coastguard Worker 23*8975f5c5SAndroid Build Coastguard Worker## Supported expressions 24*8975f5c5SAndroid Build Coastguard WorkerAny valid combination of the following operators and functions, with floating point numbers as operands can be parsed by <b>ceval</b>. Parentheses can be used to override the default operator precedences. 25*8975f5c5SAndroid Build Coastguard Worker 26*8975f5c5SAndroid Build Coastguard Worker* Arithematic operators 27*8975f5c5SAndroid Build Coastguard Worker 28*8975f5c5SAndroid Build Coastguard Worker`+` (addition), `-` (subtraction), `*` (multiplication), `/` (division), `%` (modulo), `**` (exponentiation), `//` (quotient) 29*8975f5c5SAndroid Build Coastguard Worker* Relational operators 30*8975f5c5SAndroid Build Coastguard Worker 31*8975f5c5SAndroid Build Coastguard Worker`==` (equal), `!=` (not equal), `<` (strictly less), `>` (strictly greater), `<=` (less or equal), `>=` (greater or equal) to compare the results of two expressions 32*8975f5c5SAndroid Build Coastguard Worker 33*8975f5c5SAndroid Build Coastguard Worker* Single-argument functions 34*8975f5c5SAndroid Build Coastguard Worker 35*8975f5c5SAndroid Build Coastguard Worker`exp()`, `sqrt()`, `cbrt()`, `sin()`, `cos()`, `tan()`, `asin()`, `acos()`, `atan()`, `sinh()`, `cosh()`, `tanh()`, `abs()`, `ceil()`, `floor()`, `log10()`, `ln()`, `deg2rad()`, `rad2deg()`, `signum()`, `int()`, `frac()`, `fact()` 36*8975f5c5SAndroid Build Coastguard Worker 37*8975f5c5SAndroid Build Coastguard Worker* Two-argument functions 38*8975f5c5SAndroid Build Coastguard Worker 39*8975f5c5SAndroid Build Coastguard Worker`pow()`, `atan2()`, `gcd()`, `hcf()`, `lcm()`, `log()` (generalized log(b, x) to any base `b`) 40*8975f5c5SAndroid Build Coastguard Worker 41*8975f5c5SAndroid Build Coastguard Worker* Pre-defined math constants 42*8975f5c5SAndroid Build Coastguard Worker 43*8975f5c5SAndroid Build Coastguard Worker`_pi`, `_e` 44*8975f5c5SAndroid Build Coastguard Worker 45*8975f5c5SAndroid Build Coastguard Worker...pre-defined constants are prefixed with an underscore 46*8975f5c5SAndroid Build Coastguard Worker 47*8975f5c5SAndroid Build Coastguard Worker* Logical operators 48*8975f5c5SAndroid Build Coastguard Worker 49*8975f5c5SAndroid Build Coastguard Worker`&&`, `||` and `!` 50*8975f5c5SAndroid Build Coastguard Worker 51*8975f5c5SAndroid Build Coastguard Worker* Bitwise operators 52*8975f5c5SAndroid Build Coastguard Worker 53*8975f5c5SAndroid Build Coastguard Worker`&`, `|`, `^`, `<<`, `>>`, `~` 54*8975f5c5SAndroid Build Coastguard Worker 55*8975f5c5SAndroid Build Coastguard Worker* Other operators 56*8975f5c5SAndroid Build Coastguard Worker 57*8975f5c5SAndroid Build Coastguard Worker * `,` (Comma operator) 58*8975f5c5SAndroid Build Coastguard Worker Comma operator returns the result of it's rightmost operand 59*8975f5c5SAndroid Build Coastguard Worker Ex: `2,3` would give `3`; `4,3,0` would be equal to `0`; and `cos(_pi/2,_pi/3,_pi)` would return `cos(_pi)` i.e, `-1` 60*8975f5c5SAndroid Build Coastguard Worker * `e` (e-operator for scientific notation) 61*8975f5c5SAndroid Build Coastguard Worker Using the binary `e` operator, we can use scientific notation in our arithmetic expressions 62*8975f5c5SAndroid Build Coastguard Worker Ex: `0.0314` could be written as `3.14e-2`; `1230000` could be subsituted by `1.23e6` 63*8975f5c5SAndroid Build Coastguard Worker 64*8975f5c5SAndroid Build Coastguard Worker## Usage 65*8975f5c5SAndroid Build Coastguard WorkerInclude the ceval library using the `#include "PATH_TO_CEVAL.H"` directive your C/C++ project. 66*8975f5c5SAndroid Build Coastguard Worker 67*8975f5c5SAndroid Build Coastguard WorkerThe code snippet given below is a console based interpreter that interactively takes in math expressions from stdin, and prints out their parse trees and results. 68*8975f5c5SAndroid Build Coastguard Worker 69*8975f5c5SAndroid Build Coastguard Worker``` 70*8975f5c5SAndroid Build Coastguard Worker//lang=c 71*8975f5c5SAndroid Build Coastguard Worker#include<stdio.h> 72*8975f5c5SAndroid Build Coastguard Worker#include<stdlib.h> 73*8975f5c5SAndroid Build Coastguard Worker 74*8975f5c5SAndroid Build Coastguard Worker#include "ceval.h" 75*8975f5c5SAndroid Build Coastguard Worker 76*8975f5c5SAndroid Build Coastguard Workerint main(int argc, char ** argv) { 77*8975f5c5SAndroid Build Coastguard Worker char expr[100]; 78*8975f5c5SAndroid Build Coastguard Worker while (1) { 79*8975f5c5SAndroid Build Coastguard Worker printf("In = "); 80*8975f5c5SAndroid Build Coastguard Worker fgets(expr, 100, stdin); 81*8975f5c5SAndroid Build Coastguard Worker if (!strcmp(expr, "exit\n")) { 82*8975f5c5SAndroid Build Coastguard Worker break; 83*8975f5c5SAndroid Build Coastguard Worker } else if (!strcmp(expr, "clear\n")) { 84*8975f5c5SAndroid Build Coastguard Worker system("clear"); 85*8975f5c5SAndroid Build Coastguard Worker continue; 86*8975f5c5SAndroid Build Coastguard Worker } else { 87*8975f5c5SAndroid Build Coastguard Worker ceval_tree(expr); 88*8975f5c5SAndroid Build Coastguard Worker printf("\nOut = %f\n\n", ceval_result(expr)); 89*8975f5c5SAndroid Build Coastguard Worker } 90*8975f5c5SAndroid Build Coastguard Worker } 91*8975f5c5SAndroid Build Coastguard Worker return 0; 92*8975f5c5SAndroid Build Coastguard Worker} 93*8975f5c5SAndroid Build Coastguard Worker``` 94*8975f5c5SAndroid Build Coastguard Worker 95*8975f5c5SAndroid Build Coastguard Worker## Test Run 96*8975f5c5SAndroid Build Coastguard Worker``` 97*8975f5c5SAndroid Build Coastguard WorkerIn = 3*7**2 98*8975f5c5SAndroid Build Coastguard Worker 2 99*8975f5c5SAndroid Build Coastguard Worker ** 100*8975f5c5SAndroid Build Coastguard Worker 7 101*8975f5c5SAndroid Build Coastguard Worker* 102*8975f5c5SAndroid Build Coastguard Worker 3 103*8975f5c5SAndroid Build Coastguard Worker 104*8975f5c5SAndroid Build Coastguard WorkerOut = 147.000000 105*8975f5c5SAndroid Build Coastguard Worker 106*8975f5c5SAndroid Build Coastguard Worker 107*8975f5c5SAndroid Build Coastguard WorkerIn = (3.2+2.8)/2 108*8975f5c5SAndroid Build Coastguard Worker 2 109*8975f5c5SAndroid Build Coastguard Worker/ 110*8975f5c5SAndroid Build Coastguard Worker 2.80 111*8975f5c5SAndroid Build Coastguard Worker + 112*8975f5c5SAndroid Build Coastguard Worker 3.20 113*8975f5c5SAndroid Build Coastguard Worker 114*8975f5c5SAndroid Build Coastguard WorkerOut = 3.000000 115*8975f5c5SAndroid Build Coastguard Worker 116*8975f5c5SAndroid Build Coastguard Worker 117*8975f5c5SAndroid Build Coastguard WorkerIn = _e**_pi>_pi**_e 118*8975f5c5SAndroid Build Coastguard Worker 2.72 119*8975f5c5SAndroid Build Coastguard Worker ** 120*8975f5c5SAndroid Build Coastguard Worker 3.14 121*8975f5c5SAndroid Build Coastguard Worker> 122*8975f5c5SAndroid Build Coastguard Worker 3.14 123*8975f5c5SAndroid Build Coastguard Worker ** 124*8975f5c5SAndroid Build Coastguard Worker 2.72 125*8975f5c5SAndroid Build Coastguard Worker 126*8975f5c5SAndroid Build Coastguard WorkerOut = 1.000000 127*8975f5c5SAndroid Build Coastguard Worker 128*8975f5c5SAndroid Build Coastguard Worker 129*8975f5c5SAndroid Build Coastguard WorkerIn = 5.4%2 130*8975f5c5SAndroid Build Coastguard Worker 2 131*8975f5c5SAndroid Build Coastguard Worker% 132*8975f5c5SAndroid Build Coastguard Worker 5.40 133*8975f5c5SAndroid Build Coastguard Worker 134*8975f5c5SAndroid Build Coastguard WorkerOut = 1.400000 135*8975f5c5SAndroid Build Coastguard Worker 136*8975f5c5SAndroid Build Coastguard Worker 137*8975f5c5SAndroid Build Coastguard WorkerIn = 5.4//2 138*8975f5c5SAndroid Build Coastguard Worker 2 139*8975f5c5SAndroid Build Coastguard Worker// 140*8975f5c5SAndroid Build Coastguard Worker 5.40 141*8975f5c5SAndroid Build Coastguard Worker 142*8975f5c5SAndroid Build Coastguard WorkerOut = 2.000000 143*8975f5c5SAndroid Build Coastguard Worker 144*8975f5c5SAndroid Build Coastguard Worker 145*8975f5c5SAndroid Build Coastguard WorkerIn = 2*2.0+1.4 146*8975f5c5SAndroid Build Coastguard Worker 1.40 147*8975f5c5SAndroid Build Coastguard Worker+ 148*8975f5c5SAndroid Build Coastguard Worker 2 149*8975f5c5SAndroid Build Coastguard Worker * 150*8975f5c5SAndroid Build Coastguard Worker 2 151*8975f5c5SAndroid Build Coastguard Worker 152*8975f5c5SAndroid Build Coastguard WorkerOut = 5.400000 153*8975f5c5SAndroid Build Coastguard Worker 154*8975f5c5SAndroid Build Coastguard Worker 155*8975f5c5SAndroid Build Coastguard WorkerIn = (5/4+3*-5)+(sin(_pi))**2+(cos(_pi))**2 156*8975f5c5SAndroid Build Coastguard Worker 2 157*8975f5c5SAndroid Build Coastguard Worker ** 158*8975f5c5SAndroid Build Coastguard Worker 3.14 159*8975f5c5SAndroid Build Coastguard Worker cos 160*8975f5c5SAndroid Build Coastguard Worker+ 161*8975f5c5SAndroid Build Coastguard Worker 2 162*8975f5c5SAndroid Build Coastguard Worker ** 163*8975f5c5SAndroid Build Coastguard Worker 3.14 164*8975f5c5SAndroid Build Coastguard Worker sin 165*8975f5c5SAndroid Build Coastguard Worker + 166*8975f5c5SAndroid Build Coastguard Worker 5 167*8975f5c5SAndroid Build Coastguard Worker - 168*8975f5c5SAndroid Build Coastguard Worker * 169*8975f5c5SAndroid Build Coastguard Worker 3 170*8975f5c5SAndroid Build Coastguard Worker + 171*8975f5c5SAndroid Build Coastguard Worker 4 172*8975f5c5SAndroid Build Coastguard Worker / 173*8975f5c5SAndroid Build Coastguard Worker 5 174*8975f5c5SAndroid Build Coastguard Worker 175*8975f5c5SAndroid Build Coastguard WorkerOut = -12.750000 176*8975f5c5SAndroid Build Coastguard Worker 177*8975f5c5SAndroid Build Coastguard Worker 178*8975f5c5SAndroid Build Coastguard WorkerIn = 3,4,5,6 179*8975f5c5SAndroid Build Coastguard Worker 6 180*8975f5c5SAndroid Build Coastguard Worker, 181*8975f5c5SAndroid Build Coastguard Worker 5 182*8975f5c5SAndroid Build Coastguard Worker , 183*8975f5c5SAndroid Build Coastguard Worker 4 184*8975f5c5SAndroid Build Coastguard Worker , 185*8975f5c5SAndroid Build Coastguard Worker 3 186*8975f5c5SAndroid Build Coastguard Worker 187*8975f5c5SAndroid Build Coastguard WorkerOut = 6.000000 188*8975f5c5SAndroid Build Coastguard Worker 189*8975f5c5SAndroid Build Coastguard Worker 190*8975f5c5SAndroid Build Coastguard WorkerIn = tanh(2/3)==(sinh(2/3)/cosh(2/3)) 191*8975f5c5SAndroid Build Coastguard Worker 3 192*8975f5c5SAndroid Build Coastguard Worker / 193*8975f5c5SAndroid Build Coastguard Worker 2 194*8975f5c5SAndroid Build Coastguard Worker cosh 195*8975f5c5SAndroid Build Coastguard Worker / 196*8975f5c5SAndroid Build Coastguard Worker 3 197*8975f5c5SAndroid Build Coastguard Worker / 198*8975f5c5SAndroid Build Coastguard Worker 2 199*8975f5c5SAndroid Build Coastguard Worker sinh 200*8975f5c5SAndroid Build Coastguard Worker== 201*8975f5c5SAndroid Build Coastguard Worker 3 202*8975f5c5SAndroid Build Coastguard Worker / 203*8975f5c5SAndroid Build Coastguard Worker 2 204*8975f5c5SAndroid Build Coastguard Worker tanh 205*8975f5c5SAndroid Build Coastguard Worker 206*8975f5c5SAndroid Build Coastguard WorkerOut = 1.000000 207*8975f5c5SAndroid Build Coastguard Worker 208*8975f5c5SAndroid Build Coastguard Worker 209*8975f5c5SAndroid Build Coastguard WorkerIn = (2+3/3+(3+9.7)) 210*8975f5c5SAndroid Build Coastguard Worker 9.70 211*8975f5c5SAndroid Build Coastguard Worker + 212*8975f5c5SAndroid Build Coastguard Worker 3 213*8975f5c5SAndroid Build Coastguard Worker+ 214*8975f5c5SAndroid Build Coastguard Worker 3 215*8975f5c5SAndroid Build Coastguard Worker / 216*8975f5c5SAndroid Build Coastguard Worker 3 217*8975f5c5SAndroid Build Coastguard Worker + 218*8975f5c5SAndroid Build Coastguard Worker 2 219*8975f5c5SAndroid Build Coastguard Worker 220*8975f5c5SAndroid Build Coastguard WorkerOut = 15.700000 221*8975f5c5SAndroid Build Coastguard Worker 222*8975f5c5SAndroid Build Coastguard Worker 223*8975f5c5SAndroid Build Coastguard WorkerIn = sin(_pi/2)+cos(_pi/2)+tan(_pi/2) 224*8975f5c5SAndroid Build Coastguard Worker 2 225*8975f5c5SAndroid Build Coastguard Worker / 226*8975f5c5SAndroid Build Coastguard Worker 3.14 227*8975f5c5SAndroid Build Coastguard Worker tan 228*8975f5c5SAndroid Build Coastguard Worker+ 229*8975f5c5SAndroid Build Coastguard Worker 2 230*8975f5c5SAndroid Build Coastguard Worker / 231*8975f5c5SAndroid Build Coastguard Worker 3.14 232*8975f5c5SAndroid Build Coastguard Worker cos 233*8975f5c5SAndroid Build Coastguard Worker + 234*8975f5c5SAndroid Build Coastguard Worker 2 235*8975f5c5SAndroid Build Coastguard Worker / 236*8975f5c5SAndroid Build Coastguard Worker 3.14 237*8975f5c5SAndroid Build Coastguard Worker sin 238*8975f5c5SAndroid Build Coastguard Worker 239*8975f5c5SAndroid Build Coastguard Worker[ceval]: tan() is not defined for odd-integral multiples of _pi/2 240*8975f5c5SAndroid Build Coastguard Worker 241*8975f5c5SAndroid Build Coastguard WorkerOut = nan 242*8975f5c5SAndroid Build Coastguard Worker 243*8975f5c5SAndroid Build Coastguard Worker 244*8975f5c5SAndroid Build Coastguard WorkerIn = asin(2) 245*8975f5c5SAndroid Build Coastguard Worker 2 246*8975f5c5SAndroid Build Coastguard Workerasin 247*8975f5c5SAndroid Build Coastguard Worker 248*8975f5c5SAndroid Build Coastguard Worker[ceval]: Numerical argument out of domain 249*8975f5c5SAndroid Build Coastguard Worker 250*8975f5c5SAndroid Build Coastguard WorkerOut = nan 251*8975f5c5SAndroid Build Coastguard Worker 252*8975f5c5SAndroid Build Coastguard Worker 253*8975f5c5SAndroid Build Coastguard WorkerIn = exit 254*8975f5c5SAndroid Build Coastguard Worker... Program finished with exit code 0 255*8975f5c5SAndroid Build Coastguard Worker 256*8975f5c5SAndroid Build Coastguard Worker``` 257*8975f5c5SAndroid Build Coastguard Worker## Note 258*8975f5c5SAndroid Build Coastguard WorkerWhen the `ceval.h` file is included in a C-program, you might require the `-lm` flag to link `math.h` 259*8975f5c5SAndroid Build Coastguard Worker 260*8975f5c5SAndroid Build Coastguard Worker```shell 261*8975f5c5SAndroid Build Coastguard Workergcc file.c -lm 262*8975f5c5SAndroid Build Coastguard Worker``` 263*8975f5c5SAndroid Build Coastguard Worker 264