2015-12-18 16 views
6

Ich versuche, LaTeX-Escape-Codes (z. B. \alpha) zu den Unicode-Zeichen (mathematische Zeichen) zu analysieren (d. H. U+1D6FC).Boost Spirit (X3) Symboltabellen, die zu UTF8-Zeichenfolgen führen

Im Moment bedeutet dies, ich bin mit diesem symbols Parser (Regel):

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; 

Dies funktioniert gut, aber bedeutet, dass ich ein std::u32string als Ergebnis zu bekommen. Ich möchte eine elegante Möglichkeit, die Unicode-Code-Punkte im Code (für möglicherweise zukünftige Automatisierung) und Wartungsgründe zu halten. Gibt es eine Möglichkeit, diese Art von Parser in eine UTF-8 std::string zu parsen?

Ich dachte, die symbols struct parse zu einem std::string, aber das wäre sehr ineffizient (ich weiß, vorzeitige Optimierung bla bla).

Ich hatte gehofft, dass es einen eleganten Weg gab, anstatt durch eine Reihe von Reifen zu gehen, um das zu erreichen (symbols Anhängen von Strings an das Ergebnis).

Ich befürchte allerdings, dass die Verwendung der Codepunktwerte und der Wunsch nach UTF8 zu einem Laufzeitverlust der Konvertierung führen (oder gibt es eine constexpr UTF32-> UTF8-Konvertierung?).

Antwort

7

Der JSON parser example at cierelabs zeigt einen Ansatz, der semantischen Aktionen verwendet Codepunkte in UTF-8-Codierung anhängen:

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] 
    ; 

in ihren

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

, die, wie Sie sehen können, bauen die utf8 Sequenz in ein std::string Attribut.

Siehe zum vollständigen Code: https://github.com/cierelabs/json_spirit/blob/x3_devel/ciere/json/parser/x3_grammar_def.hpp

+0

entschied ich mich mit 'std :: string' als Symbol Schlüssel/Wert, und ich versuche, die' char_' Regel zu erhalten, wie eine Sequenz, die die 'repeat' mit zu arbeiten, Richtlinie. Vergleich der Versionen UTF8 und UTF32 [hier] (http://coliru.stacked-crooked.com/a/47a50fdbec15cd31). Ich verstehe nicht, warum die zweite Version nach dem ersten 'alpha' fehlschlägt. – rubenvb

+0

@rubenvb Ich werde mir das heute Abend ansehen. – sehe

+0

https://www.livecoding.tv/sehe/ – sehe

Verwandte Themen