【问题标题】:Trouble with boost::spirit::lex - punctuation charactersboost::spirit::lex 的问题 - 标点符号
【发布时间】:2012-11-14 13:55:56
【问题描述】:

我想创建一个包含 '[' 或 ']' 或 '&>' 等字符序列的 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;
};

但这给了我一些关于无法识别的转义字符和用它对字符串进行词法分析失败的警告。我怎样才能正确地做到这一点?

【问题讨论】:

    标签: c++ boost boost-spirit boost-spirit-lex


    【解决方案1】:

    你需要一个额外的转义级别:

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

    "\\" 是一个包含一个反斜杠的字符串文字,然后词法分析器构造函数会对其进行解析。

    【讨论】:

    • 谢谢 - 就是这样。唯一不幸的是,正则表达式多了一层“混淆”
    • @TobiasLangner 如果你会使用 c++11,raw string literals 会有很大帮助。
    猜你喜欢
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多