You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写DSL总结器失败求助:Rascal语言分析服务报错

自定义Rascal DSL总结器CallFailed错误修复

你遇到的CallFailed错误源于总结器函数的签名与Rascal语言服务的要求不匹配。你的summarizer函数声明接收start[Deployment]类型的参数,但解析器返回的是Tree类型对象,类型不兼容导致调用失败。

修复步骤:

  1. 修正总结器函数签名
    将summarizer的第二个参数类型从start[Deployment]改为Tree,符合Rascal分析服务的调用约定:

    Summary summarizer(loc l, Tree input) {
        // 后续代码调整
    }
    
  2. 将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);
    }
    
  3. 验证分析服务注册
    确保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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 01:35:01