那么最后我就来看看这个所谓的lr(0)分析表生成算法 :
这个算法乍一看好像又和前面脱节了, 但是如果仔细看之前的讲解, 比如下图, 仔细比较, 感受一下 ...
你会发现 : 每次产生的D其实就相当于是一个新的状态, 那么再看一下closure 和 goto的具体实现 :
不难发现closure其实就是把所有原推导式左侧点的右侧的非终结符(也就是即将探索的第一个非终结符)的推导式全部加入这个集合, 那么为什么要这样做呢 ? 因为这个算法是并行的, 比如上图, 在执行推导式0的时候, 他需要先完成推导式1, 完成之后再完成推导式0, 那么其实他真正需要的其实是1, 只有1完成之后才能完成0, 也就是说它真正需要的是一个终结符, 这个过程就是不断地化简非终结符得到终结符的过程... 这就是所谓的closure ... 至于goto, 其实就是把集合中所有得到x能够进行的转化求出来, 作为新的状态.
差不多就是这样, 其实这一波lr(0)确实有点卒, 但是仔细看看还是勉强能够理解的, 还是要看具体撸代码, 不撸代码也只是看看作为课外知识了解一下...