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