gpt4 book ai didi

ruby - Parslet:识别给定关键字以外的任何内容

转载 作者:数据小太阳 更新时间:2023-10-29 08:12:01 24 4
gpt4 key购买 nike

我正在尝试为 Handlebars 编写一个 Ruby/Parslet 解析器,但我被 {{ else }} 关键字困住了。为了给那些不使用 Handlebars 的人解释 brieflt,一个 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 }} block 。以下是我如何编写匹配 if/else block 的规则:

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 可以是任何东西)

所以我现在需要重写 `identifier`` 规则,使其匹配任何单词但不匹配“else”。

提前致谢,文森特

最佳答案

一种方法是使用 absent? 前瞻修饰符。 foo.absent? 将匹配如果原子或规则 foo 此时匹配,并且不消耗任何输入。

有了这个,您可以将 identifier 规则写成

rule(:identifier)
{ (else_kw >> dccurly).absent? >> match['a-zA-Z0-9_'].repeat(1) }

关于ruby - Parslet:识别给定关键字以外的任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28851517/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com