comparison 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
comparison
equal deleted inserted replaced
107:dbf459397217 108:3c404a296995
9 import luan.Luan; 9 import luan.Luan;
10 import luan.LuanState; 10 import luan.LuanState;
11 import luan.LuanSource; 11 import luan.LuanSource;
12 import luan.parser.Parser; 12 import luan.parser.Parser;
13 import luan.parser.ParseException; 13 import luan.parser.ParseException;
14 import luan.lib.PackageLib;
14 15
15 16
16 final class LuanParser { 17 final class LuanParser {
17
18 static FnDef parse(LuanSource source,UpValue.Getter envGetter) throws ParseException {
19 return new LuanParser(source,envGetter).RequiredTarget();
20 }
21 18
22 private static final class Frame { 19 private static final class Frame {
23 final Frame parent; 20 final Frame parent;
24 final List<String> symbols = new ArrayList<String>(); 21 final List<String> symbols = new ArrayList<String>();
25 int stackSize = 0; 22 int stackSize = 0;
67 upValueGetters.add(new UpValue.NestedGetter(i)); 64 upValueGetters.add(new UpValue.NestedGetter(i));
68 } 65 }
69 upValueSymbols.add(name); 66 upValueSymbols.add(name);
70 return upValueSymbols.size() - 1; 67 return upValueSymbols.size() - 1;
71 } 68 }
69
70 void addUpValueGetter(String name,UpValue.Getter upValueGetter) {
71 upValueSymbols.add(name);
72 upValueGetters.add(upValueGetter);
73 }
72 } 74 }
73 75
74 private static final String _ENV = "_ENV"; 76 private static final String _ENV = "_ENV";
75 private static final UpValue.Getter[] NO_UP_VALUE_GETTERS = new UpValue.Getter[0]; 77 private static final UpValue.Getter[] NO_UP_VALUE_GETTERS = new UpValue.Getter[0];
76 78
77 private final LuanSource source; 79 private final LuanSource source;
78 private Frame frame; 80 private Frame frame;
79 private final Parser parser; 81 private final Parser parser;
80 82 private final boolean interactive;
81 private LuanParser(LuanSource source,UpValue.Getter envGetter) { 83
84 LuanParser(LuanSource source,UpValue.Getter envGetter) {
82 this.source = source; 85 this.source = source;
83 this.frame = new Frame(envGetter); 86 this.frame = new Frame(envGetter);
84 this.parser = new Parser(source.text); 87 this.parser = new Parser(source.text);
88 this.interactive = envGetter==UpValue.globalGetter;
89 }
90
91 void addVar(String name,Object value) {
92 frame.addUpValueGetter(name,new UpValue.ValueGetter(value));
85 } 93 }
86 94
87 private LuanSource.Element se(int start) { 95 private LuanSource.Element se(int start) {
88 return new LuanSource.Element(source,start,parser.currentIndex()); 96 return new LuanSource.Element(source,start,parser.currentIndex());
89 } 97 }
151 159
152 private FnDef newFnDef(int start,Stmt stmt) { 160 private FnDef newFnDef(int start,Stmt stmt) {
153 return new FnDef( se(start), stmt, frame.stackSize, symbolsSize(), frame.isVarArg, frame.upValueGetters.toArray(NO_UP_VALUE_GETTERS) ); 161 return new FnDef( se(start), stmt, frame.stackSize, symbolsSize(), frame.isVarArg, frame.upValueGetters.toArray(NO_UP_VALUE_GETTERS) );
154 } 162 }
155 163
156 private FnDef RequiredTarget() throws ParseException { 164 FnDef Expressions() throws ParseException {
157 Spaces(); 165 Spaces();
158 int start = parser.begin(); 166 int start = parser.begin();
159 Expressions exprs = ExpList(); 167 Expressions exprs = ExpList();
160 if( exprs != null && parser.endOfInput() ) { 168 if( exprs != null && parser.endOfInput() ) {
161 Stmt stmt = new ReturnStmt( se(start), exprs ); 169 Stmt stmt = new ReturnStmt( se(start), exprs );
162 return parser.success(newFnDef(start,stmt)); 170 return parser.success(newFnDef(start,stmt));
163 } 171 }
164 parser.rollback(); 172 return parser.failure(null);
173 }
174
175 FnDef RequiredModule() throws ParseException {
176 Spaces();
177 int start = parser.begin();
165 frame.isVarArg = true; 178 frame.isVarArg = true;
166 Stmt stmt = RequiredBlock(); 179 Stmt stmt = RequiredBlock();
167 if( parser.endOfInput() ) 180 if( parser.endOfInput() )
168 return parser.success(newFnDef(start,stmt)); 181 return parser.success(newFnDef(start,stmt));
169 throw parser.exception(); 182 throw parser.exception();
205 return; 218 return;
206 Stmt stmt; 219 Stmt stmt;
207 if( (stmt=ReturnStmt()) != null 220 if( (stmt=ReturnStmt()) != null
208 || (stmt=FunctionStmt()) != null 221 || (stmt=FunctionStmt()) != null
209 || (stmt=LocalFunctionStmt()) != null 222 || (stmt=LocalFunctionStmt()) != null
223 || (stmt=ImportStmt()) != null
210 || (stmt=BreakStmt()) != null 224 || (stmt=BreakStmt()) != null
211 || (stmt=GenericForStmt()) != null 225 || (stmt=GenericForStmt()) != null
212 || (stmt=NumericForStmt()) != null 226 || (stmt=NumericForStmt()) != null
213 || (stmt=TryStmt()) != null 227 || (stmt=TryStmt()) != null
214 || (stmt=DoStmt()) != null 228 || (stmt=DoStmt()) != null
284 return parser.failure(null); 298 return parser.failure(null);
285 String name = RequiredName(); 299 String name = RequiredName();
286 addSymbol( name ); 300 addSymbol( name );
287 FnDef fnDef = RequiredFunction(false); 301 FnDef fnDef = RequiredFunction(false);
288 return parser.success( new SetStmt( new SetLocalVar(symbolsSize()-1), fnDef ) ); 302 return parser.success( new SetStmt( new SetLocalVar(symbolsSize()-1), fnDef ) );
303 }
304
305 private Stmt ImportStmt() throws ParseException {
306 int start = parser.begin();
307 if( !Keyword("import") )
308 return parser.failure(null);
309 Expr importExpr = new ConstExpr(se(start),PackageLib.require);
310 String modName = StringLiteral(false);
311 if( modName==null )
312 return parser.failure(null);
313 String varName = modName.substring(modName.lastIndexOf('.')+1);
314 LuanSource.Element se = se(start);
315 FnCall require = new FnCall( se, importExpr, new ExpList.SingleExpList(new ConstExpr(modName)) );
316 Settable settable;
317 if( interactive ) {
318 settable = new SetTableEntry( se(start), env(), new ConstExpr(varName) );
319 } else {
320 addSymbol( varName );
321 settable = new SetLocalVar(symbolsSize()-1);
322 }
323 return parser.success( new SetStmt( settable, expr(require) ) );
289 } 324 }
290 325
291 private Stmt BreakStmt() throws ParseException { 326 private Stmt BreakStmt() throws ParseException {
292 parser.begin(); 327 parser.begin();
293 if( !Keyword("break") ) 328 if( !Keyword("break") )
1058 "false", 1093 "false",
1059 "for", 1094 "for",
1060 "function", 1095 "function",
1061 "goto", 1096 "goto",
1062 "if", 1097 "if",
1098 "import",
1063 "in", 1099 "in",
1064 "local", 1100 "local",
1065 "nil", 1101 "nil",
1066 "not", 1102 "not",
1067 "or", 1103 "or",