4

更新 2

|**|元の質問:バックトラッキングが必要ない場合、Ragel の使用を避けることはできますか?

()*更新された回答: はい、バックトラッキングが必要ない場合は、簡単なトークナイザーを作成できます。

更新 1

私が行っていることは XML に固有のものではないため、XML のトークン化について尋ねるのは危険であることに気付きました。

更新を終了

次のようなファイルで FooBarEntity 要素を単純に検索する Ragel スキャナー/トークナイザーがあります。

<ABC >
  <XYZ >
    <FooBarEntity>
      <Example >Hello world</Example >
    </FooBarEntity>
  </XYZ >
  <XYZ >
    <FooBarEntity>
      <Example >sdrastvui</Example >
    </FooBarEntity>
  </XYZ >
</ABC >

スキャナーのバージョン:

%%{
  machine simple_scanner;
  action Emit {
    emit data[(ts+14)..(te-15)].pack('c*')
  }
  foo = '<FooBarEntity>' any+ :>> '</FooBarEntity>';
  main := |*
    foo => Emit;
    any;
  *|;
}%%

スキャナー以外のバージョン (つまり、()*の代わりに使用|**|)

%%{
  machine simple_tokenizer;
  action MyTs {
    my_ts = p
  }
  action MyTe {
    my_te = p
  }
  action Emit {
    emit data[my_ts...my_te].pack('c*')
    my_ts = nil
    my_te = nil    
  }
  foo = '<FooBarEntity>' any+ >MyTs :>> '</FooBarEntity>' >MyTe %Emit;
  main := ( foo | any+ )*;
}%%

私はこれを理解し、 https://github.com/seamusabshere/ruby_ragel_examplesでテストを書きました

https://github.com/seamusabshere/ruby_ragel_examples/blob/master/lib/simple_scanner.rlおよびhttps://github.com/seamusabshere/ruby_ragel_examples/blob/master/lib/simple_tokenizerで読み取り/バッファリング コードを確認できます。 .rl

4

2 に答える 2

3

XML を解析するためにスキャナーを使用する必要はありません。スキャナーなしで、単純な XML パーサーをRagel に実装しました。これは、いくつかのタイミングと詳細情報を含むブログ投稿です。

編集:多くの方法で行うことができます。スキャナーを使用できます。単語を解析して、 が表示STARTANIMALされるまで単語の収集を開始しますSTOPANIMAL

于 2011-06-08T17:32:30.213 に答える
1

Occam の言い換え: スキャナは、必要でない限り必要ありません。スキャナーがないと、一度に 1 つのシンボルを処理でき、おそらくバッファーなしでストリームから読み取ることができます。

于 2011-06-09T05:43:15.000 に答える