AbstractNode factor() {
		AbstractNode node = null;

		if (test(IDENT)) {
			if (testLookAhead(DOT) || testLookAhead(LBRAC)) {
				node = new ContentNode(selector());
			} else {
				node = new ContentNode(constIdent());
			}
		} else if (test(INT)) {
			node = integer();
		} else if (test(STR)) {
			node = string();
		} else if (test(READ)) {
			node = readParser();
		} else if (test(LPAR)) {
			read(LPAR, "(");
			node = expr();
			read(RPAR, ")");
		} else {
			failExpectation("identifier, integer, string, read or (expression)");
		}

		return node;
	}