Mercurial Hosting > luan
diff src/luan/interp/LuanCompiler.java @ 108:3c404a296995
make Package module more standard;
return _ENV by default;
add "import" statement;
git-svn-id: https://luan-java.googlecode.com/svn/trunk@109 21e917c8-12df-6dd8-5cb6-c86387c605b9
author | fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> |
---|---|
date | Fri, 23 May 2014 03:21:54 +0000 |
parents | 754e6030c029 |
children | 2428ecfed375 |
line wrap: on
line diff
--- a/src/luan/interp/LuanCompiler.java Mon May 19 09:17:57 2014 +0000 +++ b/src/luan/interp/LuanCompiler.java Fri May 23 03:21:54 2014 +0000 @@ -7,15 +7,43 @@ import luan.LuanElement; import luan.LuanTable; import luan.parser.ParseException; +import java.util.Map; public final class LuanCompiler { private LuanCompiler() {} // never - public static LuanFunction compile(LuanState luan,LuanSource src,LuanTable env) throws LuanException { - UpValue.Getter envGetter = env!=null ? new UpValue.ValueGetter(env) : new UpValue.EnvGetter(); + public static LuanFunction compileModule(LuanState luan,LuanSource src) throws LuanException { + UpValue.Getter envGetter = new UpValue.EnvGetter(); + LuanParser parser = new LuanParser(src,envGetter); + for( Map.Entry<Object,Object> entry : luan.global() ) { + Object key = entry.getKey(); + if( key instanceof String ) + parser.addVar( (String)key, entry.getValue() ); + } try { - FnDef fnDef = LuanParser.parse(src,envGetter); + FnDef fnDef = parser.RequiredModule(); + final Closure c = new Closure((LuanStateImpl)luan,fnDef); + return new LuanFunction() { + public Object[] call(LuanState luan,Object[] args) throws LuanException { + Object[] rtn = c.call(luan,args); + return rtn.length==0 ? new Object[]{c.upValues()[0].get()} : rtn; + } + }; + } catch(ParseException e) { +//e.printStackTrace(); + LuanElement le = new LuanSource.CompilerElement(src); + throw luan.bit(le).exception( e.getFancyMessage() ); + } + } + + public static LuanFunction compileInteractive(LuanState luan,LuanSource src) throws LuanException { + UpValue.Getter envGetter = UpValue.globalGetter; + LuanParser parser = new LuanParser(src,envGetter); + try { + FnDef fnDef = parser.Expressions(); + if( fnDef == null ) + fnDef = parser.RequiredModule(); return new Closure((LuanStateImpl)luan,fnDef); } catch(ParseException e) { //e.printStackTrace();