构建迷你编程语言时Lexer出现RPAREN提前添加问题求助
问题修复方案
问题根源
输入2*(2*2)时词法分析输出的tokens顺序错误,核心原因:
- 遇到右括号
)时,未先将正在收集的数字(第二个2)写入tokens,直接添加了RPAREN),导致数字被留在循环收尾阶段才添加,顺序完全颠倒。 - 冗余的
funCall判断始终为False,完全没有生效,可直接移除。
修复后的lex()函数
operators = ['+', '-', '*', '/'] # Lexer def lex(line): line = line.replace(" ", "") num = "" isNum = False tokens = [] for char in line: if char.isdigit(): isNum = True num += char elif char in operators: if isNum: tokens.append(f"NUM:{num}") num = "" isNum = False tokens.append(f"OP:{char}") elif char == "(" or char == ")": # 先处理未完成的数字收集 if isNum: tokens.append(f"NUM:{num}") num = "" isNum = False # 添加括号token if char == "(": tokens.append(f"LPAREN{char}") else: tokens.append(f"RPAREN{char}") if isNum: tokens.append(f"NUM:{num}") return tokens
验证结果
输入2*(2*2)后,tokens数组变为:['NUM:2', 'OP:*', 'LPAREN(', 'NUM:2', 'OP:*', 'NUM:2', 'RPAREN)'],完全符合预期。
额外优化提示
- 原代码中
idx、tok变量未被使用,可直接删除以精简代码。 parse()函数需补全import os,否则会触发未定义错误。
内容的提问来源于stack exchange,提问作者AmongusDev
相关产品推荐
相关产品推荐

