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