Я довольно новичок в Boost Spirit. В идеале я хотел бы удостовериться, что две ценности в моей грамматике одинаковы с использованием Phoenix. Опущенная версия того, что я пытаюсь получить, будет кортежем, где оба ints равны.Используйте Boost Phoenix в Ци, чтобы ссылаться на предыдущий матч в грамматике
Я хотел бы, чтобы строка «14,14, test» была проанализирована, но «14,12, test» потерпела неудачу, так как 14 не равно 12. Мне нужен код ниже для печати:
Good: (14 14 test)
Fail
В настоящее время оба входа будут проходить с тех пор, как я разрешаю, и qi :: int_ для синтаксического анализа второго значения без каких-либо проверок.
#include <iostream>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
#include <boost/fusion/include/vector.hpp>
#include <boost/spirit/include/qi_matches.hpp>
#include <string>
#include <vector>
#include <algorithm>
namespace qi = boost::spirit::qi;
namespace phx = boost::phoenix;
int main(){
std::vector<std::string> test_inputs = {"14,14,test","14,12,test"};
std::for_each(test_inputs.begin(),test_inputs.end(),[](const std::string& input){
boost::fusion::vector<int,int,std::string> result;
int i(0);
auto res = qi::parse(input.begin(),input.end(),
//works but also parses "14,12,test"
qi::int_[phx::ref(i) = qi::_1] >> qi::lit(",") >> qi::int_ >> qi::lit(",") >> +qi::char_,
//Fails to compile
//qi::int_[phx::ref(i) = qi::_1] >> qi::lit(",") >> qi::int_(phx::val(i)) >> qi::lit(",") >> +qi::char_,
//qi::int_[phx::ref(i) = qi::_1] >> qi::lit(",") >> qi::int_(phx::ref(i)) >> qi::lit(",") >> +qi::char_,
result);
if(res){
std::cout << "Good: " << result << std::endl;
}
else{
std::cout << "Fail" << std::endl;
}
});
}
Я могу использовать ФЕНИКС :: реф, чтобы захватить первое значение, но я не могу понять, чтобы проверить мой второй ци :: int_ анализатор для значения двутавровых. Я пробовал использовать phoenix :: val и phoenix :: ref без компиляции удачи. В идеале я хотел бы зафиксировать значение во втором int и подумал, что парсер int_ возьмет ленивый литерал из Phoenix.
Спасибо за любую помощь по этому вопросу.
Альтернатива, использующая 'phx :: ref' дважды, которую вы отметили как не скомпилированные работы, если вы определяете' BOOST_SPIRIT_USE_PHOENIX_V3' при использовании g ++ 4.8.1 и boost 1.54. Я бы рекомендовал использовать это определение всегда, оно решает множество проблем. – llonesmiz
Я имел в виду определение перед включением заголовков. Вы можете увидеть это [здесь] (http://coliru.stacked-crooked.com/a/01cbe1ce2b361a3d). В любом случае я думаю, что должны быть альтернативные решения, поэтому, надеюсь, вы получите информативный ответ. – llonesmiz
Определяет код для компиляции для меня как в gcc 4.7, так и в Clang. Благодаря! – Joel