Я довольно озадачен синтаксическими строками, когда мне нужно определить в правиле минус, и это всего лишь минус-символ, а не диапазон символов между двумя конечными точками.Укажите кодировку без диапазонов intetreting
Например, когда вы пишете правило процента закодировать строку символов, как правило, будет писать
*(bk::char_("a-zA-Z0-9-_.~") | '%' << bk::right_align(2, 0)[bk::upper[bk::hex]]);
которое обычно означает «буквы, заглавные буквы, цифры, знак минус, подчёркивание, точка и Тильда» , но третий знак минус будет создавать диапазон между 9 и подчеркиванием или что-то еще, поэтому вы должны положить минус в конце bk::char_("a-zA-Z0-9_.~-")
.
Он решает текущую проблему, но что делать, когда вход динамический, например, пользовательский ввод и знак минус, означает минус-символ?
Как предотвратить использование Духом специального значения для любого из возможных символов?
EDIT001: Я прибегаю к более конкретному примеру из @sehe answer
void spirit_direct(std::vector<std::string>& result, const std::string& input, char const* delimiter)
{
result.clear();
using namespace bsq;
if(!parse(input.begin(), input.end(), raw[*(char_ - char_(delimiter))] % char_(delimiter), result))
result.push_back(input);
}
в случае, если вы хотите, чтобы убедиться, что минус рассматривается как минус, а не диапазон один бы, чтобы изменить код следующим образом (согласно @sehe предложение ниже).
void spirit_direct(std::vector<std::string>& result, const std::string&
input, char const* delimiter)
{
result.clear();
bsq::symbols<char, bsq::unused_type> sym_;
std::string separators = delimiter;
for(auto ch : separators)
{
sym_.add(std::string(1, ch));
}
using namespace bsq;
if(!parse(input.begin(), input.end(), raw[*(char_ - sym_)] % sym_, result))
result.push_back(input);
}
Какой выглядит довольно элегантно. В случае использования правила статической константы, я думаю, я могу избежать символов с символом «\», квадратные скобки означали как один из тех «специальных» символов, которые нужно экранировать. Зачем? Каково значение []? Есть ли какие-нибудь дополнительные символы для выхода?
ho-ho, у вас есть много :) Давайте посмотрим на ваш ответ http://stackoverflow.com/questions/30046512/splitting-string-using-boost-spirit считают, что «разделитель» есть «, | - ~ », тогда он будет захватывать 4 разделителя (',', '|', '}', '~'), когда средний Джо имел в виду еще 4 разделителя, но ',', '|', '-', '~'. Я не могу указать шаблон для ввода слишком «далеко», и он должен быть обратно совместимым (минус просто означает минус). Что касается следующих точек - 1) не изящный. 2a) выглядит громоздким, но, возможно, я не получил его. 2b) намного лучше, но опять же не вершина элегантности. 2c) выглядит так, как приказал доктор – kreuzerkrieg
@kreuzerkrieg «он должен быть обратно совместим» - см., Есть ваши спецификации! И о связанном ответе ... [что не так с простым заказом] (http://coliru.stacked-crooked.com/a/2b21fd6d120e393c)? – sehe
thats it, это не МОЯ спецификация ... длинный рассказ ... Заказывающий материал - хороший, он приятный и уродливый :) ИМХО, символы <> материал читабельнее и понятнее – kreuzerkrieg