Mercurial Hosting > luan
comparison core/src/luan/impl/ThemeParser.java @ 667:08966099aa6d
implement Closure directly
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Fri, 08 Apr 2016 07:00:17 -0600 |
parents | 71f8f5075df8 |
children | 58ebfec6178b |
comparison
equal
deleted
inserted
replaced
666:2f449ccf54d2 | 667:08966099aa6d |
---|---|
13 | 13 |
14 | 14 |
15 public final class ThemeParser { | 15 public final class ThemeParser { |
16 | 16 |
17 public static LuanFunction compile(LuanState luan,String sourceName,String sourceText) throws LuanException { | 17 public static LuanFunction compile(LuanState luan,String sourceName,String sourceText) throws LuanException { |
18 /* | |
18 try { | 19 try { |
19 FnDef fnDef = new ThemeParser(sourceName,sourceText).parse(); | 20 FnDef fnDef = new ThemeParser(sourceName,sourceText).parse(); |
20 final LuanStateImpl luanImpl = (LuanStateImpl)luan; | 21 final LuanStateImpl luanImpl = (LuanStateImpl)luan; |
21 return new Closure(luanImpl,fnDef); | 22 return new Closure(luanImpl,fnDef); |
22 } catch(ParseException e) { | 23 } catch(ParseException e) { |
23 //e.printStackTrace(); | 24 //e.printStackTrace(); |
24 throw new LuanException( e.getFancyMessage() ); | 25 throw new LuanException( e.getFancyMessage() ); |
25 } | 26 } |
27 */ | |
28 return null; | |
26 } | 29 } |
27 | 30 |
28 private static final class Frame { | 31 private static final class Frame { |
29 final Frame parent; | 32 final Frame parent; |
30 final List<String> symbols = new ArrayList<String>(); | 33 final List<String> symbols = new ArrayList<String>(); |
104 frame.symbols.add(name); | 107 frame.symbols.add(name); |
105 if( frame.stackSize < symbolsSize() ) | 108 if( frame.stackSize < symbolsSize() ) |
106 frame.stackSize = symbolsSize(); | 109 frame.stackSize = symbolsSize(); |
107 } | 110 } |
108 | 111 |
109 private FnDef newFnDef(Stmt stmt) { | 112 private Class newFnDef(Stmt stmt) { |
110 // return new FnDef( /*stmt*/null, frame.stackSize, symbolsSize(), frame.isVarArg, frame.upValueGetters.toArray(NO_UP_VALUE_GETTERS) ); | 113 // return new FnDef( /*stmt*/null, frame.stackSize, symbolsSize(), frame.isVarArg, frame.upValueGetters.toArray(NO_UP_VALUE_GETTERS) ); |
111 return null; | 114 return null; |
112 } | 115 } |
113 | 116 |
114 private int stackIndex(String name) { | 117 private int stackIndex(String name) { |
133 | 136 |
134 private Expr env() { | 137 private Expr env() { |
135 return new GetLocalVar(stackIndex(ENV)); | 138 return new GetLocalVar(stackIndex(ENV)); |
136 } | 139 } |
137 | 140 |
138 private FnDef parse() throws ParseException { | 141 private Class parse() throws ParseException { |
139 List<Stmt> stmts = new ArrayList<Stmt>(); | 142 List<Stmt> stmts = new ArrayList<Stmt>(); |
140 int stackStart = symbolsSize(); | 143 int stackStart = symbolsSize(); |
141 { | 144 { |
142 addSymbol(IO); | 145 addSymbol(IO); |
143 FnCall requireCall = new FnCall( new ConstExpr(PackageLuan.requireFn), new ConstExpr("luan:Io") ); | 146 FnCall requireCall = new FnCall( new ConstExpr(PackageLuan.requireFn), new ConstExpr("luan:Io") ); |
159 parser.anyChar(); | 162 parser.anyChar(); |
160 } | 163 } |
161 } | 164 } |
162 stmts.add( new ReturnStmt(new GetLocalVar(stackIndex(MOD))) ); | 165 stmts.add( new ReturnStmt(new GetLocalVar(stackIndex(MOD))) ); |
163 Stmt block = new Block( stmts.toArray(new Stmt[0]), stackStart, symbolsSize() ); | 166 Stmt block = new Block( stmts.toArray(new Stmt[0]), stackStart, symbolsSize() ); |
164 FnDef fnDef = newFnDef(block); | 167 Class fnDef = newFnDef(block); |
165 return fnDef; | 168 return fnDef; |
166 } | 169 } |
167 | 170 |
168 private Stmt parseDef() throws ParseException { | 171 private Stmt parseDef() throws ParseException { |
169 parser.begin(); | 172 parser.begin(); |
184 Expr table = new GetLocalVar(stackIndex(MOD)); | 187 Expr table = new GetLocalVar(stackIndex(MOD)); |
185 Settable fnName = new SetTableEntry(table,new ConstExpr(name)); | 188 Settable fnName = new SetTableEntry(table,new ConstExpr(name)); |
186 frame = new Frame(frame); | 189 frame = new Frame(frame); |
187 addSymbol(ENV); | 190 addSymbol(ENV); |
188 Stmt block = parseBody("define:"+name,spaces,indent); | 191 Stmt block = parseBody("define:"+name,spaces,indent); |
189 FnDef fnDef = newFnDef(block); | 192 Class fnDef = newFnDef(block); |
190 frame = frame.parent; | 193 frame = frame.parent; |
191 Stmt rtn = new SetStmt(fnName,fnDef); | 194 Stmt rtn = new SetStmt(fnName,/*fnDef*/null); |
192 return parser.success(rtn); | 195 return parser.success(rtn); |
193 } | 196 } |
194 | 197 |
195 private Stmt parseBody(String tagName,final String spaces,boolean afterIndent) throws ParseException { | 198 private Stmt parseBody(String tagName,final String spaces,boolean afterIndent) throws ParseException { |
196 List<Stmt> stmts = new ArrayList<Stmt>(); | 199 List<Stmt> stmts = new ArrayList<Stmt>(); |
327 parser.failure(); // rollback | 330 parser.failure(); // rollback |
328 } | 331 } |
329 frame = new Frame(frame); | 332 frame = new Frame(frame); |
330 addSymbol(ENV); | 333 addSymbol(ENV); |
331 Stmt block = parseBody("block:"+name,spaces,false); | 334 Stmt block = parseBody("block:"+name,spaces,false); |
332 FnDef fnDef = newFnDef(block); | 335 Class fnDef = newFnDef(block); |
333 frame = frame.parent; | 336 frame = frame.parent; |
334 // String rtn = "<% env." + tag.name + "(" + (tag.attrs.isEmpty() ? "nil" : table(tag.attrs)) + ",env,function(env) %>" + block + "<% end) %>"; | 337 // String rtn = "<% env." + tag.name + "(" + (tag.attrs.isEmpty() ? "nil" : table(tag.attrs)) + ",env,function(env) %>" + block + "<% end) %>"; |
335 Expr env = env(); | 338 Expr env = env(); |
336 Expr fn = new IndexExpr( env, new ConstExpr(name) ); | 339 Expr fn = new IndexExpr( env, new ConstExpr(name) ); |
337 List<Expressions> args = new ArrayList<Expressions>(); | 340 List<Expressions> args = new ArrayList<Expressions>(); |
338 args.add( env ); | 341 args.add( env ); |
339 args.add( fnDef ); | 342 args.add( /*fnDef*/null ); |
340 FnCall fnCall = new FnCall( fn, ExpList.build(args) ); | 343 FnCall fnCall = new FnCall( fn, ExpList.build(args) ); |
341 Stmt rtn = new ExpressionsStmt(fnCall); | 344 Stmt rtn = new ExpressionsStmt(fnCall); |
342 return parser.success(rtn); | 345 return parser.success(rtn); |
343 } | 346 } |
344 | 347 |