## 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
  - Project / makefiles for MSVC, mingw, autoconf, bcc
  - 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)`
- Localization
  - Argument separator, decimal separator, thousands separator can be adjusted to your locale

### 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.