## Features

The following is a list of the features currently supported by the parser library. The primary objective is to keep it as extensible as possible whilst ensuring a maximum parsing speed. Extending the parser is mostly based on allowing a user to add custom callbacks which require only an absolute minimum of code. For instance you need exactly 2 lines of code to add a new function. But extending the parser may not be necessary at all since it comes with a powerful default implementation. Here is the (incomplete) list of features:

### Overview

- Easy to use

- You need only a few lines of code to evaluate en expression

- Extremely fast

- faster than similar commercial parsers

- User-defined operators

- binary operators
- postfix operators
- infix operators

- User-defined functions
  - with a fixed number of up to five arguments
  - with variable number of arguments
  - with a single string argument (for database queries)
- User-defined constants.
  - numeric constants
  - string constants
- User-defined variables.
  - unlimited in number
  - definable at parser runtime by the parser
  - assigning variables in terms of other variables is possible
- Custom value recognition callbacks
  - support for binary and hex values.
  - can be used to implement database queries
- Default implementaion with many features

- 26 predefined functions.
- 15 predefined operators.
- Supports numerical differentiation with respect to a given variable.
- Assignement operator is supported

- Portability
  - GNU Makefile included
  - BCB Project files included
  - MSVC 7.1 Project files for managed and unmanaged code
  - ISO 14882 compliant code
  - DLL version usable from every language able to use function exported in C-style
- Unit support
  - Use postfix operators as unit multipliers `(3m -> 0.003)`

### The default implementation

This section gives an overview on the default features supported by the parser. The default implementation is defined in the class `mu::Parser` located in the file muParser.cpp. The DLL-version uses this class internally.

#### Built-in functions

The following table gives an overview of the functions supported by the default implementation. It lists the function names, the number of arguments and a brief description.

> Name | Argc. | Explanation
> `sin` | 1 | sine function
> `cos` | 1 | cosine function
> `tan` | 1 | tangens function
> `asin` | 1 | arcus sine function
> `acos` | 1 | arcus cosine function
> `atan` | 1 | arcus tangens function
> `sinh` | 1 | hyperbolic sine function
> `cosh` | 1 | hyperbolic cosine
> `tanh` | 1 | hyperbolic tangens function
> `asinh` | 1 | hyperbolic arcus sine function
> `acosh` | 1 | hyperbolic arcus tangens function
> `atanh` | 1 | hyperbolic arcur tangens function
> `log2` | 1 | logarithm to the base 2
> `log10` | 1 | logarithm to the base 10
> `log` | 1 | logarithm to the base 10
> `ln` | 1 | logarithm to base e (2.71828...)
> `exp` | 1 | e raised to the power of x
> `sqrt` | 1 | square root of a value
> `sign` | 1 | sign function -1 if x<0; 1 if x>0
> `rint` | 1 | round to nearest integer
> `abs` | 1 | absolute value
> `if` | 3 | if ... then ... else ...
> `min` | var. | min of all arguments
> `max` | var. | max of all arguments
> `sum` | var. | sum of all arguments
> `avg` | var. | mean value of all arguments

#### Built-in binary operators

The following table lists the default binary operators supported by the parser.

> Operator | Meaning | Priority
> `=` | assignement* | -1
> `and` | logical and | 1
> `or` | logical or | 1
> `xor` | logical xor | 1
> `<=` | less or equal | 2
> `>=` | greater or equal | 2
> `!=` | not equal | 2
> `==` | equal | 2
> `>` | greater than | 2
> `<` | less than | 2
> `+` | addition | 3
> `-` | subtraction | 3
> `*` | multiplication | 4
> `/` | division | 4
> `^` | raise x to the power of y | 5

> *The assignment operator is special since it changes one of its arguments and can only by applied to variables.