Legend Since 1984
Cruising between Fantasy and Reality...

Sunday, June 04, 2006

White Space Contains '\r'

下午帮solit调一个编译课实验的程序。让他把输入文件传给我,我用自己的程序跑一下把生成的正确结果返回给他,帮他诊断程序中的错误。

输入的是文本文件,用QQ传的。从QQ的文本框中^C&^V到Visual Studio里面,Start Debug,怪了,词法分析都过不去。跟我自己以前的测试程序比较,都是符合所定义的文法的呀。既然我的词法分析显示"undefined keyword: "错误,想必不可能是语法分析阶段的问题,问题出在从输入文件中取得一个token后去关键字表查询的时候,如果没有查到,表示这个关键字没有被定义,程序异常退出。但是我们两人的关键字表都是一模一样的啊。

再次单步调试,发现出错的token字是char(13),怪了,ASCII码为13的字符是什么?再分析完前两个token之后本应该发现“{”这个token啊,中间的'\n'(回车,char(10))会被自动跳过的。那么这个char(13)是哪里来的?突然想起原来solit提到过的Unix和Windows处理回车的差异——在Unix/Linux中回车使用\r\n来表示的,而Windows仅为\n。说定这个char(13)正是\r啊。引入\r的源头应该是从QQ粘贴过来所致——很有可能在QQ文本框的内部表示中把回车都设置为\r\n了,而我的程序中判断空白符(white space)的时候只对' '、'\t'、'\n'进行了处理,程序把\r也当成了一个token去查关键表,不错才怪了!

简单在判断空白符的地方增加对\r的判断,问题就迎刃而解了。

Labels:

2 Comments:

Blogger 豆瓣 said...

为什么我的 blog在香港显示不出来??
555~~~
我看不到我发的帖子
你的就能看到

6:11 AM

 
Anonymous lookou said...

嗯,文章分析的很透彻!送个棒棒糖奖励一下:--@

5:08 AM

 

Post a Comment

<< Home