| 503 | } |
| 504 | |
| 505 | Token mTEXT() { |
| 506 | boolean modifiedText = false; |
| 507 | StringBuilder buf = new StringBuilder(); |
| 508 | while ( c != EOF && c != delimiterStartChar ) { |
| 509 | if ( c=='\r' || c=='\n' ) break; |
| 510 | if ( c=='}' && subtemplateDepth>0) break; |
| 511 | if ( c=='\\' ) { |
| 512 | if ( input.LA(2)=='\\' ) { // convert \\ to \ |
| 513 | consume(); |
| 514 | consume(); |
| 515 | buf.append('\\'); |
| 516 | modifiedText = true; |
| 517 | continue; |
| 518 | } |
| 519 | |
| 520 | if ( input.LA(2)==delimiterStartChar || input.LA(2)=='}' ) { |
| 521 | modifiedText = true; |
| 522 | consume(); // toss out \ char |
| 523 | buf.append(c); |
| 524 | consume(); |
| 525 | } |
| 526 | else { |
| 527 | buf.append(c); |
| 528 | consume(); |
| 529 | } |
| 530 | continue; |
| 531 | } |
| 532 | buf.append(c); |
| 533 | consume(); |
| 534 | } |
| 535 | |
| 536 | if ( modifiedText ) return newToken(TEXT, buf.toString()); |
| 537 | else return newToken(TEXT); |
| 538 | } |
| 539 | |
| 540 | /** <pre> |
| 541 | * ID : ('a'..'z'|'A'..'Z'|'_'|'/') |