作者halajohn (Wei Hu)
站内Programming
标题Re: [问题] 如何学写COMPILER? [纯抛砖引玉]
时间Thu Apr 19 13:17:14 2007
: 很多人都在猜 C++ parser 没有 LR(2) 搞不出来,
: 因为许多人使用 bison 这个 LALR(1) parser generator 实作都碰壁得很惨,
: 不单是 LALR 和 LR 支援 syntax 的能力之差所造成的错觉,
挑个错, LALR or LR 支援 syntax 的能力并不差,
理论上 (实际上也是), LR 要比 LL 强大 (的多).
: 还常常会遇上 lookahead 的 token 不够的问题。
lookahead 的问题不在够不够用,
要是觉得不够用, 你自己把他加大不就好了.
lookahead 的问题在於, 大於某个数值的 lookahead 下,
grammar 展开的时间 (或空间, 看你要用哪种实作) 将会大到超过你的想像,
就连目前个人电脑上能用到的最快 CPU 也没法轻易的负担.
而这个数值在现实生活中所用到的一般性 grammar 而言,
大约是 2....
: 一个 grammer 能用 BNF 表示,
: 并不会代表它的 parser 好写,
: 因为 BNF 可以随你高兴写,
: 但写出来的 form 不见得适合 context-free LALR(1) parser 去 parse。
: > 再加上继承, overloading 这些可能跨过无数 header, source
: > 追进去早忘了上层是啥 datatype
: 不对,用 template 写东西绝对可以 cross,
: 一直以来都没有问题,
: 而且要同时让支援 export 跟不支援 export 的 compiler 都不会有问题,
: 讲 template 的书上也有说明做法,
: 我还是第一次听说用 template 写的东西不能 cross platform。
理论上是这样啦, 不过要 100% 支援 C++ 的 compiler 才行
我个人很喜欢写 template code,
之前用 gcc 3 写, 一些复杂的 syntax 都做不出来
(不知道 gcc 4 有没有因为 parser 换过所以好点).
现在改用 VC 2005...
说真的, Microsoft 做得还真不错, 不是盖的, 100 分.
--
http://www.csie.ntu.edu.tw/~r88052/main/tw/frame.html
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 219.87.157.82