我想写一个Ruby/Parslet解析器以解析Handlebars,但我卡在了
简单解释一下,如果/否则语句是这样写的:
(注:docurly是
{{ 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是}}
,块可以是更多或更少的任何内容)
所以我现在需要重写`identifier`规则,使它匹配任何单词但不包括“else”。
提前感谢, 文森特