目录

综述

正文

1 缓冲区对

2 哨兵标记


综述

在讨论如何识别输入流中的词素之前,我们首先讨论几种可以加快源程序读入速度的方法。源程序读入虽然简单,却很重要。由于我们常常需要查看一个词素之后的若干字符才能够确定是否找到了正确的词素,因此这个任务变得有些困难。在“识别词法单元时的棘手问题”中给出了一个极端的例子。但是在实践中,很多情况下我们的确需要至少向前看一个字符。比如,我们只有读取到一个非字母或数字的字符之后才能确定我们已经达到一个标识符的末尾,因此这个字符不是 id 的词素的一部分。在C语言中,像 - 、= 或 < 这样的单字符运算符也有可能是 ->、== 或 <= 这样的双字符运算符的开始字符。因此,我们将介绍一种双缓存区方案,这种方案能够安全地处理向前看多个符号的问题。然后,我们考虑一种改进方法。这种方法使用“哨兵标记”来节约用于检查缓冲器末端的时间。

正文

1 缓冲区对

我们考虑一种改进方法。这种方法使用“哨兵标记”来节约用于检查缓冲器末端的时间。由于在编译一个大型源程序时需要处理大量的字符 ,处理这些字符需要很多的时间,因此开发了一些特殊的缓冲技术来减少用于处理单个输入字符的时间开销。一种重要的机制就是利用两个交替读入的缓冲区,如图1-1所示。

图1-1 使用一对输入缓冲区

每个缓冲区的容量都是N个字符,通常N是一个磁盘块的大小,如4096字节。我们可以使用系统读取命令一次将N个字符读入到缓冲区中,而不是每读入一个字符调用一次系统读取命令。如果输入文件中的剩余字符不足N个,那么就会有一个特殊字符(用 eof 表示)来标记源文件的结束。这个特殊字符不同于任何可能出现在源程序中的字符。

程序为输入维护了两个指针:

1)lexemeBegin指针:该指针指向当前词素的开始处。当前我们正视试图确定这个词素的结尾。

2)forward指针:他一直向前扫描,直到发现某个模式被匹配为止。做出这个决定所依据的策略在以后来讨论。

一旦确定了下一个词素,forward指针将指向该词素结尾的字符。词法分析器将这个词素作为某个返回给语法分析器的词法单元的属性值记录下来。然后使lexemeBegin指针指向刚刚找到的词素之后的第一个字符。在图1-1中,我们看到,forward指针已经越过下一个词素 * * (Fortran的指数运算符)。在处理完这个词素后,它将会被左移一个位置。

将forward指针前移要求我们首先检查是否已经到达某个缓冲区的末尾。如果是,我们必须将N个新字符读到另一个缓冲区中,且将forward指针指向这个新载入字符的缓冲区的头部。只要我们从不需要越过实际的词素向前看很远,以至于这个词素的长度加上我们向前看的距离大于N,我们就绝不会在识别这个词素之前覆盖掉这个尚在缓冲区中的词素。

2 哨兵标记

如果我们采用上一届节中描述的方案,那么在每次向前移动forward指针时,我们都必须检查是否到达了缓冲区的末尾。若是,那么我们必须加载另一个缓冲区。因此,每读入一个字符,我们需要做两次测试:一次是检查是否到达缓冲区的末尾,另一次是确定读入的字符是什么(后者肯是一个多路分支选择语句)。如果我们扩展每个缓冲区,使他们在末尾包含一个“哨兵”(sentinel) 字符,我们就可以把对缓冲区末端的测试和对当前字符的测试合二为一。这个哨兵字符必须是一个不会在源程序中出现的特殊字符,一个自然地选择就是字符 eof

图1-2显示的缓冲区安排与图1-1一致,只是加入了“哨兵标志”字符。请注意, eof 仍然可以用来标记整个输入的结尾。任何不是出现在某个缓冲区末尾的 eof 都表示到达了输入的结尾。代码段部分总结了前移forward所指向的字符完成多路分支跳转。只有当我们确实处于缓冲区末尾或输入末尾时,才需要进行更多的测试。

图1-2 各个缓冲区末端的“哨兵标记”
/*     Author: John Rothan
*     Title:带有哨兵标记的forward指针移动算法
*/     Date: 2022-3-3switch ( *forward ++ ) {case eof:if (forward在第一个缓冲区末尾) {装载第二个缓冲区;forward=第二个缓冲区的开头;}else if (forward在第二个缓冲区末尾) {装载第一个缓冲区;forward=第一个缓冲区的开头:}else /*缓冲区内部的eof标记输入结束*/终止词法分析其他字符的情况
}

