【问题标题】:boost spirit: how to match any lexer token in qi?boost Spirit:如何匹配 qi 中的任何词法分析器标记?
【发布时间】:2015-06-09 08:50:03
【问题描述】:

我想将 C++ 函数声明与默认参数值匹配,但忽略这些值。 例如:

int myFunction(int a, int b = 5 + 4);

这是词法分析器的(一部分):

struct Lexer : boost::spirit::lex::lexer<lexer_type>
{
    Lexer()
    {
        identifier = "[A-Za-z_][A-Za-z0-9_]*";
        numLiteral = "([0-9]+)|(0x[0-9a-fA-F]+)";

        this->self.add
            ("int")
            ('+')
            ('=')
            ('(')
            (')')
            (';')
            (',')
            (identifier)
            (numLiteral);
    }
};

我想写几个解析器规则,比如:

function = qi::lit("int") >> lexer.identifier >> '(' >> arglist >> ')' >> ';';
arglist = (lexer.numLiteral >> lexer.identifier >> -(lit('=') >> rvalue )) % ',';
rvalue = +(qi::token() - ',' - ')');

我已经看到 here 说“解析器原语 qi::token 和 qi::tokenid 现在可以在没有任何参数的情况下使用。在这种情况下,它们将匹配任何令牌。”。这是我想要的(也是我写的),但不幸的是它没有编译。 qi::token() 至少需要一个参数。 我错过了什么吗?

【问题讨论】:

  • 你没有显示任何 SSCCE,所以我不会浪费任何时间。您是否尝试过不使用括号(这是 EDSL 约定,cf. qi::stringqi::string("value")
  • 谢谢@sehe 的提示:没有括号。现在它编译了。顺便问一下,什么是 EDSL?
  • Edsl: Embedded Domain Specific Language (精神的表达模板是一个例子;凤凰的懒惰演员[在语义行动中]是另一个)

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


【解决方案1】:

好的,因为这显然足以回答它:

这是我想要的(以及我写的),但不幸的是它无法编译。 qi::token() 至少需要一个参数。我错过了什么吗?

可能你错过的还不够多:你离开()了吗?因为在 EDSL 中,删除无参数版本的括号是惯例(cf. qi::stringqi::string("value")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多