Parsing Boost Spirit:解析反馈-替换解析信息中的信息

Parsing Boost Spirit:解析反馈-替换解析信息中的信息,parsing,boost,boost-spirit,boost-spirit-qi,Parsing,Boost,Boost Spirit,Boost Spirit Qi,我使用boost spirit实现了一个语法。它用于解析命令行语言,以便向软件发出命令。用户键入这些命令。对于语言的一小部分,解析器运行得相当好 当用户键入文本时,我想在用户点击enter键执行命令之前向用户提供简单的反馈。例如,如果命令行表示解析为完成的完整命令,我想更改颜色。与其在用户点击一个键时接受一个无效的键,我可能会发出嘟嘟声而不接受该键 我的想法是在每次按键时将命令字符串提交给解析器,并使用解析过程中的反馈来确定短语是完全解析还是完全有效地解析到输入的末尾,或者是错误解析 我在网上搜

我使用boost spirit实现了一个语法。它用于解析命令行语言,以便向软件发出命令。用户键入这些命令。对于语言的一小部分,解析器运行得相当好

当用户键入文本时,我想在用户点击enter键执行命令之前向用户提供简单的反馈。例如,如果命令行表示解析为完成的完整命令,我想更改颜色。与其在用户点击一个键时接受一个无效的键,我可能会发出嘟嘟声而不接受该键

我的想法是在每次按键时将命令字符串提交给解析器,并使用解析过程中的反馈来确定短语是完全解析还是完全有效地解析到输入的末尾,或者是错误解析

我在网上搜索了一下,发现parse_信息过去是由spirit classic中的parse返回的,但现在parse只返回bool。指示成功状态,但我没有指示输入表达式解析到输入末尾,但解析器只需要更多输入的情况。parse_info似乎包含了我需要的所有信息

有谁能解释一下在解析表达式后找出这些信息的简单方法吗

多谢各位,
卡勒姆

开始迭代器是通过引用传递的。因此,实际上信息更丰富:如果解析结果为“success”(布尔值
true
),您始终可以看到正确使用了多少输入

演练:

auto f = input.begin(), l = input.end();

bool ok = qi::phrase_parse(f, l, grammar, qi::space);

if (ok)
    std::cout << "Parse success\n";
else
    std::cout << "Parse failed\n";

if (f!=l)
    std::cout << "Trailing unparsed input: '" << std::string(f, l) << "'\n";
auto f=input.begin(),l=input.end();
bool ok=qi::短语解析(f,l,语法,qi::space);
如果(确定)

非常感谢你的回复,我已经尝试了你的建议,但是我似乎没有得到我需要的所有信息。。。如果没有足够的输入来完成规则,则pharse_parse返回false,迭代器留在开始处。如果有足够的输入来完全定义规则和一些额外的输入,那么短语解析将返回true,迭代器将前进到成功解析的输入的末尾。我无法检测到从无效输入中耗尽输入的情况。这就是我需要的。@CallumJamieson:那么你可能想要两个语法,或者修改你的语法,让它接受它接受的任何其他字符串的前缀。这可能会让人恼火,这取决于你的语法。在PEG解析器的大多数应用程序中,人们并不真正想要这种“任何前缀”的行为,他们想要精确的解析。如果您有一个语法元素,比如
qi::lit(“init”)
,那么您可能必须将其更改为
-('i'>>-('n'>>-('i'>-'t'))
。您可能可以使用一个helper函数来生成这些解析器元素……好吧,这是spirit的一个一般限制——它实际上没有“好”、“坏”、“不确定”解析。例如,您可以查看boost asio文档中的这个HTTP解析器示例:在这段代码中,解析器返回一个三态“good”、“bad”、“undeterminate”,这对于处理HTTP非常重要,因为请求是分块来的。例如,我不知道有什么好方法可以在精神上重写代码,因为每次有新代码出现时,它都必须重新分析。很想知道。@ChrisBeck您需要每个解析器原语的三态结果。这听起来是一项有趣的工作,实际上并非不可行。也许有人有兴趣提供它在X3非常感谢您的意见和想法,非常感谢。。。因为这是一个相当小的简单语法,所以我实现了我自己的解析器,它具有这三种状态的结果。