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

TinyC编译器5—词法分析

1.词法分析的概念

词法分析也称为 分词 ,此阶段编译器从左向右扫描源文件,将其字符流分割成一个个的  ( token 、 记号 ,后文中将称为 token )。所谓 token ,就是源文件中不可再进一步分割的一串字符,类似于英语中单词,或汉语中的词。

TOKEN-TYPE              TOKEN-VALUE
-----------------------------------------------
T_IF                    if
T_WHILE                 while
T_ASSIGN                =
T_GREATTHAN             >
T_GREATEQUAL            >=
T_IDENTIFIER            name / numTickets / ...
T_INTEGERCONSTANT       100 / 1 / 12 / ....
T_STRINGCONSTANT        "This is a string" / "hello" / ...

编译器中的 token 中一般用一个 struct 来表示:

typedef enum {T_IF, T_WHILE, T_ADD, T_INTCONSTANT, T_STRINGCONSTANT, T_IDENTIFIER, ...
} TokenType;typedef struct _Token {TokenType type;union {char *stringval;int *intval;double *doubleval;} value;
} TokenRecord;

词法分析器每扫描到一个完整的 token 后,立即 新建一个 TokenRecord ,将此 token 的类型记录在此结构的 type 域中,将其字面值记录在 value 域中对应的子域内,并将此 TokenRecord 结构传递给下一阶段的语法分析模块使用,然后接着扫描下一个 token 。这样从语法分析模块的角度来看,源程序就变成了一个连续的 token stream 了。

分词扫描的方法目前主流使用的是正则表达式,下面将进行介绍。

2.正则语言和正则表达式

2.1正则语言的定义

  • 只有一个空句子的集合是一个正则语言,只有一个单符号句子的集合也是一个正则语言。如以下每个集合都是一个正则语言:{ε}, {a}, {b}, ..., {z}。注意:{ε} 不要和空集搞混了,空集中没有任何元素,但是{ε} 中有一个空句子元素。
  • 如果句子集合 R1 和 R2 是正则语言,则 R1 和 R2 的并集 R 也是一个正则语言,R = R1 ∪ R2。
  • 如果句子集合 R1 和 R2 是正则语言,则 R1 和 R2 的连接集合 R 也是一个正则语言。连接集合 R = { s1 s2 | s1 ∈ R1, s2 ∈ R2 } 。
  • 如果句子集合 R 是正则语言,则 R 的重复集合 R* 也是一个正则语言,重复集合 R* = { s1 s2 ... sn | si ∈ R , n ∈ N },此处 n 可以等于 0 ,此时 R* 中只有一个空句子。

但是正则语言如何表示出来呢,这时候正则表达式登场。

2.2正则表达式

  • 只有一个空句子的集合的正则表达式为 ε ,只有一个单符号句子的集合 {θ} 的正则表达式为 θ 。
  • 如果正则语言 R1 和 R2 的正则表达式为 r1 和 r2 ,那么正则表达式 r1|r2 表示 R1 和 R2 的并集。
  • 如果正则语言 R1 和 R2 的正则表达式为 r1 和 r2 ,那么正则表达式 r1 r2 表示 R1 和 R2 的连接集合。
  • 如果正则语言 R 的正则表达式为 r , 那么正则表达式 r* 表示 R 的重复集合 R* 。
  • 正则表达式 (r) 和 r 是等价的。

举个例子:正则表达式 a 表示集合 {a}, b 表示集合 {b} , a|b 表示集合 {a, b} , ab* 表示集合 {a, ab, abb, abbb, ... } 。

2.2.2特殊字符

以下 11 个字符:* [ ] ^ $ . | ? * + ( ) 被保留作特殊用途,如果想使用这些字符的字面值,需要在前面加反斜杠 “\” 转义。另外,一些不便书写的字符可以通过在前面加 “\” 转义,如 \n 和 \t 分别表示换行符和制表符。

2.2.3字符集

