diff src/luan/impl/Parser.java @ 775:1a68fc55a80c

simplify dir structure
author Franklin Schmidt <fschmidt@gmail.com>
date Fri, 26 Aug 2016 14:36:40 -0600
parents core/src/luan/impl/Parser.java@b620b8e1010f
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/luan/impl/Parser.java	Fri Aug 26 14:36:40 2016 -0600
@@ -0,0 +1,190 @@
+package luan.impl;
+
+
+final class Parser {
+
+	private static class Frame {
+		int i;
+		StringBuilder sb;
+	}
+
+//	private final LuanSource src;
+	public final String text;
+	public final String sourceName;
+	private final int len;
+	private Frame[] stack = new Frame[256];
+	private int frame = 0;
+	private int iHigh;
+
+	public Parser(String text,String sourceName) {
+//		this.src = src;
+		this.text = text;
+		this.sourceName = sourceName;
+		this.len = text.length();
+		stack[0] = new Frame();
+	}
+
+	private int i() {
+		return stack[frame].i;
+	}
+
+	private void i(int i) {
+		Frame f = stack[frame];
+		f.i += i;
+		if( iHigh < f.i )
+			iHigh = f.i;
+	}
+
+	public int begin() {
+		frame++;
+		if( frame == stack.length ) {
+			Frame[] a = new Frame[2*frame];
+			System.arraycopy(stack,0,a,0,frame);
+			stack = a;
+		}
+		Frame f = new Frame();
+		f.i = stack[frame-1].i;
+		stack[frame] = f;
+		return i();
+	}
+
+	public void rollback() {
+		Frame f = stack[frame];
+		f.i = stack[frame-1].i;
+		f.sb = null;
+	}
+
+	public <T> T success(T t) {
+		success();
+		return t;
+	}
+
+	public boolean success() {
+		Frame f = stack[frame];
+		if( f.sb != null && f.sb.length() > 0 )  throw new RuntimeException("sb not emtpy");
+		frame--;
+		stack[frame].i = f.i;
+		return true;
+	}
+
+	public <T> T failure(T t) {
+		failure();
+		return t;
+	}
+
+	public boolean failure() {
+		frame--;
+		return false;
+	}
+
+	public ParseException exception(String msg) {
+		return new ParseException(msg,text,sourceName,i(),iHigh);
+	}
+
+	public ParseException exception() {
+		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();
+	}
+
+	public char lastChar() {
+		return text.charAt(i()-1);
+	}
+
+	public char currentChar() {
+		return text.charAt(i());
+	}
+
+	public boolean endOfInput() {
+		return i() >= len;
+	}
+
+	public boolean match(char c) {
+		if( endOfInput() || text.charAt(i()) != c )
+			return false;
+		i(1);
+		return true;
+	}
+
+	public boolean match(String s) {
+		int n = s.length();
+		if( !text.regionMatches(i(),s,0,n) )
+			return false;
+		i(n);
+		return true;
+	}
+
+	public boolean matchIgnoreCase(String s) {
+		int n = s.length();
+		if( !text.regionMatches(true,i(),s,0,n) )
+			return false;
+		i(n);
+		return true;
+	}
+
+	public boolean anyOf(String s) {
+		if( endOfInput() || s.indexOf(text.charAt(i())) == -1 )
+			return false;
+		i(1);
+		return true;
+	}
+
+	public boolean noneOf(String s) {
+		if( endOfInput() || s.indexOf(text.charAt(i())) != -1 )
+			return false;
+		i(1);
+		return true;
+	}
+
+	public boolean inCharRange(char cLow, char cHigh) {
+		if( endOfInput() )
+			return false;
+		char c = text.charAt(i());
+		if( !(cLow <= c && c <= cHigh) )
+			return false;
+		i(1);
+		return true;
+	}
+
+	public boolean anyChar() {
+		if( endOfInput() )
+			return false;
+		i(1);
+		return true;
+	}
+
+	public boolean test(char c) {
+		return !endOfInput() && text.charAt(i()) == c;
+	}
+
+	public boolean test(String s) {
+		return text.regionMatches(i(),s,0,s.length());
+	}
+
+	public String textFrom(int start) {
+		return text.substring(start,i());
+	}
+
+}