정규 표현식을 사용하여 다음 표현식을 macth하고 싶습니다.
Execute stmtname
and
Execute stmtname using @a,@b;
stmtname과 변수 목록을 추출하고 싶습니다. 나는 다음을 시도했다.
^execute[\s\t]+(\w+)[\s\t]+(using[\s\t]*(.+))?
그러나 두 번째 문만 구문 분석 할 수 있습니다. 누구든지이 문제를 해결하도록 도와주세요.
정규식으로 문법을 "구문 분석"하려고하지 않을 것입니다. 이미 Boost를 사용하고 있기 때문에 Boost Spirit을 통해 파서 생성기 국가로 모험을 떠나 보는 것은 어떨까요?
std::string statement_name;
std::vector<std::string> parameters;
bool ok = qi::phrase_parse(
first, last,
qi::no_case[
sr::distinct(qi::graph) ["execute"]
>> ident_
>> -(sr::distinct(qi::graph) ["using"] >>
('@' >> ident_) % ','
)
>> -qi::lit(';') >> qi::eoi
],
qi::space,
statement_name,
parameters
);
복잡성의 대부분은 내가 매우 세 심하게 노력했기 때문입니다.
execute_only
구문 분석하지 않음 execute _only
) 및;
마지막에 선택 사항 수락 (이 점에서 귀하의 예가 상충됩니다)테스트 프로그램은 다음을 인쇄합니다.
-----------------------------------------
Parsing 'Execute no_parameter_statement'
Parse success
statement_name: no_parameter_statement
0 parameters:
-----------------------------------------
Parsing 'Execute stmtname using @a,@b;'
Parse success
statement_name: stmtname
2 parameters:
@a
@b
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/repository/include/qi_distinct.hpp>
namespace qi = boost::spirit::qi;
namespace sr = boost::spirit::repository::qi;
typedef std::string::const_iterator It;
qi::rule<It, std::string()> ident_ = sr::distinct(qi::char_("a-z0-9_")) [ qi::alpha >> *(qi::char_("a-z0-9_")) ];
int main() {
for(std::string const input : {
"Execute no_parameter_statement",
"Execute stmtname using @a,@b;"
})
{
std::cout << "-----------------------------------------\n";
std::cout << "Parsing '" << input << "'\n";
std::string statement_name;
std::vector<std::string> parameters;
auto f(input.begin()), l(input.end());
bool ok = qi::phrase_parse(f,l,qi::no_case[
sr::distinct(qi::graph) ["execute"]
>> ident_
>> -(sr::distinct(qi::graph) ["using"] >>
('@' >> ident_) % ','
)
>> -qi::lit(';') >> qi::eoi
],
qi::space,
statement_name,
parameters
);
if (ok) {
std::cout << "Parse success\n";
std::cout << "statement_name: " << statement_name << "\n";
std::cout << parameters.size() << " parameters:\n";
for(auto const& p : parameters)
std::cout << "\t@" << p << "\n";
} else {
std::cout << "Parse failed\n";
}
if (f!=l)
std::cout << "Remaining unparsed: '" << std::string(f,l) << "'\n";
}
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다