Проблемы с boost::spirit::lex - знаки пунктуации

Я хочу создать lex::token_def‹>, содержащий последовательности символов, такие как '[' или ']' или '&>'

Я попытался экранировать необходимые символы:

namespace lex = boost::spirit::lex;

enum LexerIDs { ID_IDENTIFIER, ID_WHITESPACE, ID_INTEGER, ID_FLOAT, ID_PUNCTUATOR };

template <typename Lexer>
struct my_lexer : lex::lexer<Lexer>
{
    my_lexer() : punctuator("\[|\]|\(|\)|\.|&>|\*\*|\*|\+|-|~|!|/|%|<<|>>|<|>|<=|>=|==|!=")
    {
        this->self.add(punctuator, ID_PUNCTUATOR);
    }
    lex::token_def<> punctuator;
};

но это дает мне некоторое предупреждение о нераспознанных экранированных символах и сбое лексической строки с ним. Как я могу сделать это правильно?


person Tobias Langner    schedule 14.11.2012    source источник


Ответы (1)


Вам нужен дополнительный уровень побега:

my_lexer() : punctuator("\\[|\\]|\\(|\\)|\\.|&>|\\*\\*|\\*|\\+|-|~|!|/|%|<<|>>|<|>|<=|>=|==|!=")

"\\" — это строковый литерал, содержащий одну обратную косую черту, которую затем анализирует конструктор лексера.

person Angew is no longer proud of SO    schedule 14.11.2012
comment
спасибо - это так. Единственная печальная вещь заключается в том, что регулярные выражения получают дополнительный уровень «обфускации». - person Tobias Langner; 14.11.2012
comment
@TobiasLangner Если вы можете использовать c++11, необработанные строковые литералы может очень помочь. - person ; 14.11.2012