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