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. 实现 /abcd/
js 复制代码
function waitForC(char) {
  if (char === 'c' || char === 'd') {
    endIndex = i 
    return end
  }
  return waitForA
}
  1. 有限状态机配图
相关推荐
kyriewen8 小时前
我手写了一个 EventEmitter,面试官追问了 6 个问题——第 4 个我没答上来
前端·javascript·面试
IT_陈寒9 小时前
Java的Date类又坑了我一次,改用时间戳真香
前端·人工智能·后端
山河木马9 小时前
矩阵专题2-怎么创建视图矩阵(uViewMatrix)
javascript·webgl·计算机图形学
小林攻城狮9 小时前
使用 Transport 节流解决 Vercel AI SDK 流式渲染卡死问题
前端·react.js
前端缘梦9 小时前
告别 TS 运行时类型漏洞!Zod 完整入门实战教程(前端 / 全栈必备)
前端·react.js·全栈
the_answer10 小时前
Webpack vs Vite 深度对比分析
前端·webpack
转转技术团队10 小时前
验证码识别实战:前端不写页面,改训模型了?
前端
MomentYY10 小时前
Temperature:AI 的“脑洞旋钮”
前端·llm·ai编程
远航_10 小时前
OpenSpec 完整详细介绍
前端·后端
召钱熏10 小时前
状态枚举正确≠渲染正确:一个语音按钮的状态机边界修复实录
android·前端