View Full Version : [Java]Da Stringa a Float.
:.Blizzard.:
25-03-2009, 11:30
Ciao a tutti :)
Ho un problema che non riesco a risolvere:
All'interno della mia classe ho una variabile di tipo
String funzione = "x*x"
Ho anche un metodo
public float f(float x) {
return ????
Come posso fare a far sì che la stringa funzione venga vista come operazione a tutti gli effetti da eseguire?
In teoria il return deve essere la funzione scritta dall'utente in un Textfield.
supertonno
25-03-2009, 11:39
L'unico modo che conosco e utilizzare un math espression parser. Le librerie standard non lo fanno, quindi le cose sono 2:
-se le espressioni da decifrare sono semplici scrivi un piccolo parser, con l'utilizzo delle espressioni regolari.
-se le espressioni che devi calcolare possono essere complesse, cerca online un math espression parser gia fatto e usi quello.
banryu79
25-03-2009, 11:41
Potresti per esempio implementarti un'automa a stati finiti che analizzi l'espressione aritmetica e con un algoritmo ne calcoli il risultato.
Se ti servono degli esempi in merito ne trovi due molto chiari e semplici, anche se sono in linguaggio C:
- Analizzatore lessicale per espressioni aritmetiche (http://www.guidealgoritmi.it/ShowArticle.aspx?ID=2)
- Operator Precedence Parsing: calcolare il valore di un'espressione aritmetica (http://www.guidealgoritmi.it/ShowArticle.aspx?ID=3)
(sono articoli scritti da un utente di questo Forum)
^TiGeRShArK^
25-03-2009, 14:22
se usi java 6 puoi semplicemente usare Rhino così:
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine jsEngine = mgr.getEngineByName("JavaScript");
String expression = "3 * 5 + 2";
jsEngine.put("expression", expression);
try {
double result = (double)jsEngine.eval("eval(expression)");
} catch (ScriptException ex) {
ex.printStackTrace();
}
sempre se la tua espressione contiene una sequenza di numeri, di operazioni matematiche e di parentesi valida.
Vincenzo1968
25-03-2009, 15:42
Ciao,
si, come dice Supertonno, potresti scaricare un parser bell'e pronto dalla rete. Ma, a parer mio, è più istruttivo(e, sempre IMHO, anche più divertente), costruirsi un parser per conto proprio.
Un altro metodo per effettuare il parsing, oltre a quelli indicati da Banryu(che ringrazio per il parere positivo sui miei articoli; sono l'utente di cui parla ;)) è il cosiddetto parsing a discesa ricorsiva che ha il pregio di essere facilmente implementabile a mano.
Qui ne trovi un esempio:
http://www.hwupgrade.it/forum/showthread.php?t=1929862
x TigerShark: credo che Blizzard abbia bisogno di gestire anche le variabili oltre alle costanti numeriche. Per fare questo è necessario implementare una tabella dei simboli. I link seguenti contengono un paio di esempi:
http://www.ibm.com/developerworks/library/l-flexbison.html
http://epaperpress.com/lexandyacc/index.html
Si tratta di parser di tipo LALR(1) che utilzzano i tools Flex/Bison. Per Java è possibile utilizzare gli strumenti equivalenti:
http://www.cs.princeton.edu/~appel/modern/java/JLex/
http://www.cs.princeton.edu/~appel/modern/java/CUP/
http://www2.cs.tum.edu/projects/cup/
Se si preferisce, invece, la tecnica top-down, è disponibile, tra i tanti, ANTLR:
http://www.antlr.org/
:)
P.S. sto preparando una mini guida su compilatori, interpreti e tecniche di parsing; seguirà un contest sull'argomento. ;)
^TiGeRShArK^
25-03-2009, 16:24
Ciao,
si, come dice Supertonno, potresti scaricare un parser bell'e pronto dalla rete. Ma, a parer mio, è più istruttivo(e, sempre IMHO, anche più divertente), costruirsi un parser per conto proprio.
Un altro metodo per effettuare il parsing, oltre a quelli indicati da Banryu(che ringrazio per il parere positivo sui miei articoli; sono l'utente di cui parla ;)) è il cosiddetto parsing a discesa ricorsiva che ha il pregio di essere facilmente implementabile a mano.
Qui ne trovi un esempio:
http://www.hwupgrade.it/forum/showthread.php?t=1929862
x TigerShark: credo che Blizzard abbia bisogno di gestire anche le variabili oltre alle costanti numeriche. Per fare questo è necessario implementare una tabella dei simboli. I link seguenti contengono un paio di esempi:
http://www.ibm.com/developerworks/library/l-flexbison.html
http://epaperpress.com/lexandyacc/index.html
Si tratta di parser di tipo LALR(1) che utilzzano i tools Flex/Bison. Per Java è possibile utilizzare gli strumenti equivalenti:
http://www.cs.princeton.edu/~appel/modern/java/JLex/
http://www.cs.princeton.edu/~appel/modern/java/CUP/
http://www2.cs.tum.edu/projects/cup/
Se si preferisce, invece, la tecnica top-down, è disponibile, tra i tanti, ANTLR:
http://www.antlr.org/
:)
P.S. sto preparando una mini guida su compilatori, interpreti e tecniche di parsing; seguirà un contest sull'argomento. ;)
se deve gestire anche le variabili allora il semplice eval di javascript è insufficiente.
Comunque con Java 6 non deve scaricare assolutamente nulla dalla rete dato che Rhino è integrato nella VM. ;)
banryu79
25-03-2009, 16:59
se deve gestire anche le variabili allora il semplice eval di javascript è insufficiente.
Comunque con Java 6 non deve scaricare assolutamente nulla dalla rete dato che Rhino è integrato nella VM. ;)
Ciao Tiger, qual'è il package di riferimento?
Cioè, per esempio, dove si trova la classe ScriptEngineManager? Sarò ubriaco ma non riesco a trovarlo :fagiano:
Vincenzo1968
25-03-2009, 17:09
se deve gestire anche le variabili allora il semplice eval di javascript è insufficiente.
Comunque con Java 6 non deve scaricare assolutamente nulla dalla rete dato che Rhino è integrato nella VM. ;)
Dall'esempio che ha postato si direbbe che abbia bisogno di gestire le variabili:
String funzione = "x*x"
Ha incurosito anche me codesto Rhino. Mi unisco alla richiesta di Banryu.
^TiGeRShArK^
25-03-2009, 17:21
Ciao Tiger, qual'è il package di riferimento?
Cioè, per esempio, dove si trova la classe ScriptEngineManager? Sarò ubriaco ma non riesco a trovarlo :fagiano:
javax.script.ScriptEngineManager
occhio che esiste solo da java 6 in poi :p
ah, occhio che mi sono dimenticato un cast da Object a double, poichè tutti gli oggetti che rhino ritorna sono appunto Object :p
edit: ora l'ho aggiunto...
banryu79
26-03-2009, 08:54
javax.script.ScriptEngineManager
occhio che esiste solo da java 6 in poi :p
ah, occhio che mi sono dimenticato un cast da Object a double, poichè tutti gli oggetti che rhino ritorna sono appunto Object :p
edit: ora l'ho aggiunto...
Thanks a lot ;) (ieri sera ero proprio acciecato:D )
Per Vincenzo: ho trovato questa pagina (http://java.sun.com/developer/technicalArticles/J2SE/Desktop/scripting/) che spiega la tecnologia condensata nel package javax.script.
Ciao
:.Blizzard.:
26-03-2009, 09:24
Cavoli ragazzi, vi ringrazio molto. Adesso mi leggo tutte le guide che mi avete consigliato, considerando che vorrei provare a implementarlo da solo il parser.
Brevemente vi riassumo il programmino che ho fatto:
l'applicazione è di tipo client/server, comunicazione via soap. Lato server grosso modo funziona quasi tutto come dovrebbe, ovvero cambiando il return del metodo
public float f(float x)
return *****
e inserendo una qualsiasi funzione polinomiale, questa viene disegnata correttamente su un JPanel.
Adesso però devo riuscire a far sì che sia il client a scegliere quale funzione calcolare tramite un Textfield.
Vi ringrazio ancora per i suggerimenti, cercherò di tenervi aggiornati.
banryu79
27-03-2009, 11:37
Scusate se riporto up il topic, ma sto studiacchiando il package javax.script. seguendo il tutorial alla pagina che ho linkato sopra, e stavo cercando delle implementazioni jsr-223 compatibili di terze parti di altri motori di scripting (nel JDk ver 1.6 viene fornita solo l'implementazione di Rhino).
Sono andato quindi a visitare la pagina pertinente di dev.java.net e ho trovato un elenco di motori di scripting, solo che non ho capito se sono riferimenti esterni a motori si scripting che si vuole supportare nel tempo o se sono già state create le relative implementazioni jsr-223 (l'elenco è presente sotto il titolo "Script Engines in this project (so far!)").
Mi interessa sapere in particolare se esiste l'implementazione per JEP (http://www.singularsys.com/jep/) (tra l'altro pertinente al problema dell'utente del thread).
Qualcuno è in grado di darmi qualche delucidazione?
^TiGeRShArK^
27-03-2009, 12:15
da quello che ho capito dovresti scaricarti i binari e poi fare qualcosa del genere:
ScriptEngineManager m = new ScriptEngineManager();
ScriptEngine jepEngine = m.getEngineByName("JEP");
banryu79
27-03-2009, 13:19
da quello che ho capito dovresti scaricarti i binari e poi fare qualcosa del genere:
ScriptEngineManager m = new ScriptEngineManager();
ScriptEngine jepEngine = m.getEngineByName("JEP");
Grazie,
sì confermo che bisogna scaricare i binari ma questi forniscono "solo" l'implementazione JSR-223; a parte poi bisogna scaricare l'implementazione del linguaggio del parser in questione (i binari scaricati sono organizzati in sottocartelle, una per ogni script engine JSR-223 implementation, e in ognuna è presente un file readme con i link appropriati e le istruzioni del caso).
JEP non è freeware ma a pagamento, compilando un form si può ricevere il link per scaricare una versione trial.
Grazie e ciao :)
stetti8five
28-03-2009, 17:37
Ciao a tutti :)
Ho un problema che non riesco a risolvere:
All'interno della mia classe ho una variabile di tipo
String funzione = "x*x"
Ho anche un metodo
public float f(float x) {
return ????
Come posso fare a far sì che la stringa funzione venga vista come operazione a tutti gli effetti da eseguire?
In teoria il return deve essere la funzione scritta dall'utente in un Textfield.
Ciao, non so quali vincoli hai per la realizzazione di questo software ma hai pensato/conosci/potresti_utilizzare java RMI?
Ciao, non so quali vincoli hai per la realizzazione di questo software ma hai pensato/conosci/potresti_utilizzare java RMI?
Scusami, ma non riesco proprio a capire quale sarebbe il beneficio che potrebbe ricavare dall'utilizzare RMI in questo caso... sempre che stiamo parlando entrambi di Remote Method Invocation e non di altro. :confused:
stetti8five
29-03-2009, 16:59
Cavoli ragazzi, vi ringrazio molto. Adesso mi leggo tutte le guide che mi avete consigliato, considerando che vorrei provare a implementarlo da solo il parser.
Brevemente vi riassumo il programmino che ho fatto:
l'applicazione è di tipo client/server, comunicazione via soap. Lato server grosso modo funziona quasi tutto come dovrebbe, ovvero cambiando il return del metodo
public float f(float x)
return *****
e inserendo una qualsiasi funzione polinomiale, questa viene disegnata correttamente su un JPanel.
Adesso però devo riuscire a far sì che sia il client a scegliere quale funzione calcolare tramite un Textfield.
Vi ringrazio ancora per i suggerimenti, cercherò di tenervi aggiornati.
mi riferivo in particolar modo a quello scritto in rosso. Farsi un parser ad-hoc mi sembra un pò esagerato
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.