view src/luan/parser/Parser.java @ 118:735708619119

add Debug.debug() git-svn-id: https://luan-java.googlecode.com/svn/trunk@119 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Sun, 01 Jun 2014 07:07:31 +0000
parents 754e6030c029
children cc3a0578edac
line wrap: on
line source

package luan.parser;

import luan.LuanSource;


public final class Parser {
	private final LuanSource src;
	public final String text;
	private final int len;
	private int[] stack = new int[256];
	private int frame = 0;
	private int iHigh;

	public Parser(LuanSource src) {
		this.src = src;
		this.text = src.text;
		this.len = text.length();
	}

	private int i() {
		return stack[frame];
	}

	private void i(int i) {
		stack[frame] += i;
		if( iHigh < stack[frame] )
			iHigh = stack[frame];
	}

	public int begin() {
		if( frame == stack.length ) {
			int[] a = new int[2*frame];
			System.arraycopy(stack,0,a,0,frame);
			stack = a;
		}
		frame++;
		stack[frame] = stack[frame-1];
		return i();
	}

	public void rollback() {
		stack[frame] = stack[frame-1];
	}

	public <T> T success(T t) {
		success();
		return t;
	}

	public boolean success() {
		frame--;
		stack[frame] = stack[frame+1];
		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,src,i(),iHigh);
	}

	public ParseException exception() {
		return exception("Invalid input");
	}

	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(String s) {
		return text.regionMatches(i(),s,0,s.length());
	}

	public String textFrom(int start) {
		return text.substring(start,i());
	}

}