c++ - 解析自定义结构化查询语言?

标签 c++ sql

我目前正在为基本的 CRUD 功能开发一种简单的查询语言,它是基于控制台的,用户将按以下形式输入查询:

FIND WHERE NAME nametofind

并且该语言将搜索项目 vector 并在找到项目时返回该项目。我开发了以下内容来解析此查询。

int SDIQL::parseQuery(std::string query)
{
    std::vector<std::string> result_items;

    std::istringstream ss(query);
    std::string token;

    while(std::getline(ss, token, ' ')) {
        //std::cout << token << '\n';
        result_items.push_back(token);
    }

    if(result_items[0] == "ADD" || result_items[0] == "INSERT")
    {
        if(result_items[1] != "")
        {
            if(result_items[2] == "WITH")
            {
                if(result_items[3] != "")
                {
                    ADDquery(result_items[1], result_items[3]);
                }
                else
                {
                    std::cout<<"No value entered, please try again."<<std::endl;
                }
            }
            else
            {
                std::cout<<"Invalid paramater entered, expected WITH, please try again."<<std::endl;
            }
        }
        else
        {
            std::cout<<"No Key Specified, please try again."<<std::endl;
        }
    }
    else if(result_items[0] == "FIND" || result_items[0] == "GET")
        //FIND WHERE NAME name
    {
        if(result_items[1] == "WHERE")
        {
            if(result_items[2] == "NAME")
            {
                if(result_items[3] != "")
                {
                    FINDquery(result_items[3]);             
                }
                else
                {
                    std::cout<<"No value entered, please try again."<<std::endl;
                }
            }
            else
            {
                std::cout<<"Invalid paramater entered, expected NAME, please try again."<<std::endl;
            }
        }
        else
        {
            std::cout<<"Invalid paramater entered, expected WHERE, please try again."<<std::endl;
        }
    }
    else if(result_items[0] == "DELETE" || result_items[0] == "REMOVE")
    {
        if(result_items[1] == "WHERE")
        {
            if(result_items[2] == "NAME")
            {
                if(result_items[3] != "")
                {
                    DELETEquery(result_items[3]);               
                }
                else
                {
                    std::cout<<"No value entered, please try again."<<std::endl;
                }
            }
            else
            {
                std::cout<<"Invalid paramater entered, expected NAME, please try again."<<std::endl;
            }
        }
        else
        {
            std::cout<<"Invalid paramater entered, expected WHERE, please try again."<<std::endl;
        }
    }




    return 1;
}

但是,这似乎存在一些严重的问题......例如,它目前按空格拆分项目,然后使用它们来检查使用了哪些命令,但是如果要搜索的查询中有空格怎么办?例如

if(result_items[3] != "")
{
    FINDquery(result_items[3]);             
}

这很好用,查询是

FIND WHERE NAME mynametosearch

但是当它:

FIND WHERE NAME my name to search

它现在有超过 result_items[3] 的额外参数,搜索将失败。

我可以采取什么更好的方法?

最佳答案

由于您是自己开发语言,因此您应该能够写下您的语言的语法。如果不是,你真的应该考虑这样做。
因为只要掌握了语法,就可以使用所需的任何解析器库。我个人找到boost::spirit很不错。但是旧的 flex/bison 组合也应该这样做。

关于c++ - 解析自定义结构化查询语言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22690410/

相关文章:

c++ - C++中的按位设置

c++ - 为什么我不能将 QGridLayout 添加到 QMainWindow?

c++ - 从二维数组中获取一维数组索引

c++ - 无法解析的外部符号C++-错误的声明?

sql - PL/SQL : ORA-12704: character set mismatch when insert varchar2 to nvarchar2

sql - 函数和语句的区别

SQL oracle - 如何从列中获取最大值,添加一个,格式化它并与更多值连接

c++ - 检查函数调用表达式的正确性

sql - 我需要 T-SQL 将数据导出到 CSV(带标题)的最佳实践

php - 选择 >= 来自 fb 的月份