【编译原理】【《编译技术与应用》笔记】第二章:词法分析

server/2024/9/20 7:36:50/ 标签: 编译原理

文章目录

    • @[toc]
      • 2.1|高级程序语言的词构成特性
        • 预定义词
        • 自定义词
        • 长度优先原则
      • 2.2|词法的描述
        • C语言的词法
          • 变量的正则表达式
          • 数值常量的正则表达式
          • 预定义词的正则表达式
          • 字符类常量的正则表达式
          • 注释的正则表达式
          • 空格的正则表达式
          • 回车换行的正则表达式
          • C语言的词法
        • 词法分析的实现框架
        • 正则表达式的含义
      • 2.3|基于状态转换图的词法分析
        • 基于状态转换图的匹配判断算法
        • C语言词法正则表达式lexeme的状态转换图
        • 基于状态转换图的词法分析算法

因上努力

个人主页:丷从心·

系列专栏:编译原理

果上随缘


2.1|高级程序语言的词构成特性

预定义词
  • 关键词
  • 算术运算词
  • 比较运算词
  • 逻辑运算词
  • 标点符号词
自定义词
  • 变量

  • 常量

    • 数值类常量

      • 整数
      • 实数
    • 字符类常量

      • 字符常量
      • 字符串常量
长度优先原则
  • 当词法分析中遇到“<=”时,基于长度优先原则,词法分析的结果是“<=”这一个词

2.2|词法的描述

C语言的词法
变量的正则表达式
letter -> ['A'~'Z']['a'~'z']
digit -> ['0'~'9']
id -> (letter ∪ '_') · (letter ∪ digit ∪ '_')*
数值常量的正则表达式
digits -> digit+
optionalFraction -> '.' · digits
optionalExponent -> 'E' · ('+''-')? · digits
numberConst -> integerConst · optionalFraction? · optionalExponent?
预定义词的正则表达式
reservedLexeme -> 'i' · 'n' · 't''+''<' · '=''&' · '&'';'
字符类常量的正则表达式
stringConst -> '‘' · (character - '’') · '’''“' · (character - '”')* · '”'
注释的正则表达式
singleRowNote -> '/' · '/' · (character - cr - lf)* · cr · lf
multiRowNoteContent1 -> (character - '*')* · ('*')+
multiRowNoteContent2 -> (character - '*' - '/') · (character - '*')* · ('*')+
multiRowNoteContent -> multiRowNoteContent1 · multiRowNoteContent2*
multiRowNote -> '/' · '*' · multiRowNoteContent · '/'
note -> singleRowNote ∪ multiRowNote
  • 对于多行注释,将开头标志/*以后的内容分为两部分,一部分是以*结尾的字符串(取名为multiRowNoteContent),一部分是字符/
  • multiRowNoteContent中肯定不含*/子串,对multiRowNoteContent从左到右扫描,当发现*字符后面不再为*字符时,就进行一次切分,经此切分后,给其中第一个子字符串取名为multiRowNoteContent1,其他的子字符串取名为multiRowNoteContent2
空格的正则表达式
blankSpace -> (空格字符)+
回车换行的正则表达式
crlf -> (cr · lf)+
C语言的词法
lexeme -> reservedLexeme ∪ id ∪ numberConst ∪ stringConst ∪ note ∪ blankSpace ∪ crlf
词法分析的实现框架
  • 词法分析器要对输入字符序列从头到尾逐一扫描,将其切分成一个词序列
  • 会用到两个指针:起始指针pStart和当前指针pCurrent,初始时,指针pStartpCurrent都指向输入字符序列的第一个字符
  • 如果当前串是正则表达式所指集合中的元素,就对pCurrent指针后移一步,接着继续进行判断,直至当前串不为正则表达式所指集合中的元素,这时就解析出一个词
  • 将解析出的词输出,然后解析下一个词,把pCurrent的值赋给pStart,这个过程不断进行下去,直至pStartpCurrent都指向输入字符序列末尾的结束字符
正则表达式的含义
  • 正则表达式相当于面向对象中的类,它所指集合中的元素相当于类的实例对象

2.3|基于状态转换图的词法分析

