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识别分支跳转伪代码: