2009-06-01 12 views
8

Sto provando a creare un parser Bison per gestire i caratteri UTF-8. Non voglio che il parser interpreti effettivamente i valori dei caratteri Unicode, ma voglio che analizzi la stringa UTF-8 come una sequenza di byte.Can Bison analizza i caratteri UTF-8?

momento Bison genera il seguente codice che è problematico:

if (yychar <= YYEOF) 
    { 
     yychar = yytoken = YYEOF; 
     YYDPRINTF ((stderr, "Now at end of input.\n")); 
    } 

Il problema è che molti byte della stringa UTF-8 avrà un valore negativo, e Bison interpreta valori negativi come EOF, e si ferma

C'è un modo per aggirare questo?

risposta

8

bison sì, flex no. L'unica volta che avevo bisogno di un parser di bisonti per lavorare con i file codificati in UTF-8 ho finito per scrivere la mia funzione yylex.

modificare: Per aiutare, ho usato un sacco di operazioni Unicode disponibili in glib (c'è un tipo gunicode e alcune funzioni di manipolazione di file/stringa che ho trovato utile).

+0

Bene, il mio lexer gestisce i caratteri UTF-8 bene, ma il parser Bison interrompe l'analisi non appena vede un valore negativo. Si prega di avvisare. –

+0

Stai leggendo il tuo file 1 byte alla volta? o 1 carattere codificato utf-8 alla volta? – eduffy

+0

1 byte alla volta. –

4

flex Essendo il problema qui, si potrebbe voler dare un'occhiata a zlex.

+0

Questo è un progetto interessante, ma non risolverebbe esattamente il problema affrontato in questa domanda. I caratteri a 16 bit sono diversi dai caratteri codificati UTF-8 (per una cosa UTF-8 può avere una lunghezza massima di 4 byte). – eduffy

0

Questa è una domanda di 4 anni fa, ma sto affrontando gli stessi problemi e mi piacerebbe condividere le mie idee.

Il problema è che in UTF-8 non si sa quanti byte leggere. Come suggerito sopra, puoi usare il tuo lexer personale, o leggere righe intere o leggere 4 byte ogni volta. Quindi estrarre il carattere UTF-8 da quello e leggere più byte per completare nuovamente a 4 byte.

+0

Sebbene non si possa sapere quanti byte leggere per carattere finché non li si legge, probabilmente non è necessario saperlo. Per tokenare correttamente il flusso di byte, tutto ciò che è veramente necessario sapere è quali pattern di byte sono significativi come parole chiave, delimitatori, ecc. Il lexer non ha bisogno di interpretare nient'altro; raccoglie solo sequenze di byte in token. Anche se si desidera riportare i token letterali dei caratteri al chiamante, è possibile scrivere regole del modello lessicale che corrispondono alle sequenze di codici UTF-8 valide e utilizzarle per scansionare correttamente i caratteri multibyte in arrivo. –

Problemi correlati