编译原理(2-有限状态机)


3、有限状态机

  • 每一个状态都是一个机器(函数),每个机器都可以接收输入和计算输出
  • 机器本身没有状态,每一个机器会根据输入决定下一个状态

一个简单的状态机,代码实现如下:

/**
 * 分词
 * 状态机
 */
let NUMBERS= /[0-9]/;
const Numeric = 'Numeric';
const Punctuator = 'Punctuator';
let tokens = [];
/**
 * start表示开始状态函数
 * 它是一函数,接收一个字符,返回下一个状态函数
 */
let currentToken;
//确定一个新的token.
function emit(token){
    currentToken={type:'',value:''};
    tokens.push(token);
}
function start(char){//char=1
    if(NUMBERS.test(char)){//如果这个char是一个数字的话
        currentToken={type:Numeric,value:''};
         //进入新的状态了,什么状态?就是收集或者是捕获number数字的状态
        return number(char);
    }
    throw new TypeError('首字符必须是数字');
}

function number(char){
    if(NUMBERS.test(char)){//如果这个char是一个数字的话
        currentToken.value+=char;
        return number;
    }else if(char === '+'||char === '-'){
        emit(currentToken);
        emit({type:Punctuator,value:char});
        currentToken={type:Numeric,value:''};
        return number;
    }
}
function tokenizer(input){
    //刚开始的时候是start的状态
    let state = start;
    for(let char of input){
        state = state(char);
    }
    if(currentToken.value.length>0)
        emit(currentToken);
}
tokenizer("10+20+30-40");
// 10 + 20 + 30 - 10
console.log(tokens);

/**
[
    { type: 'Numeric', value: '10' },
    { type: 'Punctuator', value: '+' },
    { type: 'Numeric', value: '20' }
  ]
 */

文章作者: 何不去高处
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 何不去高处 !