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

Antlr4 JavaScript Visitor返回含undefined数组,如何返回正常结果?

问题分析与修复方案

核心问题排查

  • visitFunction笔误:方法最后返回this.result,但实际定义的变量是result,this.result未初始化,直接返回了undefined,这是结果异常的关键原因。
  • 冗余节点处理不当:语法formula : ST expression EOF;包含三个子节点,visitFormula遍历所有子节点时,ST(等号)和EOF没有对应的自定义visit方法,Antlr默认visitor会返回undefined,导致结果混入无效值。
  • 缺少expression节点处理:未实现visitExpression及其子节点的访问方法,导致expression节点被访问时返回undefined。

修复后的Visitor代码

export default class GrammarParserVisitor extends MyGrammarParserVisitor {
  // 处理formula节点,直接返回expression的结果,跳过ST和EOF
  visitFormula(ctx) {
    return this.visit(ctx.expression());
  }

  // 修正visitFunction的返回值,过滤无效结果
  visitFunction(ctx) {
    const result = [ctx.FUNCTION_NAME().getText()];
    const expressionList = ctx.expression();

    for (let i = 0; i < expressionList.length; i++) {
      const exprResult = this.visit(expressionList[i]);
      // 只保留非undefined的结果
      if (exprResult !== undefined) {
        result.push(exprResult);
      }
    }

    console.log(result);
    // 返回正确的局部变量result,而非未定义的this.result
    return result;
  }

  // 补充expression节点的访问实现(需根据实际语法调整)
  visitExpression(ctx) {
    // 假设expression包含binaryExpr、literal、cellRef等子节点
    if (ctx.binaryExpr()) {
      return this.visit(ctx.binaryExpr());
    } else if (ctx.literal()) {
      return this.visit(ctx.literal());
    } else if (ctx.cellRef()) {
      return this.visit(ctx.cellRef());
    }
    // 兜底返回空值而非undefined,避免结果污染
    return null;
  }

  // 示例:处理数字字面量节点(如1、0)
  visitLiteral(ctx) {
    return ctx.getText();
  }

  // 示例:处理单元格引用节点(如$I$11、D169)
  visitCellRef(ctx) {
    return ctx.getText();
  }

  // 示例:处理二元表达式节点(如$I$11=D169)
  visitBinaryExpr(ctx) {
    const left = this.visit(ctx.left);
    const op = ctx.operator().getText();
    const right = this.visit(ctx.right);
    return [left, op, right];
  }
}

关键修复说明

  • 精简visitFormula逻辑:不再遍历所有子节点,直接获取expression子节点的结果,跳过无意义的ST和EOF,从源头避免undefined混入。
  • 修正visitFunction返回值:将错误的return this.result改为return result,同时增加过滤逻辑,跳过expression返回的无效值。
  • 补充完整节点处理:为expression及其子节点实现对应的visit方法,确保每个语法节点都返回明确的非undefined结果,覆盖所有语法分支。

修复后预期结果

对于输入=IF($I$11=D169,1,0),最终返回的结果应类似:

[
  "IF",
  ["$I$11", "=", "D169"],
  "1",
  "0"
]

内容的提问来源于stack exchange,提问作者roman_kh122

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 04:15:19