如: [abferx] ,用方括号括起来的字符,表示匹配这些字符中的其中一个,相当于 (a|b|f|e|r|x) 。方括号内的特殊字符不需要转义( [ ] - ^ 除外),如 [af({] 表示 匹配 “a”, “f”, “{”, “(” 中的其中一个。方扩号内可以使用 “-“ 来定义一个范围,且可以定义多个范围,如 [0-9] 表示匹配单个数字, [a-zA-Z] 表示匹配单个字母。

2.2.4取反字符集

如: [^abc] ,在方括号内的第一个字符为 ^ ,表示这是一个取反字符集,表示匹配一个不在方括号内部的字符。

2.2.5  *、?和+

* 表示匹配前面的字符(或者由括号括起来的表达式、方括号括起来的字符集)0次或多次;

? 表示匹配前面的字符(或者由括号括起来的表达式、方括号括起来的字符集)0次或1次;

+ 表示匹配前面的字符(或者由括号括起来的表达式、方括号括起来的字符集)1次或多次。

2.2.6 ”.” 通配符

. 表示匹配除换行符外的任意字符一次。

综上所诉:

正则表达式可以用来表示源程序中的 token ,如:

  • 整数 : [0-9]+
  • 小数 : [0-9]+\.[0-9]*
  • 字符串 : \”[^\”]*\”
  • 标识符 : [_a-zA-Z][_a-zA-Z0-9]*
  • 关键字 if : if

3.正则表达式背后的原理:有限状态自动机

有限状态自动机(finate automaton)是用来判断字符串(句子)是否和正则表达式匹配的假想机器,它有一个字母表 Σ 、一个状态集合 S ,一个转换函数 T ,当它处于某个状态时,若它读入了一个字符(必须是字母表里的字符),则会根据当前状态和读入的字符自动转换到另一个状态,它有一个初始状态,还有一些所谓的接受状态。

上图中圆圈表示各种状态,各箭头及签头上的字符表示状态的转换表,自动机只有一个初始状态,用一个不含字符的箭头指向此状态,可以认为此为自动机的入口,自动机可以有一个或多个接受状态,用双圆圈表示。

上图中的自动机的字母表为 {a, b},初始状态为 S1 ,当它读入一个 a 后,就转到状态 S2 ,若读入的是 b ,则转到 S4,然后一个接一个字符的转换其状态,若字符结束时自动机处在其接受状态,则表示此字符串被其接受。

经过观察可知,此图中的自动机能接受的字符串为 “ab”, “abb”, “abbb”, ... ,也就是说,此自动机与正则表达式 ab+ 是等价的。

而且数学家们已经证明了:任何一个正则表达式都有一个等价的有限状态自动机,任何一个有限状态自动机也有一个等价的正则表达式。

相关文章:

TinyC编译器5—词法分析

1.词法分析的概念 词法分析也称为 分词 ,此阶段编译器从左向右扫描源文件,将其字符流分割成一个个的 词 ( token 、 记号 ,后文中将称为 token )。所谓 token ,就是源文件中不可再进一步分割的一串字符&am…...

电子电气架构---智能计算架构和SOA应用

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不…...

Python Numpy 实现神经网络自动训练:反向传播与激活函数的应用详解

Python Numpy 实现神经网络自动训练:反向传播与激活函数的应用详解 这篇文章介绍了如何使用 Python 的 Numpy 库来实现神经网络的自动训练,重点展示了反向传播算法和激活函数的应用。反向传播是神经网络训练的核心,能够通过计算梯度来优化模…...

Apache Calcite - 基于规则的查询优化

基于规则的查询优化 基于规则的查询优化(Rule-based Query Optimization)是一种通过应用一系列预定义的规则来优化查询计划的技术。这些规则描述了如何转换关系表达式,以提高查询执行的效率。基于规则的优化器并不依赖于统计信息&#xff0c…...

react学习笔记,ReactDOM,react-router-dom

react 学习 1. 下载与安装 下载 npm install -g create-react-app 安装 npx create-react-app xxx 推荐 npm init react-app xxx yarn create react-app xxx 2. 创建 react 元素 indexjs 文件 import React from "react"; import ReactDOM from "react…...

优化UVM环境(八)-整理project_common_pkg文件

书接上回: 优化UVM环境(七)-整理环境,把scoreboard拿出来放在project_common环境里 Prj_cmn_pkg.sv考虑到是后续所有文件的基础,需要引入uvm_pkg并把自身这个pkg import给后续的文件: 这里有3个注意事项&…...

【实战案例】Django框架连接并操作数据库MySQL相关API

本文相关操作基于上次操作基本请求及响应基础之上【实战案例】Django框架基础之上编写第一个Django应用之基本请求和响应 Django框架中默认会连接SQLite数据库,好处是方便无需远程连接,打包项目挪到其他环境安装一下依赖一会就跑起来,但是缺点…...

【其他】无法启动phptudy服务,提示错误2:系统找不到指定的文件

在服务中启动phpstudy服务时,提示“windows 无法启动phpstudy服务 服务(位于本地计算机上) 错误2:系统找不到指定的文件”的错误。导致错误的原因是可执行文件的路径不对,修改成正确的路径就可以了。 下面是错误的路径,会弹出错误窗口&#…...

AI驱动的支持截图或线框图快速生成网页应用的开源项目

Napkins.dev是什么 Napkins.dev是一个创新的开源项目,基于AI技术将用户的截图或线框图快速转换成可运行的网页应用程序。项目背后依托于Meta的Llama 3.1 405B大型语言模型和Llama 3.2 Vision视觉模型,结合Together.ai的推理服务,实现从视觉设…...

es集群索引是黄色

排查 GET /_cat/shards?hindex,shard,prirep,state,unassigned.reason 查询原因 发现node正常 执行重新分配 retry_failedtrue 参数告诉Elasticsearch重试那些因某种原因(如节点故障、资源不足等)而失败的分片分配。这个选项通常用来尝试再次分配那些…...

获取淘宝商品评论的方法分享-调用API接口item_review

在电商领域,商品评论是消费者了解产品、做出购买决策的重要依据。淘宝作为中国最大的电商平台之一,其商品评论系统涵盖了海量的用户反馈数据。为了帮助企业、电商数据分析师、市场研究人员以及普通消费者更高效地获取这些评论数据,淘宝开放平…...

MATLAB人脸考勤系统

MATLAB人脸考勤系统课题介绍 该课题为基于MATLAB平台的人脸识别系统。传统的人脸识别都是直接人头的比对,现实意义不大,没有一定的新意。该课题识别原理为:先采集待识别人员的人脸,进行训练,得到人脸特征值。测试的时…...

Spring篇(事务篇 - 基础介绍)

目录 一、JdbcTemplate(持久化技术) 1. 简介 2. 准备工作 2.1. 引入依赖坐标 2.2. 创建jdbc.properties 2.3. 配置Spring的配置文件 3. 测试 3.1. 在测试类装配 JdbcTemplate 3.2. 测试增删改功能 查询一条数据为实体类对象 查询多条数据为一个…...

qt EventFilter用途详解

一、概述 EventFilter是QObject类的一个事件过滤器,当使用installEventFilter方法为某个对象安装事件过滤器时,该对象的eventFilter函数就会被调用。通过重写eventFilter方法,开发者可以在事件处理过程中进行拦截和处理,实现对事…...

[ 钓鱼实战系列-基础篇-6 ] 一篇文章让你了解邮件服务器机制(SMTP/POP/IMAP)-1

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…...

wordpress伪静态规则

WordPress 伪静态规则是指将 WordPress 生成的动态 URL 转换为静态 URL 的规则,这样做可以提高网站的搜索引擎优化(SEO)效果,并且使得 URL 更加美观、易于记忆。伪静态规则通常需要在服务器的配置文件中设置,不同的服务器环境配置方法有所不同…...

缓存框架JetCache源码解析-缓存定时刷新

作为一个缓存框架,JetCache支持多级缓存,也就是本地缓存和远程缓存,但是不管是使用着两者中的哪一个或者两者都进行使用,缓存的实时性一直都是我们需要考虑的问题,通常我们为了尽可能地保证缓存的实时性,都…...

docker配置mysql8报错 ERROR 2002 (HY000)

通过docker启动的mysql,发现navicat无法连接,后来进入容器内部也是无法连接,产生以下错误 root9f3b90339a14:/var/run/mysqld# mysql -u root -p Enter password: ERROR 2002 (HY000): Cant connect to local MySQL server through socket …...

【Linux】为什么环境变量具有全局性?共享?写时拷贝优化?

环境变量表具有全局性的原因: 环境变量表之所以具有全局性的特征,主要是因为它们是在进程上下文中维护的,并且在大多数操作系统中,当一个进程创建另一个进程(即父进程创建子进程)时,子进程会继承…...

如何在Linux中找到MySQL的安装目录

前言 发布时间:2024-10-22 在日常管理和维护数据库的过程中,了解MySQL的确切安装位置对于执行配置更改、更新或者进行故障排查是非常重要的。本文将向您介绍几种在Linux环境下定位MySQL安装路径的方法。 通过命令行工具快速定位 使用 which 命令 首…...

Cursor Pro功能无限试用:开源自动化工具原理与实战部署指南

1. 项目概述与核心思路拆解最近在开发者圈子里,Cursor 这款 AI 驱动的代码编辑器热度一直很高,它集成了强大的 AI 助手,能极大地提升编码效率。不过,其核心的 Pro 功能需要付费订阅才能持续使用。很多开发者,尤其是学生…...

如何快速入门ROS机器人仿真:WPR系列仿真工具完整指南

如何快速入门ROS机器人仿真:WPR系列仿真工具完整指南 【免费下载链接】wpr_simulation 项目地址: https://gitcode.com/gh_mirrors/wp/wpr_simulation 想要在虚拟环境中快速学习ROS机器人开发吗?wpr_simulation项目为你提供了一个完美的起点&…...

多智能体编排实战:从架构设计到生产部署的12周训练指南

1. 项目概述与核心价值最近在探索如何系统性地掌握多智能体编排技术时,我遇到了一个名为“Shadow Dojo”的开源项目。这个名字很有意思,“道场”一词本身就意味着一个需要持续练习、精进技艺的地方。这个项目将自己定位为“训练场”,目标非常…...

智能合约钱包自动化交互:ca-agent-skills 技能库解析与实践

1. 项目概述与核心价值最近在梳理智能合约钱包(Smart Contract Wallet)的生态工具时,我注意到了 Portkey 团队开源的ca-agent-skills仓库。这个项目乍一看名字有点抽象,但深入研究后,我发现它解决了一个非常实际且关键…...

Android Studio 在 MacOS 上的完整安装与使用指南

Android Studio 在 MacOS 上的完整安装与使用指南摘要一、Android Studio 简介二、下载与安装1. 下载 Android Studio2. 安装前的依赖准备3. 安装步骤三、基础使用指南1. 创建第一个项目2. 运行应用3. 核心功能四、进阶功能配置1. 配置 SDK 和工具2. 自定义主题与插件3. Gradle…...

如何用Python自动化拆分CATIA多实体零件:终极PyCATIA教程

如何用Python自动化拆分CATIA多实体零件:终极PyCATIA教程 【免费下载链接】pycatia python module for CATIA V5 automation 项目地址: https://gitcode.com/gh_mirrors/py/pycatia 在CATIA V5的零件设计中,工程师经常遇到一个常见挑战&#xff1…...

Swiz状态管理库:原子化与派生状态在前端开发中的实践

1. 项目概述:一个为现代前端应用量身定制的状态管理库如果你和我一样,在React、Vue或者Svelte这类现代前端框架里摸爬滚打过几年,那你一定对状态管理这个“老大难”问题深有体会。从早期的Flux架构,到Redux的一统江湖,…...

Blender 3MF插件:从设计到打印的无缝桥梁 [特殊字符]

Blender 3MF插件:从设计到打印的无缝桥梁 🚀 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 还在为3D模型在不同软件间转换而烦恼吗?B…...

AgenticTime:为AI智能体设计的时间推理引擎与.atime文件格式详解

1. 项目概述:为AI智能体赋予时间感知能力如果你用过Claude、GPT或者任何基于大语言模型的AI助手,肯定遇到过这样的场景:你告诉它“周五前要完成API评审”,它当时答应得好好的,但当你隔天再问“我这周有什么要紧事”时&…...

从“左撇子困境”看包容性设计:打破设计偏见,提升产品普适性

1. 设计中的“左撇子困境”:一个被忽视的普适性问题作为一名在硬件设计和产品开发领域摸爬滚打了十几年的工程师,我经常和团队讨论“用户体验”和“人机工程学”。这些词听起来高大上,但它们的本质,往往就藏在一些最不起眼的日常细…...