编译原理——3.2 输入缓冲

3.2.1 缓冲区对
E = M * C ** 2
上述表达式将被一次性读取N个字符存储在长度为N的缓冲区中,如果长度不及N,则后面补上特殊字符eof表示结束。
程序维护两个指针(lexemeBegin指针和forward指针),以读取符号“为例,一开始lexemeBegin和forward指针均指向第一个字符’’,然后forward向前看,指向第二个字符’’,发现可以和前面字符串构成词素,因此再向前看,forward指向’2’,不是词素”一部分,而此时前面两个字符已经匹配到词素“”,因此将词素”返回,然后将lexemeBegin右移一个位置。
现在考虑一种情况,某一词素很长,forward向前看的长度超过了缓冲区长度N,此时将无法确认正确的词素,因此可以通过增加另一个缓冲区,当forward向前看到第一个缓冲区结尾时再将N个新字符读取到另一个缓冲区中,然后将forward指向这个新载入字符的缓冲区的头部,只要我们从不需要越过实际的词素向前看很远,以至于这个词素的长度加上我们向前看的距离大于N,我们就绝不会在识别这个词素之前覆盖掉这个尚在缓冲区中的词素。

3.2.2 哨兵标记
在缓冲区末尾加入一个“哨兵”——eof,使得每一次识别一个字符可以直接通过字符是什么判断是否到达缓冲区末尾。
Eof识别分支跳转伪代码:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值