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

从Lisp代码生成Token时触发致命JavaScript错误的原因排查

问题分析与修复方案

根本原因

你遇到的Fatal JavaScript invalid size error是无限循环导致的内存溢出。问题出在处理标识符/字母的分支中:当遍历到输入字符串的最后一个字符时,char = input[++i]会让i超出输入长度,此时char变为undefined。你的LETTERS正则/[-_a-zA-Z0-9]/会将undefined转换为字符串"undefined",而这个字符串里的字母会被正则匹配,导致while循环无限执行,不断向value中累加"undefined",最终因字符串体积过大触发内存错误。

修复步骤

  1. 修复标识符循环的边界判断
    在LETTERS分支的while循环中,增加i < input.length的判断,确保不会越界处理undefined:

    if (LETTERS.test(char)) {
        let value = '';
        // 新增输入长度判断,终止循环避免无限累加
        while (i < input.length && LETTERS.test(char)) {
            value += char;
            char = input[++i];
        }
        // 后续type判断代码不变
    }
    
  2. 健壮化数字处理分支
    虽然NUMBERS正则/\d/不会匹配undefined,但同样建议增加边界判断,保持代码一致性:

    if (NUMBERS.test(char)) {
        let value = '';
        while (i < input.length && NUMBERS.test(char)) {
            value += char;
            char = input[++i];
        }
        // 后续type判断代码不变
    }
    
  3. 移除无用日志
    删掉循环开头的console.log(tokenList[i]);——i是输入字符串的索引,而tokenList的长度远小于输入长度,该语句只会输出大量undefined,还会额外消耗性能。

潜在问题补充

你的RESERVEDWORDS包含';',但';'不在LETTERS正则中,当前代码会将其视为未识别字符抛出错误。如果需要支持Lisp注释(;开头到行尾),可以添加单独处理分支:

if (char === ';') {
    // 跳过注释内容,直到换行或输入结束
    while (i < input.length && char !== '\n') {
        char = input[++i];
    }
    continue;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 09:58:21