Повышение духа: как сопоставить любой лексер-токен в ци?

Я хотел бы сопоставить объявление функции 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() - ',' - ')');

Я видел здесь, что "Примитивы синтаксического анализатора qi::token и qi::tokenid теперь могут использоваться без каких-либо аргументов. В этом случае они будут соответствовать любому токену". Что я хочу (и что я написал), но, к сожалению, не компилируется. qi::token() действительно нуждается как минимум в одном аргументе. Я что-то пропустил?

1 ответ

Решение

Хорошо, так как этого было достаточно, чтобы ответить на него:

Что я хочу (и что я написал), но, к сожалению, не компилируется. qi::token() действительно нуждается как минимум в одном аргументе. Я что-то пропустил?

Вероятно, вы не пропустили достаточно: вы покинули ()? Потому что в EDSL принято исключать скобки для версии без параметров (см. qi::string против qi::string("value"))

Другие вопросы по тегам