2015-05-12 2 views
1

Я довольно озадачен синтаксическими строками, когда мне нужно определить в правиле минус, и это всего лишь минус-символ, а не диапазон символов между двумя конечными точками.Укажите кодировку без диапазонов 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); 
} 

Какой выглядит довольно элегантно. В случае использования правила статической константы, я думаю, я могу избежать символов с символом «\», квадратные скобки означали как один из тех «специальных» символов, которые нужно экранировать. Зачем? Каково значение []? Есть ли какие-нибудь дополнительные символы для выхода?

ответ

1

Простой.

Вы разрабатываете и задаете поддерживаемые шаблоны, которые пользователь может предоставить своими значениями.

Далее

  • писать код, который преобразует его в символьного набора (например, расширить все диапазоны (если поддерживается на входе пользователя) и сортировать -, чтобы быть первым символом по определению).

  • не использовать набор символов вообще.

    • почему бы не использовать char_ [ _pass = my_match_predicate(_1) ]
    • почему бы не просто сделать чередование буквенных символов? lit('a') | 'b' | '-' | '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
    • почему бы не использовать qi::symbols<char, char> (или даже qi::symbols<char, qi::unused_type> sym_; с raw [ sym_ ] или аналогичный)

      Обновлениеqi::symbols<> подход на удивление быстро: Live On Coliru.Я был недавно работу по оптимизации, где он разочарован: см этот ответ (под «Spirit (TRIE)») - Binary String to Hex c++

В общем, я не знаю, что вы пытаетесь достигают, но Spirit не хорошо подходит для генерации правил на лету. См. Некоторые из моих существующих ответов на этом сайте.

+0

ho-ho, у вас есть много :) Давайте посмотрим на ваш ответ http://stackoverflow.com/questions/30046512/splitting-string-using-boost-spirit считают, что «разделитель» есть «, | - ~ », тогда он будет захватывать 4 разделителя (',', '|', '}', '~'), когда средний Джо имел в виду еще 4 разделителя, но ',', '|', '-', '~'. Я не могу указать шаблон для ввода слишком «далеко», и он должен быть обратно совместимым (минус просто означает минус). Что касается следующих точек - 1) не изящный. 2a) выглядит громоздким, но, возможно, я не получил его. 2b) намного лучше, но опять же не вершина элегантности. 2c) выглядит так, как приказал доктор – kreuzerkrieg

+1

@kreuzerkrieg «он должен быть обратно совместим» - см., Есть ваши спецификации! И о связанном ответе ... [что не так с простым заказом] (http://coliru.stacked-crooked.com/a/2b21fd6d120e393c)? – sehe

+0

thats it, это не МОЯ спецификация ... длинный рассказ ... Заказывающий материал - хороший, он приятный и уродливый :) ИМХО, символы <> материал читабельнее и понятнее – kreuzerkrieg

0

Вы пытались использовать \ - bk::char_("a-zA-Z0-9\\-_.~")?

+0

nope, так как я ищу что-то вроде директивы, которая отключает специальный символ, означающий – kreuzerkrieg

+1

@kreuzerkrieg его не существует. – sehe

Смежные вопросы