书的原名<<Compiler,Principles,Techniques and Tools>> International Edition
问题来源: SEC3.2
原书算法描述如下:
forward=forward+1;
if forward=eof then begin
if forward at the end of first half then begin
reload second half;
forward=forward+1;
end
else if forward at the end of second half then begin
reload first half;
move forward to beginning of first half
end
else/*eof within a buffer signifying end of input*/
terminate lexcial analysis;
end
根据此算法,每当指针走到第一个Buffer的末尾,把数据装入第二个Buffer。当指针走到第二个Buffer的末尾,重新装入第一个Buffer。根据这个算法我自己写了个程序,进行词法分析,但发现有问题。分析了半天,发现问题出在 PushCharBack()上。让我们假设当前指针处在第一个Buffer的末尾,根据书上的算法,程序应该往第二个Buffer里重新装入了新的数据。这时的指针指向位于第二个Buffer的第一个Char。但很不幸的是,我们发现现在词法并不是我们所期待的,所以我们希望重新分析另一种可能性,于是我们把指针向回移了一格,停留在了第一个Buffer的末端。根据原书的算法,这时我们应该重新装载第二个Buffer,但很不幸的是,原来Buffer中的内容已经被替换。所以我们现在不能对原来的内容进行词法分析了,因为数据已经丢失。
我不知道Ullman在写书的时候有没有考虑过这个问题。不过,最近我又发现了很有趣的事。Ullman他自己也承认他从来就没写过Compiler或者教过Compiler这门课。还有在我看到NFA转DFA这章时,发现他用的算法远比我们老师教的方法复杂度要高。
这本书看到现在为止,节奏很缓慢,对书中的一些细节问题有些地方解释的不是很详细,大概他当我们都是Stanford的学生了。呵呵~~~~。毕竟是大师级的人物不好妄加评论。
http://www-db.stanford.edu/~ullman/