由悬空else想到的

看Flex和Bison的资料, 其中提到优先级和结合性的问题, 里面说到应用优先规则的场合有两个, 一个是表达式, 一个是解决悬空else(dangling else) 的问题. 这个问题几乎每一本编译理论的书都会谈论到的. 所谓悬空else就是对如下if语句解析的时候产生二义的问题

if()
  if()
else

这种语句, 也可以这样解释

if()
  if()
  else

两种都是成立的, 但是如果你写了这种语句, 编译器只会选择其中一种, 而且不会报错, 而且编译器是不会按照程序员写的缩进来决定选择哪一种的, 因此有可能你通过缩进表明你的本意是某一种方案, 但是实际上编译器采用的是另一种方案, 此时错误是很难排查出来的. 实际上我还亲自碰到过一回, 定位了好久才找出原因所在.

我写了这样一段代码:

  if(lexer.ch == '\\')
    if(lexer.chNext == '\"' || lexer.chNext == '\'' || lexer.chNext == '\\'lexer.Forward();
  else if(lexer.ch == '\"')
  {    
    lexer.Forward();
    lexer.SetState(SCE_C_DEFAULT);
  }

这里面else if是永远不会执行的,因为编译器是这样看的:

  
  if(lexer.ch == '\\')
  {
    if(lexer.chNext == '\"' || lexer.chNext == '\'' || lexer.chNext == '\\'
    {  
      lexer.Forward();
    }
    else if(lexer.ch == '\"')
    {    
      lexer.Forward();
      lexer.SetState(SCE_C_DEFAULT);
    }
  }

我得到的教训是总是用{}清晰的界定语句的范围, 而不图省事.

不过今天要谈的主要不是这个. 接下来我想搜索一下"悬空else" 看看有没有可以一读的文章, 虽然根据经验, 凡是稍微有点基础性, 原理性, 底层的东西, 在中文网络上都是很难找到高质量内容的. 试过好几回了. 但是结果还是出乎我的意料, 不论是百度还是谷歌, 关于这个主题的中文原创内容不超过5篇. 百度百科为0 , 因为百度百科就是个抄袭的大本营, 其他地方没有, 他自然也抄不成了. 各种个人博客, 技术博客, IT社区更是没有丝毫这方面的信息. 看起来情况是这样, 偌大一个中文网络, 关注这个主题的人为零. 没有人谈论, 也没有人关注, 连翻译国外的内容也没有.

中文世界的程序员们都在做些什么呢?

如果搜索Google, "dangling else" 则是另外一番光景, 从各种角度讨论的都有, dangling else in python, dangling else in java, dangling else in PHP... 简直是天壤之别.

由此想到另外一个问题, 中国人的思维可能不太适合这种需要缜密逻辑的领域. 编译理论是计算机科学中比较复杂的课题之一, 就国内而言, 不要说学习和研究这方面的少, 即使合格的教授人员也是很少的. 大学就不要指望了. 某些大学开设的计算机系就是一个笑话, 很多连私营的培训班都不如.

继续搜索"中国人 理性思维", 搜到不少有趣的东西. 具体来说就是国人是懒于思考, 特别是细致,缜密,严密的逻辑推理和论证. 宁愿直接拷贝一个结果也不愿意自己尝试创造. 这在中文网络上高度的重复率上也反映了出来, 而且国内最大的搜索引擎百度看起来并不反对这种重复内容, 甚至是自己带头干. 对比一下百度和谷歌的搜索结果, 百度上排名在前的通常是一些数据量大的网站上的重复内容, 大部分是转载,抄袭, 这是变相的鼓励重复发布内容, 结果信息只是从一个网站复制到另一个网站, 新的东西越来越少. 最后抄来抄去, 大家抄的都是同样的内容, 整个中文网络环境都在被百度给毒化.

再联想到各种C2C(Copy 2 China), 山寨之王腾讯, 发现问题并不是孤立的, 一个小问题反映了整个系统的面貌和状态, 这背后恐怕是一种普遍的国民个性在起作用.

可巧的是, 读完一些文章之后, 立刻碰到一个现实的例子, 完全印证了刚刚学到的理论. 网址http://www.tianya.cn/publicforum/content/worldlook/1/210294.shtml

先看标题

这是非常典型的中国式句式"你有什么资格xxxxx", 类似的逻辑包括

你自己都有缺点,你有什么资格说别人。

别人能做到,你为什么做不到?

鲁迅辩论的灵魂中引用的话语, 也是类似的逻辑:

你说中国不好。你是外国人么?为什么不到外国去?可惜外国人看你不起……

  你说甲生疮。甲是中国人,你就是说中国人生疮了。既然中国人生疮,你是中国人,就是你也生疮了。你既然也生疮,你就和甲一样。而你只说甲生疮,则竟无自知之明,你的话还有什么价值?倘你没有生疮,是说诳也。卖国贼是说诳的,所以你是卖国贼。我骂卖国贼,所以我是爱国者。爱国者的话是最有价值的,所以我的话是不错的,我的话既然不错,你就是卖国贼无疑了!(摘自《鲁迅全集》第三卷)

回到上面的资格论, 乍一看标题, 我觉得很奇怪, 不管白岩松有没有侮辱和诋毁中国人民, 跟资格有什么关系呢? 难道某些人是有资格诋毁中国人民的? 说话的人似乎并不强调诋毁和侮辱这个事实, 而是侧重于资格.

下方的评论也证明了这一点

恍然大悟, 原来白岩松之所以没有资格, 乃是因他是"蒙古DA子", 我才知道白岩松的蒙古族的, 不过即使白岩松是汉族的, "蒙古DA子" 就会被汉奸,卖国贼取代, 如果不用汉奸,卖国贼字样, 还有生疮可以用, 这里面已经没有任何道理可讲了, 你说了什么并不重要, 重要的是你的身份, 籍贯, 性别, 甚至长相,衣着. 总之,先把你资格否定掉, 接下来你所说的任何话都毫无价值了.

再摘录一个网上的故事.

作家鲍尔吉原野,曾经写过一篇散文,很形象地描述了他在商店里遇到的这类尴尬。他本来想买山西产的蜜枣,问了商店里的女服务员,答曰“只有陕西蜜枣”。曰:“我要买山西蜜枣,陕西的我就不买了”,刚要走,女服务员不满地发起牢骚:“山西不就是陕西么!不就差了一个字么!就你那么矫情!”作者回过身来想说明山西和陕西不一样,如同贵州不是苏州,但是服务员已经将话题转换了:“显得你有学问是不是?不就是个知识分子么,你有啥了不起啊?你说,你有啥了不起?!”。
问题从“山西与陕西不一样”发展到了“你到底有啥了不起”,转变之迅速,令人措手不及,若非那种思维的高手,你最好马上逃走,否则她还会招来群众“评理”,这种“理”只能越评越乱套,作者只能落荒而逃。