Boost logo

Boost :

Subject: [boost] [spirit] scan_keyword: scan an InputIterator for a keyword.
From: Vicente J. Botet Escriba (vicente.botet_at_[hidden])
Date: 2011-11-28 16:45:31


Hi,

for chrono input I'm using a scan_keyword function that adapted from
libc++ library (you can find the code in[1]).
Next follows the interface:

// scan_keyword
// Scans [b, e) until a match is found in the basic_strings range
// [kb, ke) or until it can be shown that there is no match in [kb, ke).
// b will be incremented (visibly), consuming CharT until a match is found
// or proved to not exist. A keyword may be "", in which will match
anything.
// If one keyword is a prefix of another, and the next CharT in the input
// might match another keyword, the algorithm will attempt to find the
longest
// matching keyword. If the longer matching keyword ends up not
matching, then
// no keyword match is found. If no keyword match is found, ke is returned
// and failbit is set in err.
// Else an iterator pointing to the matching keyword is found. If more
than
// one keyword matches, an iterator to the first matching keyword is
returned.
// If on exit b == e, eofbit is set in err.
// Examples:
// Keywords: "a", "abb"
// If the input is "a", the first keyword matches and eofbit is set.
// If the input is "abc", no match is found and "ab" are consumed.

template <class InputIterator, class ForwardIterator>
ForwardIterator
scan_keyword(InputIterator& b, InputIterator e,
                ForwardIterator kb, ForwardIterator ke,
                std::ios_base::iostate& err
                );

What is the better way to do that (or something similar) with Spirit/Lexer?
Can we hope that the Spirit solution could perform much better?
What about if the strings to parse are know at compile-time?

[1]
https://svn.boost.org/svn/boost/trunk/boost/chrono/detail/scan_keyword.hpp

Best,
Vicente


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk