本文是词法分析的第一篇文章,主要介绍在词法分析过程中需要用到的一些基本概念,包括词法单元、模式和词素以及三者之间的关系,理解这些内容对学习词法分析过程十分重要。

词法分析器的作用

词法分析是编译的第一阶段。词法分析器的主要任务是读入源程序的输入字符,将它们组成词素,生成并输出一个词法单元序列,这个词法单元序列被输出到语法分析器进行语法分析。另外,由于词法分析器在编译器中负责读取源程序,因此除了识别词素之外,它还会完成一些其他任务,比如过滤掉源程序中的注释和空白,将编译器生成的错误消息与源程序的位置关联起来等。总而言之,词法分析器的作用如下:
1. 读入源程序的输入字符,将它们组成词素,生成并输出一个词法单元序列;
2. 过滤掉源程序中的注释和空白;
3. 将编译器生成的错误消息与源程序的位置关联起来;
4. 其它。

词法单元、模式和词素

词法分析涉及到三个重要的相关术语——词法单元、模式和词素:
- 词法单元由词法单元名和可选的属性值组成。词法单元名是一个词法单元的引用(别名),它将作为语法分析器处理的输入符号。当有多个词素的词法单元名相同时,可以附加属性值信息来区别这些词素。词法单元名将影响语法分析过程中的决定,而属性值将影响语法分析之后对这个词法单元的翻译(具体翻译成哪一个词素);
- 模式描述一个词法单元的词素可能具有的形式;
- 词素是一个字符序列(串),它和某个词法单元的模式匹配,并被词法分析器识别为该词法单元的一个实例。

为了进一步说明词法单元、模式和词素之间的关系,我们举一个例子:

PS:由于词法分析器通常还要和符号表进行交互,因此属性值常常作为一个指针指向符号表中的某个条目。

词法单元的规约

我们知道,每个词法单元都有一个模式来描述它的所有词素,正则表达式正是这样一种用来描述词素模式的重要方法。在真正介绍正则表达式之前,我们还需要了解串和语言以及一些相关的术语和运算,这些内容能帮助我们十分容易地理解正则表达式。

某个符号集合上的一个串是该集合中符号的一个有穷序列。这句话说明了串的两个特点:第一是组成串的符号都来自某个符号集合,第二是串的长度是可数的。举个例子:对集合A={a,b,…,z,A,B,…,Z}来说,它的一个串只能包括大小写字母,并且长度是可数的。

下面定义了一些串相关的术语:

下面定义了串上的运算:

语言

语言是某个给定的符号集合上一个任意的可数的串集合。这句话稍微有点抽象,我们把这句话拆分开来解释:首先,语言是一个集合;其次,这个集合中的元素是串,并且集合的大小是任意的;最后,这些串是依据某个符号集合生成的。

下面定义了语言上的运算:

正则表达式

正则表达式可以用来描述词素的模式,一个正则表达式可以由较小的正则表达式递归的构建:

下面我们举例说明。对于符号集合∑={a,b},有:
- 正则表达式a表示语言{a};
- 正则表达式a|b表示语言{a,b};
- 正则表达式(a|b)(a|b)表示语言{aa,ab,ba,bb};
- 正则表达式a*表示语言{ε,a,aa,aaa,…};
- 正则表达式(a|b)*表示语言{ε,a,b,aa,ab,ba,bb,aaa,…};
- 正则表达式a|a*b表示语言{a,b,ab,aab,aaab,…}。

上面通过基本的并、连接和闭包运算递归定义了正则表达式,为了增强正则表达式描述串模式的能力,也出现了许多针对正则表达式的扩展,下面是一些比较典型的扩展:

词法单元的识别

上面介绍了如何用正则表达式来表示一个模式,下面我们将介绍如何根据词法单元的模式来识别一个与该模式匹配的词素,为此,我们首先将模式转换成状态转换图。

一个状态转换图由一组表示状态的结点和表示输入字符的边构成,词法分析器在扫描输入字符串的过程中寻找和某个模式匹配的词素,状态转换图中的每个状态代表一个可能在这个过程中出现的情况。一个状态转换图有如下特点:
- 有一个初始状态,该状态由一条无出发结点的、标号为“start”的边指明。在读入任何输入符号之前,状态转换图总位于它的初始状态;
- 有某些最终状态,该状态用双层的圈表示。这些状态表明已经找到一个词素;
- 有某些回退状态,该状态附近有一个“*”标明。在识别“3+4”这个串时,只有当扫描到“+”符号时,才能确定前面的数字符号“3”,此时识别出了词素“3”,并且需要回退一个字符。

下面是词法单元relop的状态转换图,它表示比较运算符<、>、<=、>=、<>和=:

根据这个状态转换图,我们可以十分容易的编写出一段代码来识别这些比较运算符,这里就不再赘述了。

欢迎关注微信公众号fightingZhヾ(๑╹◡╹)ノ”

