2

次のようにフォーマットされたデータを解析しようとしています。

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
]

ポインタはありますか?ありがとう

4

3 に答える 3

4
>> 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
于 2013-04-17T05:05:52.913 に答える
3

それはtoandthruです。実際には必要ありません。ここでは R3 を利用して、R3 なしで済ませましょう。

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

and先読みを行い、はルールbreakを破ります。anyこれにより、次のループの先頭に到達したときに内側のループを停止できます。

toandは、thruスキップしたくない過去のものをスキップto 'bします。コード内の の場合、ほとんどの場合、実際には何もしませんでした。anyラップしたループがR3 で進行しない場合は続行しないように変更されたのは幸運to 'bでした。進行していなかったからです。

someあなたの最初の問題に関しては、オプションにするために、の後の内側は である(print "a")必要がありanyます。はsomeオプションではなかったためa、介在するデータがない の実行では機能しませんでした。

PARSE はトリッキーかもしれませんが、こつをつかむことができます。

于 2013-04-17T05:00:53.897 に答える