我試圖寫一個簡單的HTML模板引擎(爲了好玩),並想解析一個結構類似這樣的我如何做解析器組合條件檢查
A.正常線是HTML
B.如果符合$
開始然後查看它作爲Java代碼線
$ if (isSuper) {
<span>Are you wearing red underwear?</span>
$ }
C.如果${}
纏繞多條線路,在它所有的代碼應該是Java代碼。
D.如果符合$include
開始那麼做就行了一些技巧(調用另一個模板)
$include anotherTemplate(id, name)
這將創建的anotherTemplate
一個新的實例,並調用它的render()
方法
Ë 。除$include
之外還會有更多的「命令」,比如$def
,$val
。
如何在解析器組合器中表達這一點?實際上,這是一個有條件的叉子
爲1和2,我有這樣的事情:
'$' ~> ('{' ~> upto('}') <~ '}' | not('{') <~ newline)
其中upto
從Scalate的Scamel解析器借來的(我剛開始讀不能相當明白)
我用not('{')
來區分$....
代碼行與${...}
塊。但這很麻煩,不會擴展到其他「命令」
所以我該如何做到這一點?
真的很好的解釋! –
@ DanielC.Sobral謝謝!你有任何改進它的建議嗎? – Harrison