Mercurial Hosting > luan
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('\\') ) |