从Lisp代码生成Token时触发致命JavaScript错误的原因排查
问题分析与修复方案
根本原因
你遇到的Fatal JavaScript invalid size error是无限循环导致的内存溢出。问题出在处理标识符/字母的分支中:当遍历到输入字符串的最后一个字符时,char = input[++i]会让i超出输入长度,此时char变为undefined。你的LETTERS正则/[-_a-zA-Z0-9]/会将undefined转换为字符串"undefined",而这个字符串里的字母会被正则匹配,导致while循环无限执行,不断向value中累加"undefined",最终因字符串体积过大触发内存错误。
修复步骤
修复标识符循环的边界判断
在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判断代码不变 }健壮化数字处理分支
虽然NUMBERS正则/\d/不会匹配undefined,但同样建议增加边界判断,保持代码一致性:if (NUMBERS.test(char)) { let value = ''; while (i < input.length && NUMBERS.test(char)) { value += char; char = input[++i]; } // 后续type判断代码不变 }移除无用日志
删掉循环开头的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
相关产品推荐
相关产品推荐

