Mercurial Hosting > luan
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",