【问题标题】:Skip parts of the input in boost::spirit::qi if a function call comes back true如果函数调用返回 true,则跳过 boost::spirit::qi 中的部分输入
【发布时间】:2011-12-20 02:35:23
【问题描述】:

我最近一直在玩 boost::spirit::qi 并且一直在尝试编写我自己的(非常非常简单的)脚本语言来解析它。当我处理脚本中的 if 语句时,我遇到了麻烦。如果函数调用返回真,我需要解析器跳过部分输入。

例如,我将标记定义为接受变量名 (a-zA-Z_),并将比较设置为接受“>”或“

comparison_statement = token >> comparison >> token;
statement            = lit("if ") >> comparison_statement[&compare] >> "then";

qi::phrase_parse(first, last, script, space);  // This call the parser

如果函数 compare 返回 true,我将如何跳过下一部分?

【问题讨论】:

  • 这正是epsilon parser 的用途;你试过了吗?
  • 不,我是 Boost 新手,从未见过。我已经查看了文档,但它有点令人困惑,你能给我一个如何使用它的例子吗?谢谢:)
  • “语义谓词”段落相关示例。
  • 我觉得这个问题有点愚蠢,但是这怎么能用来跳过部分输入呢?我正在阅读,因为当函数返回 false 时,它​​会引发解析错误。那怎么能用作条件呢?
  • 通过在备选方案 (|) 的一侧拥有 eps 分支,在备选方案的另一侧拥有其他东西(可能是 noop)。

标签: c++ boost boost-spirit boost-spirit-qi


【解决方案1】:

可以使用Epsilon Parser 编写解析器中的条件。这将调用您提供给它的函数,如果该函数返回 false,则该特定检查将失败并继续进行下一个或。

例如:

qi::rule<Iterator, std::string(), ascii::space_type> rool;
rool = a | b | eps(f) | d

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多