Mercurial Hosting > luan
comparison core/src/luan/impl/ThemeParser.java @ 616:56b0b9018319
improve ThemeParser error handling
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Tue, 29 Dec 2015 22:19:11 -0700 |
parents | d2e0855b3105 |
children | 3dde072c3420 |
comparison
equal
deleted
inserted
replaced
615:abc3198c86dd | 616:56b0b9018319 |
---|---|
174 FnDef fnDef = newFnDef(0,block); | 174 FnDef fnDef = newFnDef(0,block); |
175 return fnDef; | 175 return fnDef; |
176 } | 176 } |
177 | 177 |
178 private Stmt parseDef() throws ParseException { | 178 private Stmt parseDef() throws ParseException { |
179 int start = parser.currentIndex(); | 179 int start = parser.begin(); |
180 if( !parser.match("{define:") ) | 180 if( !parser.match("{define:") ) |
181 return null; | 181 return parser.failure(null); |
182 String name = parseName(); | 182 String name = parseName(); |
183 if( name==null ) | 183 if( name==null ) |
184 throw parser.exception("invalid block name"); | 184 throw parser.exception("invalid block name"); |
185 if( !parser.match("}") ) | 185 if( !parser.match('}') ) |
186 throw parser.exception("unclosed define tag"); | 186 throw parser.exception("unclosed define tag"); |
187 String spaces = ""; | 187 String spaces = ""; |
188 boolean indent = BlankLine(); | 188 boolean indent = BlankLine(); |
189 if( indent ) { | 189 if( indent ) { |
190 int startSpaces = parser.currentIndex(); | 190 int startSpaces = parser.currentIndex(); |
197 addSymbol(ENV); | 197 addSymbol(ENV); |
198 Stmt block = parseBody("define:"+name,spaces,indent); | 198 Stmt block = parseBody("define:"+name,spaces,indent); |
199 FnDef fnDef = newFnDef(start,block); | 199 FnDef fnDef = newFnDef(start,block); |
200 frame = frame.parent; | 200 frame = frame.parent; |
201 Stmt rtn = new SetStmt(fnName,fnDef); | 201 Stmt rtn = new SetStmt(fnName,fnDef); |
202 return rtn; | 202 return parser.success(rtn); |
203 } | 203 } |
204 | 204 |
205 private Stmt parseBody(String tagName,final String spaces,boolean afterIndent) throws ParseException { | 205 private Stmt parseBody(String tagName,final String spaces,boolean afterIndent) throws ParseException { |
206 List<Stmt> stmts = new ArrayList<Stmt>(); | 206 List<Stmt> stmts = new ArrayList<Stmt>(); |
207 int stackStart = symbolsSize(); | 207 int stackStart = symbolsSize(); |
314 if( !parser.match("{block:") ) | 314 if( !parser.match("{block:") ) |
315 return parser.failure(null); | 315 return parser.failure(null); |
316 String name = parseName(); | 316 String name = parseName(); |
317 if( name==null ) | 317 if( name==null ) |
318 throw exception("invalid block name"); | 318 throw exception("invalid block name"); |
319 if( !parser.match("}") ) | 319 if( !parser.match('}') ) |
320 return null; | 320 return null; |
321 if( tagSpaces != null ) { | 321 if( tagSpaces != null ) { |
322 parser.begin(); | 322 parser.begin(); |
323 InlineSpaces(); | 323 InlineSpaces(); |
324 if( EndOfLine() ) { | 324 if( EndOfLine() ) { |
349 return parser.success(rtn); | 349 return parser.success(rtn); |
350 } | 350 } |
351 | 351 |
352 private Stmt parseSimpleTag(String spaces) throws ParseException { | 352 private Stmt parseSimpleTag(String spaces) throws ParseException { |
353 int start = parser.begin(); | 353 int start = parser.begin(); |
354 if( !parser.match("{") ) | 354 if( !parser.match('{') ) |
355 return parser.failure(null); | 355 return parser.failure(null); |
356 String name = parseName(); | 356 String name = parseName(); |
357 if( name==null ) | 357 if( name==null ) |
358 return parser.failure(null); | 358 return parser.failure(null); |
359 if( !parser.match("}") ) | 359 if( !parser.match('}') ) |
360 return parser.failure(null); | 360 return parser.failure(null); |
361 // rtn = "<% env." + name + (attrs.isEmpty() ? "()" : table(attrs)) + " %>"; | 361 // rtn = "<% env." + name + (attrs.isEmpty() ? "()" : table(attrs)) + " %>"; |
362 Expr env = env(); | 362 Expr env = env(); |
363 Expr fn = new IndexExpr( se(start,name), env, new ConstExpr(null,name) ); | 363 Expr fn = new IndexExpr( se(start,name), env, new ConstExpr(null,name) ); |
364 if( spaces!=null && spaces.length() > 0 ) { | 364 if( spaces!=null && spaces.length() > 0 ) { |
395 | 395 |
396 private boolean EndOfLine() { | 396 private boolean EndOfLine() { |
397 return parser.match( "\r\n" ) || parser.match( '\r' ) || parser.match( '\n' ); | 397 return parser.match( "\r\n" ) || parser.match( '\r' ) || parser.match( '\n' ); |
398 } | 398 } |
399 | 399 |
400 private String parseName() { | 400 private String parseName() throws ParseException { |
401 int start = parser.begin(); | 401 int start = parser.begin(); |
402 if( parser.match('/') ) | |
403 throw exception("bad closing tag"); | |
404 if( parser.match("define:") ) | |
405 throw exception("unexpected definition"); | |
402 if( !NameChar() ) | 406 if( !NameChar() ) |
403 return parser.failure(null); | 407 return parser.failure(null); |
404 while( NameChar() ); | 408 while( NameChar() ); |
405 String match = parser.textFrom(start); | 409 String match = parser.textFrom(start); |
406 return parser.success(match); | 410 return parser.success(match); |