【问题标题】:Using a nested rule with parse使用带有解析的嵌套规则
【发布时间】:2013-04-17 03:34:25
【问题描述】:

我正在尝试解析一些格式如下的数据。

data: [a b x b x x b a a x x b b x ]

我需要它来按顺序提取 a 和 b 并为每个 a 和 b 执行不同的操作。

预期的输出是:

a
b
b
b
a
a
b
b
== true

到目前为止,我已经想出了这个,但是重复的 a 失败了。

parse data [
  some [
    thru 'a (print "a")
    some [
      any [
        to 'b (print "b")
      ]
      to 'a
    ]
  ]
  to end
]

任何指针?谢谢

【问题讨论】:

    标签: rebol rebol3


    【解决方案1】:
    >> data: [a b x b x x b a a x x b b x ]
    == [a b x b x x b a a x x b b x]
    
    >> parse data [ some [ 'a (print "a") | 'b (print "b") | skip ] ]
    a
    b
    b
    b
    a
    a
    b
    b
    == true
    

    【讨论】:

      【解决方案2】:

      我可能遗漏了一些东西……但这不是您想要的:

       parse data [
           any [
               thru ['a (print "a") | 'b (print "b")]
           ]
           to end
       ]
      

      生成您请求的输出。

      【讨论】:

      • 谢谢,你说得对。我一直在思考如何将数据构造为 a followed 0 或多个 b。您的解决方案更简洁,因为它实际上只是说如果我得到一个 a 执行此操作,或者如果我得到一个 b 执行此操作,并且随着 parse 在系列中前进,顺序是隐含的。
      • 当然。不过@GrahamChiu 的要好一些!
      • 实际上,这个在 Rebol 3 中要好得多。不过,Graham's 将在 Rebol 2 中工作。
      • 我必须补充一点,对于复杂的规则并不总是建议在解析中使用 'TO 和 'THRU,因为它们不是模式匹配而是搜索(就像在普通系列上的查找一样)。当将正常的解析模式匹配和搜索混合在一起时,现实生活中可能会出现非常复杂的错误。对于更简单的规则,(在 10 行以下)'TO 和 'THRU 通常会创建更明显的规则(在阅读它们时)......就像可以在上面看到的那样。
      【解决方案3】:

      这是tothru,你并不需要它们。让我们在这里充分利用 R3 而不要这样做。

      parse data [
          some [
              'a (print "a")
              any [
                  'b (print "b") |
                  and 'a break |
                  skip
              ]
          ]
          to end
      ]
      

      and 进行前瞻,break 突破了any 规则。这可以让您在到达下一个循环的开头时停止内部循环。

      tothru 将跳过您不想跳过的内容,而对于您的代码中的 to 'b,它大多数时候实际上并没有做任何事情。你很幸运,你包裹 to 'bany 循环在 R3 中被更改为如果它不前进就不会继续,因为它没有前进。

      至于您的第一个问题,(print "a") 之后的内部some 应该是any,以使其成为可选。 some 不是可选的,因此它不适用于在没有干预数据的情况下运行 a

      解析可能很棘手,但你会掌握它的窍门。

      【讨论】:

      • 谢谢布赖恩,非常清楚的解释。我以前没见过and。这里的文档是parse?rebol.com/r3/docs/functions/parse.html 上的最新信息来源吗?
      • 其他答案会起作用,但不要做嵌套循环的事情,这样他们就不会真正回答你的问题。不过,如果您真的不需要知道如何执行嵌套循环,那么它们将起作用!
      猜你喜欢
      • 2019-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多