我正在使用Boost :: Spirit来构建简单的"数据过滤器"我的C ++ GUI应用程序中的语言,适用于非技术用户。语言与普通英语非常相似,可以解析为AST。我被要求尽可能方便用户使用,所以我希望提供类似CLang的错误消息("无法识别' tokken',你的意思是'令牌' ?")和自动完成。
现有的问题是如何使用Boost :: Spirit语法为两个目标生成可能的令牌列表(我将使用简单的字符串距离算法来满足第一个要求)?
到目前为止我的想法:
此解决方案的问题是建议还会建议对给定地点无效的令牌。如果我添加(我会)可定义的标识符,我手头有更大的问题......
还有一个约束:我希望只在一个地方定义这种语言的语法;如果语法改变了,我想在重新编译后自动完成注意这个改变
答案 0 :(得分:1)
Spirit没有这个功能。你可以自己生成它,但一般来说这是相当大的努力(如果不是直接不可能的,由于NP完全性)。也许只是检测解析错误(on_error
)并拥有有限数量的股票“期权” - 80%的规则应该有很长的路要走。
此外,我认为解析“无效占位符令牌”的“草图”将无效,因为您必须构建有关占位符令牌类型的假设,因此可能无法生成有效的表达式。
我觉得你将表达式解析视为只是标记化 - 这在大多数情况下都不准确。