红色解析并用<>替换双%不起作用(red parsing and replacing d

2019-09-28 00:51发布

我想改造

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

 test: "bla bla <bla bla> bla bla bla bla <bla> bla"

与此代码,它不红工作:

 rules: [
    (toggle: -1)
    to "%" mark: (
        (toggle: 0 - toggle)
        either (toggle = 1) [change mark {<}][change mark {>}]
    )
    thru "%"
    |
    to end
]

parse test rules

输出

>> test
== "bla bla <bla bla% bla bla bla bla %bla% bla"

Answer 1:

你的规则需要多一点关怀,使用关键字尤其是当'to'thru 。 您编写规则将发生一次置换,然后的方式to end将推动你输入的结束-而不是你想要的。

我会通过它慢慢的一步。

第一条规则中, to "%" ,这个推进输入第一个“%”字符。 这是一个成功的规则,以便您的括号表达式执行和修改输入,即改变“%”到“<”。 所有优秀的有:第一置换完成,并在输入非常下一个字符现在是“<”。 但是,你的下一个规则是thru "%" 。 该推进输入接下来 “%”字符在input--你想更改为“>”一个字符。

这里的其他关键部件(如HostileFork指出)是您的替换规则不重复。 您解析规则运行一次,然后一切都结束了。 你选择的规则to end ,然后接管和跳跃输入一路到底。 为了得到一个规则,在整个输入反复扫描你需要设置你的规则有someanywhileskip

这里有您的规则剩下的大部分代码的地方,但实现的结果我想你想快速返工。

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 "<"][change mark ">"]
    ) 
    ]
]
parse test rules
test
 == "bla bla <bla bla> bla bla bla bla <bla> bla"

有在,我可能会改变,比如切换代码其它的事情,你可以看到我摆脱不必要的括号的,但现在我forcusing的方式parse工作。



Answer 2:

你不必在你的解析规则的任何迭代结构(SOME,ANY,while等),所以它不应该是不足为奇它一个更换和停止。

这会给你所需的输出,并具有考虑几个其他的变化(虽然只是包括any [... | skip]修改将有固定的代码):

rules: [
    (toggle: true)
    any [
        to "%" mark: thru "%" (
            change mark pick [{>} {<}] (toggle: not toggle)
        )
    |
        skip
    ]
]

parse test rules

(我不使用PICK与逻辑的忠实粉丝!......如果真,第二,如果虚假它给你的第一要素,但在这里把它扔的乐趣。)



Answer 3:

有两种解决方案:一个没有解析

test: "bla bla %bla bla% bla bla bla bla %bla% bla"
replace test "%" "<"
replace test "%" ">"
replace test "%" "<"
replace test "%" ">"

和一个与解析

test: "bla bla %bla bla% bla bla bla bla %bla% bla"
parse test [some [to "%" change skip "<"  to "%" change skip ">"] to end]

和一个为了好玩

parse test [(tog: next [">" "<"]) some [to "%" change skip tog  (reverse head tog)] to end]


文章来源: red parsing and replacing double % with <> doesn't work