2

私はかなり長い間スピリット クラシックを使用しており、最近 v2 の学習を開始しました。どちらも使いやすく、適度な解析問題を処理するのに十分強力です。

スピリット クラシックとアスキー キャラクターの牧歌的な時代に、仕事は単純に EBNF を LL 形式に適合させることです。しかし、最後に、i18n に対処する必要があります。

私の考えは本当に大雑把です。任意のエンコーディングの入力テキスト バイト ストリームを反復処理する前方反復子を作成します。イテレータはこれらのエンコーディング変換ジョブを処理し、パーサーに utf16/32 コード単位をフィードします (イテレータは iconv または icu4c で簡単に実装できます)。

コード単位の型は、パーサーによって処理される内部 char 型である必要があります。しかし、ドキュメントを読んだ後、明示的な char_t パラメータを持つプリミティブな反復子テンプレートがいくつかしか見つかりませんでした。それは、これらの数値、ディレクティブ、スキャナーなどを再構成する必要があるということですか?

v2ドキュメントもチェックアウトしました。すべてを一貫させる名前空間の方法を提供しますが、内部の char 型を明示的に変更する方法についてはまだそれほど多くはありません。繰り返しになりますが、メーリング リストのアーカイブを検索しましたが、Unicode やその他のエンコーディング関連の投稿はまだ公開されていないようです。エンコーディングが異なるこれらのファイルでもスピリットは機能する可能性があると言う人もいました。そこで、エンコーディングは異なるが同じ内容のファイルを使用してパーサーをテストしました。いくつかの MBCS でエンコードされたファイルがテストに合格し、偶然にも一部の utf8 ファイルも合格しました。しかし、他のエンコーディングはほとんどの場合失敗しました。

4

1 に答える 1

1

Boost Spirit の Web サイトで、char_文字エンコーディングの名前空間を既に見つけていると思います。

最後のページには役立つコメントが含まれています

「Spirit がサポートする文字セットごとに名前空間があります。これには、ascii、iso8859_1、standard、および standard_wide (および将来的には unicode) が含まれます。」

言い換えれば、ブーストスピリットは現時点では実際にはユニコードをサポートしていません。それはTODOリストにあります。

それまでの間、次のような厄介な回避策を試すことができます。

my_tag_ = lit("<") >> byte_ >> lit(">");

これは、文字セットに依存するフィルターを使用しない限り、山括弧の間に表示されるバイナリ文字列と一致します。

于 2011-12-19T17:02:48.383 に答える