41-parse的实现原理&有限状态机

parse 的实现原理

  1. 有限状态机 finite state machine
  • 读取一组输入,然后根据这些输入来更改为不同的状态
js 复制代码
state1----->  state2
    `------>  state3
  1. 简述 parse 的过程

    初始状态-----}}-----> 插值 ---> end ↓
    -----< a-z-----> parseElement ----> parseTag 开始 ---> parseChildren(循环) ---> parseTag 结束 ↓ -----非以上是text-----> parseText ↓
    结束

  • 解析插值语法
  • 解析 < a-z 标签语法
  • 解析除以上两种语法外的 text 语法
  1. 状态机经常被用在词法语法解析的场景

  2. 使用有限状态机实现正则表达式功能

js 复制代码
function test(string) {
  function waitForA(char) {
    if (char === 'a') {
      return waitForB
    }
    return waitForA
  }

  function waitForB(char) {
    if (char === 'b') {
      return waitForC
    }
    return waitForA
  }


  function waitForC(char) {
    if (char === 'c') {
      return end
    }
    return waitForA
  }
  function end() {
    return end
  }

  let currentState = waitForA
  for (let i = 0; i < string.length; i++) {
    let nextState = currentState(string[i])
    currentState = nextState
    if(currentState === end) {
      return true
    }
  }
  return false
}
console.log(test('abc')); // true
    
console.log(test('acc')); // false

console.log(test('labcfdds')); // true
  1. 获取匹配的 "abc" 的下标
js 复制代码
function test(string) {
  let startIndex // ✅
  let endIndex // ✅
  let i  // ✅
  let result = []
  function waitForA(char) {
    if (char === 'a') {
      startIndex = i // ✅
      return waitForB
    }
    return waitForA
  }

  function waitForB(char) {
    if (char === 'b') {
      return waitForC
    }
    return waitForA
  }

  function waitForC(char) {
    if (char === 'c' || char === 'd') {
      endIndex = i // ✅ 
      return end
    }
    return waitForA
  }

  function end() {
    return end
  }

  let currentState = waitForA
  for (i = 0; i < string.length; i++) {
    let nextState = currentState(string[i])
    currentState = nextState
    if(currentState === end) { // ✅
      console.log(startIndex, 'startIndex');  // ✅
      console.log(endIndex, 'endIndex'); // ✅
      result.push({ // ✅
        start: startIndex,
        end: endIndex
      })
      currentState = waitForA   // ✅  相当于结束回到初始状态, 这样能够下次循环继续走流程检验,否则会一直处在 end 状态
      // return true // ✅
    }
  }
  // return false
}
// console.log(test('abc')); // true
    
// console.log(test('acc')); // false

console.log(test('labcfabcdds')); // true
  1. 实现 /ab[cd]/
js 复制代码
function waitForC(char) {
  if (char === 'c' || char === 'd') {
    endIndex = i 
    return end
  }
  return waitForA
}
  1. 有限状态机配图
相关推荐
聆风吟º几秒前
【C标准库】C语言memset函数详解:从原理到实战避坑
c语言·开发语言·库函数·memset
idealzouhu几秒前
【Kotlin】 数据流完全指南:冷流、热流与 Android 实战
android·开发语言·kotlin
蜗牛攻城狮2 分钟前
【Vue3实战】El-Table实现“超过3行省略,悬停显示全文”的完美方案(附性能优化)
前端·vue.js·性能优化·element-plus
孙12~2 分钟前
前端vue3+vite,后端SpringBoot+MySQL
前端·html·学习方法
快快起来写代码3 分钟前
反射可能用于的场景
开发语言·python
隔壁小邓4 分钟前
vue的组件化的理解之单独拆分的组件&组件的封装
前端·javascript·vue.js
Ivanqhz5 分钟前
图着色寄存器分配算法(Graph Coloring)
开发语言·javascript·python·算法·蓝桥杯·rust
一直都在5726 分钟前
JAVA类的加载过程
java·开发语言
困惑阿三6 分钟前
全栈部署排雷手册:从 405 报错到飞书推送成功
服务器·前端·后端·nginx·阿里云·node.js·飞书
无名-CODING7 分钟前
从零开始!Vue3+SpringBoot前后端分离项目Docker部署实战(下):Vue前端Nginx反代与致命坑点盘点
前端·spring boot·docker