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

Python简易递归下降解析器报错:字符串索引越界求助

问题分析与修复

你的代码报错是因为索引越界:当输入合法的"abc"时,最后一次调用nextToken()会尝试访问entry[3],但字符串"abc"的索引只有0、1、2,超出范围就会触发报错。另外还有几处逻辑漏洞,下面是具体修复方案:

关键问题点

  • nextToken()没有处理索引超出字符串长度的情况,直接访问entry[i]会触发越界错误
  • 初始赋值t = entry[i]时,如果用户输入空字符串,也会直接报错
  • 最终的合法性判断只检查t == '',没有确认是否所有字符都被解析完毕

修复后的代码

i = 0
t = ''
entry = ''   

def nextToken():
    global i
    i += 1
    # 先判断索引是否超出字符串长度,超出返回空字符串
    if i >= len(entry):
        return ''
    return entry[i]

def A():
    global t
    if t == 'a':
        t = nextToken()
        if t == 'b':
            t = nextToken()
            if t == 'c':
                t = nextToken()
            else:
                print("expected c")
        else:
            print("expected b")
    else:
        print("expected a")

print("Input to validate: ")
entry = input().strip()  # 去掉输入前后的空白字符,避免意外
# 处理空输入的情况
if len(entry) == 0:
    print("Input error...")
else:
    t = entry[i]
    A()
    # 合法的情况是t为空,且所有字符都被解析(i等于字符串长度)
    if t == '' and i == len(entry):
        print("Correct input ...")
    else:
        print("Input error...")

修复说明

  1. nextToken()函数:增加了索引检查,当i超过字符串长度时返回空字符串,彻底避免越界问题
  2. 输入处理:用strip()去掉输入的前后空白,同时判断输入是否为空,防止空字符串访问索引报错
  3. 合法性判断:同时检查t == ''和i == len(entry),确保所有字符都被正确解析,没有多余字符残留

比如输入"abc"时,执行流程:

  • 初始i=0,t=entry[0] = 'a'
  • 进入A(),t是'a',调用nextToken(),i变成1,返回entry[1]='b',t='b'
  • 检查t是'b',调用nextToken(),i变成2,返回entry[2]='c',t='c'
  • 检查t是'c',调用nextToken(),i变成3,此时3 >= len("abc")=3,返回空字符串,t=''
  • 最后判断t == ''且i=3 == len(entry)=3,输出"Correct input ..."

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 04:42:39