Newer
Older
NiHao / NiHao / src / nihao / tokenizer / QTokenizer.java
@xwolf xwolf on 27 Jan 2015 1 KB Initial upload
package nihao.tokenizer;

public class QTokenizer {
	private static final String ignore = " \t\n\r";
	private static final String number = "0123456789.";
	private static final String letters = "abcdefghijklmnñopqrstuvwxyzáéíóúàèìòùâêîôûäëïöüãõ_ABCDEFGHIJKLMNÑOPQRSTUVWXYZÁÉÍÓÚÀÈÌÒÙÂÊÎÔÛÄËÏÖÜÃÕ0123456789";
	private String s;
	private int index = 0;

	public QTokenizer(String input) {
		s = input;
	}

	public QToken patrol() {
		int i = index;
		QToken result = next();
		index = i;
		return result;
	}

	public QToken next() {
		if (index >= s.length())
			return null;
		while (ignore.contains(new String(new char[] { s.charAt(index) }))) {
			index++;
			if (index >= s.length())
				return null;
		}
		char ch = s.charAt(index);
		String range;
		String sch = new String(new char[] { ch });
		if (number.contains(sch) && ch != '.')
			range = number;
		else if (letters.contains(sch))
			range = letters;
		else {
			index++;
			if (ch == '"' || ch == '\'') { // String
				StringBuilder sb = new StringBuilder();
				char ich;
				while ((ich = s.charAt(index)) != ch) {
					sb.append(ich);
					index++;
					if (index >= s.length())
						break;
				}
				index++;
				return new QToken(QTokenType.LITERAL, sb.toString());
			} else if (index < s.length() && ch == '/' && s.charAt(index) == '/') { // Commentary jump
				while (s.charAt(index) != '\n') {
					index++;
					if (index >= s.length())
						break;
				}
				return next();
			} else
				return new QToken(QTokenType.SYMBOL, sch);
		}
		StringBuilder sb = new StringBuilder();
		while (range.contains(sch)) {
			sb.append(ch);
			index++;
			if (index >= s.length())
				break;
			ch = s.charAt(index);
			sch = new String(new char[] { ch });
		}
		return new QToken(range == number ? QTokenType.NUMBER : QTokenType.WORD, sb.toString());
	}
}