这个问题和朋友,同事都讨论过数次,这里做个总结。
大部分认为用手写。
其实我不反对实际当中这么干的,但要说清楚非要用语法工具编写的原因。
用手写的理由大部分是:
就以上两点
实际举个例子。
switch(funcname){ case "ok": call_function(stack.top()); case "failed" : call_function(stack.bottom()); }
看着很简单的代码 ok 和failed 对栈不同的位置函数名字。
function ok() function failed()
当然这代码很傻,不过不少引擎里面能看到这样大量的代码。额 ……
但如果客户有要求,我们需要对语法进行缩减并增加可自定义函数。然后你会跟客户说,这样不行阿。需要修改大量的代码。
这时候你突然想起来了,我怎么没有用antlr或者yacc呢。。。只需要改几行代码就ok了。
function functionname '(' paramlist ')' functionbody
客户想这样
func functionname :paramslist -> functionbody
你看,鬼才愿意在手撸递归下降的代码里大量的改代码么。。。当然不少大师,还是十分优雅的解决了手撸的问题,比如使用手写生成器生成大部分文法代码,然后具体的细节部分调优采用模板嵌入或者其他的方式。。这个文坑留在以后添。