【发布时间】:2022-02-16 15:27:46
【问题描述】:
我决定尝试制作一个语言标记器(甚至不知道这是否是一个真实的单词)并制作了大约 4 个标记,成功标记了一个带有换行符和多个空格等的完整程序,但我只是从头开始我遇到了问题;我目前有两个令牌,int 和 variableSet。正在读取的程序具有 1 sv 1 2 的内容作为测试,并且标记器返回一个 int, int, int, int 数组,其中 sv 的值为 1。
const code = `1 sv 1 2`
var validTokens = require("./tokens"); // just an object with the structure tokenName: RegExp object
function reverseTokenSearch(regex){
for (const [index, [key, value]] of Object.entries(Object.entries(validTokens))) {
if (value === regex){
return key;
}
}
return false;
}
function throughTokens (code,lastidx=0) {
for (const tokentype in validTokens){ // loop through all of the valid tokens
validTokens[tokentype].lastIndex = lastidx;
const searchresult = validTokens[tokentype]
const tokenresult = searchresult.exec(code.toString());
if (tokenresult) {
return [searchresult, tokenresult[0], tokenresult.index, lastidx+tokenresult[0].length+1, tokenresult.groups]
}
}
}
function resetIndexes (){
for (const tt in validTokens){
validTokens[tt].lastidx = 0;
}
}
resetIndexes();
var lst = 0
var tokens = []
var res = 1;
console.log("\ntokenizer; original input:\n"+code+"\n");
while (lst !== undefined && lst !== null){
if (lst > code.length){
console.error("Fatal error: tokenizer over-reached program length.")
process.exit(1)
}
const res = throughTokens(code,lst);
if(res){
console.log(res,lst)
const current = []
current[0] = reverseTokenSearch(res[0])
current[1] = res[1]
const currentidx = 2
for (const x in res[4]) {
current[currentidx] = x;
}
tokens.push(current)
lst = res[3]
} else {
lst = null
}
}
console.log(tokens)
// What outputs:
/*
tokenizer; original input:
1 sv 1 2
[ /\d+/g { lastidx: 0 }, '1', 0, 2, undefined ] 0
[ /\d+/g { lastidx: 0 }, '1', 5, 4, undefined ] 2
[ /\d+/g { lastidx: 0 }, '1', 5, 6, undefined ] 4
[ /\d+/g { lastidx: 0 }, '2', 7, 8, undefined ] 6
[ [ 'int', '1' ], [ 'int', '1' ], [ 'int', '1' ], [ 'int', '2' ] ]
*/
我认为这是因为数组的顺序,但我不知道从哪里开始修复它,并且非常感谢朝着正确的方向推动。 (编辑):我尝试删除 RegExp 对象上的“g”标志,但它所做的只是让程序陷入无限循环。
【问题讨论】:
-
可以显示
validTokens的内容吗? -
module.exports = { int: new RegExp("\\d+","g"), variableSet: new RegExp("sv","g"), }
标签: javascript node.js regex tokenize