两种设计方案以及各自优缺点

我们先学手工构造

词法分析器手工构造

  1. 关系运算符的手工构造:

    上面这个图其实我有点疑惑,下面说一下,我自己的理解
    C语言中的关系运算符,有<、 <=、 > 、>= 、!= 、== 、=等
    我们可以看到关系运算符最多有两个字符,所以我们至少要读两个字符。①第一次读的是“<”号,那我们再读第二个运算符,如果第二 个读到的是=号,那我们返回LE,意思就是小于等于。如果第二次读到的是>(事实上我就是不明白为什么能出现<>这种组合方式,编译器不会报错吗,可能老师只是让我们好理解吧),那么返回NE,表示不相等。如果我们读到其他运算符,那我们就回滚,返回LT,称为仅小于。所以懂这种使用分支方式来考虑关系运算的设计思想就可以了。

    这里就是使用伪代码实现关系运算的示例
  2. 标识符的手工构造
    c的标识符只能以_和字母为开头,中间可以有数字,下划线,字母;所以构造方法和关系运算一样,先读第一个字符看是不是字母或者下划线,然后读第二个,依次。。。
  3. 第二类关键字算法构造

    可以构造一张包含所有关键字的哈希表,我们先按照第二类里面所给的手工构造的分析器识别字符,然后将我们识别之后得到的结果到关键字的哈希表中查找,看是否是关键字,如果是的话按关键字返回,否则按标识符返回。
    该方法的好处是:我们可以不在2给出的方法中区分关键字和标识符,方法2区分关键字和标识符还需要花费更多的代码和时间。现在我们不区分,通过构造关键字哈希表,查表来完成这一工作会更为便捷。

词法分析器生成器


原理: 我们只需要给出我们识别源语言的规则给词法分析器生成器,他就能给我们生成一个词法分析器
所以我们的任务就被分解成了①如何给出声明式的规范,也就是给出我们识别源语言的规则,这也需要去写代码②如何构造中间的词法分析器生成器,内容包括定义数据结构等

任务①:

  1. 首先我们要理解正则表达式(RE)这个概念,它属于申明规范中的内容(可以近似的视正则表达式为申明规范)
  2. 我们先以熟悉的算术表达式来类比上图的内容。给定的字符集={0,1,2,3…9,+,-,X,➗,=},我们用这些字符集构造的表达式就是算术表达式。比如2+3-4这样的。
  3. (以C语言为例)正则表达式的字符集={NUL,EOF,…1,2,…9,A,…Z}等,说白了C语言的正则表达式的字符集就是ASCII码的集合,而Java就是Unicode编码的集合,我们这里是抽象成了c1,c2来表示
  4. WCNM,什么垃圾编辑器,不小心撤销之后找不会了,我那么多字白打了
  5. 简而言之就是,空串是正则表达式,字符集中的单个字符是正则表达式,两个正则表达式MIN,MN的表示方法{MIN表示或,即选择一个,MN是两个表达式并起来},还是正则表达式,对一个正则表达式M,可以折腾出无限个正则表达式M*来表示。
  6. 总之,正则表达式就是我们用一种符号集合的方法表示出所有的符合我们要求的表达式。
  7. 例如,之前我们的说的是C语言的正则表达式,我们知道他的字符集是ASCII码。现在我们构造C语言中标识符的正则表达式。首先,标识符只能由字母,数字,下划线表示,所以标识符的字符集={a,b,…z,A,…,Z,0,1,…9,_},是2X26+10+1=63个字符。
  8. 现在构造正则表达式:我们知a是正则表达式,b是正则表达式,那么a|b还是正则表达式,那么(a|b|c|…|A|…|Z|)也是正则表达式,这里用到了上面的选择,注意括号只是为了让我们好识别它是一个字符表达式。我们令K=(a|b|c|…|A|…|Z|),发现这是标识符的第一位的正则表达式,即只能为字母与下划线,同理我们构造出非第一位的正则表达式,令S=(a|b|c|…|A|…|Z|_|0|1|…|9),相比于K多了10个,我们令M=KL,即连接,然后再将闭包,即M*,这样我们就得到了标识符的所有正则表达式(注意这里M是我缩写的,事实上它是等于两个长串的连接),怎么样,太神奇了,虽然我现在不知道有什么用。

  9. 10.最后我们可以引入语法糖,简化构造,例如我们上面说的标识符的构造用到的k,K=(a|b|c|…|A|…|Z|),我们用第一种语法糖,可以简化写为[a-],即a到下划线,简化我们正则表达式的构造。语法糖可以为我们的构造提供很大的方便,不过语法糖本身也是我们使用正则表达式来实现的。
    任务②: 我们要了解有限状态自动机这个概念,它是我们描述经中间的词法分析器生成器生成的词法分析器的一个数学工具

