Search code examples
c++boost-spiritboost-spirit-qiboost-spirit-lex

How to ignore a token attribute from spirit::Lex when using spirit::qi?


When I use this qi grammar accepting tokens from Lex:

pair %=  token(ID_MARKER)
    >> ':'
    >> atom
    >> ','
    >> atom
    ;

in conjunction with this fusion/tuple mapping to assist in the capture:

BOOST_FUSION_ADAPT_STRUCT(
    Client::pair_rec,
    (std::string,      m_dummy  )  // want to rid of this capture of ID_MARKER
    (Client::atom_rec, m_atom_1 )
    (Client::atom_rec, m_atom_2 )
)

everything works fine.

But I would like to use the ID_MARKER just for parsing; I don't really need or want to capture it.

So I tried to ignore the attribute by using qi::lit:

pair %=  qi::lit( token(ID_MARKER) )
    >> ':'
    >> atom
    >> ','
    >> atom
    ;

along with removing m_dummy from the capture, but I just get a wall of template errors.

What should I be doing instead, to clean this up?


Solution

  • Without code to test I can't be sure, but:

    pair %=  qi::omit[ token(ID_MARKER) ]
        >> ':'
        >> atom
        >> ','
        >> atom
        ;
    

    should work. You could also add a token_def<lex::omit> marker; in your lexer.