Ich habe ein Java Programm das ein TextArea hat.
In diesem TextArea kann man jetzt ein kurzes Programm eingeben:
int zaehler = 0;
String infoText = "Stand: ";
public main() {
startLoop();
}
public startLoop() {
while(true) {
zaehler++;
if(zaehler == 3) {
zaehler = 0;
sendeAnRoboter(infoText + " Bereit")
}
}
}
Wichtig: sendeAnRoboter() wurde nicht definiert, sondern wird in der Script Sprache vordefiniert.
Also im Prinzip was ich möchte ist, innerhalb meines Java-Programs ein Script (in Java Form) aufrufen, dass eine interne Java Funktion sendeAnRoboter() aufruft.
Ich kenne die üblichen Scriptsprachen, Groovy, Beanshell, LUA, … und auch die Begriffe Lexer, Parser, ActionTree etc. Doch ehrlich gesagt, nach tagelangem recherchieren, Lesen, probieren, sehe ich keinen Weg wie ich das oben genannte umsetzen könnte. Vor allem „eigene“ Befehle einfach zu generieren, die dann innerhalb des laufenden Java Programms ausgeführt werden.
Was ich gefunden habe sind nur „Compiler“ und keine „Interpreter“ Lösungen. Und wenn, dann keine Java In Java Interpreter (ich möchte kein Javascript).
Deshalb hier mein hilfesuchender Post… weiß jemand eine simple Lösung, oder überhaupt eine Lösung, ein Tutorial das die Umsetzung nicht nur „streift“ und man sich 6 Monate den Rest erarbeiten muss? Ich scheue keine Mühen, aber 5 Tage sind was anderes als ein halbes Jahr
ANTLR habe ich mir schon mehrmals angesehen und mehrmals ausprobiert, aber es scheitert. Es ist zu komplex. Es gibt zig Dateien und zig Stellen die man editieren muss. Auch durch zahlreiche YouTube Videos (die meistens > 1 Stunde dauern) bin ich nicht wirklich zum Kern vorgedrungen. Vor allem auch, weil hier zu 99% nur Compiler gebaut werden, und keine Echtzeit-Interpreter.
Ich habe mir deshalb einen eigenen Parser, Lexer, Interpreter gebaut, der auch funktioniert, nur 1. er kann keine C/Java Syntax, und er st ein bisschen Langsam. Also eher eine Notlösung um überhaupt eine Scriptsprache in Java zu haben.
Das hier ist meine Übergangslösung:
compiler.addMethod(new Method("replaceStr",
(byte)opcodeCounter++,
new int[] {VAR_NAME, STRING, STRING}, new String[] {"variable","oldChar","newChar"}) {
@Override public void run() {
String varName= getNextValueAsVarName();
Object value = getNextValueAsString();
Object value2 = getNextValueAsString();
replaceStr(varName, value, value2);
}
});
Im Gegensatz zu anderen Lösungen muss ich nicht noch an duzenden anderen Stellen irgendwas editieren. Dieser kurze Block löst/kreiert eine komplette Funktion (Methoden Definition / Interpreter Handling + ByteCode Reads + Java Funktionsaufruf), und springt dann zur Java Methode „replaceStr“. Ich denke einfacher geht es kaum. Aber wie schon erwähnt… das ersetzt keine komplette C/Java Syntax. Ich könnte meins noch weiter ausbauen, doch ich denke das braucht Monate. Und da man ja das Rad nicht neu erfinden soll, dachte ich, es gibt da draussen jemanden der sagt: „alles ganz easy, schau mal hier!“
Wäre nett, wenn meine Suche hier enden würde, und jemand den Link der Links hat, oder selbst ein Tutorial für diesen Fall geschrieben hat. Ich konnte jedenfalls kein einziges Tutorial für diesen speziellen Fall finden. Sonst wäre ich ja nicht hier
Das hier ist mein letzter Versuch.