2015-05-12 30 views
1

當我必須在規則中定義負號時,我對解析字符串感到非常困惑,它只是一個負號字符,而不是兩個端點之間的字符範圍。指定一個沒有解釋範圍的字符集

例如,當你寫一個規則%的編碼字符的字符串,你通常會寫

*(bk::char_("a-zA-Z0-9-_.~") | '%' << bk::right_align(2, 0)[bk::upper[bk::hex]]); 

這通常意味着「字母,大寫字母,數字,減號,下劃線,點和波浪線」 ,但第三個減號將創建一個介於9和下劃線之間的範圍,所以您必須將減號放在末尾bk::char_("a-zA-Z0-9_.~-")

它解決了當前的問題,但是當輸入是動態的時候,像用戶輸入一樣,減號表示減號字符會怎麼做呢?

我該如何防止Spirit對任何可能的字符賦予特殊含義?

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); 
} 

的情況下,要確保負被視爲負,而不是一人會改變的代碼如下(根據下面的提議)。

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>(或者甚至raw [ sym_ ]或類似qi::symbols<char, qi::unused_type> sym_;

      更新qi::symbols<>做法是快得驚人:Live On Coliru。我有一個最近的優化工作在那裏感到失望:看到這個答案(下「精神(特里)」) - Binary String to Hex c++

一般情況下,我不知道你想什麼實現,但精神是而不是非常適合在飛行中生成規則。請參閱我網站上現有的解答。

+0

ho-ho,你有很多:)讓我們看看你的答案http://stackoverflow.com/questions/30046512/splitting-string-using-boost-spirit認爲「分隔符」是「,| - 〜 「那麼當平均Joe也意味着4個分隔符,但是'','',' - ','〜'時,它將捕獲4個分隔符(',','|','}','〜')。我無法指定輸入模式太「遙遠」,它應該向後兼容(減去只是表示減去)。至於下一點 - 1)不優雅。 2a)看起來很麻煩,但也許我沒有得到它。 2b)好得多,但又不是優雅的頂峯。 2c)看起來像醫生所訂的 – kreuzerkrieg

+1

@ kreuzerkrieg「它應該向後兼容」 - 請參閱,這是您的規格!關於相關答案...... [簡單排序有什麼問題](http://coliru.stacked-crooked.com/a/2b21fd6d120e393c)? – sehe

+0

多數民衆贊成它,它不是我的規格...長故事...訂購的東西 - 好的,它是好的和醜陋的:)恕我直言,符號<>的東西更易於理解 – kreuzerkrieg

0

您是否嘗試過使用\ - bk::char_("a-zA-Z0-9\\-_.~")

+0

因爲我正在尋找類似於禁用特殊字符含義的指令 – kreuzerkrieg

+1

@kreuzerkrieg它不存在。 – sehe

相關問題