提升::精神::Qi 关键字和标识符

boost::spirit::qi keywords and identifiers

本文关键字:标识符 关键字 Qi 精神 提升      更新时间:2023-10-16

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

关键字声明:

qi::symbols<char> keywords;

示例关键字集:

keywords.add
        ("foo")
        ("bar")
        ;

标识符规则声明:

qi::rule<std::string::const_iterator, std::string(), ascii::space_type> identifier;

下面介绍了如何在 qi 计算和编译器示例中定义标识符规则:

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

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

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

谢谢!

实际上这个问题值得一些投票。它应该更频繁地实现,并且可能在 Spirit 教程中得到解决,因为它经常被忽视(显然编译器示例还可以(


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

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

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

同时,看看非常相关的

  • 来自精神库的 Qi distinct解析器指令

如果你正在构建一个非常强大的通用语言语法,这就是你应该考虑使用Spirit Lexer的地方。再说一次,以我的拙见,Spirit的目标是快速开发和使用Spirit的表达式模板eDSL简洁地嵌入的小型一次性语法。我认为,在很多方面,这在很大程度上是关键时刻的对立面。