将 %% 替换为 <!-- --> 时永远解析循环

Parse looping forever when replacing %% by <!-- -->

我要变身

 test: "bla bla %bla bla% bla bla bla bla %bla% bla"

进入

 test: "bla bla <!--bla bla--> bla bla bla bla <!--bla--> bla"

我认为这很容易,因为它是

的细微变化

但是我的代码永远循环,尽管我有 "to end" 规则:

test: "bla bla %bla bla% bla bla bla bla %bla% bla"


toggle: -1
rules: [ 
    any [
        to "%" mark: (
            toggle: negate toggle 
            either toggle = 1 [change mark {} insert mark {<!--}][change mark {} 
            insert mark {-->}]
    ) 
    ]
    |
    to end
] 

parse test rules
test

我不会使用 to(或 thru),它们在我看来有点危险。我会使用类似的东西:

toggle: false 
parse test [
    some [
        change #"%" (either toggle: not toggle ["<!--"]["-->"]) 
    |   skip
    ]
]

此外,您可以删除 toggle,如果您想要:

parse test [
    some [
        change #"%" (first reverse ["-->" "<!--"]) 
    |   skip
    ]
]

问题出在您试图用空字符串交换“%”。 "%" 留在那里并且总是被击中。您的规则适用于这些修改

rules: [ 
    any [
        to "%" mark: (
            toggle: negate toggle 
            either toggle = 1 [
                change/part mark  {<!--} 1 
            ][
                change/part   mark {-->} 1
            ]
        ) 
    ] 
    to end
] 

不使用parse,虽然没有任何优势,只是另一种方式:

until [none? attempt [insert remove find test "%" first reverse ["-->" "<!--"]]]