【问题标题】:red parsing and replacing double % with <> doesn't work红色解析和用 <> 替换双 % 不起作用
【发布时间】:2017-10-31 13:04:33
【问题描述】:

我想变身

 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"

【问题讨论】:

    标签: parsing rebol red


    【解决方案1】:

    您的规则需要多加注意,尤其是在使用关键字'to'thru 时。您的规则的编写方式将发生一次替换,然后to end 会将您推进到输入的末尾——不是您想要的。

    我会慢慢介绍的。

    第一条规则,to "%",它将输入推进到第一个“%”字符。这是一条成功的规则,因此您的括号表达式会执行并修改输入,即将“%”更改为“但是你的下一个规则是thru "%"。这会将输入 过去 推进输入中的下一个“%”字符——您想要更改为“>”的字符。

    这里的另一个关键部分(正如 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"
    

    我可能会更改代码中的其他内容,例如切换开关,您可以看到我去掉了不必要的括号,但现在我要强调 parse 的工作方式。

    【讨论】:

      【解决方案2】:

      您的解析规则中没有任何迭代构造(SOME、ANY、WHILE 等),因此它进行一次替换并停止也就不足为奇了。

      这将为您提供所需的输出,并有一些其他更改供您考虑(尽管仅包括 any [... | skip] 修改会修复您的代码):

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

      (我不是将 PICK 与 LOGIC 一起使用的最大粉丝!...如果为真,它会给你第一个元素,如果为假,它会给你第二个元素,但把它扔在这里是为了好玩。)

      【讨论】:

        【解决方案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]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多