编译原理二:有限状态机

news2024/9/30 17:22:15

文章目录

  • 1. 有限状态机介绍
    • 1.1. 确定性有限状态机(DFA)
    • 1.2. 非确定性有限状态机(NFA)
    • 1.3. 有限状态机的应用
  • 2. 例子:实现一个简易版本的分词

1. 有限状态机介绍

有限状态机是一种计算模型,它可以接受一串输入并根据一组状态转移规则进行状态转移,最终输出一个结果。有限状态机可以分为两种类型:确定性有限状态机(DFA)非确定性有限状态机(NFA)

1.1. 确定性有限状态机(DFA)

DFA 是一种状态机,它的每个状态都有一条出边对应每个输入符号,而每个输入符号只能对应一条出边。在实际的编译器实现中,通常使用 DFA 进行词法分析。DFA 能够快速匹配输入的字符串,并且不需要回溯的操作,因此能够有效地提高编译器的词法分析效率。

1.2. 非确定性有限状态机(NFA)

NFA 的每个状态都可以有多条出边对应同一个输入符号。在实际应用中,NFA 通常是通过转换为 DFA 来实现的。NFA 可以描述一些 DFA 不能描述的语言,但是其转换为 DFA 的过程可能需要消耗大量的时间和空间

1.3. 有限状态机的应用

有限状态机在编译原理中有着广泛的应用。在编译器的词法分析阶段,词法分析器将源代码作为输入,通过有限状态机匹配出其中的词法单元。此外,在其他领域,有限状态机也有一些应用,比如网络协议自然语言处理图像处理等等。

有限状态机的实现方式有很多种,比如使用编程语言直接实现、使用专门的工具生成等等。在实际应用中,我们需要根据具体的问题来选择最适合的实现方式和优化策略。

2. 例子:实现一个简易版本的分词

let tokens = []; // 存储分词数据
let NUMBER = /[0-9]/; // 校验数字
let currentToken; // 存每一次的token
const Numeric = "Numeric"; // 数字类型
const Punctuator = "Punctuator"; // 运算符类型
/**
 * 开始状态函数
 * @param {*} char 传递的参数 1,0,+,2,0...
 * @return 下一个状态函数
 */
function start(char) {
  if (NUMBER.test(char)) {
    currentToken = { type: Numeric, value: "" };
  }
  return number(char);
}

function number(char) {
  if (NUMBER.test(char)) {
    // 如果传进来的时数字,就给value赋值
    currentToken.value += char;
    return number;
  } else if (char === "+" || char === "-") {
    // 如果是运算符,就将当前的token传递出去,存到tokens中
    emit(currentToken);
    // 将运算符也存起来
    emit({ type: Punctuator, value: char });
    // 重新开始分词
    currentToken = { type: Numeric, value: "" };
    return number;
  }
}

function emit(token) {
  // 重新计算currentToken
  currentToken = { type: "", value: "" };
  // 更新tokens
  tokens.push(token);
}

function tokenlizier(input) {
  // 开始是start的状态
  let state = start;
  for (let char of input) {
    // 保证每次state都更新
    state = state(char);
  }
  if (currentToken.value.length > 0) {
    // 如果传递的长度大于1则再次开始
    emit(currentToken);
  }
}

tokenlizier("10+20-20");

console.log(tokens);

输出结果:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/687284.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

脑机接口科普0023——黑门03:伦理道德中的电车难题

本文禁止转载!!!!! 脑机接口科普0022——黑门02:伦理道德问题_sgmcy的博客-CSDN博客 前文中,罗列了一下脑机接口这个技术中,会遇到哪些伦理道德的问题。 前文末,以黑门…

Stable Diffusion 对图像进行风格化

风格化是基于现有图像转换成另一种风格的操作方法,通常应用于img2img中,将文字提示中特定的新风格应用于原图像上进行修改。在这个过程中并非使用随机的潜在状态,而是采用原始图像去编码初始潜在状态。在此基础上通过加入少量的随机性&#x…

【观察】新华三:数据中心可组合架构创新,提供多元算力的“最优解”

今天,以ChatGPT为代表的AIGC大模型,已经在国内形成了“海啸效应”,几乎所有的科技公司都在想方设法进入大模型的赛道。背后的核心驱动力,就在于大模型的最大价值在于普遍提升个人生产力,而各行各业的公司都在积极寻找应…

linux下照片添加水印乱码

java程序给图片添加中文文字水印显示乱码 原因:linux服务器没有对应的文字 解决步骤 在windows系统下文字中选一个文字(微软雅黑) windows文字保存路径:C:\Windows\Fonts 上传到linux服务器:/usr/share/fonts 新建…

Revit做基坑放坡开挖方法及快速生成基坑

一、Revit做基坑放坡开挖方法 1、建立基坑顶与基坑底轮廓参照线,使用地形表面工具通过放置点创建原始平整场地过后的地形(有坐标点可以直接导入)。 2、修改原始地形名称为:开挖前,阶段化:现有类型。 3、使用平整区域,弹…

video-从入门到精通-不管任何项目奇葩需求,这一专栏就够了

