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. 有限状态机配图
相关推荐
小码哥_常3 小时前
一套自己部署的 IM,客户端是同一份 Flutter
前端·后端
蜗牛攻城狮5 小时前
微前端四大方案选型对比与最佳实践:qiankun、micro-app、wujie、Module Federation
前端·微前端·qiankun·前端架构·micro-app·wujie
C^h6 小时前
c++ string
开发语言·c++
raindayinrain6 小时前
c++高性能--原子操作,无锁编程,操作顺序
开发语言·c++·性能优化
学逆向的6 小时前
C++ 合并命名空间
开发语言·c++·网络安全
Zhao-Jichao6 小时前
VS2026 打包 C++ 程序生成 EXE,借助 Installer Project 扩展工具
开发语言·c++
她说可以呀6 小时前
Vue插槽
前端·javascript·vue.js
qq_448011166 小时前
Vue + Jinja2两套模版与法冲突造成undefinedError
前端·javascript·vue.js
aixingpan7 小时前
aixingpan.cn API开发文档:前端查询夏令时和时区接口指南
前端·php
学逆向的7 小时前
C 局部静态变量
c语言·开发语言·网络安全