Die Formula-Library ist ein Versuch von mir, einen objektorientierten schnellen Bottom-Up-Formelparser mit Shift-Reduce Arbeitsweise in C++ zu implementieren, ohne Yacc oder Lex zu verwenden. Um die Leistungsfähigkeit zu demonstrieren, habe ich dazu ein kleines Plotter-Programm geschrieben (der Source-Code des Plotters und der Formula-Library steht unter GPL):
Fertig kompiliert: plotter2.exe
Die zugrundeliegende Library mit kompletten Source und Visual C++ Projekt: formula.zip
Das Plotterprogramm mit kompletten Source und Visual C++ Projekt: plotter.zip
Die Grammatik ist nahe an C angelehnt. Hier der Versuch einer BNF-Grammatik:
expression = and-expression [or-operator and-expression]
and-expression = equal-expression [and-operator equal-expression]
equal-expression = relational-expression [equal-operator relational-expression]
relational-expression = sum [relational-operator sum]
sum = [sign] term {additive-operator term}
term = factor {multiplicative-operator factor}
factor = power {power-operator power}
power = power_operand {power-operator power_operand}
power_operand = unsigned-real | variable | (expression) | function-call
or-operator = |
and-operator = &
equal-operator = == | !=
relational-operator = < | > | <= | >=
additive-operator = + | -
multiplicative-operator = * | / | %
power-operator = ^
not-operator = !
variable = [a-z, A-Z, _]+ [a-z, A-Z, 0-9, _]*
unsigned-real = [0-9]* [.] [0-9]* [real-exponent]
real-exponent = [e|E] [+|-] [0-9]+
Folgende Funktionen werden folgende unterstüzt:
acos
asin
atan
atan2
cos
cosh
exp
fabs
fmod
log
log10
pow
sin
sinh
tan
tanh
sqrt
ceil
floor
max
min
time
Außerdem bietet die Library die Möglichkeit, Variablen zu setzen
und beliebige eigene Funktionen einfach einzuklinken.