return new Token(VALUE_TOKEN, sb.toString().trim());
        private Token getToken(InputStream inputStream) throws IOException {            if (ch == '\0') {                ch = nextCharacter(inputStream);            }            skipWhitespace(inputStream);            if (isLabelCharacter(ch)) {                sb.setLength(0);                do {                    sb.append(ch);                    ch = nextCharacter(inputStream);                } while (isLabelCharacter(ch));                return new Token(ID_TOKEN, sb.toString());            } else if (ch == '=') {                ch = nextCharacter(inputStream);                skipWhitespace(inputStream);                if (isValueCharacter(ch)) {                    sb.setLength(0);                    do {                        sb.append(ch);                        ch = nextCharacter(inputStream);                    } while (isValueCharacter(ch));                    return new Token(VALUE_TOKEN, sb.toString().trim());                }            } else if (ch == '[') {                ch = nextCharacter(inputStream);                Token id = getToken(inputStream);                // check ]                ch = nextCharacter(inputStream); // skip ]                return new Token(SECTION_TOKEN, id.getValue());            } else if (ch == '#') {                do {                    ch = nextCharacter(inputStream);                } while (!isNewLineCharacter(ch));                return getToken(inputStream);            }            return null;        }