public Construct readNext() throws SyntaxError {

		patternSearch: for (LanguagePattern lp : LanguagePattern.searchValues()) {
			Symbol symbol = lexer.nextToken();
			int start = lexer.getIndex();
			for (;;) {
				switch (lp.tryNextToken(symbol)) {
				case LanguagePattern.PATTERN_ENDED:
					return lp.fetchProduct();
				case LanguagePattern.TOKEN_APROVED:
					continue;
				case LanguagePattern.TOKEN_ILLEGAL:
					lexer.setIndex(start);
					continue patternSearch;
				}
			}
		}
		throw new SyntaxError(lexer.nextToken(), this);
	}