notebooks
  • notebooks
  • _planning
    • 2022 OKR
    • basketball
    • swimming
  • communication
    • Dubbo
    • Kafka
    • Messaging
    • RPC
    • Thrift
  • computation
    • map-reduce
  • cs-basic-knowledge
    • computer-architecture
    • data-structure-and-algorithms
    • networks
    • os
  • devops
    • Docker
    • Linux
    • Prometheus
    • operations
    • security
    • trouble-shooting
  • distributed-knowledge
    • Zookeeper_CMD
    • distributed-system
  • game-engine
    • Unity
  • others
    • appium使用
  • protocols
    • http(s)协议
    • 官方链接
    • sip
  • storage
    • Elasticsearch
    • GuavaCache
    • MySQL
    • MySQL_CMD
    • NoSQL
    • Redis
    • Redis_CMD
  • system-design
    • system-design
  • tools
    • Git
    • IDEA
    • Mac
    • VScode
    • Vim
  • _working
    • doc-template
      • backend-design-review
      • correction-of-error
      • service-review
    • process
      • domain-backup
      • oncall
  • blogs
    • history
      • 8088/8086微处理器
      • 8088/8086指令系统
      • CSS-DOM
      • CSS定位
      • CSS工作原理
      • CSS控制背景
      • CSS浮动布局
      • CSS盒模型
      • Chrome开发者工具使用方法
      • DOM
      • Django Model模型层学习
      • Django-REST-framework Serializers学习
      • Django-REST-framework Views和ViewSets学习
      • Django View视图层学习
      • Gvim下Emmet安装及使用教程
      • HTTP协议简介
      • HashMap原理初探
      • JavaScript简史
      • JavaScript语法
      • Java内存模型和GC机制
      • Java基础——Lambda学习
      • Java基础——方法引用
      • Java基础——枚举类型
      • Java类加载机制
      • KMP算法
      • Kafka学习
      • Linux下用命令行编译Java程序
      • MathJax简介和基本用法
      • Python实现常见数据结构
      • Python装饰器总结
      • TCP协议的三次握手和四次挥手
      • Thrift学习
      • asyncio学习
      • markdown的常用语法
      • 修改hosts文件实现翻墙
      • 充实文档的内容
      • 关系数据库
      • 关系数据库标准语言SQL(一)
      • 关系数据库标准语言SQL(二)
      • 关系数据理论
      • 关系查询处理和查询优化
      • 内联元素和块级元素
      • 剑指offer算法题练习
      • 动态创建标记
      • 图形化用户界面
      • 在Eclipse中使用Maven构建Java Web项目
      • 增加微博秀遇到的一些问题
      • 处理机调度
      • 如何用github和hexo搭建个人博客
      • 存储管理
      • 存储系统的层次结构
      • 学习模仿lionhit网站首页的过程总结
      • 实用的GitHub小技巧
      • 并发控制
      • 循环与分支程序设计
      • 指令系统的设计
      • 指令级并行及其开发——硬件方法
      • 搭建自己的VPN服务器
      • 操作系统用户界面
      • 数据库安全性
      • 数据库完整性
      • 数据库恢复技术
      • 数据库绪论
      • 数据库编程
      • 数据库设计
      • 数据抽象
      • 文件系统
      • 文法和语言
      • 最佳实践
      • 案例研究:JavaScript图片库
      • 案例研究:图片库改进版
      • 汇编语言程序格式
      • 汇编语言程序设计基础知识
      • 流水线技术
      • 深度优先搜索和广度优先搜索
      • 牛客网——网易2017秋招编程题集合
      • 用JavaScript实现动画效果
      • 第一篇博客
      • 经典排序算法总结(Java实现)
      • 经典查找算法总结(Java实现)
      • 综合示例
      • 编译原理引论
      • 背包、队列和栈
      • 虚拟机安装Linux系统及常用软件
      • 计算机操作系统绪论
      • 计算机系统结构的基础知识
      • 设备管理
      • 设计模式之代理模式
      • 设计模式之单例模式
      • 设计模式之工厂模式
      • 设计模式之策略模式
      • 设计模式之观察者模式
      • 词法分析
      • 进程管理
      • 闭包
      • 阻止Google自动跳转到香港服务器的方法
      • 项目部署过程
  • programming-language
    • C#
      • C#
    • C&C++
      • C
    • C&C++
      • C++
    • Java
      • GoogleGuice
    • Java
      • JVM
    • Java
      • Java
    • Java
      • Maven
    • Java
      • Mybatis
    • Java
      • Spring知识
    • Java
      • SpringBoot
    • Java
      • Tomcat
    • Python
      • Python
    • Shell
      • Shell
  • wheels
    • dcc
      • 产品调研
      • 方案设计
    • red-envelope
      • 方案设计
    • short-url
      • 短链接服务
    • sso
      • 方案设计
