我在使用 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) 我在业余时间开发代码。最好在调试模式下。最近,当我尝试构建发行版时,出现错误(运行时,输出: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) 使用 Boost.Spirit 将某些表达式转换为 AST 的正确方法是什么?
我试图构建它,但我认为它很混乱并且可以简化很多。
#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 ¬_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)