Handlebars 用の Ruby/Parslet パーサーを作成しようとしていますが、{{ else }}キーワードに行き詰まっています。ハンドルバーを使用しない人のために簡単に説明すると、if/else は次のように記述されます。
{{#if my_condition}}
show something
{{else}}
show something else
{{/if}}
ただし、インライン化とヘルパーが同じ構文を使用できるため、注意が必要です。次に例を示します。
Name: {{ name }}
Address: {{ address }}
そこで、最初に置換を認識するルールを作成しました。
rule(:identifier) { match['a-zA-Z0-9_'].repeat(1) }
rule(:path) { identifier >> (dot >> identifier).repeat }
rule(:replacement) { docurly >> space? >> path.as(:item) >> space? >> dccurly}
{{name}}またはのようなものに一致し{{people.name}}ます。{{ else }}もちろん問題は、それがブロックとも一致することです。if/else ブロックに一致するルールを作成した方法は次のとおりです。
rule(:else_kw) {str('else')}
rule(:if_block) {
docurly >>
str('#if') >>
space >>
path.as(:condition) >>
space? >>
dccurly >>
block.as(:if_body) >>
(
docurly >>
else_kw >>
dccurly >>
block.as(:else_body)
).maybe >>
docurly >>
str('/if') >>
dccurly
}
(注: docurly は{{、dccurly は}}、 block は多かれ少なかれ何でもかまいません)
したがって、「識別子」ルールを書き直して、「else」ではなく任意の単語に一致するようにする必要があります。
前もってありがとう、ヴィンセント