2

現在、Rebol 3 のFirmata プロトコルの Midi メッセージを解析していて、これまでに見たことのない状況に遭遇しました。

基本的に、フレーミング バイト間でバイトをコピーする一般的なルールがあります。ただし、そのルールはフレーミング バイトを消費しています。コードを次のように減らしました。

data: #{
    F06C00010101040E7F000101010308040E7F00010101040E7F0001010103
    08040E7F000101010308040E7F00010101040E7F00010101040E7F0001010103
    08040E7F000101010308040E7F000101010308040E7F00010101040E7F000101
    01040E7F00010101020A7F00010101020A7F00010101020A7F00010101020A7F
    00010101020A06017F00010101020A06017FF7
}

sysex-start: #{F0}
sysex-end: #{F7}
capability-query: #{6B}
capability-response: #{6C}
capability-end: #{7F}

received-rule: [
    sysex-start
    capability-response-rule 
    sysex-end
]

capability-response-rule: [
    capability-response
    [
        capability-end |
        some [copy pin 1 skip]
    ]
]
parse data received-rule

問題は、バイナリsome [copy pin 1 skip]を飲み込んでいるということです。sysex-end

  • (サブルールに移動せずに) ルールを再構築する方法はありsysex-endますか?

  • このサブルールから抜け出す場合に役立つ解析キーワードはありますか?

(注: 仕様に従ってデータを解釈していないことは承知しています。)

4

2 に答える 2

3

何らかの方法で sysex-end に到達したら、ループを中断する必要があります。

ループのたびに sysex-end に一致し、ヒットしたときに中断するか、sysex-end ではないすべてのものに対してのみ一致します。

最初のオプションは、明らかに sysex-end をサブルールにもたらしますが、単純に見えます。あなたの問題を次のように作り直すと:

problem-rule: [
    (matched-bytes: none)
    copy matched-bytes some [skip]
]

次に、NOT キーワードを使用した最初のソリューションは次のようになります。

alternative-1: [
    (matched-bytes: none)
    copy matched-bytes some [
        not sysex-end
        skip
    ]
]

2 番目の選択肢は、サブルールに sysex-end を持ち込まない。あなたはビットセットを作ります!sysex-end (247 は 16 進数の F7 に対応) 以外のすべてに一致するようにするには:

not-sysex-end: bits: make bitset! [0 - 246 248 - 255]
alternative-2: [
    (matched-bytes: none)
    copy matched-bytes some [not-sysex-end]
]

これを指定するより良い方法があるかどうかを知るには、私は Rebol 3 ビットセットに精通していません。

ここでの 2 番目の選択肢は、要件を満たし、最初の選択肢よりもはるかに高速に実行される可能性が高いため、おそらく優れています。

于 2014-06-22T13:59:31.790 に答える
2

(少なくともRebol2では)使用できます

pin-set: complement charset to-string #{F7} 

received-rule: [
    sysex-start
    capability-response-rule 
    sysex-end
]

capability-response-rule: [
    capability-response
    [
        capability-end |
        some  [copy pin pin-set  ]
    ]
]
parse data received-rule

== 真

于 2014-06-22T13:32:07.710 に答える