我正在尝试为 Handlebars 编写一个 Ruby/Parslet 解析器,但我遇到了{{ else }}
关键字。为了向那些不使用 Handlebars 的人解释一下,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}}
or {{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 is {{
, dccurly is}}
和 block 或多或少可以是任何东西)
所以我现在需要重写 `identifier` 规则,使其匹配任何单词,但不匹配“else”。
提前致谢,文森特