diff src/luan/interp/LuanParser.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 dbf459397217
children 219e05867366
line wrap: on
line diff
--- a/src/luan/interp/LuanParser.java	Mon May 19 09:17:57 2014 +0000
+++ b/src/luan/interp/LuanParser.java	Fri May 23 03:21:54 2014 +0000
@@ -11,14 +11,11 @@
 import luan.LuanSource;
 import luan.parser.Parser;
 import luan.parser.ParseException;
+import luan.lib.PackageLib;
 
 
 final class LuanParser {
 
-	static FnDef parse(LuanSource source,UpValue.Getter envGetter) throws ParseException {
-		return new LuanParser(source,envGetter).RequiredTarget();
-	}
-
 	private static final class Frame {
 		final Frame parent;
 		final List<String> symbols = new ArrayList<String>();
@@ -69,6 +66,11 @@
 			upValueSymbols.add(name);
 			return upValueSymbols.size() - 1;
 		}
+
+		void addUpValueGetter(String name,UpValue.Getter upValueGetter) {
+			upValueSymbols.add(name);
+			upValueGetters.add(upValueGetter);
+		}
 	}
 
 	private static final String _ENV = "_ENV";
@@ -77,11 +79,17 @@
 	private final LuanSource source;
 	private Frame frame;
 	private final Parser parser;
+	private final boolean interactive;
 
-	private LuanParser(LuanSource source,UpValue.Getter envGetter) {
+	LuanParser(LuanSource source,UpValue.Getter envGetter) {
 		this.source = source;
 		this.frame = new Frame(envGetter);
 		this.parser = new Parser(source.text);
+		this.interactive = envGetter==UpValue.globalGetter;
+	}
+
+	void addVar(String name,Object value) {
+		frame.addUpValueGetter(name,new UpValue.ValueGetter(value));
 	}
 
 	private LuanSource.Element se(int start) {
@@ -153,7 +161,7 @@
 		return new FnDef( se(start), stmt, frame.stackSize, symbolsSize(), frame.isVarArg, frame.upValueGetters.toArray(NO_UP_VALUE_GETTERS) );
 	}
 
-	private FnDef RequiredTarget() throws ParseException {
+	FnDef Expressions() throws ParseException {
 		Spaces();
 		int start = parser.begin();
 		Expressions exprs = ExpList();
@@ -161,7 +169,12 @@
 			Stmt stmt = new ReturnStmt( se(start), exprs );
 			return parser.success(newFnDef(start,stmt));
 		}
-		parser.rollback();
+		return parser.failure(null);
+	}
+
+	FnDef RequiredModule() throws ParseException {
+		Spaces();
+		int start = parser.begin();
 		frame.isVarArg = true;
 		Stmt stmt = RequiredBlock();
 		if( parser.endOfInput() )
@@ -207,6 +220,7 @@
 		if( (stmt=ReturnStmt()) != null
 			|| (stmt=FunctionStmt()) != null
 			|| (stmt=LocalFunctionStmt()) != null
+			|| (stmt=ImportStmt()) != null
 			|| (stmt=BreakStmt()) != null
 			|| (stmt=GenericForStmt()) != null
 			|| (stmt=NumericForStmt()) != null
@@ -288,6 +302,27 @@
 		return parser.success( new SetStmt( new SetLocalVar(symbolsSize()-1), fnDef ) );
 	}
 
+	private Stmt ImportStmt() throws ParseException {
+		int start = parser.begin();
+		if( !Keyword("import") )
+			return parser.failure(null);
+		Expr importExpr = new ConstExpr(se(start),PackageLib.require);
+		String modName = StringLiteral(false);
+		if( modName==null )
+			return parser.failure(null);
+		String varName = modName.substring(modName.lastIndexOf('.')+1);
+		LuanSource.Element se = se(start);
+		FnCall require = new FnCall( se, importExpr, new ExpList.SingleExpList(new ConstExpr(modName)) );
+		Settable settable;
+		if( interactive ) {
+			settable = new SetTableEntry( se(start), env(), new ConstExpr(varName) );
+		} else {
+			addSymbol( varName );
+			settable = new SetLocalVar(symbolsSize()-1);
+		}
+		return parser.success( new SetStmt( settable, expr(require) ) );
+	}
+
 	private Stmt BreakStmt() throws ParseException {
 		parser.begin();
 		if( !Keyword("break") )
@@ -1060,6 +1095,7 @@
 		"function",
 		"goto",
 		"if",
+		"import",
 		"in",
 		"local",
 		"nil",