我想改造
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"
你的规则需要多一点关怀,使用关键字尤其是当'to
和'thru
。 您编写规则将发生一次置换,然后的方式to end
将推动你输入的结束-而不是你想要的。
我会通过它慢慢的一步。
第一条规则中, to "%"
,这个推进输入第一个“%”字符。 这是一个成功的规则,以便您的括号表达式执行和修改输入,即改变“%”到“<”。 所有优秀的有:第一置换完成,并在输入非常下一个字符现在是“<”。 但是,你的下一个规则是thru "%"
。 该推进输入过接下来的 “%”字符在input--你想更改为“>”一个字符。
这里的其他关键部件(如HostileFork指出)是您的替换规则不重复。 您解析规则运行一次,然后一切都结束了。 你选择的规则to end
,然后接管和跳跃输入一路到底。 为了得到一个规则,在整个输入反复扫描你需要设置你的规则有some
, any
, while
或skip
。
这里有您的规则剩下的大部分代码的地方,但实现的结果我想你想快速返工。
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
工作。
你不必在你的解析规则的任何迭代结构(SOME,ANY,while等),所以它不应该是不足为奇它一个更换和停止。
这会给你所需的输出,并具有考虑几个其他的变化(虽然只是包括any [... | skip]
修改将有固定的代码):
rules: [
(toggle: true)
any [
to "%" mark: thru "%" (
change mark pick [{>} {<}] (toggle: not toggle)
)
|
skip
]
]
parse test rules
(我不使用PICK与逻辑的忠实粉丝!......如果真,第二,如果虚假它给你的第一要素,但在这里把它扔的乐趣。)
有两种解决方案:一个没有解析
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]