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

时间:2014-12-13 20:33:27

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

我在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”开头。这看起来像一个非常标准的用例,但无法找到真正指明这一点的文档。

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

谢谢!

1 个答案:

答案 0 :(得分:3)

实际上这个问题值得一些投票。它应该更多地被实现,并且可能在精神教程中被解决,因为它经常被忽视(显然 the compiler samples 是好的)


  

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

那是对的。如果你发现我自己的一个答案(非常好的机会),我倾向于以一种快速而肮脏的方式来修复那些首先没有适当的关键字守卫的语法。

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

同时,看看非常相关的

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