词法分析器
词法分析器
在早期编译1.0时代,我们的目标是完成程序语言到机器语言的翻译,所以重点在编译器前端,于是我们花费大量时间研究词法分析、语法分析、语义分析等内容。如今的本科编译原理课程,基本上也就到这一层面吧。
在编译2.0时代,我们的目标变了,我们的重点在于生成高效的代码。于是,我们的重点在编译器中端和后端,我们研究循环优化,研究指令调度,研究目标平台优化等内容。如今的研究生高级编译原理教程,会涉及到这一层面。
但是,我们已经在编译3.0时代了,我们的目标是要跳出编译器这个领域,因为我们有太多太多的领域需要编译优化,如安全、数据库、深度学习等等领域,于是,我们需要有一个可以脱离编译器,却又能利用编译优化的东西,而目前最适合的就是LLVM,因为它的模块化设计、它的IR、它的License等等。
所以,要学好用好LLVM,首先需要有一个编译的整体观,我到底要用LLVM做什么?我是要去做C++前端吗?那我的重点是在C++语言,是在语义分析、是在LLVM IR代码生成。我是要去做一个后端优化吗?那我的重点是在LLVM后端,是在IR优化,是在后端代码生成,是在后端指令调度。我是要用LLVM在我的项目中来进行编译优化吗?那我的重点是在IR优化,是在结合我的业务写自定义的Pass优化。
1.手工构造
要实现一门语言,第一要务就是要能够处理文本文件,搞明白其中究竟写了些什么。
传统上,我们会先利用“词法分析器”(也称为“扫描器”)将输入切成“语元(token)”,然后再做处理。
词法分析器返回的每个语元都带有一个语元编号,此外可能还会附带一些元数据(比如某个数值)。
llvm 实现语法分析器和AST
2.自动构造
小作业参考 XLEX生成器:
XLEX生成器:
正则表达式–>NFA—>DFA–>DFA最小化–>词法分析程序
FLEX 代码参考
RE 正则表达式
正则表达式 “一行胜千言”
通用的字符串表达框架
是用来简洁表达一组字符串的表达式。
针对字符串表达“简洁”和“特征”思想的工具
判断某字符串的特征归属
正则表达式在文本处理中十分常用:
表达文本类型的特征(病毒、入侵等)
同时查找或替换一组字符串
匹配字符串的全部或部分
主要应用在字符串匹配中
正则表达式的使用:
编译:将符合正则表达式语法的字符串转换成正则表达式特征
我们可以说正则表达式是某一种语法格式,但是在程序中我们必须用字符串的形式来表达他,但是字符串就是字符串,他不是一组字符串,所以我们需要通过编译的形式,将一个字符串变成一个特征,而这个特征可以表达一组字符串,这就是编译的作用。我们也可以认为编译后的特征与一组字符串是对应的,而编译之前的正则表达式只是一个符合正则表达式语法的单一字符串,但他并不是真正意义上的正则表达式。
正则表达式语法由字符和操作符构成
正则表达式的常用操作符
操作符 说明 实例. 表示任何单个字符,它可以代表字符表上所有出现的一个字符 [ ] 字符集,对单个字符给出取值范围 [abc]表示a、b、c,[a-z]表示a到z单个字符[^ ] 非字符集,对单个字符给出排除范围 [^abc]表示非a或b或c的单个字符,(出现一个字符,但这个字符不是a,不是b,也不是c)* 前一个字符0次或无限次扩展 abc*表示ab、abc、abcc、abccc等+ 前一个字符1次或无限次扩展 abc+表示abc、abcc、abccc等? 前一个字符0次或1次扩展 abc?表示ab、abc| 左右表达式任意一个 abc|def表示abc、def{m} 扩展前一个字符m次 ab{2}c表示abbc注意,大括号只对大括号前的一个字符进行扩展 {m,n} 扩展前一个字符m至n次(含n) ab{1,2}c表示abc,abbc^ 匹配字符串开头 ^abc表示abc且在一个字符串的开头$ 匹配字符串结尾 abc$表示abc且在一个字符串的结尾() 分组标记,内部只能使用|操作符 (abc)表示abc,(abc|def)表示abc、def\d 数字,等价于[0-9]\w 单词字符,等价于[A-Za-z0-9_]
经典正则表达式实例:
^[A-Za-z]+$ 由26个字母组成的字符串^[A-Za-z0-9]+$ 由26个字母和数字组成的字符串^-?\d+$ 整数形式的字符串^[0-9]*[1-9][0-9]*$ 正整数形式的字符串[1-9]\d{5} 中国境内邮政编码,6位[\u4e00-\u9fa5] 匹配中文字符 采用utf-8编码来约定了中文字符的取值范围\d{3}-\d{8}|\d{4}-\d{7} 国内电话号码,010-68913536
FA有限自动机 不确定的有限自动机(NFA)
NFA是一个五元组,M=(S,Σ,move,s0,F):
1. S是有限个状态的集合
2. Σ是有限个输入字符(包括ε)的集合
3. move是一个状态转移函数,move(si,ch)=sj表示当前状态si下若遇到输入字符ch,则迁移到状态sj
4. s0是唯一的初态
5. F是终态集,它是S的子集,包含了所有的终态
确定的有限自动机(DFA)
DFA是NFA的一个特例:
没有状态具有ε状态转移,即状态转换图中没有标记ε的边
对每一个状态s和每一个字符a,最多有一个下一个状态
与NFA相比,DFA的特点就是它的确定性
相关文章:
词法分析器
词法分析器 在早期编译1.0时代,我们的目标是完成程序语言到机器语言的翻译,所以重点在编译器前端,于是我们花费大量时间研究词法分析、语法分析、语义分析等内容。如今的本科编译原理课程,基本上也就到这一层面吧。 在编译2.0时…...
【Spring】Spring之启动过程源码解析
概述 我们说的Spring启动,就是构造ApplicationContext对象以及调用refresh()方法的过程。 Spring启动过程主要做了这么几件事情: 构造一个BeanFactory对象解析配置类,得到BeanDefinition,并注册到BeanFactory中 解析ComponentS…...
状态模式(State)
状态模式是一种行为设计模式,允许一个对象在其内部状态改变时改变它的行为,使其看起来修改了自身所属的类。其别名为状态对象(Objects for States)。 State is a behavior design pattern that allows an object to change its behavior when its inter…...
【uniapp】样式合集
1、修改uni-data-checkbox多选框的样式为单选框的样式 我原先是用的单选,但是单选并不支持选中后,再次点击取消选中;所以我改成了多选,然后改变多选样式,让他看起来像单选 在所在使用的页面上修改样式即可 <uni-d…...
【Spring框架】SpringBoot统一功能处理
目录 用户登录权限校验用户登录拦截器排除所有静态资源练习:登录拦截器拦截器实现原理 统一异常处理统一数据返回格式为什么需要统⼀数据返回格式?统⼀数据返回格式的实现 用户登录权限校验 用户登录拦截器 1.自定义拦截器 package com.example.demo.…...
51单片机学习--按键控制流水灯模式定时器时钟
TMOD负责确定T0和T1的工作模式,TCON控制T0和T1的启动或停止计数,同时包含定时器状态 TF1:定时器1溢出标志 TF0:定时器0溢出标志 0~65535 每隔1微秒计数器1,总时间65535微秒,赋上初值64535,则只…...
Django教程_编程入门自学教程_菜鸟教程-免费教程分享
教程简介 Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,视图V和模版T。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统…...
VGG卷积神经网络-笔记
VGG卷积神经网络-笔记 VGG是当前最流行的CNN模型之一, 2014年由Simonyan和Zisserman提出, 其命名来源于论文作者所在的实验室Visual Geometry Group。 测试结果为: 通过运行结果可以发现,在眼疾筛查数据集iChallenge-PM上使用VGG…...
Python爬虫如何实现IP代理池搭建
大家好,作为一名IP代理产品供应商,我知道很多人在使用Python爬虫时遇到了一些麻烦。有时候,我们的爬虫在爬取过程中会被目标网站识别并封禁IP,导致我们的爬取任务受阻。今天我要分享的就是如何搭建一个高效稳定的IP代理池…...
单例模式:保证一个类只有一个实例
单例模式:保证一个类只有一个实例 什么是单例模式? 在软件开发中,有些类只需要一个实例,比如数据库连接池、线程池等。单例模式就是一种设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。 实…...
【新版系统架构补充】-七层模型
网络功能和分类 计算网络的功能 :数据通信、资源共享、管理集中化、实现分布式处理、负载均衡 网络性能指标:速率、带宽(频带宽度或传送线路速率)、吞吐量、时延、往返时间、利用率 网络非性能指标:费用、质量、标准化…...
第2章 C语言概述
本章介绍以下内容: 运算符: 函数:main()、printf() 编写一个简单的C程序 创建整型变量,为其赋值并在屏幕上显示其值 换行字符 如何在程序中写注释,创建包含多个函数的程序,发现程序的错误 什么是关键字 C程…...
vscode vue3开发常用插件(附Prettier格式化配置)
必不可少插件(名称可能不全): 1、Chinese (Simplified) (简体中文) Language 2、Prettier - Code formatter 3、Vue 3 Snippets 4、Vue Language Features (Volar) 可选插件: 5、Auto Close Tag 6、Vue Theme Prettier格式化配置: 按ctr…...
【微信小程序】van-uploader实现文件上传
使用van-uploader和wx.uploadFile实现文件上传,后端使用ThinkPHP。 1、前端代码 json:引入van-uploader {"usingComponents": {"van-uploader": "vant/weapp/uploader/index"} }wxml:deletedFile是删除文件函…...
人工智能在计算机视觉中的应用与挑战
引言 计算机视觉是人工智能领域的一个重要分支,旨在让计算机能够像人一样理解和解释视觉信息,实现图像和视频的自动识别、理解和分析。计算机视觉技术已经在许多领域产生了深远的影响,如人脸识别、自动驾驶、医学影像分析等。本篇博客将深入…...
以太网接口指示灯状态分析和电路设计
一、RJ45以太网连接器介绍 以带网络隔离变压器的RJ45接头为例,如HR911105A,其技术参数如下 原理框图 指示灯部分 二、PHY芯片 phy芯片以DP83848CVV/NOPB为例,查看数据手册。引脚26,引脚27和引脚28和LED灯相关,如下截…...
Redis的基础
一、进入redis 内部 / 关闭 # 方式一: // 进入redis redis-cli // 有密码输入密码 :auth [username] password auth 123456 # 方式二: // 进入redis 并且输入密码 redis-cli -a 123456// 如果在docker 里面的则可以 docker exec -it redis…...
LeetCode 626. 换座位
题目链接:LeetCode 626. 换座位 题目描述 表名:Seat 编写SQL查询来交换每两个连续的学生的座位号。如果学生的数量是奇数,则最后一个学生的id不交换。 按 id 升序 返回结果表。 查询结果格式如下所示。 示例1: 题目分析 如…...
华为、阿里巴巴、字节跳动 100+ Python 面试问题总结(六)
系列文章目录 个人简介:机电专业在读研究生,CSDN内容合伙人,博主个人首页 Python面试专栏:《Python面试》此专栏面向准备面试的2024届毕业生。欢迎阅读,一起进步!🌟🌟🌟 …...
hash 模式和 history 模式的实现原理
hash 模式和 history 模式的实现原理: #后面的 hash 值的变化不会导致浏览器向服务器发出请求,浏览器不发出请求,就不会刷新页面。通过监听 hashchange 事件的变化可以知道 hash 值发生了哪些变化,然后根据 hash 值的变化来实现更…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
Spring Boot + MyBatis 集成支付宝支付流程
Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例(电脑网站支付) 1. 添加依赖 <!…...
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里 脚本1 #!/bin/bash #定义变量 ip10.1.1 #循环去ping主机的IP for ((i1;i<10;i)) doping -c1 $ip.$i &>/dev/null[ $? -eq 0 ] &&am…...
