c++ - 从控制台灵气解析多行

标签 c++ parsing console boost-spirit boost-spirit-qi

我正在使用控制台作为输入源。 我寻找一种 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_("\r\n}")] % eol >> '}', blank, block))
    {
        std::cout << "Processing a block of " << block.size() << " lines\n";
        block.clear();
    }
}

打印:

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

延迟一秒后第二行出现的地方(由于使用了sleep 1)

正如 Chris Beck 所暗示的,这在幕后使用了 boost::spirit::istream_iterator。您也可以明确地使用它,例如如果您想使用递归嵌套规则。

关于c++ - 从控制台灵气解析多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32315829/

相关文章:

c++ - 如何缩短此迭代问题的运行时间

c++ - 试图将 Mongoose 编译成 C++ 树莓派项目

.Net WikiText 到 HTML 解析器

math - 数学解析器的智能设计?

java - 使用 JsonPath 解析带有链接 hashmap java 的 Json

symfony2 控制台参数

ruby - 在 Ruby 控制台应用程序中获取键盘事件(不按 'enter' 输入)的最佳方法是什么?

C++:父子对象数组

c++ - 如何在shell脚本中调用c++程序

Linux下C关闭然后打开标准输入