灵气从控制台解析多行
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迭代器只需几行代码。
相关文章:
- C++:将控制台输出存储在宏中更好吗
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- SSH通过/sbin/SSH无法读取RSA密钥文件(从控制台运行)
- C++控制台应用程序阻止退出
- 如何修复此iFile以将.txt输出到控制台
- 为什么控制台要求输入,即使代码中没有输入
- 在Qt Creator中,如何在连接到正在运行的进程后查看控制台输出
- 控制台输出在 Qt5 中未正确显示
- C++出现控制台错误.我无法识别源代码的问题
- C++程序不会从 Windows 控制台运行
- 有人可以向我解释为什么控制台输出 0 吗?
- Visual Studio 2017 停止工作,并在打开后显示许多控制台窗口
- 如何从 Win32 C++ 应用程序输出到父控制台窗口?
- Win32 API 控制台光标在 WriteConsole 后不移动
- 如何获取控制台窗口的宽度?
- 如何在 Win32 C++控制台应用程序中调用 UWP 类库
- 如何从Windows控制台调用.exe(C++)以在不同的目录(或任何目录)中创建文件夹?
- 来自Visual Studio中控制台项目的exe文件?
- 为什么即使使用 for 循环遍历我的向量,它也没有输出到控制台?(C++)
- 使用 std::string_view 的子字符串控制台输出