1. Antlr, @init, @after. 这个对于相似的逻辑处理可以避免重复的代码。
2. Bison, $1, @$, 不用定义一个变量,体现了script的方便性。
3. 优先级。Antlr以顺序来确定,bison依靠%left, %right定义,稍占优。不过bison的优先级只支持到token级别,不注意反而增加了疑惑。
4. AST的支持。其实即使没有工具本身的支持,用bison产生一个语法树还是不算困难的,比如通过一个stack维护parent节点。不过antlr毕竟直接支持并增加了redirection.
5. Channel特性。
6. 生成代码的可读性及可调试性。Antlr略好,不过毕竟还是会产生类似于 if ( (LA8_0==39) ) { alt8=1; }等自动临时变量。Bison 通过 #line 106 "../INPUT/src/xxx.yy"实现。想要观察比如$1的值需要额外处理。
7. shift/reduce warnning. 这个门槛比较高,在复杂逻辑中完全去除对于俺相当困难
8. @lexer/parser::members {}. 由于继承的关系,override的处理不够直观。也许工具能够克服这个缺点。
9. 出错处理。Java的异常处理和字符串比C++稍好,个人意见。Antlr还有脚本层面上的catch支持。