package nl.rug.ai.mas.oops.lua; import java.io.InputStream; import nl.rug.ai.mas.oops.AxiomSystem; import org.luaj.platform.J2sePlatform; import org.luaj.vm.LFunction; import org.luaj.vm.LString; import org.luaj.vm.LTable; import org.luaj.vm.LuaState; import org.luaj.vm.Platform; public class LuaProver { private LuaState d_vm; public LuaProver() { Platform.setInstance(new J2sePlatform()); d_vm = Platform.newLuaState(); org.luaj.compiler.LuaC.install(); registerNameSpace(); } private void registerNameSpace() { LuaFormula formula = new LuaFormula(); LuaTheory theory = new LuaTheory(formula); d_vm.pushlvalue(new LTable()); d_vm.pushlvalue(new FunctionGetLogics()); d_vm.setfield(-2, new LString("getLogics")); formula.register(d_vm); d_vm.setfield(-2, new LString("Formula")); // Give the constructor a name theory.register(d_vm); d_vm.setfield(-2, new LString("Theory")); // Give the constructor a name d_vm.setglobal("oops"); } private final class FunctionGetLogics extends LFunction { public int invoke(LuaState L) { LTable result = new LTable(); int i = 1; for (AxiomSystem system : AxiomSystem.values()) { result.put(i++, new LString(system.name())); } d_vm.pushlvalue(result); return 1; } } public void doFile(String file) { d_vm.getglobal("dofile"); d_vm.pushstring(file); d_vm.call(1, 0); } public void doStream(InputStream is, String name) { int result = d_vm.load(is, name); if (result == 0) { d_vm.call(0,0); } else if (result == LuaState.LUA_ERRMEM){ System.err.println("ERROR: Lua ran out of memory while parsing"); d_vm.pop(1); } else { String error = d_vm.tostring(-1); System.err.println("ERROR: Lua encountered a syntax error: " + error); d_vm.pop(1); } } public void interactive() { doStream(System.in, "stdin"); } public static void main(String[] args) { String file = null; if (args.length > 0) { file = args[0]; } LuaProver prover = new LuaProver(); if (file == null) { prover.interactive(); } else { prover.doFile(file); } } }