字体
关灯
   存书签 书架管理 返回目录
向下递归调用,直到,将整个代码,分析完毕。
    这个思路,听起来,很美。
    它,完美地,将复杂的语法规则,分解成了,一个个,独立的,函数模块。
    但是,当黄建功他们,真正开始,用机器码,编写这些,互相调用的函数时。
    他们,很快,就遇到了,一个,鬼魅般的,敌人。
    ——“左递归”。
    在他们的“宪法”中,有一条规则是:E -> E + T。
    一个“表达式”,可以由,另一个“表达式”,加上一个“项”,构成。
    这是一个,典型的,“左递归”定义。
    当,“分析表达式”的函数,被调用时,它的第一件事,就是,再去调用,它自己!
    “分析表达式” -> 调用“分析表达式” -> 调用“分析表达式”……
    结果,就是程序,陷入了一个,永不停止的,自我调用的,死循环!
    “轰!”
    第一台,用于测试的“盘古之心”原型机,因为,函数调用栈,被瞬间撑爆,冒出了一股青烟,彻底报废。
    黄建功,和他的组员们,目瞪口呆地,看着那台,烧毁的机器。
    他们,花了三天三夜,写出来的,几万行机器码。
    在运行的,第一毫秒,就,以一种,最惨烈的方式,宣告了,自我毁灭。
    “不行……这条路,走不通……”
    黄建功,喃喃自语。
    他发现,“宪法”的优美,和,现实编程的残酷,是两回事。
    有些,在数学上,看起来很美的定义,在计算机里,就是,一个,致命的陷阱。
    第一路,宣告失败。
    而另一路,则是由,钱学敏,这位数学泰斗,跨界支援。
    他们采用的,是一种,更加复杂,也更加强大的,自下而上的分析方法——“LR分析法”。
    这种方法,不依赖递归。
    它的核心,是,构建一张,巨大的,“分析表”。
    这张表,会告诉“语法分析器”,在当前状态下,读到,下一个符号时,应该执行什么操作(移入、规约、接受、或报错)。
    整个分析过程,就像一辆,在,预设好的,庞大轨道网络上,行驶的,小火车。
    只要,这张“分析表”,是正确的,那么,分析过程,就,绝对不会出错。
    这个方法,从理论上,就,完美地,避开了“左递归”的陷阱。
    看起来

关闭+畅/阅读=模式,看最新完整内容。本章未完,请点击下一页继续阅读》》
上一页 目录 下一页