Mercurial Hosting > luan
changeset 684:41f791e4206d
bug fixes
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Sat, 16 Apr 2016 21:42:19 -0600 |
parents | 67dd1449e354 |
children | 1e4b0bc0202d |
files | core/src/luan/impl/LuanImpl.java core/src/luan/impl/LuanParser.java |
diffstat | 2 files changed, 57 insertions(+), 18 deletions(-) [+] |
line wrap: on
line diff
diff -r 67dd1449e354 -r 41f791e4206d core/src/luan/impl/LuanImpl.java --- a/core/src/luan/impl/LuanImpl.java Thu Apr 14 21:51:55 2016 -0600 +++ b/core/src/luan/impl/LuanImpl.java Sat Apr 16 21:42:19 2016 -0600 @@ -239,4 +239,12 @@ return a.length==0 ? null : a[0]; } + public static String strconcat(String... a) { + StringBuilder sb = new StringBuilder(); + for( String s : a ) { + sb.append(s); + } + return sb.toString(); + } + }
diff -r 67dd1449e354 -r 41f791e4206d core/src/luan/impl/LuanParser.java --- a/core/src/luan/impl/LuanParser.java Thu Apr 14 21:51:55 2016 -0600 +++ b/core/src/luan/impl/LuanParser.java Sat Apr 16 21:42:19 2016 -0600 @@ -289,18 +289,21 @@ private Stmts RequiredBlock() throws ParseException { Stmts stmts = new Stmts(); int stackStart = symbolsSize(); - boolean isReturn = Stmt(stmts); - while( !isReturn && (StmtSep() || TemplateSep(stmts)) ) { + do { Spaces(); stmts.addNewLines(); - isReturn = Stmt(stmts); - } + Stmts stmt = Stmt(); + if( stmt != null ) { + stmts.addAll(stmt); + stmts.hasReturn = stmt.hasReturn; + } + } while( !stmts.hasReturn && (StmtSep() || TemplateSep(stmts)) ); + Spaces(); while( StmtSep() ) Spaces(); stmts.addNewLines(); int stackEnd = symbolsSize(); popSymbols( stackEnd - stackStart ); - stmts.hasReturn = isReturn; return stmts; } @@ -318,7 +321,7 @@ } private boolean EndOfLine() { - if( parser.match( "\r\n" ) || parser.match( '\r' ) || parser.match( '\n' ) ) { + if( MatchEndOfLine() ) { parser.sb().append('\n'); return true; } else { @@ -326,13 +329,14 @@ } } - private boolean Stmt(Stmts stmts) throws ParseException { + private boolean MatchEndOfLine() { + return parser.match( "\r\n" ) || parser.match( '\r' ) || parser.match( '\n' ); + } + + private Stmts Stmt() throws ParseException { Stmts stmt; - if( (stmt=ReturnStmt()) != null ) { - stmts.addAll(stmt); - return true; - } - if( (stmt=FunctionStmt()) != null + if( (stmt=ReturnStmt()) != null + || (stmt=FunctionStmt()) != null || (stmt=LocalStmt()) != null || (stmt=LocalFunctionStmt()) != null || (stmt=BreakStmt()) != null @@ -344,9 +348,9 @@ || (stmt=SetStmt()) != null || (stmt=ExpressionsStmt()) != null ) { - stmts.addAll(stmt); + return stmt; } - return false; + return null; } private Expr indexExpStr(Expr exp1,Expr exp2) { @@ -427,6 +431,7 @@ else stmt.add( "LuanFunction.NOTHING" ); stmt.add( "; " ); + stmt.hasReturn = true; return parser.success( stmt ); } @@ -623,6 +628,7 @@ Stmts stmt = new Stmts(); Expr cnd; Stmts block; + boolean hasReturn = true; cnd = RequiredExpr(In.NOTHING).single(); RequiredKeyword("then"); block = RequiredBlock(); @@ -630,6 +636,8 @@ stmt.addAll( cnd ); stmt.add( ") ) { " ); stmt.addAll( block ); + if( !block.hasReturn ) + hasReturn = false; while( Keyword("elseif") ) { cnd = RequiredExpr(In.NOTHING).single(); RequiredKeyword("then"); @@ -638,14 +646,21 @@ stmt.addAll( cnd ); stmt.add( ") ) { " ); stmt.addAll( block ); + if( !block.hasReturn ) + hasReturn = false; } if( Keyword("else") ) { block = RequiredBlock(); stmt.add( "} else { " ); stmt.addAll( block ); + if( !block.hasReturn ) + hasReturn = false; + } else { + hasReturn = false; } RequiredKeyword("end"); stmt.add( "} " ); + stmt.hasReturn = hasReturn; return parser.success( stmt ); } @@ -1488,6 +1503,8 @@ return parser.failure(null); } + private static int STR_LIM = 65000; + private Expr constExpStr(String s) { int n = 0; int from = 0; @@ -1502,7 +1519,22 @@ .replace("\t","\\t") .replace("\b","\\b") ; - s = "\"" + s + "\""; + if( s.length() > STR_LIM ) { + int len = s.length(); + StringBuilder sb = new StringBuilder(); + sb.append( "LuanImpl.strconcat(" ); + int start = 0; + while(true) { + int end = start + STR_LIM; + if( end >= len ) + break; + sb.append( "\"" ).append( s.substring(start,end) ).append( "\"," ); + start = end; + } + sb.append( "\"" ).append( s.substring(start) ).append( "\")" ); + s = sb.toString(); + } else + s = "\"" + s + "\""; while( n-- > 0 ) s += "\n"; Expr exp = new Expr(Val.SINGLE,false); @@ -1652,7 +1684,7 @@ int nEquals = parser.currentIndex() - start; if( !parser.match('[') ) return parser.failure(null); - EndOfLine(); + MatchEndOfLine(); start = parser.currentIndex(); while( !LongBracketsEnd(nEquals) ) { if( !parser.anyChar() ) @@ -1701,8 +1733,7 @@ if( Digit() ) Digit(); // optional return parser.success((char)Integer.parseInt(parser.textFrom(start))); } - if( EndOfLine() ) { - parser.sb().setLength(parser.sb().length()-1); + if( MatchEndOfLine() ) { return parser.success('\n'); } return parser.failure(null);