C++ boost::spirit::qi关键字和标识符

C++ boost::spirit::qi关键字和标识符,c++,boost,boost-spirit,boost-spirit-qi,C++,Boost,Boost Spirit,Boost Spirit Qi,我看过一些关于qi语法中关键字/标识符使用的细微差别的帖子,但我不太明白boost示例中演示的方法应该如何工作 关键词声明: qi::symbols<char> keywords; qi::rule<std::string::const_iterator, std::string(), ascii::space_type> identifier; 标识符规则声明: qi::symbols<char> keywords; qi::rule<std::

我看过一些关于qi语法中关键字/标识符使用的细微差别的帖子,但我不太明白boost示例中演示的方法应该如何工作

关键词声明:

qi::symbols<char> keywords;
qi::rule<std::string::const_iterator, std::string(), ascii::space_type> identifier;
标识符规则声明:

qi::symbols<char> keywords;
qi::rule<std::string::const_iterator, std::string(), ascii::space_type> identifier;
也许我读错了qi语法,但在我看来,这不接受任何匹配或以关键字开头的文字。拒绝完整的关键字匹配是所需的行为。但是,我想接受“food”作为标识符,即使它以关键字“foo”开头。这似乎是一个相当标准的用例,但很难找到真正确定这一点的文档

谁能提供一个标识符规则,只拒绝与关键字完全匹配


谢谢

实际上这个问题值得投票。它应该更容易被理解,并且可能会在Spirit教程中得到解决,因为它经常被忽略(显然是可以的)


也许我读错了qi语法,但在我看来,这不接受任何匹配或以关键字开头的文字

没错。如果你在我自己的答案中发现了(这是一个很好的机会),我倾向于这样做,作为一种快速而肮脏的方式来修复那些一开始就没有适当关键字保护的语法

但是,需要不同的关键字/标识符需要更多的工作。我可能会找到一个正确答案的链接(这并不难,只是很乏味)

同时,看看非常相关的

  • 来自Spirit存储库

如果你正在构建一个非常健壮的通用语言语法,这就要考虑使用一个精神词典。在我看来,Spirit的目标是快速开发和使用Spirit的表达式模板eDSL简洁地嵌入的小型一次性语法。在很多方面,我认为这与问题的重要性恰恰相反。

事实上,这个问题值得投票。这应该更容易理解,并且可能在Spirit教程中讨论,因为它经常被忽略(显然是可以的),非常感谢您的回答。这就把它清理干净了。我知道DISTINCE指令,但我想我可能缺少了一些快速修复的东西。谢谢