编译器,原理,工具,技术一书中的一个问题

书的原名<<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/

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值