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

2024-04-20 17:04

本文主要是介绍【编译原理】【《编译技术与应用》笔记】第二章:词法分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • @[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.chinasem.cn/article/920825

相关文章

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Java中&和&&以及|和||的区别、应用场景和代码示例

《Java中&和&&以及|和||的区别、应用场景和代码示例》:本文主要介绍Java中的逻辑运算符&、&&、|和||的区别,包括它们在布尔和整数类型上的应用,文中通过代码介绍的非常详细,需要的朋友可... 目录前言1. & 和 &&代码示例2. | 和 ||代码示例3. 为什么要使用 & 和 | 而不是总是使

Python循环缓冲区的应用详解

《Python循环缓冲区的应用详解》循环缓冲区是一个线性缓冲区,逻辑上被视为一个循环的结构,本文主要为大家介绍了Python中循环缓冲区的相关应用,有兴趣的小伙伴可以了解一下... 目录什么是循环缓冲区循环缓冲区的结构python中的循环缓冲区实现运行循环缓冲区循环缓冲区的优势应用案例Python中的实现库