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

pt3*_*Nyc 5 c++ boost boost-spirit boost-spirit-qi

我已经看过一些与qi语法中关键字/标识符使用细微差别相关的帖子,但是我无法理解在boost示例中演示的方法应该如何工作......

关键词声明:

qi::symbols<char> keywords;
Run Code Online (Sandbox Code Playgroud)

示例关键字集:

keywords.add
        ("foo")
        ("bar")
        ;
Run Code Online (Sandbox Code Playgroud)

标识符规则声明:

qi::rule<std::string::const_iterator, std::string(), ascii::space_type> identifier;
Run Code Online (Sandbox Code Playgroud)

以下是qi calc和编译器示例中定义标识符规则的方法:

identifier = !keywords >> qi::raw[ qi::lexeme[ ( qi::alpha | '_' ) >> *( qi::alnum | '_' ) ] ];
Run Code Online (Sandbox Code Playgroud)

也许我正在阅读qi语法错误,但在我看来,这不会接受任何匹配或关键字开头的文字.拒绝完整关键字匹配是所需的行为.但是,我想接受"食物"作为标识符,即使它以关键字"foo"开头.这似乎是一个非常标准的用例,但无法找到真正指出这一点的文档.

任何人都可以提供仅拒绝与关键字完全匹配的标识符规则吗?

谢谢!

seh*_*ehe 3

实际上这个问题值得一些投票。它应该被更多地认识到,并且可能在 Spirit 教程中得到解决,因为它经常被忽视(显然编译器示例是好的)


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

这是正确的。如果您发现我自己的答案(很有可能),我倾向于将其作为一种快速而肮脏的方法来修复首先没有适当关键字保护的语法。

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

同时,看看非常相关的

如果您正在构建一个真正强大的通用语言语法,那么您应该考虑使用 Spirit Lexer。再说一次,以我的拙见,Spirit 的目标是快速开发和使用 Spirit 的表达式模板 eDSL 简洁嵌入的小型一次性语法。我认为,在很多方面,这恰恰是重要的事情的对立面。