Проблема с 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;
};

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

2

Решение

Вам нужен дополнительный экранирующий уровень:

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

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

2

Другие решения

Других решений пока нет …