灵气从控制台解析多行

Spirit Qi Parsing multilines from Console

本文关键字:控制台      更新时间:2023-10-16

我使用控制台作为输入源。我寻找一种方法qi可以解析一行,然后它会等待下一行并从该点继续解析。例如,使用以下语法

start = MultiLine | Line;
Multiline = "{" *(Line) "}";
Line = *(char_("A-Za-z0-9"));

作为输入

{ AAAA
Bbbb
lllll
lalala
}

从文件中取出整个东西很容易。但是,如果我需要从控制台输入,我该怎么办呢?我想让它处理已经给出的,然后等待剩下的行。

在Qi中最"高级"的惯用方法是qi::match:

Live On Coliru

#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/qi_match.hpp>
using Line      = std::string;
using MultiLine = std::vector<Line>;
int main() {
    std::cin.unsetf(std::ios::skipws);
    MultiLine block;
    using namespace boost::spirit::qi;
    while (std::cin >> phrase_match('{' >> lexeme[*~char_("rn}")] % eol >> '}', blank, block))
    {
        std::cout << "Processing a block of " << block.size() << " linesn";
        block.clear();
    }
}

打印:

Processing a block of 4 lines
Processing a block of 7 lines

其中第二行在一秒延迟后出现(由于使用的sleep 1)

作为克里斯贝克是暗示,这使用boost::spirit::istream_iterator引擎盖下。你也可以显式地使用它,例如,如果你想使用递归嵌套规则。

您可以使用您从std::cin构建的istream迭代器。如果您的语法是针对typename iterator模板化的,就像Hartmut在所有示例中所做的那样,那么它应该可以正常工作。

如果您提供SSCCE,将很容易说明。创建istream迭代器只需几行代码。