《编译原理》第二版(龙书)附录源码Windows下调试方法

说明:原书上附带的是Unix环境下调试程序的运行结果,而在Windows下运行会频频报错:

Exception in thread "main" java.lang.Error: near line 1: syntax error
	at parser.Parser.error(Parser.java:15)
	at parser.Parser.match(Parser.java:19)
	at parser.Parser.assign(Parser.java:116)
	at parser.Parser.stmt(Parser.java:110)
	at parser.Parser.stmts(Parser.java:62)
	at parser.Parser.block(Parser.java:30)
	at parser.Parser.program(Parser.java:23)
	at main.Main.main(Main.java:9)

阅读出错提示会发现在第一行就出错了,为什么呢?

这是因为这段代码出了问题:

 for( ; ; readch() ) {
         if( peek == ' ' || peek == '\t' ) continue;
         else if( peek == '\n'  ) line = line + 1;
         else break;
      }

这是词法分析器下面的代码:(package:lexer  文件名:lexer.java  函数:Token scan() { }), 他的作用是滤掉输入的“空格”和“tab”,当遇到“换行”时,就使行数加一(line=line+1; ) 到这里我们可能会觉得没什么问题,其实,问题就出在这里。

 

注意

 

广义上理解:

r:回车,使输出转到当前行的行首

n:换行,使输出转到下一行,但是并不一定就是行首。

 

 

Windows、Linux/Unix 、MacOS 下,关于换行有如下区别:

Windows: “ \n\r ”或 “ \r\n ”表示换行,计两个字符。

Linux/Unix : “ \n ”表示换行,计一个字符

MacOS:“ \r  ”表示换行,计一个字符。

 

回到刚刚的错误代码会发现,这段代码并没有错,这是段适用于 Unix/Linux 系统的代码,在 Unix/Linux 下完全可以成功运行。下面这张图片是 Ubuntu14 下面运行的结果(测试输入的程序来自龙书附录):

《编译原理》第二版(龙书)附录源码Windows下调试方法_第1张图片

那么我们如何使其可以在 Windows + Eclipse 上成功运行呢?根据刚才的内容,我们对程序进行修改:

  for( ; ; readch() ) {
         if( peek == ' ' || peek == '\t' || peek == '\n' ) continue;
         else if( peek == '\r'  ) line = line + 1;
         else break;
      }

即可使其在 Eclipse 上成功运行,运行结果如下:

《编译原理》第二版(龙书)附录源码Windows下调试方法_第2张图片

运行结果和Ubuntu14上结果一致,结果正确。

源码地址:https://pan.baidu.com/s/1FWPJk4jNvQ8pT8m9gXjYHA    提取码:29j5

转载请注明出处:http://blog.csdn.net/qq1641070658/article/details/79651183

你可能感兴趣的:(常见问题)