Mercurial Hosting > luan
diff core/src/luan/impl/Parser.java @ 679:43522473599d
make java line numbers match
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Thu, 14 Apr 2016 15:19:25 -0600 |
parents | 859c0dedc8b6 |
children | b620b8e1010f |
line wrap: on
line diff
--- a/core/src/luan/impl/Parser.java Wed Apr 13 16:24:48 2016 -0600 +++ b/core/src/luan/impl/Parser.java Thu Apr 14 15:19:25 2016 -0600 @@ -2,11 +2,17 @@ final class Parser { + + private static class Frame { + int i; + StringBuilder sb; + } + // private final LuanSource src; public final String sourceName; public final String text; private final int len; - private int[] stack = new int[256]; + private Frame[] stack = new Frame[256]; private int frame = 0; private int iHigh; @@ -15,31 +21,37 @@ this.sourceName = sourceName; this.text = text; this.len = text.length(); + stack[0] = new Frame(); } private int i() { - return stack[frame]; + return stack[frame].i; } private void i(int i) { - stack[frame] += i; - if( iHigh < stack[frame] ) - iHigh = stack[frame]; + Frame f = stack[frame]; + f.i += i; + if( iHigh < f.i ) + iHigh = f.i; } public int begin() { frame++; if( frame == stack.length ) { - int[] a = new int[2*frame]; + Frame[] a = new Frame[2*frame]; System.arraycopy(stack,0,a,0,frame); stack = a; } - stack[frame] = stack[frame-1]; + Frame f = new Frame(); + f.i = stack[frame-1].i; + stack[frame] = f; return i(); } public void rollback() { - stack[frame] = stack[frame-1]; + Frame f = stack[frame]; + f.i = stack[frame-1].i; + f.sb = null; } public <T> T success(T t) { @@ -48,8 +60,10 @@ } public boolean success() { + Frame f = stack[frame]; + if( f.sb != null && f.sb.length() > 0 ) throw new RuntimeException("sb not emtpy"); frame--; - stack[frame] = stack[frame+1]; + stack[frame].i = f.i; return true; } @@ -71,6 +85,26 @@ return exception("Invalid input"); } + public StringBuilder sb() { + Frame f = stack[frame]; + if( f.sb == null ) + f.sb = new StringBuilder(); + return f.sb; + } + + public void upSb() { + Frame f = stack[frame]; + StringBuilder sb = f.sb; + if( sb != null && sb.length() > 0 ) { + Frame fUp = stack[frame-1]; + if( fUp.sb == null ) + fUp.sb = sb; + else + fUp.sb.append(sb.toString()); + f.sb = null; + } + } + public int currentIndex() { return i(); }