相关疑难解决方法(0)

仅在 Boost.Spirit.Qi 语法初始化的优化构建中出现分段错误

我在使用 Spirit Qi 编写解析器时遇到了一个奇怪的问题:我在某个地方有一个错误,该错误导致-O优化时崩溃,但没有优化则不会。它在语法的构造函数中崩溃:

template <typename Iterator>
struct math_expression_grammar : qi::grammar<Iterator, std::string()>
{
    qi::rule<Iterator, std::string()>
        expression,
        term,
        factorial,
        factor,
        pexpression,
        pfactor,
        nfactor,
        number;

    math_expression_grammar():
        math_expression_grammar::base_type(expression)
    {
        using namespace boost::spirit;
        using namespace boost::spirit::ascii;
        namespace sp = boost::spirit;
        namespace ph = boost::phoenix;

        auto sum = term[_val = sp::_1] >> lit('+') >> term[_val += sp::_1, _val += "+ "];
        auto difference = term[_val = sp::_1] >> lit('-') >> term[_val += sp::_1, _val += "- "];
        auto product = factor[_val = sp::_1] …
Run Code Online (Sandbox Code Playgroud)

c++ debugging gcc boost

5
推荐指数
1
解决办法
601
查看次数

提升与优化级别相关的Spirit V2 qi bug

我在业余时间开发代码。最好在调试模式下。最近,当我尝试构建发行版时,出现错误(运行时,输出:1\n2\n然后失败)。我位于一段代码(下图),其中包含错误,我发现,该错误只发生,当优化级别为-Os, -Ofast, -O2, -O3但不是-O, -O0, -O1, -Og。在发布模式下,我受调试能力的限制。错误原因是什么?查找此类错误的方法是什么?

#!/ usr / bin / env bash -vex WARN =“-W -Wall -Wextra” INCLUDE =“-isystem / c / libs / boost-trunk” OPT =“-O2” g ++ -x c ++--std = gnu ++ 1年$ INCLUDE

$ WARN $ OPT -oa << __ EOF && ./a && echo -e“ \ e [1; 32msucceeded \ e [0m” || 回声-e“ \ e [1; 31mfailed \ e [0m”

#include <iterator>
#include <string>
#include <iostream> …
Run Code Online (Sandbox Code Playgroud)

g++ boost-spirit compiler-optimization boost-spirit-qi

4
推荐指数
1
解决办法
550
查看次数

Boost.Spirit 将表达式转换为 AST

使用 Boost.Spirit 将某些表达式转换为 AST 的正确方法是什么?

我试图构建它,但我认为它很混乱并且可以简化很多。

https://godbolt.org/z/VXHXLY

#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>

namespace ast {
  struct unary_operator;
  struct binary_operator;

  struct expression {
    typedef boost::variant<
      double,
      std::string,
      boost::recursive_wrapper<unary_operator>,
      boost::recursive_wrapper<binary_operator>,
      boost::recursive_wrapper<expression>
    > type;

    expression() {

    }

    template<typename Expr>
    expression(const Expr &expr)
      : expr(expr) {

    }

    expression &operator+=(expression rhs);
    expression &operator-=(expression rhs);

    expression &operator*=(expression rhs);
    expression &operator/=(expression rhs);

    expression &and_(expression rhs);
    expression &or_(expression rhs);

    expression &equals(expression rhs);
    expression &not_equals(expression rhs);

    expression &less_than(expression rhs);
    expression &less_equals(expression rhs);
    expression &greater_than(expression rhs);
    expression &greater_equals(expression rhs);

    expression &factor(expression …
Run Code Online (Sandbox Code Playgroud)

c++ boost abstract-syntax-tree boost-spirit

2
推荐指数
1
解决办法
113
查看次数