6

\alphaLaTeX エスケープ コード (例: ) を Unicode (数学) 文字 (例: )に解析しようとしていますU+1D6FC

現在、これは、このsymbolsパーサー (ルール)を使用していることを意味します。

struct greek_lower_case_letters_ : x3::symbols<char32_t>
{
  greek_lower_case_letters_::greek_lower_case_letters_()
  {
    add("alpha",   U'\u03B1');
  }
} greek_lower_case_letter;

これは正常に動作しますがstd::u32string、結果として取得していることを意味します。コード内に Unicode コード ポイントを保持するエレガントな方法 (おそらく将来の自動化のため) とメンテナンスの理由が必要です。この種のパーサーを UTF-8 に解析する方法はありstd::stringますか?

symbols構造体を a に解析することを考えましたstd::stringが、それは非常に非効率的です (時期尚早の最適化は bla bla です)。

これを機能させるために一連のフープを通過する代わりに、エレガントな方法があることを望んでいました(symbols結果に文字列を追加します)。

ただし、コード ポイント値を使用して UTF8 を使用すると、変換のランタイム コストが発生するのではないかと心配しています (または、constexprUTF32->UTF8 変換の可能性はありますか?)。

4

1 に答える 1

7

cierelabsのJSON パーサーの例は、セマンティック アクションを使用して utf8 エンコーディングでコード ポイントを追加するアプローチを示しています。

  auto push_utf8 = [](auto& ctx)
  {
     typedef std::back_insert_iterator<std::string> insert_iter;
     insert_iter out_iter(_val(ctx));
     boost::utf8_output_iterator<insert_iter> utf8_iter(out_iter);
     *utf8_iter++ = _attr(ctx);
  };

  // ...

  auto const escape =
         ('u' > hex4)           [push_utf8]
     |   char_("\"\\/bfnrt")    [push_esc]
     ;

これは彼らの

typedef x3::rule<unicode_string_class, std::string> unicode_string_type;

ご覧のとおり、utf8 シーケンスをstd::string属性に組み込みます。

完全なコードについては、https ://github.com/cierelabs/json_spirit/blob/x3_devel/ciere/json/parser/x3_grammar_def.hpp を参照してください。

于 2015-12-18T20:54:35.403 に答える