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();
 	}