2015-12-18 13 views
6

Sto provando ad analizzare i codici di escape LaTeX (ad esempio \alpha) ai caratteri Unicode (matematici) (ad esempio U+1D6FC).Tabelle dei simboli Boost Spirit (X3) risultanti in stringhe UTF8

In questo momento questo significa che sto usando questo symbols parser (regola):

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; 

Questo funziona bene, ma significa che sto ottenendo un std::u32string di conseguenza. Mi piacerebbe un modo elegante per mantenere i codici Unicode nel codice (per un'automazione futura) e per motivi di manutenzione. C'è un modo per far analizzare questo tipo di parser in un UTF-8 std::string?

Ho pensato di rendere l'analisi di symbols struct a std::string, ma sarebbe altamente inefficiente (lo so, l'ottimizzazione prematura bla bla).

Speravo ci fosse un modo elegante invece di passare attraverso un mucchio di cerchi per ottenere questo lavoro (symbols accodare le stringhe al risultato).

Tuttavia, temo che utilizzando i valori del punto di codice e volendo UTF8 si incorre in un costo di runtime della conversione (o è possibile una conversione constexpr UTF32-> UTF8?).

risposta

7

Il JSON parser example at cierelabs mostra un approccio che utilizza le azioni semantiche per aggiungere punti di codice nella codifica 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] 
    ; 

Questo è usato nella loro

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

Il che, come si può vedere, costruire l'utf8 sequenza in un attributo std::string.

Vedere il codice completo: https://github.com/cierelabs/json_spirit/blob/x3_devel/ciere/json/parser/x3_grammar_def.hpp

+0

ho deciso usando 'std :: STRING' come simbolo chiave/valore, e sto cercando di ottenere la regola' char_' a lavorare come una sequenza usando il 'repeat' direttiva. Confronto tra la versione UTF8 e UTF32 [qui] (http://coliru.stacked-crooked.com/a/47a50fdbec15cd31). Non capisco perché la seconda versione fallisce dopo il primo '\ alpha'. – rubenvb

+0

@rubenvb Lo vedrò più tardi stasera. – sehe

+0

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

Problemi correlati