词法分析(lexical analysis),是计算机科学中将字符序列转换为记录(Token)序列化的过程。词法分析一般分手动与自动,自动是基于lex,flex词法分析器使用正则式来配置,我们这里将学习手动构造。

一、明白词法分析所要做的事情。

下面是Source code:

int 

通过词法分析后得到的结果:

[

通过上述示例可以看出,词法分析是输入字符串,输出的是记号流。为了达到这样的结果,业务上有一套算法理论支持,所以你需要了解一下:正规式、有限自动机。

二、自动实现的原理

  • 正规式。

正规式与正则表达式类似,都是以表达式来表示字符串属性。只是正规式更基础、更简单,它只有5种基本语法。

1. 

正规式的作用是用来设定程序语言中的规则,从下列示例中可以看出,正规式的定义有时比较复杂,所以在flex(一种词法分析器,可适匹于多种语言)中使用的是正则式:

1. 

  • 有限自动机。

有限自动机(finite automata)是一种数学模型,它可以用来描述识别输入符号串的过程,在这个机器中,它的状态总是处于有限状态中的某一个状态。又分为:确定的有限自动机(DFA)与不确定的有限自动机(NFA)。

  1. 确定的有限自动机(DFA),每一个输入只有单一状态可流转,可对应程序的分支、循环语句。
  2. 不确定的有限自动机(NFA),每一个输入有多个状态可流转,无法对应程序语句。
  • 为什么需要这两种有限自动机呢?
  1. 首先,不确定的有限自动机能对应正规式,通过Thompsont算法;
  2. 其次,不确定的有限自动机可转为确定的有限自动机,通过子集构造算法;
  3. 再次,转化出来的确定的有限自动机可以实现大幅简化,通过Hopcroft算法;
  4. 最后,确定的有限自动机可以对应程序的分支、循环语句,即可以通过程序来实现。

四、我们自己来实现一个手动的。

我们不去管词法分析理论的复杂性,只要记住前面所说的“要将字符串转为记号流”就可以了。我们逐个读取代码中的字符串,判断其属于Token类型的可能性,最终确定Token类型并保存相关的值,就这样,我们就能完成了词法分析器。

在这里,我们只对K语言的部分语法作词法分析处理,请留意。如果想查看相关原代码,请浏览姜友华的github的compiler项目。

  • 首先,写一个K语言程序,用到了部分K语言语法。文件:complier/king.txt。
// 定义一个函数,判断是否可上学。

  • 其次,写词法分析器头文件,供外部调用。文件:compiler/lexer/lexer.h。
  1. 开始部分,我们定义了所需要分析的词法类型;
  2. 接着,定义了记号流记号的节点形式;
  3. 后面,提供了几个方法,供外部调用,运行并获取记号流数据。
//

  • 再次,写词法分析器主体,分类逐步解决问题。文件:compiler/lexer/lexer.c。
  1. 开始,我们对代码中出现的保留字(如:bool, int, string, true, false, return, if, for, in)作了判断;
  2. 接着,我们对空、数字、字母等作了判断,这里没有用正则表达式;
  3. 然后,我们对非分割符作了判断,它们有可能是数字字面量、字符串字面量、变量名与保留字;
  4. 最后,是遂个读取字符,判断生成各类Token,保存在tokens里;
  5. 这样,我们有了记号流。
//

  • 最后,我们在Main函数中调用词法分析器并输出。
  1. 我们是读取原代码文件的,要记得使用文件的绝对路径;
  2. 运行后并输出了结果,那就是记号流。
//

  • 说明:
  1. 字节流使用了1024长度的Token数组,Token.value使用了256长度的char数组,目的是为了实现更简便。如果你更改原代码,请留意越界出错。
  2. 没有使用map来判断保留字,为每个保留字设计了函数。这是因为C没有map,自已实现HashMap有些复杂,留到以后去处理。
  3. 所实现部分只针对示例的代码。

下一章,学C语言写自己的K语言:编译器语法分析。

让我们在这里,遇见明天的自己!姜友华

c语言编译器_学C语言写自己的K语言:编译器词法分析。相关推荐

  1. 学python之前要学c语言吗_学Python之前需要学c语言吗

    先学哪种语言好,我认为需要分不同的人来说. 对于计算机专业的大学生来说,我觉的先学C语言好.(推荐学习:Python视频教程) 目前国内高校计算机相关专业应该大部份都是以C语言作为入门语言来学习的,这 ...

  2. cs架构用什么语言开发_学了C语言,能开发什么项目?

    直至今天还有人在喊着C语言都过时的语言了,还有什么值得去学的,看现在的python,JAVA等语言现在用起来多简单,谁还去学习老掉牙的C语言,事实真的是这样的吗?小编作为专门下载了这两种语言的底层源码 ...

  3. C语言学习——从零开始学编程(第二篇:C语言知识总括)

    本节将介绍:C语言的基本框架和大部分知识的浅了解(记得先看目录哦~~) 前言--小颖的话 提示:本文篇幅长,知识点多,可以分开学习,记得收藏点赞哦~ 一.数据类型 1.C语言中的关键字 2.不同类型所 ...

  4. 没有c语言基础可以学python吗-必须要有C语言基础才能学python吗

    就我个人的观点,Python 作为学习编程的入门语言是再合适不过的.凡是在大学计算机专业学习过 C 语言的同学都感同身受,认为 C 语言不是很好的入门语言,很多曾经立志学习编程的读者,在学习了 C 语 ...

  5. c语言 落后_编程会不会没落、C语言会不会没落?

    原标题:编程会不会没落.C语言会不会没落? 今天在头条上看到一篇关于"电脑维修转行"的朋友写的文章.分析的原因头头是道,简而言之就是:新电脑配置越来越高.价格越来越透明,也越来越便 ...

  6. python是不是比c语言难_解答:为什么很多人觉得C语言很难?

    对初学者来说,C语言确实有一定的难点,但是C语言是基础的语言,并不是最难的所以学不好的主要还是自身的问题.依据本人这么多年的经验,这尝试分析下为何这么多人学不好C语言? C语言本身存在一定难度 C语言 ...

  7. mysql 多语言处理_[Abp 源码分析]十三、多语言(本地化)处理

    0.简介 如果你所开发的需要走向世界的话,那么肯定需要针对每一个用户进行不同的本地化处理,有可能你的客户在日本,需要使用日语作为显示文本,也有可能你的客户在美国,需要使用英语作为显示文本.如果你还是一 ...

  8. python属于计算机的什么语言_Python语言属于()_学小易找答案

    [简答题]制作出来的图像是用于在显示器上显示的,请问分辨率一般设置多少就可以了? [填空题]电阻是 1 0 Ω 的导体,用拉丝机在温度不变的情况下将其 均 匀拉长到原来的 2 倍 则导体电阻变为 __ ...

  9. 学会计学java,Java 属于以下哪种语言?_学小易找答案

    [单选题]恰恰舞单人套路中的时间步共( ) 小节 [判断题]穹隆构造是指长短轴比<3:1的背斜 [判断题]学会拒绝一个案件比接受一个案件更重要. [判断题]64对于文化企业来讲,分析竞争者是在市 ...

最新文章

  1. 个人申请并部署阿里云免费Symantec SSL过程浅谈
  2. k-core与k-shell的区别
  3. 8086汇编-实验4-[bx]和loop的使用
  4. Android中的资源复用小技巧
  5. DB排行榜更新,.NET Core+MySQL成主流!
  6. 被嫌弃的eval和with
  7. 一道内存分配的面试题
  8. 空白DirectX11应用程序
  9. php mongodb 视频教程,燕十八mongodb视频资料分享
  10. java类中各成员初始化的顺序
  11. 使用docer创建spring boot镜像
  12. 应用MapX编程两例
  13. 计算机网络_学习笔记 索引
  14. 搞清楚 Python traceback
  15. 修改html文件500错误信息,打开网页提示 HTTP500错误的终极解决方法
  16. 网络安全工程师就业前景
  17. SAP BAPI_ACC_DOCUMENT_POST函数预制凭证失败报错--会计科目xxxxx 在会计科目表xxx 中没有定义
  18. TCP是“第一个系统”
  19. c语言位非运算符,C语言-位运算符
  20. 卡西欧科学计算机app,卡西欧CASIO计算器

热门文章

  1. 使用java 自带的webservice
  2. Underscore.js 初探
  3. thinkphp3.2与phpexcel带图片生成 完美案例
  4. 手机web开发的感想
  5. 只需一行代码实现增删查改,微软已经让我们很简单。谈AccessDataSource的使用。...
  6. android 首选项框架,Android:创建自定义首选项
  7. 分布式mysql保持数据一致性_一种分布式跨数据库保持事务一致性的方法及系统与流程...
  8. rar 文件头crc版本_php实现rar文件的读取和解压
  9. docker 查看虚拟网卡_最简单的免费虚拟化方案:Hyper-V Server + Windows Admin Center
  10. java自增自减很难理解_关于java中自增,自减,和拓展运算符的小讨论