private Value factor() {
//		System.out.println("factor " + data.get(0).getTokenType().name() + ":" + data.get(0).getValue());

		Token t = popToken();
		switch(t.getTokenType()) {
		case SCONSTANT:
			return new ConstantValue(t.getValue(), new Type("integer"));
		case SSTRING:
			String tmp = t.getValue().substring(1, t.getValue().length() - 1);
			if(tmp.length() > 1)
				return new ConstantValue(tmp, new ArrayType("char", 0, tmp.length() - 1));
			else
				return new ConstantValue(tmp, new Type("char"));
		case SFALSE:
		case STRUE:
			return new ConstantValue(t.getValue(), new Type("boolean"));
		case SIDENTIFIER:
			pushToken(t);
			return variable();
		case SLPAREN:
			Value pt = expression();
			expectToken(TokenType.SRPAREN);
			return pt;
		case SNOT:
			List<Value> operands = new LinkedList<Value>();
			operands.add(factor());
			return new Expression(t.getValue(), operands, new Type("boolean"));
		default:
			fail(t);
		}
		return null;
	}