编写DSL总结器失败求助:Rascal语言分析服务报错
自定义Rascal DSL总结器CallFailed错误修复
你遇到的CallFailed错误源于总结器函数的签名与Rascal语言服务的要求不匹配。你的summarizer函数声明接收start[Deployment]类型的参数,但解析器返回的是Tree类型对象,类型不兼容导致调用失败。
修复步骤:
修正总结器函数签名
将summarizer的第二个参数类型从start[Deployment]改为Tree,符合Rascal分析服务的调用约定:Summary summarizer(loc l, Tree input) { // 后续代码调整 }将Tree转换为抽象语法实例
在函数内部,先把解析得到的Tree转换为你定义的Deployment类型,再进行数据提取与错误消息生成:Summary summarizer(loc l, Tree input) { // 验证并转换Tree为Deployment实例 if (!input instanceof start[Deployment]) { return summary(l); // 类型不匹配时返回空总结 } Deployment dep = input; // 提取Hardware节点的名称与位置 rel[str, loc] result = {<var.name, var.src> | /Hardware var := dep}; // 示例:检测重复的Hardware名称并生成错误 rel[str, set[loc]] duplicates = group[loc by id | <id, loc> <- result]; rel[loc, Message] errorMessages = {<loc, error("Hardware名称 '<id>' 重复", loc)> | <id, locs> <- duplicates, size(locs) > 1, loc <- locs}; return summary(l, messages = errorMessages); }验证分析服务注册
确保depContributions中的analysis调用参数正确,当前注册代码本身无问题,但需保证修正后的summarizer能正确接收参数:set[LanguageService] depContributions() = { parsing(parser(#start[Deployment])), analysis(summarizer, providesDocumentation = false, providesDefinitions = false, providesReferences = false, providesImplementations = false) };
补充说明:
- 原始代码中直接用
/Hardware var := input无法生效,因为Tree是未类型化的语法树,必须先转换为抽象语法类型(Deployment)才能访问var.name这类属性。 - 示例中实现了重复名称检测逻辑,你可以根据实际需求调整错误消息的生成规则。
内容的提问来源于stack exchange,提问作者Ivo Belitts
相关产品推荐
相关产品推荐