【编译原理】词法分析(一)相关推荐

  1. 编译原理 词法分析 算符优先分析法

    编译原理 词法分析 算符优先分析法 实验目的 加深对语法分析器工作工程的理解,加强对算符优先分析法实现语法分析程序的掌握:能够采用一种编程语言实现简单的语法分析程序:能够使用自己辨析的分析程序对简单的 ...

  2. 编译原理词法分析程序设计

    编译原理词法分析程序设计 1.   课程设计目的: 结合讲授内容,设计与实现一个简单词法分析器,通过设计编制调试一个具体的词法分析程序,加深对词法分析程序的功能及实现方法的理解.并掌握在对程序设计语言 ...

  3. java实现词法分析_编译原理(词法分析) Java 实现

    编译原理(词法分析) Java 实现 编译原理(词法分析) Java 实现 1. 项目目录 2. 需要解释的源代码 PROGRAM SOURCE; /*定义变量*/ VAR X, Y, Z:INTEG ...

  4. c++实现编译原理词法分析实验(含代码)

    c++实现编译原理词法分析实验(含代码) 一.实验目的: 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解.并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法. ...

  5. 编译原理---词法分析

    词法分析的原理 词法分析是编译程序进行编译时第一个要进行的任务,主要是对源程序进行编译预处理之后,对整个源程序进行分解,分解成一个个单词,这些单词有且只有五类,分别时标识符.关键字(保留字).常数.运 ...

  6. 编译原理——词法分析

    根据上课内容顺序写的博客,并不是按照书的目录来的 使用龙书以及编译程序设计原理(第二版)金成植.金英编著 老师的PPT是英文的,我自己随便翻的,不一定对 文章目录 词法分析(scanning) 概述 ...

  7. 编译原理词法分析实验

    目录 实验内容描述 实验设计 输入输出形式 样例输入和样例输出 实验设计原理(步骤) 主要函数和辅助函数 核心代码截图 实验结果 可以找我代做,包满分.QQ1975728171可以写完整实验报告 实验 ...

  8. 编译原理 - 词法分析

    词法分析 词法分析器 作用 编译过程划分为词法分析和语法分析两个阶段的原因 语法分析中的三个概念 词法分析的实现 如何区分兼容性的标识符 词法分析算法 词法单元 词法单元例子 词法单元的模式 正则表达 ...

  9. 编译原理——词法分析(1)

    在我们学习词法分析时,就会思考如何构造一个词法分析器? 一个词法分析器可以通过手工构造:也可以通过以下方式自动生成一个词法分析器:向一个词法分析器生成工具描述出词素的模式,然后将这些模式编译为具有动词 ...

  10. 编译原理——词法分析(3)有穷自动机中DFA与NFA的理解

    1.1词法分析器生成工具Lex 虽然在学习上,我们学习的是Lex,但是最近经常使用的是词法分析器生成工具是Flex,它可以为C语言生成代码,Vern Paxson于1987年以C语言写作了Flex,他 ...

最新文章

  1. 数据库设计的三大范式
  2. Java复习二 基本数据类型与变量和常量
  3. Android之Android触摸事件传递机制
  4. Express的基本路由实现对get和post等的请求和响应
  5. nodejs+redis
  6. Executor源码解读
  7. python教程2017百度云_python下载ICCV2017全套paper
  8. mysql主从配置,innobackup备份
  9. 从零开始开发HybridApp
  10. EXCEL VBA编程入门一
  11. geektool 天气_如何使用Geektool自定义Mac桌面
  12. 如何搜索国外上市企业的财务数据以及年报 1
  13. Adobe Acrobat Pro DC拆分PDF
  14. Merged region A1 must contain 2 or more cells
  15. html颜色趋势,跟上色彩潮流!带你展望2015年的网页设计配色趋势
  16. linux下数据库启动和停止
  17. 生产消费者模式实例(多线程实现价格监控)
  18. Source Insight 4.x完美激活破解安装图文教程
  19. 使用Mitmproxy工具进行小姐姐图片(不管什么网站,只要是.jpg格式的图片都可自动下载)的批量下载
  20. [蓝帽杯2020第四届 线上赛]Soitgoes

热门文章

  1. flex布局设置justify-content为space-between,最后一个元素无法右对齐
  2. 对于网络流算法中Dinic与ISAP的效率比较
  3. 泰坦钩长还是机器人钩长,LOL:下路4大钩子辅助,来评测一下,谁才是最强的那个?...
  4. Linux ftp服务器和客户端解析
  5. 【web日程表fullcalendar】源代码贴上,教你开发日程表
  6. 计算机图像识别在食品中的应用,舌尖上的AI,人工智能在食品中的应用
  7. 眼图观测实验报告_眼图观测实验报告
  8. Qt学习:文件介绍+对象树+信号和槽
  9. wordpress谷歌字体_如何为您的WordPress网站设置Google Analytics(分析)目标
  10. 如何修炼自己的气场,让自己变成熟稳重一点