如何解决使用Boost Spirit Classic解析SQL INSERT
| 我正在尝试学习Boost Spirit,并且作为练习,我尝试使用Boost Spirit Classic解析ѭ0。 这是我要解析的字符串:INSERT INTO example_tab (cola,colb,colc,cold) VALUES (vala,valb,valc,vald);
从这个SELECT示例中,我创建了这个小语法:
struct microsql_grammar : public grammar<microsql_grammar>
{
template <typename ScannerT>
struct definition
{
definition(microsql_grammar const& self)
{
keywords = \"insert\",\"into\",\"values\";
chlit<> LPAREN(\'(\');
chlit<> RPAREN(\')\');
chlit<> SEMI(\';\');
chlit<> COMMA(\',\');
typedef inhibit_case<strlit<> > token_t;
token_t INSERT = as_lower_d[\"insert\"];
token_t INTO = as_lower_d[\"into\"];
token_t VALUES = as_lower_d[\"values\"];
identifier =
nocase_d
[
lexeme_d
[
(alpha_p >> *(alnum_p | \'_\'))
]
];
string_literal =
lexeme_d
[
ch_p(\'\\\'\') >> +( anychar_p - ch_p(\'\\\'\') )
>> ch_p(\'\\\'\')
];
program = +(query);
query = insert_into_clause >> SEMI;
insert_into_clause = insert_clause >> into_clause;
insert_clause = INSERT >> INTO >> identifier >> LPAREN >> var_list_clause >> RPAREN;
into_clause = VALUES >> LPAREN >> var_list_clause >> RPAREN;
var_list_clause = list_p( identifier,COMMA );
}
rule<ScannerT> const& start() const { return program; }
symbols<> keywords;
rule<ScannerT> identifier,string_literal,program,query,insert_into_clause,insert_clause,into_clause,var_list_clause;
};
};
用最小的来测试它:
void test_it(const string& my_example)
{
microsql_grammar g;
if (!parse(example.c_str(),g,space_p).full)
{
// point a - FAIL
throw new exception();
}
// point b - OK
}
不幸的是,它总是进入点A并引发异常。由于我是新手,所以我不知道我的错误在哪里。我有两个问题:
使用Boost Spirit时,调试解析错误的正确方法是什么?
为什么在此示例中解析失败?
解决方法
要了解无法解析的内容,请将解析结果分配给parse_info <>,然后记录/检查parse_info <> :: stop字段,在这种情况下,该字段应为const char *,指向的最后一个字节您输入与语法匹配的字符串。
microsql_grammar g;
parse_info<std::string::const_iterator> result = parse(example.begin(),example.end(),g,space_p)
if (!result.full)
{
std::string parsed(example.begin(),result.stop);
std::cout << parsed << std::endl;
// point a - FAIL
}
// point b - OK
抱歉,如果无法编译,应该作为一个起点。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。