miércoles, 9 de abril de 2008

Usando Janino para crear un FastScriptEvaluator (Ejecutar código de java en tiempo real)

Bueno, estos días angustiado programando mi proyecto de compiladores me tope que una parte debía generar reglas, o mejor dicho procedimientos que se resuelven en tiempo en real, pueden pertenecer a una clase o algo asi, digamos,l lo que venía es:

Duelo { Definir total_vida=vida+resistencia; vida=total_vida-daño; }
lo que logre convertir a java con mi parseador
public nodo_personaje duelo(nodo_personaje primero,nodo_personaje segundo)
{ int total_vida; primero.vida=total_vida-segundo.daño; return primero; }

Tengo eso en una cadena, y no que hacer con ello, es por eso que utilizo una clase llamada Janino, la cual permite ejecutar Script en tiempo real, entonces logre meter esto es una cadena la cual ejecutaría con el janino el cual pueden encontrar ACA , bueno el ejemplo que mas sirve es el
de CreateFastScriptEvaluator que está en la documentación de janino, áca esta el ejemplo:

 Foo f = (Foo) ScriptEvaluator.createFastScriptEvaluator(
new Scanner(null, new StringReader("return a + b;")),
Foo.class,
new String[] { "a", "b" },
(ClassLoader) null
);
System.out.println("1 + 2 = " + f.bar(1, 2));

Ahora podemos mandar a llamarla con este bloque, las líneas mas importante son las de new Scanner, ahi pueden meter código java, al menos yo le metí if, while y funciono de maravilla.
bueno, yo cambie mi interface de ejemplo y la hice de esta manera:

nodo es esta clase:
public class nodo { public String cadena="";
public nodo() {
}
}


La interface la deje asi

public interface fox { nodo bar(nodo a,nodo b); }

Y para ejecutar:
nodo un_nodo=new nodo(); nodo dos_nodo=new nodo();
un_nodo.cadena="beta";
dos_nodo.cadena="gama";

fox fx = (fox) ScriptEvaluator.createFastScriptEvaluator(

new Scanner(null, new StringReader(""+this.jTextField1.getText())),
fox.class,
new String[] { "a", "b" },
(ClassLoader) null // Use current thread's context class loader );

System.out.println("" + fx.bar(un_nodo,dos_nodo).cadena); //ejecutando



NOTA: ahi puse un jTextField para meter código de java, puse en jtextfield:
a.cadena=a.cadena+"$"+b.cadena; return a; y me ejecuto esa línea y dieron los resultado, de ahí varié el JtextField con if, con else while y funcióno, la verdad me sorprendí que cuando meti otro código, me lo ejecuto a la perfección(siempre y cuando metan código de java correctamente).

Y gracias a Dios funciono, recuerden que aunque sea un día antes todo llega a la luz, me costo un cacho usarla pero heme aquí, no quiero rendirme ahora seguiremos programando....

hasta llegar a ser ....

1 comentario:

Billy Munoz dijo...

buena honda mano, vamos a implementarme,gracias por ahorrarme el trabajo