Mercurial Hosting > luan
diff src/luan/interp/LuanCompiler.java @ 128:f0a4abe58593
minor
git-svn-id: https://luan-java.googlecode.com/svn/trunk@129 21e917c8-12df-6dd8-5cb6-c86387c605b9
author | fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> |
---|---|
date | Sun, 08 Jun 2014 03:38:25 +0000 |
parents | 2428ecfed375 |
children | f99fd64291b3 |
line wrap: on
line diff
--- a/src/luan/interp/LuanCompiler.java Sat Jun 07 01:47:00 2014 +0000 +++ b/src/luan/interp/LuanCompiler.java Sun Jun 08 03:38:25 2014 +0000 @@ -13,7 +13,7 @@ public final class LuanCompiler { private LuanCompiler() {} // never - public static LuanFunction compileModule(LuanState luan,LuanSource src) throws LuanException { + public static LuanFunction compileModule(LuanState luan,LuanSource src,boolean allowExpr) throws LuanException { UpValue.Getter envGetter = new UpValue.EnvGetter(); LuanParser parser = new LuanParser(src,envGetter); for( Map.Entry<Object,Object> entry : luan.global() ) { @@ -21,35 +21,36 @@ if( key instanceof String ) parser.addVar( (String)key, entry.getValue() ); } + FnDef fnDef = parse(luan,parser,allowExpr); + final Closure c = new Closure((LuanStateImpl)luan,fnDef); + return new LuanFunction() { + @Override public Object call(LuanState luan,Object[] args) throws LuanException { + Object rtn = c.call(luan,args); + if( rtn instanceof Object[] && ((Object[])rtn).length==0 ) + rtn = c.upValues()[0].get(); + return rtn; + } + }; + } + + public static LuanFunction compileGlobal(LuanState luan,LuanSource src,boolean allowExpr) throws LuanException { + UpValue.Getter envGetter = UpValue.globalGetter; + LuanParser parser = new LuanParser(src,envGetter); + FnDef fnDef = parse(luan,parser,allowExpr); + return new Closure((LuanStateImpl)luan,fnDef); + } + + private static FnDef parse(LuanState luan,LuanParser parser,boolean allowExpr) throws LuanException { try { - FnDef fnDef = parser.RequiredModule(); - final Closure c = new Closure((LuanStateImpl)luan,fnDef); - return new LuanFunction() { - @Override public Object call(LuanState luan,Object[] args) throws LuanException { - Object rtn = c.call(luan,args); - if( rtn instanceof Object[] && ((Object[])rtn).length==0 ) - rtn = c.upValues()[0].get(); - return rtn; - } - }; + if( allowExpr ) { + FnDef fnDef = parser.Expressions(); + if( fnDef != null ) + return fnDef; + } + return parser.RequiredModule(); } 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(); - LuanElement le = new LuanSource.CompilerElement(src); + LuanElement le = new LuanSource.CompilerElement(parser.source); throw luan.bit(le).exception( e.getFancyMessage() ); } }