私はかなり長い間スピリット クラシックを使用しており、最近 v2 の学習を開始しました。どちらも使いやすく、適度な解析問題を処理するのに十分強力です。
スピリット クラシックとアスキー キャラクターの牧歌的な時代に、仕事は単純に EBNF を LL 形式に適合させることです。しかし、最後に、i18n に対処する必要があります。
私の考えは本当に大雑把です。任意のエンコーディングの入力テキスト バイト ストリームを反復処理する前方反復子を作成します。イテレータはこれらのエンコーディング変換ジョブを処理し、パーサーに utf16/32 コード単位をフィードします (イテレータは iconv または icu4c で簡単に実装できます)。
コード単位の型は、パーサーによって処理される内部 char 型である必要があります。しかし、ドキュメントを読んだ後、明示的な char_t パラメータを持つプリミティブな反復子テンプレートがいくつかしか見つかりませんでした。それは、これらの数値、ディレクティブ、スキャナーなどを再構成する必要があるということですか?
v2ドキュメントもチェックアウトしました。すべてを一貫させる名前空間の方法を提供しますが、内部の char 型を明示的に変更する方法についてはまだそれほど多くはありません。繰り返しになりますが、メーリング リストのアーカイブを検索しましたが、Unicode やその他のエンコーディング関連の投稿はまだ公開されていないようです。エンコーディングが異なるこれらのファイルでもスピリットは機能する可能性があると言う人もいました。そこで、エンコーディングは異なるが同じ内容のファイルを使用してパーサーをテストしました。いくつかの MBCS でエンコードされたファイルがテストに合格し、偶然にも一部の utf8 ファイルも合格しました。しかし、他のエンコーディングはほとんどの場合失敗しました。