Я пытаюсь проанализировать цитированную строку с помощью escape-последовательностей с помощью Boost :: Spirit. К сожалению, кажется, что включение котировок в определение грамматики вызывает массовые (-не бесполезные) ошибки времени компиляции (как можно было бы ожидать с помощью Boost). Опускание котировок позволяет компилировать программу, но, очевидно, она не будет вести себя так, как предполагалось. Это код (на самом деле часть более широкой картины, но она демонстрирует проблему):Boost :: Spirit не удается скомпилировать при попытке выполнить синтаксический анализ цитируемого строкового литерала
#include "boost/spirit/include/qi.hpp"
#include "boost/proto/deep_copy.hpp"
#include "boost/optional.hpp"
#include <string>
using boost::spirit::qi::char_;
using boost::spirit::qi::lexeme;
using boost::proto::deep_copy;
auto string_literal = deep_copy(
lexeme[
// char_('"')
/* >> */ *((char_ - '"' - '\\') | (char_('\\') >> char_))
// >> char_('"')
]);
template <class Iterator, class Grammar>
boost::optional<std::string> parse_string(Iterator first, Iterator last, Grammar&& gr)
{
using boost::spirit::qi::space;
using boost::spirit::qi::phrase_parse;
std::string temp;
bool success = phrase_parse(
first,
last,
gr,
space,
temp
);
if (first == last && success)
return temp;
else return boost::none;
}
int main()
{
std::string str;
std::cout << "string_literal: ";
getline(std::cin, str);
auto presult = parse_string(str.begin(), str.end(), string_literal);
if (presult) {
std::cout << "parsed: " << *presult;
} else
std::cout << "failure\n";
return 0;
}
раскомментирован комментировали части string_literal
«s определение приводит к ошибкам. В текущем состоянии (с комментариями) код компилируется. Я пробовал несколько вещей, таких как перемещение котировок в parse_string
, а также использование менее конкретного определения (одно из них является наименее конкретным, я мог бы придумать, что все еще полезно, правильная грамматика находится в OCaml language manual, но я что я могу просто проверять escape-последовательности отдельно), но ничего не получилось.
Моя версия Boost 1.56.0, а мой компилятор MinGW-w64 g ++ 4.9.1. Любая помощь вообще ценится.
спасибо. Я, честно говоря, не уверен, что думать о Духе больше, все эти ужасы утомляют, и документация, скорее всего, отсутствует. Я бы это знал, если бы я прочитал документацию с обложки до крышки? Независимо от того, это было очень полезно - я, скорее всего, подойду с подходом 'qi :: raw []', так как мой текущий проект сначала рассматривает все литералы как исходные строки, а затем использует отдельную функцию для «извлечения» фактических значений из них , –
Я предполагаю, что вы бы знали: я просто связал http://tinyurl.com/alternative-attributes с http://tinyurl.com/sequence-attributes docs, чтобы добраться до 'варианта, char> там. Если вам нравится, есть ** [способы его обнаружения] (http://stackoverflow.com/questions/9404189/detecting-the-parameter-types-in-a-spirit-semantic -action) **. Тем не менее, да, у Духа есть свои подводные камни (хотя вы немного подталкиваете их, не придерживаясь общих идиом, например, используя «deep_copy», таким образом, обходят края того, что возможно в Spirit v2, мне понравился результирующий стиль, Кстати). –
sehe
Мне потребовалось около 10 минут, чтобы действительно увидеть проблему здесь, поэтому вы не услышите, что я говорю, что проблем нет. Опять же, я хорошо знаю дух, и я бы не написал эту ошибку сам (я понял бы эффект 'char _ ('\\')' на синтезированные атрибуты при написании его). Так что, возможно, вам просто нужно дать ему некоторое время. Там определенно компромиссы, и я делал случаи _againt_ Spirit в прошлом. Но я по-прежнему рассматриваю его как очень ценный инструмент для некоторых работ. Я бы не хотел быть без него. – sehe