| 375 | } |
| 376 | |
| 377 | Token subTemplate() { |
| 378 | // look for "{ args ID (',' ID)* '|' ..." |
| 379 | subtemplateDepth++; |
| 380 | int m = input.mark(); |
| 381 | int curlyStartChar = startCharIndex; |
| 382 | int curlyLine = startLine; |
| 383 | int curlyPos = startCharPositionInLine; |
| 384 | List<Token> argTokens = new ArrayList<Token>(); |
| 385 | consume(); |
| 386 | Token curly = newTokenFromPreviousChar(LCURLY); |
| 387 | WS(); |
| 388 | argTokens.add(mID()); |
| 389 | WS(); |
| 390 | while ( c==',' ) { |
| 391 | consume(); |
| 392 | argTokens.add(newTokenFromPreviousChar(COMMA)); |
| 393 | WS(); |
| 394 | argTokens.add(mID()); |
| 395 | WS(); |
| 396 | } |
| 397 | WS(); |
| 398 | if ( c=='|' ) { |
| 399 | consume(); |
| 400 | argTokens.add(newTokenFromPreviousChar(PIPE)); |
| 401 | if ( isWS(c) ) consume(); // ignore a single whitespace after | |
| 402 | //System.out.println("matched args: "+argTokens); |
| 403 | for (Token t : argTokens) emit(t); |
| 404 | input.release(m); |
| 405 | scanningInsideExpr = false; |
| 406 | startCharIndex = curlyStartChar; // reset state |
| 407 | startLine = curlyLine; |
| 408 | startCharPositionInLine = curlyPos; |
| 409 | return curly; |
| 410 | } |
| 411 | input.rewind(m); |
| 412 | startCharIndex = curlyStartChar; // reset state |
| 413 | startLine = curlyLine; |
| 414 | startCharPositionInLine = curlyPos; |
| 415 | consume(); |
| 416 | scanningInsideExpr = false; |
| 417 | return curly; |
| 418 | } |
| 419 | |
| 420 | Token ESCAPE() { |
| 421 | startCharIndex = input.index(); |