3

ASCII ファイルを解析する xml パーサーを作成しましたが、UTF-8 でエンコードされたファイルを読み取れるようにする必要があります。lexに次の正規表現がありますが、UTF-8 と一致しません。何が間違っているのかわかりません:

utf_8       [\x00-\xff]*
bom         [\xEF\xBB\xBF]

それから:

bom             { fprintf( stderr, "OMG I SAW A BOM"); return BOM;}
utf_8           { fprintf( stderr, "OMG I SAW A UTF CHAR", yytext[0] ); return UTF_8;}

次の文法規則もあります。

program 
: UTF8 '<' '?'ID attribute_list '?''>' 
root ...

どこにUTF8ある:

UTF8

: BOM           {printf("i saw a bom\n");}
| UTF_8         {printf("i saw a utf\n");}
|               {printf("i didn't see anything.'\n");} 
;

私のパーサーはi didn't see anythingASCIIファイルに対して動作します。つまり、XML UTF-8ファイルを空のドキュメントにコピーして貼り付けます。

どんな助けでも大歓迎です。

編集:

参照用にトリミングされた .l ファイルを次に示します。

%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "y.tab.h"
int lines = 1;
%}

utf_8       [\x0000-\xffff]*
bom         [\xEF\xBB\xBF]
whitespace  [ \t]
ev          (.|{bom})
ev1         (.|{utf_8})
%%
{whitespace}    { fprintf( stderr, "%s", yytext );}
\n              { fprintf( stderr, "%s%d ", yytext, lines++ );}
.               { fprintf( stderr, "{TOKEN:%c}", yytext[0] ); return yytext[0];}
bom             { fprintf( stderr, "OMG I SAW A BOM"); return BOM;}
utf_8           { fprintf( stderr, "OMG I SAW A UTF CHAR", yytext[0] ); return UTF_8;}
%%

void error( char *message )
{
    fprintf( stderr, "Error: %s\n", message );
    exit(1);
}
4

1 に答える 1

8

さて、これはあなたの問題です:

utf_8       [\x0000-\xffff]*
bom         [\xEF\xBB\xBF]

ここには 2 つの問題があります。まず、Flex は実際には Unicode を理解していません。バイトで動作します。したがって、有効な UTF-8バイト シーケンスに一致する正規表現マクロが必要です。http://keithdevens.com/weblog/archive/2004/Jun/29/UTF-8.regexには、それを行う正規表現があり、Flex 構文に変換するのはそれほど難しくありません (以下を参照)。次に、BOM マクロの角括弧は、必要な 3 バイト シーケンスEB BB BFではなく、値 EF、BB、または BF を持つ任意の1 バイトに一致させます。

(ちなみに、UTF-8 ファイルにはバイト オーダー マークがあるとは想定されていません

これは、あなたがやろうとしているように見えることを多かれ少なかれ行う完全なFlex入力ファイルです:

%{
#include <stdio.h>
%}

bom     \xEF\xBB\xBF
white   [ \t]

u2a     [\xC2-\xDF][\x80-\xBF]
u2b     \xE0[\xA0-\xBF][\x80-\xBF]
u3a     [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}
u3b     \xED[\x80-\x9F][\x80-\xBF]
u4a     \xF0[\x90-\xBF][\x80-\xBF]{2}
u4b     [\xF1-\xF3][\x80-\xBF]{3}
u4c     \xF4[\x80-\x8F][\x80-\xBF]{2}

utf_8   {u2a}|{u2b}|{u3a}|{u3b}|{u4a}|{u4b}|{u4c}

%%

{white}     { putchar(' ');  }
\n          { putchar('\n'); }
{bom}       { putchar('B');  }
{utf_8}     { putchar('u');  }
[\x21-\x7e] { putchar('.');  }
.           { putchar('^');  }
于 2012-04-20T20:46:00.483 に答える