Итак, у меня есть следующее тело правила духовной кармы:
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 ++», я ожидаю, что ответ заставит меня чувствовать себя бестолковым.
Ответ
Точка Ильджама прямо отвечает на мой вопрос. Были две проблемы с моей проблемой; выше есть косвенная проблема. И это связано с условностями в PEG. То, что я пытаюсь выразить, должно быть написано так:
rule = ( eps(_r) << ( /* grammar for when pointer is not null */ ) )
| eps // otherwise dont do anything.
;
Я использовал тело семантического действия (указанное в блоке []), чтобы выразить условную часть грамматики. Как ни странно, хотя раньше я писал условные грамматики PEG, я просто допустил ошибку, которая привела ко второму классу проблем.
Итак, eps (_r1) делает свое дело. Второй тип проблемы компиляции не имеет отношения к вопросу.