我目前正在为基本的 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/