如何用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
相关产品推荐
相关产品推荐

