- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
bool EqnExprEvaluator::SetEqn(const std::string& eqnStr) {
typedef std::string::const_iterator iterator_type;
EquationExpr<iterator_type> eqnExpr;
std::string::const_iterator iter = eqnStr.begin();
std::string::const_iterator iterEnd = eqnStr.end();
bool result;
try {
result = qi::phrase_parse(iter, iterEnd, eqnExpr, boost::spirit::ascii::space, *m_expressionAST);
std::cout << "777777777777 ok, result = " << result << std::endl;
}
catch (const std::exception &e) {
throw e;
}
catch (...) {
throw std::runtime_error("Parser error");
}
return result;
}
///////////////////////////////////////////////////////////////////////////
// Equation grammar
///////////////////////////////////////////////////////////////////////////
template <typename Iterator>
struct EquationExpr : qi::grammar<Iterator, ExpressionAST(), ascii::space_type>
{
static ExpressionAST make_binary_op(char op, const ExpressionAST &left,
const ExpressionAST &right) {
ExpressionAST ast;
ast.expr = binary_op(op,left,right);
return ast;
};
//
// Typedefs to make the code less verbose
//
typedef qi::rule<Iterator, std::string(), ascii::space_type> RuleString;
typedef qi::rule<Iterator, ExpressionAST(), ascii::space_type> RuleAst;
typedef qi::rule<Iterator, ExpressionAST(),
qi::locals<ExpressionAST>,
ascii::space_type> RuleAstLocalVar;
EquationExpr() : EquationExpr::base_type(expression_root,"equation") {
boost::phoenix::function<negate_expr> neg;
boost::phoenix::function<sqrt_expr> sqrtfunc;
using qi::_val;
using qi::_1;
using qi::_2;
using qi::_3;
using qi::_4;
using qi::double_;
using qi::lit;
using qi::_a;
using qi::_pass;
using qi::char_;
using qi::string;
using qi::alpha;
using qi::alnum;
using boost::phoenix::val;
std::string varName;
pow = lit("pow") > '(' >> expression [_a = _1 ]
> lit(",")
> expression [_val = boost::phoenix::bind(make_binary_op,'^', _a,_1)]
> ')'
;
sqrt= lit("sqrt") > '(' >
expression [_val = sqrtfunc(_1)]
>> ')'
;
expression_root = qi::eps >> expression;
expression =
term [_val = _1]
>> *( ('+' >> term [_val += _1])
| ('-' >> term [_val -= _1])
)
;
term =
factor [_val = _1]
>> *( ('*' >> factor [_val *= _1])
| ('/' >> factor [_val /= _1])
)
;
allowed_variable = '@' >
(
string("length") [_val = _1]
| string("width") [_val = _1]
| string("temperature") [_val = _1]
| string("deltaT") [_val = _1]
)
;
illegal_variable = ! lit('@') > alpha > *alnum [_val = _1 ] > !qi::eps [_pass]
;
badPow = lit("pow") >> '(' >> expression >> !lit(",") [_pass]
;
factor =
double_ [_val = _1]
| allowed_variable [_val = _1]
| pow [_val = _1]
| sqrt [_val = _1]
| '(' >> expression [_val = _1] >> ')'
| ('-' >> factor [_val = neg(_1)])
| ('+' >> factor [_val = _1])
| badPow
| illegal_variable [_val = _1]
;
//
// Naming the rules
//
pow.name("pow");
sqrt.name("sqrt");
expression_root.name("expression");
term.name("term");
allowed_variable.name("allowed_variable");
factor.name("factor");
//
// Error handler
//
qi::on_error<qi::fail>
(
expression_root,
std::cout << val("Error equation equation ")
<< boost::phoenix::construct<std::string>(_1,_2)
<< val ("\n")
);
qi::on_error<qi::fail>
(
badPow,
std::cout << val("Error parsing function 'pow'. Didn't find second argument ")
<< boost::phoenix::construct<std::string>(_1,_2)
<< val ("\n")
);
qi::on_error<qi::fail>
(
pow,
std::cout << val("Error parsing function 'pow' ")
<< boost::phoenix::construct<std::string>(_1,_2)
<< val ("\n")
);
qi::on_error<qi::fail>
(
allowed_variable,
std::cout << val("Error parsing allowed variables ")
<< val ("'\n")
<< val (" Allowed at @length, @width , @temperature, and @deltaT")
<< val ("'\n")
);
qi::on_error<qi::fail>
(
illegal_variable,
std::cout << val("Error parsing variable ")
<< val (" here: Got an illegal variable '")
<< "Arg " << boost::phoenix::construct<std::string>(_1,_2) << "'" << std::endl
<< "Arg4 " << _4 << std::endl
<< boost::phoenix::construct<std::string>(_3,_2)
<< val ("'\n")
<< val (" Allowed at @length, @width , @temperature and @deltaT")
<< val ("'\n")
);
}
RuleAst expression, term, factor,sqrt, expression_root;
RuleString allowed_variable,illegal_variable;
RuleAstLocalVar pow, badPow;
};
对于这个语法,打印错误信息qi::on_error<qi::fail> (illegal_variable,...
, 但 phrase_parse 返回 true
.谁能解释一下这怎么可能?
错误打印没问题,但phrase_parse 不应该返回false
对于那种情况?
最佳答案
on_error 处理程序定义了您要执行的操作。
您想在操作中设置 qi::_pass = false
。
关于c++ - qi::phrase_parse 返回真,即使调用了 qi::on_error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35089696/
大家好,我是 boost 和 boost::spirit 的新手,很抱歉提出新手问题。 当我使用qi::phrase_parse函数时,该函数只返回bool变量,表示解析是否成功,但我不知道在哪里可以
具体来说,使用语法 g,我如何解析字符串 s ?我应该给出什么论据?我尝试了很多调用,但总是出错。 此外,由于我还不确定稍后会使用哪一个,所以使用 phrase_parse 会有什么不同吗? name
我已经使用 boost::spirit 实现了简单的 ascii 解析器.目标 ascii 文件看起来像 n 0 23 45 10.0 0.5 ..... n-1 x y ..... 但它在 meas
我正在学习使用 boost::spirit 库。我拿这个例子http://www.boost.org/doc/libs/1_56_0/libs/spirit/example/qi/num_list1.
我要解析字符串 std::string entry = "127.0.0.1 - [16/Aug/2012:01:50:02 +0000] \"GET /check.htm HTTP/1.1\
bool EqnExprEvaluator::SetEqn(const std::string& eqnStr) { typedef std::string::const_iterator
在解析期间,我有一些属性只需要在语义操作中设置(因为它们是从正在解析的数据派生的,我想避免 global 变量和对 BOOST_FUSION_ADAPT_STRUCT #include #inclu
下面的代码是将“key=val;..”字符串解析为 std::map 并且编译失败并出现错误: Error C2146 : syntax error: missing '>' before ident
为什么 qi::phrase_parse 为 qi::eol 返回 false?我希望它像 qi::parse 那样返回 true。 using namespace boost::spirit; co
我正在用 Boost.Spirit 做一个 IRC 消息解析器,但是当我尝试解析一个输入时我遇到了一个(很长的)错误。我遵循了“Roman Numerals”示例。此外,我将 g++4.7 与 -st
我目前正在尝试使用 boost::spirit::qi::phrase_parse 完成一些工作但我无法自己解决这个问题。 值得一提:我对 boost 和 boost::spirit 是全新的。 我收
我是一名优秀的程序员,十分优秀!