我需要解析一个表达式并且我正在使用boost :: spirit,表达式必须具有表单 (@anything但是跟随字符串.PV @), 我正在使用以下语法
P = S >> "." >> V;
S = ch_p('@') >> +~ch_p('@');
V = str_p(".PV@");
但是不起作用,你能告诉我错误在哪里吗?我需要用语法来做,我使用命名空间boost :: spirit
答案 0 :(得分:2)
更新为了完整性添加正则表达式方法(参见底部)
在精神V2中,我建议更简单
P = S >> V;
S = '@' >> +(char_ - '@' - V);
V = ".PV@";
假设您并不意味着需要双.
。查看测试计划 Live On Coliru 。
另外,请注意精神存储库中的confix
解析器,它可以更简洁地执行此操作:
confix('@', ".PV@")[+(char_ - '@' - ".PV@")]
同时查看 Live On Coliru 。
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/repository/include/qi_confix.hpp>
namespace qi = boost::spirit::qi;
using boost::spirit::repository::confix;
int main()
{
std::string const input("@anything but &at; followed of the string .PV@");
std::string parsed;
auto f(input.begin()), l(input.end());
bool ok = qi::parse(
f, l,
confix('@', ".PV@") [+(qi::char_ - '@' - ".PV@")],
parsed);
if (ok) std::cout << "parse success\ndata: " << parsed << "\n";
else std::cerr << "parse failed: '" << std::string(f,l) << "'\n";
if (f!=l) std::cerr << "trailing unparsed: '" << std::string(f,l) << "'\n";
return ok? 0 : 255;
}
输出:
parse success
data: anything but &at; followed of the string
根据您的使用案例,您可以使用正如评论中指出的正则表达式。查看简单演示 Live On Coliru
#include <boost/regex.hpp>
using boost::regex;
int main()
{
std::string const input("@anything but &at; followed of the string .PV@");
boost::smatch matches;
if(regex_search(input, matches, regex("@(.*?)\\.PV@")))
std::cout << "Parse success, match string: '" << matches[1] << "'\n";
}
请记住,
std::regex
在我知道的任何编译器/平台