词法分析——输入缓冲相关推荐

  1. 怎样清空输入缓冲区里的内容

    参考自:http://blog.csdn.net/devil_2009/article/details/6364759 fflush()的作用是用来刷新缓冲区,fflush(stdin)刷新标准输入缓 ...

  2. c语言getch退出程序,用getch()时怎么样清除输入缓冲

    写了个小程序,在VS2010下编绎通过. 程序运行时出现一个问题,就是连续快速多次按下左右方向键时,输入缓冲没有被清除,再次扫描输入时,没有按下键,程序也继续执行,直到输入被完全捕获. 这和本人的设计 ...

  3. NI cDAQ-9172上的板载输入缓冲大小

    NI cDAQ-9172上的板载输入缓冲大小 问题: 我的数据采集系统由一个9172机箱和一个模拟输入模块组成,我想知道这个数据采集系统输入缓冲的大小.NI cDAQ 9172的规格说明上说输入FIF ...

  4. java缓冲输入流_java入门 -- Java I/O(五)输入缓冲流BufferedInputStream

    /* * 缓冲输入字节流: * 作用:提高输入效率,比缓冲字节流跟高 * 输入字节流体系: * ----| InputStream 抽象列 * ---------| FileInputStream 读 ...

  5. Java-IO流(File操作,字符输入输出流,字节输入输出流,缓冲流,对象流)

    File对象 File的介绍 File 类 就是当前系统中 文件或者文件夹的抽象表示      通俗的讲  就是 使用File对象 来操作我们电脑系统中的文件或者文件夹 学习File类 其实就是学习 ...

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

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

  7. java缓冲流 复制文件_java使用缓冲流复制文件的方法

    本文实例为大家分享了java使用缓冲流复制文件的具体代码,供大家参考,具体内容如下 [1] 程序设计 /*------------------------------- 1.缓冲流是一种处理流,用来加 ...

  8. 【FPGA】FPGA中的缓冲与驱动那些事

    目录 转载说明 原文精彩片段 缓冲: 驱动: 转载说明 为解决问题而学习才是由效率的,今天重新看了以前的那个项目的Verilog HDL程序,到现在我还没有弄明白细节,只有慢慢蚕食.看到了这样一串程序 ...

  9. C语言再学习 -- 输入/输出

    一.缓冲区 输入字符的立即回显是非缓冲或直接输入的一个实例,它表示你说键入的字符被收集并存储在一个被成为缓冲区的临时存储区域中.按下回车可使你所键入的字符块对程序变成可用. 为什么需要缓冲区?首先,将 ...

最新文章

  1. 某多多买菜程序员:最长持续工作时间高达30小时!睁眼就工作,闭眼就睡觉!多多买菜离职率超级高!公司不得不降低门槛持续招人!...
  2. java 虚拟机 初始化_Java虚拟机 类初始化 阶段
  3. 敏捷开发knowledge
  4. 重建索引能释放掉字段因更改而产生额外列偏移量
  5. 古董来了:1999年的物件,香港已经回归了,我都上初中了,那么你出生了吗?
  6. 鼠标紧跟lable_紧跟当前软件工程趋势的12种方法
  7. GridView中使用CheckBox
  8. SAP动态下载数据库表数据至EXCEL
  9. 显示“没有注册类”问题解决方法(mscomm)
  10. 代码吃鸡:Python-Robocode
  11. 《无人机DIY》——2.11 三轴直升机
  12. Java分布式ID生成解决方案
  13. 转载:应用架构、业务架构、技术架构和业务流程图
  14. 产品经理需要了解的宏观趋势(共享经济专题)1/7
  15. python hank_python optparse模块
  16. 推荐一款快速生成海报的微信小插件
  17. 计算机英语boot,电脑开不了机显示英文boottmgr
  18. Galaxy S9最新谍照曝光 采用新款DeX扩展坞
  19. WPS无法加载EndNote加载项
  20. Echart柱状图中数据显示在图上方

热门文章

  1. 上海亚商投顾:A股缩量调整 AIGC、Web3.0概念抢眼
  2. 使用微信开发工具制作一个简单的古诗词展示微信小程序
  3. Java-Collection的子接口-List集合
  4. linux bash环境下面给expect脚本传递参数
  5. 逻辑卷管理器(LVM) 之 创扩缩秘籍
  6. Chaquopy中不能导入64位Python训练的机器学习模型(32bit与64bit不兼容)
  7. Java继承与多态(抽象类和接口练习)定义抽象类Bank,它包含oneyearRate(一年定期利率)oneyearNationalbebt(一年国债利率)和CurrentDepositRate(按年
  8. DuerOS业绩亮眼,如何成为了百度财报新增长点?
  9. QSettings遇到神坑
  10. [附源码]Python计算机毕业设计办公用品管理系统Django(程序+LW)