Und wozu dann der Zirkus mit antlr? du musst eine eval-Funktion schreiben, und zwar rekursiv über deinen Baum…
etwa
evalop(left,right,op)
gegeben durch eval(left)+eval(right) und op=„+“
gegeben durch eval(left)eval(right) und op=""
usw.
Irgendwo musst du ja die strings durch die arithmetischen Operationen von Java ersetzen - irgendwo ist wohl auch eine Funktion, die eine String in eine double-Variable verwandelt.
Soo ich bins nochmal.
Ich weiß jetzt endlich wie ichs machen muss.
Ich habe in Java einen Differentiator.java der nur den native-call macht. Dann habe ich eine differentiate Methode auf der „C-Seite“, die so aussieht:
double h = 2;
double temp = (f(x + h) - f(x - h)) / (2 * h);
while (true) {
h /= 2;
if (abs(temp - (f(x + h) - f(x - h)) / (2 * h)) > EPS) {
temp = (f(x + h) - f(x - h)) / (2 * h);
printf("%f
", h);
} else {
break;
}
}
return temp;
}```
Ich stecke also oben eine Function rein, die ich mir vorher aus dem Javaobjekt "gewrappt" habe. Der ()-Operator eines "gewrappten" JavaFunction Objekts ist dann so überladen:
```double operator()(double x) const{
return env->CallDoubleMethod(instance,fct,x);
}
Wobei „instance“ das JavaObjekt ist und „fct“ die eval-Methode des Java Functionsobjekts, die ich über die Reflection API „rauskriegen“ muss.
Wenn ich also in der differentiate Methode f(x+h) rufe, macht der überladene ()-Operator wieder einen Javacall und führt die eval-Function aus. Jetzt wo ichs verstanden hab, ist es nicht mehr sooo schwer und ich verusche mich heute an der Umsetzung