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. 有限状态机配图
相关推荐
JAVA面经实录917几秒前
Java多线程并发高频面试100题(完整版·含答案·背诵版)
java·开发语言·面试
无限进步_10 分钟前
C++异常机制:抛出、捕获与栈展开
开发语言·c++·安全
软件技术NINI13 分钟前
泉州html+css 4页
前端·javascript·css·html
再吃一根胡萝卜14 分钟前
OpenScreen:免费开源的录屏神器,做出专业级演示视频
前端
小白学大数据14 分钟前
深度探索:Python 爬虫实现豆瓣音乐全站采集
开发语言·爬虫·python·数据分析
Cloud_Shy61815 分钟前
Python 数据分析基础入门:《Excel Python:飞速搞定数据分析与处理》学习笔记系列(第十一章 Python 包跟踪器 下篇)
前端·后端·python·数据分析·excel
Xin_ye1008617 分钟前
C# 零基础到精通教程 - 第八章:面向对象编程(进阶)——继承与多态
开发语言·c#
kyriewen17 分钟前
我用AI把公司10万行代码屎山重构了,CTO看了代码后说:你提前转正
前端·javascript·ai编程
ttwuai19 分钟前
XYGo Admin 菜单与路由:Vue3 动态路由 + GoFrame 权限菜单的完整实现方案
前端·vue·后台框架