在日常我们的开发中,我们会遇到类似这样的功能,视频播放了这种情况,但是如果只是简单的实现的话,ui不满意,因为,别人有的,就是代表这是能实现的,你必须完成(苦der程序员&…

享趣闻 | 神秘感十足的5个博物馆,其中一个还是在水上?

大家好,此po是乐于分享的建模助手。 小编发现,在日常的推文里,除了BIM插件相关的推送深受各位喜爱之外,一些建筑行业相关的文章热度也蛮高的。 那本期咱们就来聊聊博物馆。 博物馆是一个能直接感受历史和文明的地方,一…

ATX Server2-多设备集群环境搭建

一、简介 ATX Server2是⼀个移动设备管理平台,主要是Python3NodeJSRethinkDB开发。用于集中管理我们的设备,以及远程运行测试用例。 官方文档:https://github.com/openatx/atxserver2 搭建这样⼀套系统,需要: 1、at…

高通工具QXDM的使用

目录 1.什么是QXDM 2.QXDM抓取log的步骤 1.将手机连接在电脑上 2.进行Connect 3.Connect后就能够抓取log 4.断开连接 5.保存log文件 1.什么是QXDM QXDM,the qualcomm extensible diagnostic monitor:高通可扩展诊断监视器 是高通公司&#xff0…

【Spring Clound】Nacos高可用集群搭建与使用

文章目录 一、Nacos 简介二、Nacos 安装2.1、Nacos 环境依赖2.2、Nacos 服务端安装 三、Nacos 部署3.1、单实例部署3.2、 集群部署3.2.1、集群架构3.2.2、模拟部署 四、微服务集成Nacos4.1、依赖组件版本选型4.2、注册中心4.2.1、服务提供者4.2.2、服务消费者4.2.3、服务调用4.…

智慧园区综合能源监测解决方案

随着能源消耗的日益增长和能源环境的日益严峻,智慧园区综合能源监测解决方案成为了当前能源管理的热点话题。智慧园区综合能源监测解决方案是一种集成化的能源监测平台,可以实现对园区内各种能源的实时监测、分析和管理,从而达到优化能源配置…

应聘软件测试,差点栽在了...这5道S级的测试用例设计题上...

1、 用例设计:根据下面需求,进行测试用例设计,请注意对测试点的表达。 (网页端)需求描述: 某项目的营养素配置页面,供用户用来配置营养素的相关信息,其中: l 项目可供用…

【嵌入式Qt开发入门】在Ubuntu下编写C++

在 Ubuntu 上面编写 C,本文内容主要介绍在 Ubuntu 在终端窗口下使用 vi/vim 编辑一 个 C源文件。通过编写最简单的示例“Hello,World!”。带领大家学习如何在 Ubuntu 终端下编辑和编译 C。这里要求大家会在 Ubuntu 上使用 vi/vim,也就是要求大…

小米的故事:创新如何将一家公司从死亡漩涡中拯救出来

小米通过在爆品体系打造、贴地的新媒体策略及小米之家新零售模式上的努力,成功地克服了低潮,在经历了两年的震荡后,在软件、硬件和新零售的增长飞轮上实现了新的外延,并在2015年至2021年期间持续增长。小米的多元化爆品和创新的零…

【pytest学习总结2】 - 如何调用pytest?

目录 2.1 如何调用pytest 2.1.1 指定要运行的测试 2.1.2 获取关于版本、选项名称、环境变量的帮助 2.1.3 分析测试的执行的持续时间 2.1.4 管理插件的加载 2.1.5 其他调用pytest的方法 🎁更多干货 完整版文档下载方式: 2.1 如何调用pytest 通常…

VSCode自定义个性化console.log,快捷打印

最终效果,通过Ctrl Alt l快捷键打印选中值 如何自定义Console.log样式? 可以使用 %c 为打印内容定义样式: console.log("This is %cMy stylish message", "color: yellow; font-style: italic; background-color: blue;pa…

ivx低代码开发平台

前言 低代码开发平台(Low-Code Development Platform, LCDS)为企业和开发者提供了高效的应用开发方式。在2023年,中国的低代码开发平台正在快速发展,以下是其中最受关注的十大平台: iVX:iVX是一款新型的低代…

云从科技大模型之路:昇思“黑土地”上的生态炼成记

文 | 智能相对论 作者 | 李永华 一线客户经理,为客户一键生成周全的资产配置建议; 中端管理人员,获得系统自动撰写的一整套数据分析报表,快速、准确授信; 金融市场的“操盘手”,能够实时获取那些影响市…

系统性能测试流程总结

一、测试前期准备 1、确定用户、业务、系统需求(目标) 1)确定客户的需求和期望 在需求分析和文档的支持下,需要对软件系统上的用户业务使用情况进行分析,提出我们所关注的性能测试需求,并告知业务人员。…

2023-6-26-第八式装饰器模式

🍿*★,*:.☆( ̄▽ ̄)/$:*.★* 🍿 💥💥💥欢迎来到🤞汤姆🤞的csdn博文💥💥💥 💟💟喜欢的朋友可以关注一下&#xf…