当前位置: 首页 > news >正文

词法分析器

词法分析器

在早期编译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多选框的样式为单选框的样式 我原先是用的单选&#xff0c;但是单选并不支持选中后&#xff0c;再次点击取消选中&#xff1b;所以我改成了多选&#xff0c;然后改变多选样式&#xff0c;让他看起来像单选 在所在使用的页面上修改样式即可 <uni-d…...

【Spring框架】SpringBoot统一功能处理

目录 用户登录权限校验用户登录拦截器排除所有静态资源练习&#xff1a;登录拦截器拦截器实现原理 统一异常处理统一数据返回格式为什么需要统⼀数据返回格式&#xff1f;统⼀数据返回格式的实现 用户登录权限校验 用户登录拦截器 1.自定义拦截器 package com.example.demo.…...

51单片机学习--按键控制流水灯模式定时器时钟

TMOD负责确定T0和T1的工作模式&#xff0c;TCON控制T0和T1的启动或停止计数&#xff0c;同时包含定时器状态 TF1&#xff1a;定时器1溢出标志 TF0&#xff1a;定时器0溢出标志 0~65535 每隔1微秒计数器1&#xff0c;总时间65535微秒&#xff0c;赋上初值64535&#xff0c;则只…...

Django教程_编程入门自学教程_菜鸟教程-免费教程分享

教程简介 Django是一个开放源代码的Web应用框架&#xff0c;由Python写成。采用了MTV的框架模式&#xff0c;即模型M&#xff0c;视图V和模版T。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的&#xff0c;即是CMS&#xff08;内容管理系统&#xf…...

VGG卷积神经网络-笔记

VGG卷积神经网络-笔记 VGG是当前最流行的CNN模型之一&#xff0c; 2014年由Simonyan和Zisserman提出&#xff0c; 其命名来源于论文作者所在的实验室Visual Geometry Group。 测试结果为&#xff1a; 通过运行结果可以发现&#xff0c;在眼疾筛查数据集iChallenge-PM上使用VGG…...

Python爬虫如何实现IP代理池搭建

大家好&#xff0c;作为一名IP代理产品供应商&#xff0c;我知道很多人在使用Python爬虫时遇到了一些麻烦。有时候&#xff0c;我们的爬虫在爬取过程中会被目标网站识别并封禁IP&#xff0c;导致我们的爬取任务受阻。今天我要分享的就是如何搭建一个高效稳定的IP代理池&#xf…...

单例模式:保证一个类只有一个实例

单例模式&#xff1a;保证一个类只有一个实例 什么是单例模式&#xff1f; 在软件开发中&#xff0c;有些类只需要一个实例&#xff0c;比如数据库连接池、线程池等。单例模式就是一种设计模式&#xff0c;用于确保一个类只有一个实例&#xff0c;并提供一个全局访问点。 实…...

【新版系统架构补充】-七层模型

网络功能和分类 计算网络的功能 &#xff1a;数据通信、资源共享、管理集中化、实现分布式处理、负载均衡 网络性能指标&#xff1a;速率、带宽&#xff08;频带宽度或传送线路速率&#xff09;、吞吐量、时延、往返时间、利用率 网络非性能指标&#xff1a;费用、质量、标准化…...

第2章 C语言概述

本章介绍以下内容&#xff1a; 运算符&#xff1a; 函数&#xff1a;main()、printf() 编写一个简单的C程序 创建整型变量&#xff0c;为其赋值并在屏幕上显示其值 换行字符 如何在程序中写注释&#xff0c;创建包含多个函数的程序&#xff0c;发现程序的错误 什么是关键字 C程…...

vscode vue3开发常用插件(附Prettier格式化配置)

必不可少插件(名称可能不全)&#xff1a; 1、Chinese (Simplified) (简体中文) Language 2、Prettier - Code formatter 3、Vue 3 Snippets 4、Vue Language Features (Volar) 可选插件&#xff1a; 5、Auto Close Tag 6、Vue Theme Prettier格式化配置&#xff1a; 按ctr…...

【微信小程序】van-uploader实现文件上传

使用van-uploader和wx.uploadFile实现文件上传&#xff0c;后端使用ThinkPHP。 1、前端代码 json&#xff1a;引入van-uploader {"usingComponents": {"van-uploader": "vant/weapp/uploader/index"} }wxml&#xff1a;deletedFile是删除文件函…...

人工智能在计算机视觉中的应用与挑战

引言 计算机视觉是人工智能领域的一个重要分支&#xff0c;旨在让计算机能够像人一样理解和解释视觉信息&#xff0c;实现图像和视频的自动识别、理解和分析。计算机视觉技术已经在许多领域产生了深远的影响&#xff0c;如人脸识别、自动驾驶、医学影像分析等。本篇博客将深入…...

以太网接口指示灯状态分析和电路设计

一、RJ45以太网连接器介绍 以带网络隔离变压器的RJ45接头为例&#xff0c;如HR911105A&#xff0c;其技术参数如下 原理框图 指示灯部分 二、PHY芯片 phy芯片以DP83848CVV/NOPB为例&#xff0c;查看数据手册。引脚26&#xff0c;引脚27和引脚28和LED灯相关&#xff0c;如下截…...

Redis的基础

一、进入redis 内部 / 关闭 # 方式一&#xff1a; // 进入redis redis-cli // 有密码输入密码 &#xff1a;auth [username] password auth 123456 # 方式二&#xff1a; // 进入redis 并且输入密码 redis-cli -a 123456// 如果在docker 里面的则可以 docker exec -it redis…...

LeetCode 626. 换座位

题目链接&#xff1a;LeetCode 626. 换座位 题目描述 表名&#xff1a;Seat 编写SQL查询来交换每两个连续的学生的座位号。如果学生的数量是奇数&#xff0c;则最后一个学生的id不交换。 按 id 升序 返回结果表。 查询结果格式如下所示。 示例1&#xff1a; 题目分析 如…...

华为、阿里巴巴、字节跳动 100+ Python 面试问题总结(六)

系列文章目录 个人简介&#xff1a;机电专业在读研究生&#xff0c;CSDN内容合伙人&#xff0c;博主个人首页 Python面试专栏&#xff1a;《Python面试》此专栏面向准备面试的2024届毕业生。欢迎阅读&#xff0c;一起进步&#xff01;&#x1f31f;&#x1f31f;&#x1f31f; …...

hash 模式和 history 模式的实现原理

hash 模式和 history 模式的实现原理&#xff1a; #后面的 hash 值的变化不会导致浏览器向服务器发出请求&#xff0c;浏览器不发出请求&#xff0c;就不会刷新页面。通过监听 hashchange 事件的变化可以知道 hash 值发生了哪些变化&#xff0c;然后根据 hash 值的变化来实现更…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...