Powered by GitBook
On this page
  • 对词法分析器的要求
  • 词法分析器的功能和输出形式
  • 词法分析器的设计
  • 正规表达式与正规集
  • 有穷自动机
  • 确定的有穷自动机DFA
  1. blogs
  2. history

词法分析

Previous设计模式之观察者模式Next进程管理

Last updated 3 years ago

词法分析是编译的第一个阶段,它的主要任务是从左至右逐个字符地对源程序进行扫描,产生一个个单词序列,用以语法分析。执行词法分析的程序称为词法分析程序或扫描程序。

对词法分析器的要求

词法分析器的功能和输出形式

功能:输入源程序,输出单词符号。

词法分析器所输出的单词符号常常表示成如下的二元式:(单词种别,单词符号的属性值)

词法分析器的设计

  1. 输入、预处理 词法分析器工作的第一步是输入源程序文本。输入串一般是放在一个缓冲区中,这个缓冲区称输入缓冲区。词法分析的工作(单词符号的识别)可以直接在这个缓冲区中进行。但在许多情况下,把输入串预处理一下,对单词符号的识别工作将是比较方便的。

  • 预处理的主要工作:

    • 某些跳格符、回车符和换行符等编辑性字符,在别处的任何出现都没有意义,预处理时可以将其剔掉。

    • 注解部分—仅在于改善程序的易读性和易理解性。对于它们,预处理时可以将其剔掉。

    • 空白符(一个或相继数个)用作单词符号之间的间隔,即用作界符。在这种情况下,预处理时可把相继的若干个空白结合成一个。

  1. 单词符号的识别:超前搜索

  2. 状态转换图 状态转换图是一张有限方向图。在状态转换图中,结点代表状态,用圆圈表示。状态之间用箭弧连结。箭弧上的标记(字符)代表在射出结点(即箭弧始结点)状态下可能出现的输入字符或字符类。

正规表达式与正规集

正规式也称正则表达式(regular expression),是说明单词的模式(pattern)的一种重要的表示法(记号),是定义正规集的数学工具。

定义: 设字母表为$\sum$,辅助字母表$\sum '= \lbrace \emptyset,\epsilon,|,.,*,(,) \rbrace$。

  1. $\epsilon$和$\emptyset$都是$\sum$上的正规式,它们所表示的正规集分别为{$\epsilon$}和$\emptyset$;

  2. 任何$a\in \sum$,a是$\sum$上的一个正规式,它所表示的正规集为{a};

  3. 假定e1和e2都是$\sum$上的正规式,它们所表示的正规集分别是L(e1)和L(e2),那么,(e1),e1|e2,e1$\cdot$e2和$e_1^*$也都是正规式,它们所表示的正规集分别为L(e1),L(e1)$\bigcup$L(e2),L(e1)L(e2)和$(L(e1))^*$;

  4. 仅由有限次使用上述三步骤而定义的表达式才是$\sum$上的正规式,仅由这些正规式所表示的字集才是$\sum$上的正规集。

其中,“|”读为“或”,“.”读为“连接”,“*”读为“闭包”。均为正规式运算符。

正规式的等价性: 若两个正规式e1和e2所表示的正规集相同,则说e1和e2等价,写作e1=e2。

设U、V、W为正规式,正规式服从的代数规律有:

  1. U|V=V|U “或”满足交换律

  2. U|(V|W)=(U|V)|W “或”的可结合律

  3. (UV)W=U(VW) “连接”的可结合律

  4. U(V|W)=UV|UW 分配律 (U|V)W=UW|VW

  5. $\epsilon U$=U $\epsilon$是“连接”的恒等元素 $U \epsilon$=U

  6. U|U=U “或”的抽取律

有穷自动机

有穷自动机(也称有限自动机)作为一种识别装置,它能准确地识别正规集,即识别正规文法所定义的语言和正规式所表示的集合,引入有穷自动机这个理论,正是为词法分析程序的自动构造寻找特殊的方法和工具。

有穷自动机分为两类:确定的有穷自动机(Deterministic Finite Automata)和不确定的有穷自动机(Nondeterministic Finite Automata) 。

确定的有穷自动机DFA

DEA定义: 一个确定的有穷自动机M是一个五元组:M=(K,Σ,f,s0 ,Z),其中:

  1. K是一个有穷状态集,它的每个元素称为一个状态;

  2. Σ是一个有穷字母表,它的每个元素称为一个输入符号,所以也称Σ为输入符号表;

  3. f是转换函数,是在K×Σ→K上的单值部分映射。即,如果 f(ki,a)=kj,(ki∈K,kj∈K)就意味着,当前状态为ki,输入符为a时,将转换为下一个状态kj,我们把kj称作ki的一个后继状态;

  4. s0 ∈K是唯一的一个初态;

  5. Z$\subset$K是一个终态集(可空),终态也称可接受状态或结束状态。


《编译原理(第2版)》张素琴 吕映芝 蒋维杜 戴桂兰 著

词法分析1