лексер повышения духа в потоке не маркирует «рано» достаточно (слишком много впереди?)

Я использую лексер boost :: spirit :: lex для токенизации входного потока, используя spirit :: istream_iterators, как описано в Использование Boost.Spirit.Lex и потоковых итераторов .

Моя проблема в том, что lex :: tokenize, по-моему, не выводит токен так же «рано» (вдоль входного потока), как мне кажется. Он ожидает, что дополнительный токен (или два?) Будет доступен целиком, прежде чем я получу предыдущий токен. Я полагаю, что это задержка на будущее, но я не уверен, почему это необходимо, или как обойти это.

Вот пример:

#include <boost/bind.hpp>
#include <boost/spirit/include/lex_lexertl.hpp>
#include <boost/spirit/include/support_istream_iterator.hpp>
namespace spirit = boost::spirit;
namespace lex = spirit::lex;

#include <iostream>
using std::cin;
using std::cout;
using std::endl;

template <typename Lexer>
struct ALexer : lex::lexer<Lexer> {
ALexer() {
this->self.add
("hello")
("goodbye")
("[ \\t\\r\\n]+")
;
}
};

struct Emitter {
typedef bool result_type;   // for boost::bind
template <typename Token>
bool operator() (const Token& t) const {
cout << "token: " << t.value() << endl;
return true;
}
};

int main() {
cin >> std::noskipws;

// iterate over stream input
spirit::istream_iterator in_begin(cin);
spirit::istream_iterator in_end;

typedef lex::lexertl::token<spirit::istream_iterator> token_type;
typedef lex::lexertl::lexer<token_type> lexer_type;
typedef ALexer<lexer_type> tokenizer_type;
tokenizer_type tokenizer;

(void) lex::tokenize(in_begin, in_end, tokenizer, boost::bind(Emitter(), _1));

return 0;
}

Пример сеанса: (Обратите внимание, что cin буферизуется строкой моей ОС, поэтому первая «строка» становится доступной для лексера сразу)

(input)    hello goodbye<NEWLINE>
(output)   token: hello
token:
(input)    <EOF>
(output)   token: goodbye
token:

Я хочу, чтобы лексер получил первую строку, и как только он доберется до <NEWLINE>, он должен знать, что полный «прощальный» токен был лексирован, и испустить его. Вместо этого он, кажется, ждет большего ввода, прежде чем я смогу прощаться.

1

Решение

Задача ещё не решена.

Другие решения