基于状态转换图的匹配判断算法
bool match(char inputString[], int inputSize) {int currentState = 0;int currentIndex = 0;wihle(currentIndex < inputSize) {currentState = getNextStateInGraph(currentState, inputString[currentIndex]);if(currentState == -1)return false;elsecurrentIndex++;}if(getStateTypeInGraph(currentState) == MATCH)return true;elsereturn false;
}
C语言词法正则表达式lexeme的状态转换图
基于状态转换图的词法分析算法
Lexeme* getNextLexeme() {int currentState = 0;startIndex = currentIndex;while(currentIndex < inputSize) {int nextState = getNextStateInGraph(currentState, input[currentIndex]);if(nextState == -1) {if(getTypeInGraph(currentState) == MATCH) {category = getCategoryInGraph(currentState);if(category == ID | INTEGER_CONST | FLOAT_CONST | SCIENTIFIC_CONST | CHAR_CONST | STRING_CONST | NUMERIC_OPERATOR | LOGIC_OPERATOR | COMPARE_OPERATOR | OTHER_RESERVED)return new Lexeme(startIndex, currentIndex - 1, category);else {startIndex = currentIndex;currentState = 0;}}else {raise exception('源代码有词法错误');}}else {currentState = nextState;currentIndex++;}}
}


http://www.ppmy.cn/server/18026.html

相关文章

鸿蒙入门11-DataPanel组件

数据面板组件 用于将多个数据的占比情况使用 占比图 进行展示 参数 参数形式 &#xff1a; DataPanel( options:{ values: number[], max?: number, type?: DataPanelType } ) 参数名 参数类型 是否必填 默认值 参数描述 values number[] 是 - 数据值列表 最大支持…

C++设计模式探讨(2)-单例模式

介绍 这段介绍来自网络&#xff1a; 单例模式是一种创建型的软件设计模式&#xff0c;在工程项目中非常常见。通过单例模式的设计&#xff0c;使得创建的类在当前进程中只有一个实例&#xff0c;并提供一个全局性的访问点&#xff0c;这样可以规避因频繁创建对象而导致的内存…

【产品经理修炼之道】- B端产品经理之业务系统设计

很多时候&#xff0c;业务系统建设好坏决定了企业的核心竞争力。作为产品经理&#xff0c;如何建设好业务系统这种OLTP类产品&#xff1f;本文从梳理业务流程、参与业务调研和设计业务系统三个步骤&#xff0c;教大家如何做好业务系统建设。 很多人都说设计B端产品最重要的是搞…

1.基于Springboot对SpringEvent初步封装

一&#xff1a;前置知识 Spring Event是Spring框架提供的一种事件机制&#xff0c;用于处理组件之间的通信。在复杂的系统中&#xff0c;模块或组件之间的通信是必不可少的。Spring Event可以用于以下场景&#xff1a; 1.系统间解耦&#xff1a;模块或组件之间通过事件进行通…

Django框架之python后端框架介绍

一、网络框架及MVC、MTV模型 1、网络框架 网络框架&#xff08;Web framework&#xff09;是一种软件框架&#xff0c;用于帮助开发人员构建Web应用程序和Web服务。它提供了一系列预先编写好的代码和工具&#xff0c;以简化开发过程并提高开发效率。网络框架通常包括以下功能…

鸿蒙应用开发-初见:入门知识、应用模型

基础知识 Stage模型应用程序包结构 开发并打包完成后的App的程序包结构如图 开发者通过DevEco Studio把应用程序编译为一个或者多个.hap后缀的文件&#xff0c;即HAP一个应用中的.hap文件合在一起称为一个Bundle&#xff0c;bundleName是应用的唯一标识 需要特别说明的是&…

《QT实用小工具·三十五》基于PathView,Qt/QML做的一个可以无限滚动的日历控件

1、概述 源码放在文章末尾 改项目实现了基于PathView&#xff0c;Qt/QML做的一个可以无限滚动的日历控件&#xff0c;下面是demo演示&#xff1a; 项目部分代码如下所示&#xff1a; import QtQuick 2.7 import QtQuick.Controls 1.4 import QtQuick.Controls.Styles 1.4Bu…

被删除的照片和视频能找回吗?如何恢复手机删除的照片和视频?

手机里的照片和视频是我们记录生活的每一个瞬间&#xff0c;也是工作学习等场合经常用到的东西&#xff0c;一旦不慎丢失&#xff0c;将对我们造成很大损失。那么我们该如何恢复手机删除的照片和视频呢&#xff1f;通过掌握正确的恢复方法&#xff0c;能够最大程度地保护手机中…

mac配置maven