编译原理——词法分析器的设计相关推荐

  1. 南华大学编译原理----词法分析器的设计与实现、语法分析器的设计与实现

    下载链接:(各位同学不需要充钱哈,这种我也没有收益,去淘宝上面找个代下,大概0.5元就能下载实验报告,用来给同学们参考,下载积分不是我设置的,是网站自己默认的) ------------------- ...

  2. lr1分析器c语言实验报告怎么写,编译原理课程的设计构造LR分析法语法分析器.doc...

    编译原理课程的设计构造LR分析法语法分析器 太 原 学 院 课程设计报告书 课程名称 设计题目 构造LR(0)分析法语法分析器 专业班级 学 号 姓 名 指导教师 2016年 12 月 15日 目 录 ...

  3. 【SEUSE】编译原理 - 词法分析器实验报告

    [SEU&SE]编译原理 - 词法分析器实验报告 README 一. 实验目的 二. 实验环境 1. 开发环境: 2. 运行环境 三. 实验内容 1. 主要内容 2. 主要功能 3. 种别码 ...

  4. 编译原理--词法分析器(python语言实现)

    词法分析器 最近在学习编译原理.由于实验要求有词法分析器,这里我就先记录一下词法分析器实现过程以及具体思路. 目标语言 此处我选择的目标语言是c语言的子集来进行词法分析. 实现语言 此处我选用的语言是 ...

  5. 编译原理词法分析器的c++实现

    一.题目的理解和说明 编译原理这门课是计算机专业的核心课程之一,是一门研究软件是什么,为什么可以运行,以及怎么运行的学科.编译系统的改进将会直接对其上层的应用程序的执行效率,执行原理产生深刻的影响.编 ...

  6. 编译原理java课程设计_编译原理课程设计词法分析

    一.课程设计任务及要求 1.1.目的 通过使用一个通用的能够自动根据正规表达式生成词法分析程序的工具程序设计一个简单语言的词法分析器,使学生充分理解课程理论内容和工具软件的使用技巧,掌握所涉及的典型数 ...

  7. 编译原理——词法分析器

    采用java图形化界面编写了java语言的词法分析器,该分析器可识别所有java关键字.软件工程课程中编译原理实验. Keyword.jvav package org.kyc.test1;public ...

  8. 按编译原理的思路设计的一个计算器

    (周游[http://www.cnblogs.com/naturemickey]版权所有,未经许可请勿转载) 首先看一下这个计算器的功能: CALC> set a = 1; b = 2 CALC ...

  9. 编译原理———词法分析器

    1.目的 设计并实现一个包含预处理功能的词法分析程序,加深对编译中词法分析过程的理解. 2.实现功能:词法分析 输入:所给文法的源程序字符串. 输出:二元组(syn,token或sum)构成的序列.其 ...

最新文章

  1. Error: Command failed: xcrun instruments -s
  2. Android直播app用什么技术可以做到延迟小一些?
  3. 简述机器指令与微指令之间的关系_计算机组成原理期末考试题-百度文库
  4. EF6 如何判断DataContext有修改,以及如何放弃修改
  5. 【JS 逆向百例】X球投资者社区 cookie 参数 acw_sc__v2 加密分析
  6. python中getopt函数_python getopt模块使用方法
  7. leetcode题解14-最长公共前缀
  8. Linux目录下有剩余空间,但无法写入数据
  9. 凝血超声手术室行业调研报告 - 市场现状分析与发展前景预测
  10. 4.5Python数据处理篇之Matplotlib系列(五)---plt.pie()饼状图
  11. 字符匹配算法之KMP
  12. html div边框添加文字,css通过text-shadow给文字加边框!
  13. 新闻客户端纷纷内容化,微博却在强化新闻属性
  14. HDLC协议(一)——基本概念
  15. [推荐]中国网管的知识宝库-网管之家
  16. Little Keng
  17. 伪装游戏软件变成计算机,注意!Steam上这款游戏是伪装的病毒:把玩家PC变成矿机...
  18. LaTeX--5--一个文档的基本结构/导言区/标题_作者_日期
  19. Android Studio Lint 工具看完这一篇还不够
  20. Python实例教程Mechanize模块编写爬虫的要点解析

热门文章

  1. 智慧楼宇可视化3D数字孪生系统
  2. java oracle in 10000,Oracle 查询 in条件个数大于1000的解决方案
  3. php中什么是伪静态,thinkphp中什么是伪静态?
  4. 在Mavericks10.9上的Xcode5…
  5. pb graph鼠标移上显示数据_数据分析手把手入门:打造自己的股票分析系统
  6. 美国的那些非主流博物馆
  7. 图纸下发后更改零部件,不更改项目号其实很简单!
  8. 打开旧的图纸属性窗口
  9. 使用Android Killer反编译apk成功,回编译打包失败问题记录
  10. html的根本原理,简要说明 HTML 的基本工作原理。