Нечувствительные к регистру ключевые слова с boost::spirit::lex
Есть ли способ распознать конкретные шаблоны без учета регистра?
Например, если у меня есть
literal_bool = L"True|False";
this->self.add(literal_bool, TokenId_LiteralBool);
Как я могу соответствовать true
, TRUE
, tRuE
избегая при этом писать [Tt][Rr][Uu][Ee]
для каждого ключевого слова?
1 ответ
Регулярные выражения поддерживаются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);
Реализация для обычных (не широких) строк:
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;
}