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

如何用ANTLR4 Python Visitor实现嵌套数组索引访问?

实现嵌套数组的索引访问

首先要确保你的ANTLR语法规则支持连续的多索引表达式,比如把IndexExpr定义为:

IndexExpr
    : ID ( '[' expr ']' )+
    ;

这样解析器会将arr[2][0]这类嵌套索引识别为一个完整的IndexExpr节点,包含变量名和所有索引表达式。

调整Visitor核心逻辑

你需要修改visitIndexExpr函数,从基础变量开始,逐层遍历所有索引表达式,依次访问嵌套数组的元素:

def visitIndexExpr(self, ctx):
    # 获取基础变量的初始值
    current_val = self.vars.get(ctx.ID().getText(), 0.0)
    
    # 遍历所有索引表达式(根据语法生成的方法调整,比如exprList())
    for expr_ctx in ctx.exprList():
        index = int(self.visit(expr_ctx))
        
        # 可选:添加类型检查,避免对非数组值索引
        if not isinstance(current_val, list):
            raise ValueError(f"无法为非数组值 '{current_val}' 执行索引操作")
        
        # 可选:添加索引越界检查
        if index < 0 or index >= len(current_val):
            raise IndexError(f"数组索引越界:{index}")
        
        # 更新当前值为索引后的结果,进入下一层
        current_val = current_val[index]
    
    return current_val

关键前提:嵌套数组的正确解析

确保你的visitArrayExpr函数将嵌套数组解析为Python原生的嵌套列表,这样才能支持逐层索引:

def visitArrayExpr(self, ctx):
    return [self.visit(expr_ctx) for expr_ctx in ctx.expr()]

比如[1,2,[1,[2]]]会被解析为[1, 2, [1, [2]]],和Python的列表结构完全一致,后续的索引操作就能直接生效。

注意事项

  • 语法适配:如果你的IndexExpr规则定义不同,要对应调整获取索引表达式列表的方法(比如ANTLR生成的上下文类中,可能用expr()获取单个、exprList()获取全部,需根据实际生成的代码调整)
  • 错误处理:示例中的类型检查和越界检查是可选的,可以根据你的需求替换为返回默认值或其他错误处理逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 21:01:03