2016-10-21 3 views
2

Есть ли способ распознать конкретные шаблоны без учета регистра?Нечувствительные к регистру ключевые слова с boost :: spirit :: lex

E.g. если у меня есть

literal_bool = L"True|False"; 
this->self.add(literal_bool, TokenId_LiteralBool); 

Как я могу соответствовать true, TRUE, tRuE, избегая при этом писать [Tt][Rr][Uu][Ee] для каждого ключевого слова?

ответ

4

Regular expressions supported by boost::spirit::lex включают в себя контроль индивидуальной чувствительности:

(?r-s:pattern)

применить опцию 'R' и опустить параметр 'S' в процессе интерпретации рисунка. Возможные значения могут быть ноль или более символов 'i' или 's'. 'i' означает нечувствительность к регистру. '-i' означает с учетом регистра. 's' изменяет значение синтаксиса '.', чтобы соответствовать любому одиночному символу. '-s' изменяет значение '.' для соответствия любому символу, кроме '\n'.

Таким образом, вы можете написать:

literal_bool = L"(?i:true|false)"; 
this->self.add(literal_bool, TokenId_LiteralBool); 

Оригинальный ответ

Введем функцию, которая делает случай шаблон нечувствительным:

literal_bool = L"True|False"; 
this->self.add(make_case_insensitive(literal_bool), TokenId_LiteralBool); 

Implementatio n для правильных (нешироких) строк:

std::string make_case_insensitive(const std::string& s) 
{ 
    std::string r; 
    std::string cC = "[xX]"; 
    for(char c : s) 
    { 
     if (std::isalpha(c)) 
     { 
      cC[1] = std::tolower(c); 
      cC[2] = std::toupper(c); 
      r += cC; 
     } 
     else 
      r += c; 
    } 
    return r; 
}