Identifier Parsing in Boost::Spirit X3 - Custom Parser
This time around, we will use a custom parser to handle the keywords.
I really hadn’t planned on making this a series, but there you go. This will be the last - I think.
I started from the code from the last post, but did make a minor adjustment. I made underbar (’_‘) a valid character in an identifier.
auto const ualnum = alnum | char_('_'); auto const reserved = lexeme[symtab >> !ualnum]; auto const ident = lexeme[ *char_('_') >> alpha >> *ualnum ] - reserved;
Parsers in X3 are classes that have a parse template function with a specific signature.
template<typename Iterator, typename Context, typename RContext, typename Attribute> bool parse(Iterator &first, Iterator const& last, Context const& context, RContext const& rcontext, Attribute& attr) const
lastare input iterators that contain the stream of characters (or whatever the iterators are iterating) to match.
rcontext contain various client and system supplied information.
attr is the attribute - the value that the parser will pass back on success. In our case, this will just be the keyword itself.
And that really is it. The code itself is straightforward and pretty much mirrors what the “standard” version does - match the given string, then check that next character (if it exists) is not a letter, number, or underbar.
After that, it is just a matter of using the new parser keyword in the
Now that wasn’t bad, was it?
Here is the finished code.