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");
 			}
 		};
 	}