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...")
修复说明
nextToken()函数:增加了索引检查,当i超过字符串长度时返回空字符串,彻底避免越界问题- 输入处理:用
strip()去掉输入的前后空白,同时判断输入是否为空,防止空字符串访问索引报错 - 合法性判断:同时检查
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
相关产品推荐
相关产品推荐

