const NUMERIC_REG = /[0-9]/
const NUMERIC = 'Numeric'
const Puncturator = 'Punctuator'
let currentToken
let tokens = []
//刚开始的时候是start的状态 表示开始 是一个函数接受一个字符 返回下一个状态函数
function start (char) {
if (NUMERIC_REG.test(char) ) {
currentToken = {type: NUMERIC, value: ''}
return number(char) // 进入新的状态了 收集或者捕获number状态
}
}
// 收集number 或者符号
function number (char) {
if (NUMERIC_REG.test(char) ) {
currentToken.value += char
return number
} else if (char === '+' || char === '-') {
emit(currentToken) // 把上一次处理好的数据放到数组中 进行了一次分词操作
emit({type: Puncturator, value: char}) // 再发射当前token
// 因为 + 后面还是数字 我们这里是这样定义的
currentToken = {type: NUMERIC, value: ''}
return number
}
}
// 重置状态 然后把新的token放进tokens
function emit(token) {
currentToken = {type: '', value: ''}
tokens.push(token)
}
// 状态机: 一个一个的喂 上一个状态决定了下一个状态怎么走
function tokenizer(input) {
let state = start // state 是关键 要一致根据上一次状态来确定下次执行的逻辑
for (let char of input) {
//刚开始的时候是start的状态 表示开始 是一个函数接受一个字符 返回下一个状态函数
state = state(char)
}
if (currentToken.value.length > 0) {
emit(currentToken)
}
}
tokenizer('10+20')
/**
* [
{ type: 'Numeric', value: '10' },
{ type: 'Punctuator', value: '+' },
{ type: 'Numeric', value: '20' }
]
*/
console.log(tokens)