提升::精神::Qi 关键字和标识符
boost::spirit::qi keywords and identifiers
我已经看过一些与 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简洁地嵌入的小型一次性语法。我认为,在很多方面,这在很大程度上是关键时刻的对立面。
相关文章:
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- C++中的"inline"关键字
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 如何确保C++函数在定义之前声明(如override关键字)
- #ifdef和未声明的标识符
- f2、f3、f4标识符未找到
- 谷歌模拟和覆盖关键字
- 设置 Visual Studio for MPI: 找不到标识符错误
- 未声明的标识符编译暗黑破坏神 2 程序"muleview"
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- Google protobuf 时间戳未声明标识符,在 Windows 上具有C++
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- 使用"class"关键字,后跟未声明的标识符
- 为什么在函数参数编译中没有标识符的const关键字
- 有没有一种方法可以在枚举中使用关键字作为标识符
- 提升::精神::Qi 关键字和标识符
- New关键字用作标识符
- 这个流控制关键字类标识符的结构是什么?
- 为什么C基本类型有多个关键字的标识符
- 解析除关键字以外的标识符