使用boost :: spirit :: lex - 标点字符的麻烦

时间:2012-11-14 13:55:57

标签: c++ boost boost-spirit 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;
};

但是这给了我一些关于无法识别的转义字符和警告的警告。 lexing一个字符串失败。我怎么能正确地做到这一点?

1 个答案:

答案 0 :(得分:2)

您需要额外的转义级别:

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

"\\"是一个包含一个反斜杠的字符串文字,lexer构造函数然后解析它。