当前位置: 首页 > 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 值的变化来实现更…...

DwarFS库开发指南:如何集成reader、writer和extractor API

DwarFS库开发指南&#xff1a;如何集成reader、writer和extractor API 【免费下载链接】dwarfs A fast high-compression read-only file system for Linux, FreeBSD, macOS and Windows 项目地址: https://gitcode.com/gh_mirrors/dw/dwarfs DwarFS是一款适用于Linux、…...

Autoware实车部署避坑指南(一)-- 从零搭建矢量地图与Unity工具链实战

1. 为什么需要矢量地图与Unity工具链 第一次接触Autoware实车部署的朋友&#xff0c;往往会被矢量地图这个概念搞懵。简单来说&#xff0c;矢量地图就是给自动驾驶车辆用的"高精导航地图"&#xff0c;它不像我们手机导航用的普通地图那样只有粗略的道路信息。举个例子…...

亚洲美女-造相Z-Turbo部署教程:Gradio WebUI入口查找与端口映射配置详解

亚洲美女-造相Z-Turbo部署教程&#xff1a;Gradio WebUI入口查找与端口映射配置详解 想快速体验生成高质量亚洲美女图片的乐趣吗&#xff1f;今天我来带你手把手部署“亚洲美女-造相Z-Turbo”模型&#xff0c;这是一个基于Z-Image-Turbo模型、专门针对亚洲美女风格进行优化的文…...

五大页面置换算法实战对比:从理论到实现的性能优化指南

1. 页面置换算法&#xff1a;内存管理的隐形裁判 当你的电脑同时运行十几个程序却依然流畅时&#xff0c;背后其实是页面置换算法在默默工作。想象一下内存就像一家网红餐厅的有限座位&#xff0c;而进程就是源源不断的顾客。页面置换算法就是那位决定"让哪桌客人暂时离开…...

电子产品PCB热仿真建模与热过孔设计的系统化方法

&#x1f393;作者简介&#xff1a;科技自媒体优质创作者 &#x1f310;个人主页&#xff1a;莱歌数字-CSDN博客 &#x1f48c;公众号&#xff1a;莱歌数字&#xff08;B站同名&#xff09; &#x1f4f1;个人微信&#xff1a;yanshanYH 211、985硕士&#xff0c;从业16年 从…...

一文讲透数字化转型的十个关键概念:信息化、自动化、数据化、智能化、平台化……

最近几年&#xff0c;提到数字化转型&#xff0c;总绕不开一堆带“化”的词&#xff1a;信息化、数据化、智能化、平台化等等。说实话&#xff0c;这些概念太多了&#xff0c;有时候连从业者都容易搞混。今天我就来给大家梳理一下电子化、信息化、结构化、多媒体化、自动化、网…...

大型源码C# WPF开发,集成SCADA数据采集系统、数据库与远程服务器调用,多产品线程序组成...

大型源码C# MES WPF CS/BS两套 1, 整体程序由WPF&#xff08;c#&#xff09;开发&#xff1b; 2&#xff0c;各个文档齐全&#xff1b; 3&#xff0c;需要您对WPF和程序架构有比较深入理解&#xff1b; 4&#xff0c;包含服务程序&#xff1b; 5&#xff0c;包含SCADA数据采集…...

互联网大厂Java面试:从Spring Boot到Kafka的业务场景深度剖析

互联网大厂Java面试&#xff1a;从Spring Boot到Kafka的业务场景深度剖析 场景概述 谢飞机今天来到了一家知名互联网大厂参与Java开发岗位的面试&#xff0c;面试官是一位技术严谨且经验丰富的资深架构师。在这次面试中&#xff0c;问题围绕“电商场景”展开&#xff0c;涉及Sp…...

web后端python安全-总结

Python的import关键字--不⽤⾃⼰从零写功能&#xff0c;直接⽤别⼈封装好的成熟代码。 写爬⾍不⽤⾃⼰写⽹络请求代码&#xff0c;导⼊requests库就能直接⽤Python爬⾍编写&#xff08;爬⽹络数字的工具&#xff09;Python Web 后端80% 的漏洞来自注入、越权、明文密码、配置泄…...

JSON语法结构

‌1、JSON 值类型‌1.1‌ 字符串(String)‌&#xff1a;必须用‌双引号‌包裹&#xff0c;如 "hello"。1.2‌ 数字(Number)‌&#xff1a;整数或浮点数&#xff0c;如 42、-3.14、1.23e4。1.3‌ 布尔值(Boolean)‌&#xff1a;true 或 false。1.4‌ 空值(Null)‌&…...