【发布时间】:2019-08-09 07:49:10
【问题描述】:
我正在用 Spirit X3 编写另一个无聊的计算器解析器,但遇到了一个问题:我定义了 2 个字面量,“cos”和“cosh”,每个字面值后面都应该跟一个数字。我写的规则是:
const std::string COS_TAG = "cos";
const std::string COSH_TAG = "cosh";
const auto cos = (COS_TAG > value)[math::cos_solver{}];
const auto cosh = (COSH_TAG > value)[math::cosh_solver{}];
(我知道语义操作不是首选方式,但我很懒)。 现在,解析“cosh 3.5”时的问题是:
expectation failure: expecting value here "cosh 3.5"
----------------------------------------------^-----
看起来解析器很急切并使用第一个标签而不检查另一个标签。我已经通过使用这样的差异运算符使其工作:
const std::string COS_TAG = "cos";
const std::string COSH_TAG = "cosh";
const auto cos = ((x3::lit(COS_TAG) - COSH_TAG) > value)[math::cos_solver{}];
const auto cosh = (COSH_TAG > value)[math::cosh_solver{}];
有更好的方法吗?
【问题讨论】:
标签: boost boost-spirit eager