|
@@ -1,5 +1,7 @@
|
|
package in.ocsf.dialij.app.srv;/* kpmy 16.03.2017 */
|
|
package in.ocsf.dialij.app.srv;/* kpmy 16.03.2017 */
|
|
|
|
|
|
|
|
+import co.paralleluniverse.fibers.Fiber;
|
|
|
|
+import co.paralleluniverse.fibers.SuspendExecution;
|
|
import groovy.lang.GroovyShell;
|
|
import groovy.lang.GroovyShell;
|
|
import in.ocsf.dialij.app.obj.Processor;
|
|
import in.ocsf.dialij.app.obj.Processor;
|
|
import org.apache.log4j.Logger;
|
|
import org.apache.log4j.Logger;
|
|
@@ -9,13 +11,38 @@ import java.io.StringReader;
|
|
import java.lang.reflect.InvocationTargetException;
|
|
import java.lang.reflect.InvocationTargetException;
|
|
import java.lang.reflect.Method;
|
|
import java.lang.reflect.Method;
|
|
import java.lang.reflect.Proxy;
|
|
import java.lang.reflect.Proxy;
|
|
|
|
+import java.util.UUID;
|
|
|
|
|
|
@Service
|
|
@Service
|
|
public class CompilerService {
|
|
public class CompilerService {
|
|
|
|
|
|
|
|
+ public static class CompileFiber extends Fiber<Object> {
|
|
|
|
+ private String source;
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ protected Object run() throws SuspendExecution, InterruptedException {
|
|
|
|
+ try {
|
|
|
|
+ BFctx ctx = new BFctx();
|
|
|
|
+ for (int i = 0; i < source.length(); i++)
|
|
|
|
+ ctx.parse(source.charAt(i));
|
|
|
|
+
|
|
|
|
+ String code = ctx.close();
|
|
|
|
+ GroovyShell groovyShell = new GroovyShell();
|
|
|
|
+
|
|
|
|
+ return groovyShell.evaluate(new StringReader(code));
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ return new RuntimeException(e);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private CompileFiber(String source){
|
|
|
|
+ this.source = source;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
private Logger log = Logger.getLogger(getClass());
|
|
private Logger log = Logger.getLogger(getClass());
|
|
|
|
|
|
- private Processor proxify(Object obj) {
|
|
|
|
|
|
+ public Processor proxify(Object obj) {
|
|
return (Processor) Proxy.newProxyInstance(obj.getClass().getClassLoader(),
|
|
return (Processor) Proxy.newProxyInstance(obj.getClass().getClassLoader(),
|
|
new Class[]{Processor.class},
|
|
new Class[]{Processor.class},
|
|
(proxy, method, args) -> {
|
|
(proxy, method, args) -> {
|
|
@@ -30,23 +57,13 @@ public class CompilerService {
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
- public Processor compile(String source) {
|
|
|
|
- BFctx ctx = new BFctx();
|
|
|
|
- for (int i = 0; i < source.length(); i++)
|
|
|
|
- ctx.parse(source.charAt(i));
|
|
|
|
-
|
|
|
|
- String code = ctx.close();
|
|
|
|
- GroovyShell groovyShell = new GroovyShell();
|
|
|
|
- try {
|
|
|
|
- Processor p = proxify(groovyShell.evaluate(new StringReader(code)));
|
|
|
|
- return p;
|
|
|
|
- } catch (Exception e) {
|
|
|
|
- throw new RuntimeException(e);
|
|
|
|
- }
|
|
|
|
|
|
+ public CompileFiber compile(String source) {
|
|
|
|
+ return new CompileFiber(source);
|
|
}
|
|
}
|
|
|
|
|
|
- private class BFctx {
|
|
|
|
|
|
+ private static class BFctx {
|
|
private StringBuilder src = new StringBuilder();
|
|
private StringBuilder src = new StringBuilder();
|
|
|
|
+ private int balance;
|
|
|
|
|
|
BFctx() {
|
|
BFctx() {
|
|
src.append("package groovy.in.ocsf.dialij.script;\n");
|
|
src.append("package groovy.in.ocsf.dialij.script;\n");
|
|
@@ -81,10 +98,15 @@ public class CompilerService {
|
|
case '[':
|
|
case '[':
|
|
src.append("v = mem.get(p);\n");
|
|
src.append("v = mem.get(p);\n");
|
|
src.append("while(v > 0){\n");
|
|
src.append("while(v > 0){\n");
|
|
|
|
+ balance++;
|
|
break;
|
|
break;
|
|
case ']':
|
|
case ']':
|
|
src.append("v = mem.get(p);\n");
|
|
src.append("v = mem.get(p);\n");
|
|
src.append("}\n");
|
|
src.append("}\n");
|
|
|
|
+ if(balance >= 0)
|
|
|
|
+ balance--;
|
|
|
|
+ else
|
|
|
|
+ throw new RuntimeException("unbalanced bf");
|
|
break;
|
|
break;
|
|
case '>':
|
|
case '>':
|
|
src.append("p++;\n");
|
|
src.append("p++;\n");
|