语法问题

时间:2014-01-26 15:41:42

标签: c++ parsing boost-spirit

我需要解析一个表达式并且我正在使用boost :: spirit,表达式必须具有表单 (@anything但是跟随字符串.PV @), 我正在使用以下语法

P = S >> "." >> V;

S = ch_p('@') >> +~ch_p('@');

V = str_p(".PV@");

但是不起作用,你能告诉我错误在哪里吗?我需要用语法来做,我使用命名空间boost :: spirit

1 个答案:

答案 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";
}

请记住,

  • Boost Regex仅标头,因此如果您尚未使用它,则会产生库依赖
  • std::regex在我知道的任何编译器/平台