【问题标题】:boost::spirit::qi keywords and identifiersboost::spirit::qi 关键字和标识符
【发布时间】:2015-02-12 07:50:32
【问题描述】:

我看过一些与 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 语法,但在我看来,这不会接受任何匹配或 关键字开头的文字。拒绝完整的关键字匹配是期望的行为。但是,我想接受“食物”作为标识符,即使它以关键字“foo”开头。这似乎是一个非常标准的用例,但很难找到真正确定这一点的文档。

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

谢谢!

【问题讨论】:

  • 其实这个问题值得一票。它应该更多地被意识到,并且可能在 Spirit 教程中得到解决,因为它经常被忽视(显然 the compiler samples 是可以的)

标签: c++ boost boost-spirit boost-spirit-qi


【解决方案1】:

其实这个问题值得一票。它应该更多地被意识到,并且可能在 Spirit 教程中得到解决,因为它经常被忽视(显然 the compiler samples 是可以的)


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

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

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

同时,看看非常相关的

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

【讨论】:

  • 非常感谢您的回复。这清除了它。我知道这个独特的指令,但我认为我可能会因为那个快速修复而遗漏一些东西。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-14
  • 2017-08-10
相关资源
最近更新 更多