从控制台灵气解析多行
Spirit Qi Parsing multilines from Console
我正在使用控制台作为输入源。
我寻找一种 qi 解析一行的方法,然后它会等待下一行并从那一点继续解析。
例如采用以下语法
start = MultiLine | Line;
Multiline = "{" *(Line) "}";
Line = *(char_("A-Za-z0-9"));
作为输入
{ AAAA
Bbbb
lllll
lalala
}
从一个文件中提取全部内容很容易。
但是,如果我需要让输入来自控制台,我该怎么办?
我想让它处理它已经给出的内容并等待其余的行。
为此,您可以只使用从 std::cin
构建的 istream 迭代器。如果你的语法像 Hartmut 在所有示例中所做的那样针对 typename iterator
进行了模板化,那么它应该可以正常工作。
如果您提供SSCCE,将很容易说明。 istream 迭代器只需几行代码即可创建。
在 Qi 中最 "highlevel" 惯用的方法是 qi::match
:
#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
。您也可以明确地使用它,例如如果你想使用递归嵌套规则。
我正在使用控制台作为输入源。 我寻找一种 qi 解析一行的方法,然后它会等待下一行并从那一点继续解析。 例如采用以下语法
start = MultiLine | Line;
Multiline = "{" *(Line) "}";
Line = *(char_("A-Za-z0-9"));
作为输入
{ AAAA
Bbbb
lllll
lalala
}
从一个文件中提取全部内容很容易。 但是,如果我需要让输入来自控制台,我该怎么办? 我想让它处理它已经给出的内容并等待其余的行。
为此,您可以只使用从 std::cin
构建的 istream 迭代器。如果你的语法像 Hartmut 在所有示例中所做的那样针对 typename iterator
进行了模板化,那么它应该可以正常工作。
如果您提供SSCCE,将很容易说明。 istream 迭代器只需几行代码即可创建。
在 Qi 中最 "highlevel" 惯用的方法是 qi::match
:
#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
。您也可以明确地使用它,例如如果你想使用递归嵌套规则。