Mercurial Hosting > luan
diff core/src/luan/impl/LuanParser.java @ 503:92c3d22745b8
make _ENV optional
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Wed, 20 May 2015 23:24:46 -0600 |
parents | b48cfa14ba60 |
children | 8e51d6071b67 |
line wrap: on
line diff
--- a/core/src/luan/impl/LuanParser.java Tue May 19 17:57:20 2015 -0600 +++ b/core/src/luan/impl/LuanParser.java Wed May 20 23:24:46 2015 -0600 @@ -10,6 +10,7 @@ import luan.LuanState; import luan.LuanSource; import luan.LuanElement; +import luan.LuanTable; import luan.modules.PackageLuan; @@ -24,15 +25,15 @@ final List<String> upValueSymbols = new ArrayList<String>(); final List<UpValue.Getter> upValueGetters = new ArrayList<UpValue.Getter>(); - Frame(UpValue.Getter envGetter) { + Frame() { this.parent = null; - upValueSymbols.add(_ENV); - upValueGetters.add(envGetter); + upValueSymbols.add(JAVA); + upValueGetters.add(new UpValue.ValueGetter(false)); } Frame(Frame parent) { this.parent = parent; - if( upValueIndex(_ENV) != 0 ) + if( upValueIndex(JAVA) != 0 ) throw new RuntimeException(); } @@ -92,19 +93,20 @@ } } + private static final String JAVA = "-JAVA-"; // inaccessible from Luan private static final String _ENV = "_ENV"; private static final UpValue.Getter[] NO_UP_VALUE_GETTERS = new UpValue.Getter[0]; final LuanSource source; private Frame frame; private final Parser parser; - private final boolean interactive; - LuanParser(LuanSource source,UpValue.Getter envGetter) { + LuanParser(LuanSource source,LuanTable env) { this.source = source; - this.frame = new Frame(envGetter); + this.frame = new Frame(); this.parser = new Parser(source); - this.interactive = envGetter instanceof UpValue.ValueGetter; + if( env != null ) + addVar(_ENV,env); } void addVar(String name,Object value) { @@ -860,6 +862,11 @@ return parser.failure(null); } + private interface Var { + public Expressions expr() throws ParseException; + public Settable settable() throws ParseException; + } + private Expr env() { int index = stackIndex(_ENV); if( index != -1 ) @@ -867,12 +874,7 @@ index = upValueIndex(_ENV); if( index != -1 ) return new GetUpVar(null,index); - throw new RuntimeException("_ENV not found"); - } - - private interface Var { - public Expressions expr(); - public Settable settable(); + return null; } private Var nameVar(final int start,final String name) { @@ -882,24 +884,32 @@ private Var nameVar(final LuanElement se,final String name) { return new Var() { - public Expr expr() { + public Expr expr() throws ParseException { int index = stackIndex(name); if( index != -1 ) return new GetLocalVar(se,index); index = upValueIndex(name); if( index != -1 ) return new GetUpVar(se,index); - return new IndexExpr( se, env(), new ConstExpr(se,name) ); + Expr envExpr = env(); + if( envExpr != null ) + return new IndexExpr( se, envExpr, new ConstExpr(se,name) ); + parser.failure(null); + throw parser.exception("name '"+name+"' not defined"); } - public Settable settable() { + public Settable settable() throws ParseException { int index = stackIndex(name); if( index != -1 ) return new SetLocalVar(index); index = upValueIndex(name); if( index != -1 ) return new SetUpVar(index); - return new SetTableEntry( se, env(), new ConstExpr(se,name) ); + Expr envExpr = env(); + if( envExpr != null ) + return new SetTableEntry( se, envExpr, new ConstExpr(se,name) ); + parser.failure(null); + throw parser.exception("name '"+name+"' not defined"); } }; }