Нечувствительные к регистру ключевые слова с 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;
}
Другие вопросы по тегам