如何为给定的boost :: spirit语法提供具有自动完成建议的用户?

时间:2017-11-17 15:37:22

标签: c++ parsing autocomplete boost-spirit

我正在使用Boost :: Spirit来构建简单的"数据过滤器"我的C ++ GUI应用程序中的语言,适用于非技术用户。语言与普通英语非常相似,可以解析为AST。我被要求尽可能方便用户使用,所以我希望提供类似CLang的错误消息("无法识别' tokken',你的意思是'令牌' ?")和自动完成。

现有的问题是如何使用Boost :: Spirit语法为两个目标生成可能的令牌列表(我将使用简单的字符串距离算法来满足第一个要求)?

到目前为止我的想法:

  • 将源流中的位置和长度添加到从解析器获取的令牌定义。
  • 为语法添加特殊的无效令牌,它将匹配任何内容......嗯......无效: - )
  • 如果用户按下ctrl + space,则构建AST(使用无效令牌,树将始终可构建),然后在当前光标位置内查找令牌
  • 在所有可能的令牌上使用简单的匹配器(毕竟我有令牌列表)并准备一份建议列表

此解决方案的问题是建议还会建议对给定地点无效的令牌。如果我添加(我会)可定义的标识符,我手头有更大的问题......

还有一个约束:我希望只在一个地方定义这种语言的语法;如果语法改变了,我想在重新编译后自动完成注意这个改变

1 个答案:

答案 0 :(得分:1)

Spirit没有这个功能。你可以自己生成它,但一般来说这是相当大的努力(如果不是直接不可能的,由于NP完全性)。也许只是检测解析错误(on_error)并拥有有限数量的股票“期权” - 80%的规则应该有很长的路要走。

此外,我认为解析“无效占位符令牌”的“草图”将无效,因为您必须构建有关占位符令牌类型的假设,因此可能无法生成有效的表达式。

我觉得你将表达式解析视为只是标记化 -  这在大多数情况下都不准确。