模板引擎是web开发中必不可少的部分,Enjoy模板引擎做为JFinal的默认模板引擎,也可以单独使用。它的实现非常的精巧,在使用了一段时间后,也来窥探究竟。
模板引擎确实不亚于实现一门语言,当前的大多数模板引擎是基于antlr,那antlr什么是呢,它帮助模板开发者生成词法、语法解析器。 开发需要制定一个词法、语法规则文件,所以要学习antlr的语法定义规则,运行环境还需要依赖它。
Enjoy模板引擎,没有基于第三方库,词法、语法分析 都是纯手写,代码量确实很少,但是想要读懂要一定的基础,如果明白作者的设计初衷将会更好理解。
1.极简设计
2.创新的词法分析算法、语法分析算法
3.语言级指令扩展
4.不引入新的概念
之前写过一篇《像#render指令一样可以动态参数又支持调用子模板中的函数》的文章,当时是懵的,经过再次阅读源码,才明白作者这样设计的好处。所以正如第三点说的,语言级指令扩展,需要什么指令完全可以自己扩展。
主要工作流程:
词法分析Lexer:这里将生成TokenList,相关类,Lexer,Token、TextToken、ParaToken,Symbol,CharTable。这里作者使用自创的DKFF(Dynamic Key Feature Forward)算法,其目的是提高可读性,降低复杂度,降低state维护量。
语法分析Parser:依据TokenList生成AST,根据Token生成对应的Stat类型,组装成Tree,这一步生成抽象语法树,而每一个Stat语句可以在render时候执行exec方法进行模板的渲染。在构建Stat时候根据Token类型,如果是Expr表达式,那么就会进行表达式Expr的词法>语法分析然后生成表达式AST并赋值给Stat。这里作者使用自创的DLRD (Double Layer Recursive Descent) 为何是Double的呢,将指令与表达式的语法分析划分在不同的层次之中所以有两次Recursive Descent(递归下降算法),可见Parser与ExprParser两个类。
Templat生成:根据AST生成一个Template待用。
render进行渲染:传入参数,Env,Scope,writer,进行渲染,Env用来解析时存放模板函数和执行时提供模板函数,Scope用来提供一些sharedMethod和给模板赋值的data,writer负责写数据。
当前阅读的是JFinal4.8。