- 论坛徽章:
- 0
|
本帖最后由 Solidus 于 2010-03-13 04:48 编辑
楼上两位, prolj 和 flw2 同志,以及将要跟帖的请注意,先搞清楚在讨论什么。
连我自己都说了,我那个想 ...
xyfree 发表于 2010-03-12 22:36
我不是专门研究这个的,所以最好去新闻组问问,我个人比较喜欢这类东西,所以就说点我知道的吧。
这类东西其实理论上的东西不是很多,基本上照着龙书就能写出个架子来了,教科书方面我见过的相对完整的论述LR的有本<Crafting a compiler with C>,不过这两本书都有问题,龙书里面生成LALR(1)和LR(1)分析表的算法比较古老,足够简单,但是慢的离谱,弄个C++的文法上去估计得算一阵子(我第一个版本就是完全照搬龙书的,90个Term,300条产生式,生成个LALR(1)分析表得10秒钟,后来换了个算法之后只需要20ms)。后一本对LR(0)->LALR(1)的传播链算法有所提及,但是语焉不详,所以这类算法你得搜索文献了,我现在能回忆起来的有个:<Efficient Computation of LALR(1) Look-Ahead Sets>,具体资料你可以去新闻组搜搜,我大部分资料都从那里来的。 其实最好找个现成的实现看,这类东西代码量都不大,然后再读文献比较好,因为此类东西主要是探讨一些数据结构的簿记方式。
另一些比较有意思的和LR有关的东西大概有我提过的:例如Backtracking-LR,介绍这个的有< Parsing Non-LR(k) Grammars with Yacc>,<A Backtracking LR Algorithm for Parsing Ambiguous Context-Dependent Languages>,GLR的我没读过相关文献,不太清楚有什么著名的东西。这两样东西都不算是理论论述,也属于如何组织数据结构。
还有一个我个人认为最酷玩意儿:从EBNF->LALR,新闻组上这问题问的也比较多,相关文献也多,例如<Yet another generation of LALR parsers for regular right part grammars>, 我都没看过也记不住名字了,但是有时间搞明白了加到自己的语法分析库里真的很酷~~
PS:其实我并不看好LR这种技术,我认为现在是ANTLR这类随意指定K的LL生成器的天下(虽然我从没用过它 )(非常类似的现象还有现代regex引擎的变迁,性能不再是第一要素,功能才是!),真正做个C++这种怪物级别的编译器最好的办法通常是手写递归下降,< Parsing Non-LR(k) Grammars with Yacc>里有所提及,我写这类LL或LR引擎主要是好奇,外加给自己做一些小工具而已~~ |
|