在 macOS 上配置 Maven 也相对简单。以下是一种常用的方法&#xff1a; 1. 安装maven **下载 Maven&#xff1a;**首先&#xff0c;你需要从 Maven 官网&#xff08;https://maven.apache.org/download.cgi&#xff09;下载最新版本的 Maven。你可以选择二进制压缩包&#xf…

黑马点评(十二) -- UV统计

一 . UV统计-HyperLogLog 首先我们搞懂两个概念&#xff1a; UV&#xff1a;全称Unique Visitor&#xff0c;也叫独立访客量&#xff0c;是指通过互联网访问、浏览这个网页的自然人。1天内同一个用户多次访问该网站&#xff0c;只记录1次。 PV&#xff1a;全称Page View&…

详解23种设计模式——单例模式

单例模式 | CoderMast编程桅杆单例模式 单例模式是最常用的设计模式之一&#xff0c;他可以保证在整个应用中&#xff0c;某个类只存在一个实例化对象&#xff0c;即全局使用到该类的只有一个对象&#xff0c;这种模式在需要限制某些类的实例数量时非常有用&#xff0c;通常全局…

新手Pytorch入门笔记-transforms.Compose()

我使用的图片是上图&#xff0c;直接下载即可 transforms.Compose 是PyTorch中的一个实用工具&#xff0c;用于创建一个包含多个数据变换操作的变换对象。这些变换操作通常用于数据预处理&#xff0c;例如图像数据的缩放、裁剪、旋转等。使用transforms.Compose 可以将多个数据…

PS学习笔记-抠图相关

选好颜色后&#xff0c;altdelete更换画布颜色、填充前景色 按住shift键自由缩放图片&#xff0c;调好后双击鼠标即可完成&#xff0c;或者点击工具栏的 对勾 在某图层下 CTRLT 变换图片&#xff0c;调好后双击鼠标即可完成&#xff0c;或者点击工具栏的 对勾 CTRLJ复制图…

揭秘快手互动神器:自动评论助力转化!

在这个信息爆炸的时代&#xff0c;每个内容创作者和企业都在寻找提升用户互动和转化的有效途径。无论是短视频、直播还是文章&#xff0c;如何让自己的内容脱颖而出&#xff0c;成为大家关注的焦点呢&#xff1f;今天&#xff0c;我们就要揭秘一款神奇的工具——快手自动评论软…

【代码随想录】day44

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、完全背包理论基础二、518零钱兑换 II三、377组合总和 Ⅳ总结 一、完全背包理论基础 完全背包&#xff1a;每个物品可以使用无数次。 二、518零钱兑换 II cla…

c#+unity基础

序列化&#xff1a; [SerializeField]&#xff0c;点不出来&#xff0c;只能在面板上显示绑定游戏物体 //公有隐藏 特有函数 特有函数&#xff1a;不需要调用&#xff0c;自动执行 Awake最先执行->OnEable 面向对象思想 面向对象思想&#xff1a;分为具体对象和抽象对…

网站推广爬虫

网站推广爬虫是一种用于帮助网站推广的工具。它可以自动地收集和分析网站相关的数据&#xff0c;以便进行市场调研、竞争分析和优化策略等工作。以下是网站推广爬的一些常见功能和特点&#xff1a; .数据收集&#xff1a;网站推广爬虫可以通过抓取网页内容、提取关键信息和分析…

Docker② —— Cgroups详解

1. 概述 Cgroups 的全称是control groups&#xff0c;cgroups为每种可以控制的资源定义了一个子系统。Cgroups分为三个部分&#xff1a; cgroup 本身&#xff1a;对进程进行分组hierarchy&#xff1a;将 cgroup 形成树形结构subsystem&#xff1a;真正起到限制作用的部组件 cp…

DNS域名解析服务

在日常生活中人们习惯使用域名访问服务器&#xff0c;但机器间互相只认IP地址&#xff0c;域名与IP地址之间是多对一的关系&#xff0c;它们之间的转换工作称为域名解析&#xff0c;域名解析需要由专门的域名解析服务器来完成&#xff0c;整个过程是自动进行的。 1、DNS系统的…

【C++】模版进阶

目录 非类型模版参数 模版的特化 概念 函数模版特化 类模版特化 全特化 偏特化 模版分离编译 什么是分离编译 模版的分离编译 解决方法 模版总结 非类型模版参数 模板参数分类类型形参与非类型形参。 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在c…