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

6
我看到了一些关于qi语法中关键字/标识符使用细节的帖子,但我无法理解在boost示例中演示的方法应该如何工作...
关键字声明:
qi::symbols<char> keywords;

示例关键词集:
keywords.add
        ("foo")
        ("bar")
        ;

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

这是在qi calc和编译器示例中定义标识符规则的方式:
identifier = !keywords >> qi::raw[ qi::lexeme[ ( qi::alpha | '_' ) >> *( qi::alnum | '_' ) ] ];

也许我对qi语法的理解有误,但在我看来,它似乎不会接受与关键字匹配或以关键字开头的任何文字。拒绝完全匹配关键字是期望的行为。但是,我想接受“food”作为标识符,即使它以关键字“foo”开头。这似乎是一个非常标准的用例,但我很难找到真正解决这个问题的文档。
有人可以提供一个仅拒绝关键字精确匹配的标识符规则吗?
谢谢!

实际上,这个问题值得一些投票。它应该更加常见,并且可能在Spirit教程中得到解决,因为它经常被忽视(显然编译器示例是可以的)。 - sehe
1个回答

3
实际上,这个问题值得一些投票。它应该更加常见,并且可能需要在Spirit教程中解决,因为它经常被忽视(显然编译器示例是可以的)。
也许我对qi语法的理解有误,但在我看来,它似乎不接受与关键字匹配或以关键字开头的任何文字。
没错。如果你在我的某个答案中发现了这种情况(很有可能),我倾向于使用这种快速而粗糙的方法来修复一开始就没有适当的关键字保护的语法问题。
但是,要求不同的关键字/标识符需要更多的工作。我可能会找到一个链接,其中正确地执行了它(这并不难,只是繁琐)。
同时,看看非常相关的
- 来自Spirit存储库的Qi distinct Parser Directive 如果你正在构建一个非常强大的通用语言语法,那么现在应该考虑使用Spirit Lexer。然而,在我看来,Spirit旨在快速开发和小型、一次性语法,这些语法可以简洁地嵌入使用Spirit的表达式模板eDSL中。在很多方面,这与我认为重要的恰恰相反。

非常感谢您的回复。这解决了我的疑惑。我知道有不同的指令,但是以为可能会在那个快速修复中漏掉一些东西。谢谢! - pt3dNyc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接