comparison core/src/luan/impl/LuanParser.java @ 714:7a322e942c15

fix line numbers
author Franklin Schmidt <fschmidt@gmail.com>
date Fri, 20 May 2016 18:35:20 -0600
parents 217b047afd93
children 960e5117e5bf
comparison
equal deleted inserted replaced
713:a21e9594307d 714:7a322e942c15
401 RequiredMatch( "%>" ); 401 RequiredMatch( "%>" );
402 } else if( parser.match( "<%" ) ) { 402 } else if( parser.match( "<%" ) ) {
403 Spaces(); 403 Spaces();
404 return parser.success(expString(builder)); 404 return parser.success(expString(builder));
405 } else { 405 } else {
406 Expr exp = new Expr(Val.SINGLE,false);
406 int i = parser.currentIndex(); 407 int i = parser.currentIndex();
407 do { 408 do {
408 if( parser.match( "%>" ) ) 409 if( parser.match( "%>" ) )
409 throw parser.exception("'%>' unexpected"); 410 throw parser.exception("'%>' unexpected");
410 if( !parser.anyChar() ) 411 if( !(EndOfLine() || parser.anyChar()) )
411 throw parser.exception("Unclosed template expression"); 412 throw parser.exception("Unclosed template expression");
412 } while( !parser.test( "<%" ) ); 413 } while( !parser.test( "<%" ) );
413 String match = parser.textFrom(i); 414 String match = parser.textFrom(i);
414 builder.add( constExpStr(match) ); 415 String rtns = parser.sb().toString();
416 parser.sb().setLength(0);
417 exp.addAll( constExpStr(match) );
418 if( rtns.length() > 0 )
419 exp.add(rtns);
420 builder.add(exp);
415 } 421 }
416 } 422 }
417 } 423 }
418 424
419 private Stmts ReturnStmt() throws ParseException { 425 private Stmts ReturnStmt() throws ParseException {
1340 Expr exp = TableExpr(); 1346 Expr exp = TableExpr();
1341 if( exp != null ) { 1347 if( exp != null ) {
1342 builder.add(exp); 1348 builder.add(exp);
1343 return parser.success(); 1349 return parser.success();
1344 } 1350 }
1345 String s = StringLiteral(); 1351 exp = StringLiteral();
1346 if( s != null ) { 1352 if( exp != null ) {
1347 builder.add( constExpStr(s) ); 1353 builder.add(exp);
1348 return parser.success(); 1354 return parser.success();
1349 } 1355 }
1350 return parser.failure(); 1356 return parser.failure();
1351 } 1357 }
1352 1358
1496 s += "L"; 1502 s += "L";
1497 Expr exp = new Expr(Val.SINGLE,false); 1503 Expr exp = new Expr(Val.SINGLE,false);
1498 exp.add( s ); 1504 exp.add( s );
1499 return parser.success(exp); 1505 return parser.success(exp);
1500 } 1506 }
1501 String s = StringLiteral(); 1507 Expr s = StringLiteral();
1502 if( s != null ) 1508 if( s != null )
1503 return parser.success(constExpStr(s)); 1509 return parser.success(s);
1504 return parser.failure(null); 1510 return parser.failure(null);
1505 } 1511 }
1506 1512
1507 private static int STR_LIM = 65000; 1513 private static int STR_LIM = 65000;
1508 1514
1509 private Expr constExpStr(String s) { 1515 private Expr constExpStr(String s) {
1510 int n = 0;
1511 int from = 0;
1512 while( (from = s.indexOf('\n',from) + 1) != 0 ) {
1513 n++;
1514 }
1515 s = s 1516 s = s
1516 .replace("\\","\\\\") 1517 .replace("\\","\\\\")
1517 .replace("\"","\\\"") 1518 .replace("\"","\\\"")
1518 .replace("\n","\\n") 1519 .replace("\n","\\n")
1519 .replace("\r","\\r") 1520 .replace("\r","\\r")
1534 } 1535 }
1535 sb.append( "\"" ).append( s.substring(start) ).append( "\")" ); 1536 sb.append( "\"" ).append( s.substring(start) ).append( "\")" );
1536 s = sb.toString(); 1537 s = sb.toString();
1537 } else 1538 } else
1538 s = "\"" + s + "\""; 1539 s = "\"" + s + "\"";
1539 while( n-- > 0 )
1540 s += "\n";
1541 Expr exp = new Expr(Val.SINGLE,false); 1540 Expr exp = new Expr(Val.SINGLE,false);
1542 exp.add( s ); 1541 exp.add( s );
1543 return exp; 1542 return exp;
1544 } 1543 }
1545 1544
1663 1662
1664 private boolean HexDigit() { 1663 private boolean HexDigit() {
1665 return Digit() || parser.anyOf("abcdefABCDEF"); 1664 return Digit() || parser.anyOf("abcdefABCDEF");
1666 } 1665 }
1667 1666
1668 private String StringLiteral() throws ParseException { 1667 private Expr StringLiteral() throws ParseException {
1669 String s; 1668 Expr s;
1670 if( (s=QuotedString('"'))==null 1669 if( (s=QuotedString('"'))==null
1671 && (s=QuotedString('\''))==null 1670 && (s=QuotedString('\''))==null
1672 && (s=LongString())==null 1671 && (s=LongString())==null
1673 ) 1672 )
1674 return null; 1673 return null;
1675 Spaces(); 1674 Spaces();
1676 return s; 1675 return s;
1677 } 1676 }
1678 1677
1679 private String LongString() throws ParseException { 1678 private Expr LongString() throws ParseException {
1680 parser.begin(); 1679 parser.begin();
1681 if( !parser.match('[') ) 1680 if( !parser.match('[') )
1682 return parser.failure(null); 1681 return parser.failure(null);
1683 int start = parser.currentIndex(); 1682 int start = parser.currentIndex();
1684 while( parser.match('=') ); 1683 while( parser.match('=') );
1685 int nEquals = parser.currentIndex() - start; 1684 int nEquals = parser.currentIndex() - start;
1686 if( !parser.match('[') ) 1685 if( !parser.match('[') )
1687 return parser.failure(null); 1686 return parser.failure(null);
1688 if( EndOfLine() ) 1687 EndOfLine();
1689 parser.upSb();
1690 start = parser.currentIndex(); 1688 start = parser.currentIndex();
1691 while( !LongBracketsEnd(nEquals) ) { 1689 while( !LongBracketsEnd(nEquals) ) {
1692 if( !parser.anyChar() ) 1690 if( !(EndOfLine() || parser.anyChar()) )
1693 throw parser.exception("Unclosed long string"); 1691 throw parser.exception("Unclosed long string");
1694 } 1692 }
1695 String s = parser.text.substring( start, parser.currentIndex() - nEquals - 2 ); 1693 String s = parser.text.substring( start, parser.currentIndex() - nEquals - 2 );
1696 return parser.success(s); 1694 String rtns = parser.sb().toString();
1697 } 1695 parser.sb().setLength(0);
1698 1696 Expr exp = constExpStr(s);
1699 private String QuotedString(char quote) throws ParseException { 1697 if( rtns.length() > 0 )
1698 exp.add(rtns);
1699 return parser.success(exp);
1700 }
1701
1702 private Expr QuotedString(char quote) throws ParseException {
1700 parser.begin(); 1703 parser.begin();
1701 if( !parser.match(quote) ) 1704 if( !parser.match(quote) )
1702 return parser.failure(null); 1705 return parser.failure(null);
1703 StringBuilder buf = new StringBuilder(); 1706 StringBuilder buf = new StringBuilder();
1704 while( !parser.match(quote) ) { 1707 while( !parser.match(quote) ) {
1709 if( parser.test('\r') || parser.test('\n') || !parser.anyChar() ) 1712 if( parser.test('\r') || parser.test('\n') || !parser.anyChar() )
1710 throw parser.exception("Unclosed string"); 1713 throw parser.exception("Unclosed string");
1711 buf.append(parser.lastChar()); 1714 buf.append(parser.lastChar());
1712 } 1715 }
1713 } 1716 }
1714 return parser.success(buf.toString()); 1717 return parser.success(constExpStr(buf.toString()));
1715 } 1718 }
1716 1719
1717 private Character EscSeq() { 1720 private Character EscSeq() {
1718 parser.begin(); 1721 parser.begin();
1719 if( !parser.match('\\') ) 1722 if( !parser.match('\\') )