自动有限状态机/自动机 实现简单分词器

本文介绍了自动有限状态机的概念,包括摩尔型和米粒型,并通过实例讲解了如何利用米粒型状态机实现一个简单的分词器。文章探讨了在编译器前端的词法分析中,自动机如何进行分词,将代码分解为有效的token和非token,并指出分词错误与语法错误的区别。
摘要由CSDN通过智能技术生成

自动有限状态机

1 是啥

计算理论中,确定有限状态自动机确定有限自动机(英语:deterministic finite automaton, DFA)是一个能实现状态转移的自动机。对于一个给定的属于该自动机的状态和一个属于该自动机字母表的字符,它都能根据事先给定的转移函数转移到下一个状态(这个状态可以是先前那个状态)。

状态机是啥

比如家门就是个状态机,有开门和关门两种状态

什么叫有限状态机

状态是有限的

比如开门和关门是两种状态,不是无限状态

2. 分类

2.1 摩尔型

下一个状态时确定的

比如电视机的开或者关,下一个状态永远是确定的

2.2 米粒型

下一个状态不确定,根据输入会有变化

比如家里电视10个台,就是10种状态,这个变化和我的输入有关

我们编程主要用到米粒型的自动机

2.2.1 例子

这是判断是否字符串含有ab

image-20210526235014963

image-20210526235102166

上面两个太麻烦了,这样麻烦是因为状态太多了,所以该轮到自动机出场了!

首先还是要个循环

image-20210526235212729

首先 start是个函数,其实是状态机,state就是状态,他俩都是函数,这个函数要返回下个状态,每个状态可以看成一个函数,因为我们做的是米粒型状态机,所以下个状态是不确定的image-20210526235310032

如果字符串c是a,那就返回下一个状态 foundB,否则就返回start,start是初始状态

如果字符串是a,就返回下个状态foundB,否则就返回start,start是初始状态,这里是根据c不同返回不同的状态,所以是米粒型的自动机,如果返回一个固定的,和c无关,就是摩尔型自动机

image-20210526235540836

foundB也是个状态机

image-20210526235729011

假设我们只找abc,找到就停止,那最后返回end就行了

end 是个摩尔型自动机

image-20210526235855114

2.2.2 应用 ----尝试自己实现一个语言

要实现个语言的编译器,需要两步

分为前端和后端

  • 前端
    • 就是理解,我们写一大段代码,对计算机来说都是乱码,我们得先让计算机理解我们写的是啥
  • 后端
    • 生成机器码,性能优化

其实前端也分两步

  • 首先要词法分析
  • 其次要语法分析

词法分析:

  • 就是分词,比如var a = 1,有一些比如var,比如 = ,比如1这样的东西,叫做终结符

  • 终结符里面分为token和非token两部分

    • 啥是token,就是大概有效输入的意思
    • 哪些是token,除了空格,换行,注释都是
  • 简单来讲,这个分词就是把代码分成数组,每个token都分开,并且标注这个token代表什么

    比如var 是关键字, a是keyword

    大概就是把代码传入一个函数,这个函数帮我分词

  • token分为有效和无效

    比如这种情况

    这个就是无效token,因为 keyword不能以数字开头

    (其实大部分语言都不拿数字开头,因为自动机实现起来麻烦,哈哈哈)

    image-20210527000911758

    var 1 = 1 这个在分词阶段不会报错,因为这是语法错误,不是词法错误

2.2.3 小练习,实现分词的自动机
let token = [
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值