我正在尝试编写一个简单的 html 模板引擎(为了好玩),并想解析这样的结构
A. 普通行是 HTML
B. 如果一行以开头,$
则将其视为 java 代码行
$ if (isSuper) {
<span>Are you wearing red underwear?</span>
$ }
C.如果${}
换行多行,里面的所有代码都应该是java代码。
D.如果一行以$include
然后在行上做一些技巧(调用另一个模板)
$include anotherTemplate(id, name)
这将创建一个新的实例anotherTemplate
,并调用它的render()
方法
E. 并且除了 之外会有更多的“命令” $include
,例如$def
, $val
。
如何在解析器组合器中表达这一点?实际上它是一个条件分叉
对于 1. 和 2.,我得到了这样的结果:
'$' ~> ( '{' ~> upto('}') <~ '}' | not('{') <~ newline )
whereupto
是从 Scalate Scamel 解析器中借来的(我刚刚开始阅读并且不太明白)
我曾经not('{')
将$....
代码行与${...}
块区分开来。但这很麻烦,并且不会扩展到其他“命令”
那么我该怎么做呢?