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);