【问题标题】:How to use Boost Spirit auto rules with AST?如何在 AST 中使用 Boost Spirit 自动规则?
【发布时间】:2013-03-09 22:53:55
【问题描述】:

编辑:当我想在另一个规则上使用它时,我扩展了 sehe 的示例以显示问题:http://liveworkspace.org/code/22lxL7$17

我正在尝试提高我的 Boost Spirit 解析器的性能,我发现从 C++11 开始,可以使用这样的自动规则:

auto comment = "/*" >> *(char_ - "*/") >> "*/"; 

(或使用 BOOST_AUTO 或 BOOST_SPIRIT_AUTO)。

我有一个这样的规则声明器:

qi::rule<lexer::Iterator, ast::SimpleType()> simple_type;

并像这样定义:

simple_type %=
        const_
    >>  lexer.identifier;

如果我用 auto 声明它,它会编译,但它不能在其他规则中用作 AST。

是否可以使用自动规则定义创建 AST 的规则? 我也对在 Boost Spirit 中加速 AST 创建的其他方法感兴趣。

【问题讨论】:

  • 什么是“ast::SimpleType”?这是lexer.identifier 的属性吗?

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


【解决方案1】:

首先,我尝试了一个简单的示例,并通过一个简单的改编结构“它适用于我”:

struct fixed
{
    int integral;
    unsigned fractional;
};

BOOST_FUSION_ADAPT_STRUCT(fixed, (int, integral)(unsigned, fractional));

template <typename It, typename Skipper = qi::space_type>
    struct parser : qi::grammar<It, std::vector<fixed>(), Skipper>
{
    parser() : parser::base_type(start)
    {
        using namespace qi;

        BOOST_SPIRIT_AUTO(qi, fixed_rule, lexeme [ int_ >> -('.' >> uint_ | attr(0u)) ]);
        start = *fixed_rule;

        BOOST_SPIRIT_DEBUG_NODE(start);
    }

  private:
    qi::rule<It, std::vector<fixed>(), Skipper> start;
};

这会愉快地解析输入:http://liveworkspace.org/code/22lxL7$1

我想你可能是指需要属性兼容性的地方,并且

应该能够在这些情况下提供帮助很好

有关 attr_cast(以及一般属性兼容性)的更多详细信息,请参阅此答案:String parser with boost variant recursive wrapper

【讨论】:

  • 您好,谢谢您一如既往的出色回答。我尝试使用attr_castas,但我没有成功在变体中使用自动规则:liveworkspace.org/code/22lxL7$17。我应该在哪里使用attr_castas
  • @BaptisteWicht 见here。我不能让它与 attr_cast 一起工作。这个“微规则”的另一个重要问题是它们之间不能存在循环依赖关系(至少我看不出如何)(我的意思是this,其中expression 依赖于term;@ 987654337@ factorfactor expression)。
  • @llonesmiz 谢谢,你打败了我。 (早上好)
  • @llonesmiz 谢谢,它工作。但是我没有想到循环依赖的限制,我的语法中有很多限制:(
  • 那个,而且我不认为可以使用 BOOST_SPIRIT_DEBUG 或类似方法来调试“自动”解析表达式(not 规则)。
【解决方案2】:

没有“自动规则”之类的东西。当您自动捕获这样的表达式时,您将使用所有默认值来创建规则。所以这个“自动规则”的属性将完全是表达式的属性,没有属性转换。

如果您需要创建特殊的属性数据(即:您需要将传入的属性类型转换为您自己的数据),您必须使用规则或语义操作。

【讨论】:

  • 嗯。我认为这不准确。让我弄清楚:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-27
  • 1970-01-01
相关资源
最近更新 更多