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

构建迷你编程语言时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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 03:45:42