<twoyao>

Curiously recurring template pattern

20 April, 2016

问题的起因是在阅读java8的源码中发现 的申明 其中 相当隐晦,不知道啥深意。Google之后豁然开朗,又涨姿势。 要理解上面这段代码可以先从简单的情景出发,先要理解它想达到什么效果。比如说我们有下面的两个类: 如果想实现链式调用, 会报编译错误,因为 返回的是Foo…

用ANTLR4实现一个表达式解析器

23 March, 2016

经过几十年的研究,编译理论已经比较成熟,实现一个编译器前端就像"填表"那么简单,只要告诉生成器语(词)法就可以。在Java的世界里,词法分析工具有[JFlex](http://www.jflex.de/),语法分析工具有[BYACC/J](http://byaccj.sourceforge.net/)、[Java Cup](http://www.cs.princeton.edu/~appel/modern/java/CUP/manual.html)。兼具的有[JavaCC](https://javacc.java.net/)、[ANTLR](http://www.antlr.org/)。 ANTLR4 是目前比较活跃的一个,由Terence Parr编写,采用Adaptive LL(*) 分析方法,有较为成熟的生态链。比起前一个版本,ANTLR4的语法更为简洁,也广受好评。 那么,该从哪里开始呢?还是从大家都熟悉的四则运算开始吧,这基本算是前端的“Hello World" 了。和lex/yacc不同,ANTLR4的词法和语法可以放在同一个.g4文件中,词法单元以大写字母开头,语法单元以小写字母开头作为区分。