PARSENODE_PTR SQLParser::parseStatement() { if (!startsStatement(nowReading)) { syntaxError(nowReading, "expect start token!"); return nullptr; } if (startsCreate(nowReading)) { return parseCreate(); } else if (startsSelect(nowReading)) { return parseSelect(); } else if (startsDelete(nowReading)) { return parseDelete(); } else if (startsInsert(nowReading)) { return parseInsert(); } else if (startsDrop(nowReading)) { return parseDrop(); } else if (nowReading == QUIT) { readToken(); expect(TERMINATOR); return PARSENODE_PTR(new ParseNode(QUIT)); } else if (nowReading == EXECFILE) { readToken(); expect(TERMINATOR); return PARSENODE_PTR(new ParseNode(EXECFILE)); } else { assert(false); return nullptr; } }
//static Command* Command::parseTokens( Tokens& tokens, bool helpMode ) { if (tokens.empty()) THROW( CWDB_ERR_PARSER, "Bad syntax: no tokens to parse"); Command* result = 0; try { switch(tokens.front().m_angen) { case ANGEN_CREATE: parseCreate( tokens, helpMode, result ); break; case ANGEN_DESCR: parseDescr( tokens, helpMode, result ); break; case ANGEN_DROP: parseDrop( tokens, helpMode, result ); break; case ANGEN_DUMP: parseDump( tokens, helpMode, result ); break; case ANGEN_GET: case ANGEN_SET: case ANGEN_PUT: parseInput( tokens, helpMode, result ); break; case ANGEN_QUERY: parseQuery( tokens, helpMode, result ); break; case ANGEN_USE: parseUse( tokens, helpMode, result ); break; case ANGEN_GENERATE: parseGenerate( tokens, helpMode, result ); break; case ANGEN_VERSION: parseVersion( tokens, helpMode, result ); break; case ANGEN_FORMAT: parseFormat( tokens, helpMode, result ); break; case ANGEN_COMPACT: parseCompact( tokens, helpMode, result ); break; case ANGEN_UPDATE: parseUpdate( tokens, helpMode, result ); break; case ANGEN_START: case ANGEN_STOP: parseStart( tokens, helpMode, result ); break; case ANGEN_EXPORT: parseExport( tokens, helpMode, result ); break; case ANGEN_IMPORT: parseImport( tokens, helpMode, result ); break; default: THROW( CWDB_ERR_PARSER, "Bad syntax: unknown command" ); } } catch (CWDBException& e) { if (result != 0) { delete result; result = 0; } throw e; } return result; }