bool isNumber(const char *s) { // empty space // +/- // [0123456789] // . // [0123456789] // e/E // [0123456789] // empty space // empty string should be treated as false? if (s == nullptr || *s == 0) return false; // process empty space parseSpace(s); if (*s == 0) return false; // empty string parseSign(s); if (*s == 0) return false; if (parseDigit(s) == 0) { if (!parseDot(s)) return false; if (parseDigit(s) == 0) return false; if (parseSpace(s) > 0) return *s == 0; if (*s == 0) return true; if (!parseExp(s)) return false; parseSign(s); if (parseDigit(s) == 0) return false; parseSpace(s); return *s == 0; } else { if (parseSpace(s) > 0) return *s == 0; if (*s == 0) return true; if (parseDot(s)) { parseDigit(s); if (parseSpace(s) > 0) return *s == 0; if (*s == 0) return true; if (!parseExp(s)) return false; parseSign(s); if (parseDigit(s) == 0) return false; parseSpace(s); return *s == 0; } else if (parseExp(s)) { parseSign(s); if (parseDigit(s) == 0) return false; parseSpace(s); return *s == 0; } else { return false; } } }
QVariantList parseList(ParserState &st) { skipSpaces(st); checkEndOfFile(st); if (*st.ptr != '(') { throw ParserError("list must be started with '('"); } st.ptr++; QVariantList list; QString i = parseIdentifier(st); list.append(i); while (st.ptr < st.end) { if (*st.ptr == ')') { st.ptr++; return list; } parseSpace(st); if (*st.ptr == ')') { st.ptr++; return list; } if (*st.ptr == '(') { QVariant v = parseList(st); list.append(v); } else { list.append(parseAtom(st)); } } throw ParserError("unexpected end of file"); }