私は単純な html テンプレート エンジンを (楽しみのために) 書こうとしていましたが、このような構造を解析したいと考えています。
A. 通常の行は HTML です
B.行が次で始まる場合、$それをJavaコード行として表示します
$ if (isSuper) {
<span>Are you wearing red underwear?</span>
$ }
C.${}複数の行を折り返す場合、その中のすべてのコードは Java コードである必要があります。
D.行がで始まる場合、行$includeに何らかのトリックを実行します(別のテンプレートを呼び出します)
$include anotherTemplate(id, name)
これは の新しいインスタンスを作成し、そのメソッドanotherTemplateを呼び出しますrender()
$includeE.など、$def以外の「コマンド」がもっとあるでしょう$val。
これをパーサーコンビネーターでどのように表現できますか? 事実上、それは条件付きフォークです
1. と 2. の場合、次のような結果が得られました。
'$' ~> ( '{' ~> upto('}') <~ '}' | not('{') <~ newline )
Scalate Scamel パーサーから借用した場所upto(読み始めたばかりで、よくわかりません)
コード行とブロックnot('{')を区別していました。しかし、これは面倒で、他の「コマンド」には拡張できません。$....${...}
どうすればこれを行うことができますか?