private Attribute parseAttribute(StreamTokenizer tokenizer) throws IOException, ParseException {
        Attribute attribute = null;

        // Get attribute name.
        getNextToken(tokenizer);
        String attributeName = tokenizer.sval;
        getNextToken(tokenizer);

        // Check if attribute is nominal.
        if (tokenizer.ttype == StreamTokenizer.TT_WORD) {

            // Attribute is real, integer, or string.
            if (tokenizer.sval.equalsIgnoreCase(ARFF_ATTRIBUTE_REAL) ||
                    tokenizer.sval.equalsIgnoreCase(ARFF_ATTRIBUTE_INTEGER) ||
                    tokenizer.sval.equalsIgnoreCase(ARFF_ATTRIBUTE_NUMERIC)) {
                attribute = new NumericAttribute(attributeName);
                readTillEOL(tokenizer);

            } else if (tokenizer.sval.equalsIgnoreCase(ARFF_ATTRIBUTE_STRING)) {
                attribute = new StringAttribute(attributeName);
                readTillEOL(tokenizer);

            } else if (tokenizer.sval.equalsIgnoreCase(ARFF_ATTRIBUTE_DATE)) {
                String format = null;
                if (tokenizer.nextToken() != StreamTokenizer.TT_EOL) {
                    if ((tokenizer.ttype != StreamTokenizer.TT_WORD) && (tokenizer.ttype != '\'') && (tokenizer.ttype != '\"')) {
                        throw new ParseException("not a valid date format", tokenizer.lineno());
                    }
                    format = tokenizer.sval;
                    readTillEOL(tokenizer);
                } else {
                    tokenizer.pushBack();
                }
                attribute = new DateAttribute(attributeName, null, format);
                readTillEOL(tokenizer);

            } else if (tokenizer.sval.equalsIgnoreCase(ARFF_ATTRIBUTE_RELATIONAL)) {
                readTillEOL(tokenizer);

            } else if (tokenizer.sval.equalsIgnoreCase(ARFF_END_SUBRELATION)) {
                getNextToken(tokenizer);

            } else {
                throw new ParseException("Invalid attribute type or invalid enumeration", tokenizer.lineno());
            }
        } else {

            // Attribute is nominal.
            List<String> attributeValues = new ArrayList<>();
            tokenizer.pushBack();

            // Get values for nominal attribute.
            if (tokenizer.nextToken() != '{') {
                throw new ParseException("{ expected at beginning of enumeration", tokenizer.lineno());
            }
            while (tokenizer.nextToken() != '}') {
                if (tokenizer.ttype == StreamTokenizer.TT_EOL) {
                    throw new ParseException("} expected at end of enumeration", tokenizer.lineno());
                } else {
                    attributeValues.add(tokenizer.sval.trim());
                }
            }

            String[] values = new String[attributeValues.size()];
            for (int i = 0; i < values.length; i++) {
                values[i] = attributeValues.get(i);
            }
            attribute = new NominalAttribute(attributeName, values);
        }

        getLastToken(tokenizer, false);
        getFirstToken(tokenizer);
        if (tokenizer.ttype == StreamTokenizer.TT_EOF) {
            throw new ParseException(PREMATURE_END_OF_FILE, tokenizer.lineno());
        }

        return attribute;
    }
private Attribute parseAttribute ( StreamTokenizer tokenizer ) throws IOException , ParseException { Attribute attribute = null ; getNextToken ( tokenizer ) ; String attributeName = tokenizer . sval ; getNextToken ( tokenizer ) ; if ( tokenizer . ttype == StreamTokenizer . TT_WORD ) { if ( tokenizer . sval . equalsIgnoreCase ( ARFF_ATTRIBUTE_REAL ) || tokenizer . sval . equalsIgnoreCase ( ARFF_ATTRIBUTE_INTEGER ) || tokenizer . sval . equalsIgnoreCase ( ARFF_ATTRIBUTE_NUMERIC ) ) { attribute = new NumericAttribute ( attributeName ) ; readTillEOL ( tokenizer ) ; } else if ( tokenizer . sval . equalsIgnoreCase ( ARFF_ATTRIBUTE_STRING ) ) { attribute = new StringAttribute ( attributeName ) ; readTillEOL ( tokenizer ) ; } else if ( tokenizer . sval . equalsIgnoreCase ( ARFF_ATTRIBUTE_DATE ) ) { String format = null ; if ( tokenizer . nextToken ( ) != StreamTokenizer . TT_EOL ) { if ( ( tokenizer . ttype != StreamTokenizer . TT_WORD ) && ( tokenizer . ttype != '\'' ) && ( tokenizer . ttype != '\"' ) ) { throw new ParseException ( "not a valid date format" , tokenizer . lineno ( ) ) ; } format = tokenizer . sval ; readTillEOL ( tokenizer ) ; } else { tokenizer . pushBack ( ) ; } attribute = new DateAttribute ( attributeName , null , format ) ; readTillEOL ( tokenizer ) ; } else if ( tokenizer . sval . equalsIgnoreCase ( ARFF_ATTRIBUTE_RELATIONAL ) ) { readTillEOL ( tokenizer ) ; } else if ( tokenizer . sval . equalsIgnoreCase ( ARFF_END_SUBRELATION ) ) { getNextToken ( tokenizer ) ; } else { throw new ParseException ( "Invalid attribute type or invalid enumeration" , tokenizer . lineno ( ) ) ; } } else { List < String > attributeValues = new ArrayList < > ( ) ; tokenizer . pushBack ( ) ; if ( tokenizer . nextToken ( ) != '{' ) { throw new ParseException ( "{ expected at beginning of enumeration" , tokenizer . lineno ( ) ) ; } while ( tokenizer . nextToken ( ) != '}' ) { if ( tokenizer . ttype == StreamTokenizer . TT_EOL ) { throw new ParseException ( "} expected at end of enumeration" , tokenizer . lineno ( ) ) ; } else { attributeValues . add ( tokenizer . sval . trim ( ) ) ; } } String [ ] values = new String [ attributeValues . size ( ) ] ; for ( int i = 0 ; i < values . length ; i ++ ) { values [ i ] = attributeValues . get ( i ) ; } attribute = new NominalAttribute ( attributeName , values ) ; } getLastToken ( tokenizer , false ) ; getFirstToken ( tokenizer ) ; if ( tokenizer . ttype == StreamTokenizer . TT_EOF ) { throw new ParseException ( PREMATURE_END_OF_FILE , tokenizer . lineno ( ) ) ; } return attribute ; }
Parses the attribute declaration.

@return an attributes in this relation
@throws IOException 	if the information is not read
successfully