【发布时间】:2011-06-01 16:38:58
【问题描述】:
所以,我有以下精神业力规则体:
base_rule =
eps(_r1 != 0) [ // _r1 is a pointer_typed placeholder
eps
]
;
这会导致来自 g++ 的相当长的错误消息(有帮助)以 :
结尾/opt/dev_64_swat/Boost/include/boost/spirit/home/phoenix/operator/comparison.hpp
:37:5: error: ISO C++ forbids comparison between pointer and integer
[-fpermissive]
这是有效的 c++:
struct zebra{};
int main()
{
zebra * x;
if( x == 0);
}
我想尝试 boost::phoenix::static_cast_<_r1_type *>(0) 以及将 _r1_type 转换为整数(是的,这是错误的,这只是一个实验)。
问题:
如何使用 Spirit eps 构造对占位符执行指针测试,以防止在点为零时对规则体进行评估?
与所有“C++ 函数式编程库的使用”问题一样,我希望答案会让我感觉自己像个笨蛋。
答案
Ildjam 的观点直接回答了我的问题。我的问题有两个问题;上面有个间接问题。这与 PEG 中的条件有关。我要表达的应该这样写:
rule = ( eps(_r) << ( /* grammar for when pointer is not null */ ) )
| eps // otherwise dont do anything.
;
我使用语义动作主体(在 [] 块中指定)来表达语法的条件部分。奇怪的是,虽然我之前写过条件 PEG 语法,但我只是犯了一个错误,导致了第二类问题。
所以,eps(_r1) 可以解决问题,第二种编译问题与问题无关。
【问题讨论】:
-
您是否尝试过使用隐式指针到
bool转换?base_rule = eps(_r1)[/*impl*/]; -
(+1) 是的,在
static_cast_尝试之后,我的大脑抛出了这个问题,可惜它不起作用。如果您想要错误消息,我可以将其添加到我的问题中。 -
不,我不认为这些错误在这种情况下会有用,只是想在尝试自己编译之前先问一下。 :-]
-
实际上,鉴于它对我有用,也许这些错误毕竟是有趣的......
标签: c++ boost boost-spirit boost-phoenix null-pointer