我知道某个声明超出了内存限制,但我不明白它是什么
对于上下文,该程序接受lisp代码作为输入并将其转换为标记
// regex tests
const LETTERS = /[-_a-zA-Z0-9]/;
const WHITESPACE = /\s/;
const NUMBERS = /\d/;
const RESERVEDWORDS = ['write-line', ';','write',....]; // ... is other reserved words that i did not list out
// lexing
module.exports = function tokenizer(input) {
const tokenList = [];
let i = 0;
while (i < input.length) {
console.log(tokenList[i]);
let char = input[i];
if (char === '(' || char === ')') {
tokenList.push(
{
type: 'paren',
value: char
}
);
i++;
continue;
}
if (LETTERS.test(char)) {
let value = '';
while (LETTERS.test(char)) {
value += char;
char = input[++i];
}
console.log(value);
if (RESERVEDWORDS.includes(value)) {
tokenList.push(
{
type: 'keyword',
value
}
)
}
else {
tokenList.push(
{
type: 'identifier',
value
}
);
}
continue;
}
if (WHITESPACE.test(char)) {
i++;
continue;
}
if (NUMBERS.test(char)) {
let value = '';
while (NUMBERS.test(char)) {
value += char;
char = input[++i];
}
tokenList.push(
{
type: 'number',
value
}
);
continue;
}
/*
.
.
.
more token conversion condition checks
.
.
.
*/
throw new TypeError(`NameError: ${char}`);
}
return tokenList;
}
我试过弄清楚这是正则表达式的问题还是代码的其他部分的问题,但都无济于事。令牌转换成功,但我得到了一个Fatal error in , line 0 Fatal JavaScript invalid size error 169220804
,我不知道为什么。
1条答案
按热度按时间hm2xizp91#
你看到的错误是当你尝试一个对平台来说太高的数组索引时。你得到这个错误的原因是因为像
input[++i]
这样的行。i
可能会变得非常大,以至于会导致脚本崩溃。现在,它变得如此之大的原因是:
当i大于
input
的长度时,char变成undefined。test()方法总是将参数强制为string。undefined变成“undefined”,与LETTERS
匹配,因此它无限循环,直到错误停止它。我只是在您的代码中添加了检查,以确保char持有一个值,并且函数正确返回。