所以,我有以下精神业力规则体:
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
为整数(是的,这是错误的,这只是一个实验)。
问题:
当点为零时,如何使用精神 eps 构造对占位符执行指针测试以防止规则体评估?
与所有“C++ 函数式编程库使用”问题一样,我希望答案让我感觉自己像个傻瓜。
答案
Ildjam 的观点直接回答了我的问题。我的问题有两个问题;上面有个间接问题。这与 PEG 中的条件有关。我想表达的应该这样写:
rule = ( eps(_r) << ( /* grammar for when pointer is not null */ ) )
| eps // otherwise dont do anything.
;
我使用语义动作主体(在 [] 块中指定)来表达语法的条件部分。奇怪的是,虽然我之前写过条件 PEG 语法,但我只是犯了一个错误,导致了第二类问题。
因此, eps(_r1) 可以解决问题,第二种类型的编译问题与问题无关。