Home
About me
Favourite links
Cities i visited
Русская версия
Mail me
|
|
|
MathParser Reference
About | Download | Reference
(The most of this reference is taken from the reference to CCalc library)
Contents
MathParser formulas syntax
You may use mathematically-correct formulas, including brackets,
functions etc.
MathParser formulas syntax admits:
- Mathematical constants E and Pi
- Large number of arithmetical and bitwise operations:
- + - * /
- It is obvious
- %
- Remainder
- **
- Power
- & | ^ ~
- Bitwise and / or / xor / not
- $
- Without name. See notes.
- Logical operations and relations
- <> = > <
- not equal / equal / greater / less relations
- && ||
- Logical and / or
- Functions
ARCTAN, COS, SIN, TAN, ABS, EXP, LN, LOG, SQRT, SQR,
INT, FRAC, TRUNC, ROUND( x, precision ), ARCSIN, ARCCOS, SGN, SIGN
- Conditional operator
<condition> ? <true expr.> : <false expr.>
where
- <condition>
- - logical condition. 0 - false, nonzero - true.
Logical relations and operations may be used.
- <true expr.>
- - expression for true expression
- <false expr.>
- - expression for false expression
Correct formulas examples
- (sin(Pi/2) + 1) / 4
- = 0.5
- 2 > 3
- = 0 (false)
- (2*2=4) ? 1 : 0
- = 1
- round( 1.2345, 2 )
- = 1.23
- round( 27.45, -1 )
- = 30
Notes
-
$ operation.
- A $ B - integerly divide A by B; if there was a remainder,
the result is increased by 1.
Usage example: for production B (or less) units of wares we spend one unit
of resource ("discrete" resource).
It is necessary to know how much resource units we need for producting A units of warez.
MathParser script
MathParser script begins with "#!". The syntax is clear from the example:
#!
a := 2;
b := 3;
return a * b + 1;
CCalc Library
There library consists of three Classes with their own API:
- CStrMap (StrMap.h)
- Small "sublibrary" for working with "string lists". You must
use this class if you want to add your own user-defined
functions (UDFs) and user-defined variables (UDVs)
- CLexer (lexer.h)
- Universal lexical analyser used as backend layer for parsing
expressions. In general developers have no need to communicate
directly with Lexer. But they can use it separately for their own needs.
- MathParser (MathParser.h)
- Core class which calculates expressions. It is
very easy to use but may be hard to initialize to match your needs.
StrMap reference
class CStrMap{
int FCount, FCapacity;
int FExtraLen, FRecordLen;
nt FDoDuplicate;
public:
char *FList;
CStrMap( int extrabytes=sizeof(double), int dup=0);
void CreateFromChain( int extrabytes, char *strchain, void *data );
~CStrMap();
void AddString(char *str, void *data);
void AddStrLen(char *str, int len, void *data );
void ShrinkMem();
void Trim(int NewCount );
void TrimClear(int NewCount );
void SetCapacity(int NewCapacity );
int IndexOf(char *str, void **data );
int LenIndexOf(char *str, int len, void **data );
char* GetString(int index, int *len, void **data );
void FillFromChain(char *strchain, void *data );
};
|
(Note: from library version you don't have to create parameters CStrMap,
CMathParser::Parameters now is not pointer but a "normal" object)
I have no time to describe each function, just some
examples of most common usage:
Creating list of variables from "char chain"
Variables will be associated with double values:
char varnames[] = "X\000" "Y\000" "Z\000\000";
double varvalues[] = { 5.3, 6.1, -7.45 };
mp.Parameters.FillFromChain( sizeof(double), varnames, varvalues );
...
|
Note that varnames is a special data structure ("char chain"):
a string containing zero-separated "substrings" terminated by double zero.
Creating list of variables step-by-step
double varvalues[] = { 5.3, 6.1 };
mp.Parameters.AddString( "X", varvalues );
mp.Parameters.AddString( "Y", varvalues+1 );
|
MathParser reference
class CMathParser{
Operation OpStack[MAX_STACK_SIZE];
double ValStack[MAX_STACK_SIZE];
int OpTop, ValTop;
int ObrDist;
CLexer Lexer;
int script;
CStrMap *VarParams;
char* ParseScript(double *result);
char* ParseFormula(double *result);
char* PrepareFormula();
char* Calc();
char* CalcToObr();
public:
CStrMap *Parameters;
CStrMap *ExtFunctions;
PrmSrchFunc MoreParams;
void *ParamFuncParam;
CMathParser( char *MoreLetters=NULL );
char* Parse(char *Formula, double *result);
~CMathParser();
};
|
Some examples of usage:
Initializing MathParser for using with list of UDVs
CMathParser* parser = new CMathParser();
/* ... creating list of variables. See CStrMap reference for example */
parser.Parameters.AddString("X", &x);
/* ... parsing expressions */
delete parser;
|
Calculating expression
double result;
char *ErrMsg = parser->Parse("sin(x * x) / 2", &result );
if ( ErrMsg == NULL )
printf( "%.15G\n", result );
else {
puts( ErrMsg );
|
Of course this documentation is incomplete as I have no time now
to write more.
For more information see test.cpp as an example of usage of the library, or you can contact me by e-mail (zkv@mail.ru)
|
|