说明:原书上附带的是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 + Eclipse 上成功运行呢?根据刚才的内容,我们对程序进行修改:
for( ; ; readch() ) {
if( peek == ' ' || peek == '\t' || peek == '\n' ) continue;
else if( peek == '\r' ) line = line + 1;
else break;
}
即可使其在 Eclipse 上成功运行,运行结果如下:
运行结果和Ubuntu14上结果一致,结果正确。
源码地址:https://pan.baidu.com/s/1FWPJk4jNvQ8pT8m9gXjYHA 提取码:29j5
转载请注明出处:http://blog.csdn.net/qq1641070658/article/details/79651183