private VariableType type() {
		if(testStandardTypes()) {
			return getValType();
		} else if (whenToken(TokenType.SARRAY)) {
			int linum = getLineNumber();
			expectToken(TokenType.SLBRACKET);
			int lvalue = number();
			expectToken(TokenType.SRANGE);
			int rvalue = number();
			expectToken(TokenType.SRBRACKET);
			expectToken(TokenType.SOF);
			
			if(lvalue > rvalue) 
				throw new RuntimeException("Line\t\t\t\t" + linum + " : invailed array range");
			
			if(testStandardTypes()) {
				Token t = popToken();
				switch(t.getTokenType()) {
				case SINTEGER: return VariableType.INTEGER_ARRAY;
				case SBOOLEAN: return VariableType.BOOLEAN_ARRAY;
				case SCHAR:    return VariableType.CHAR_ARRAY;
				default: throw new RuntimeException("Line\t\t\t\t" + t.getLineNumber() + " : unexpected type "+ t.getValue() + ".");
				}
			} else {
				fail(data.get(0));
			}
		} else {
			Token e = data.get(0);
			fail(e);
		}
		return null;
	}