私は単純な 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
E.など、$def
以外の「コマンド」がもっとあるでしょう$val
。
これをパーサーコンビネーターでどのように表現できますか? 事実上、それは条件付きフォークです
1. と 2. の場合、次のような結果が得られました。
'$' ~> ( '{' ~> upto('}') <~ '}' | not('{') <~ newline )
Scalate Scamel パーサーから借用した場所upto
(読み始めたばかりで、よくわかりません)
コード行とブロックnot('{')
を区別していました。しかし、これは面倒で、他の「コマンド」には拡張できません。$....
${...}
どうすればこれを行うことができますか?