2009-06-01 15 views
8

私は、UTF-8文字を処理するBisonパーサを作成しようとしています。パーサが実際にUnicode文字の値を解釈するのは望ましくありませんが、UTF-8文字列を一連のバイトとして解析する必要があります。BisonはUTF-8文字を解析できますか?

今、バイソンには問題がある次のコード生成:

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

問題をUTF-8文字列のバイト数が負の値を持つことになり、及びバイソンはEOFとして負の値を解釈することです、停止します。

方法はありますか?

答えて

8

bisonはい、flexいいえ。私は自分でyylex関数を書くことになったUTF-8でエンコードされたファイルで動作するバイソンパーサーが必要でした。

編集:助けるために、私は(私が重宝gunicodeタイプといくつかのファイル/文字列操作関数があります)glibで利用できるUnicodeの業務の多くを使用。

+0

私のレクサーはUTF-8文字をうまく処理しますが、Bisonパーサーは負の値を見てすぐに解析を停止します。お知らせ下さい。 –

+0

一度に1バイトずつファイルを読んでいますか?または1 utf-8エンコードされた文字を一度に? – eduffy

+0

一度に1バイト。 –

4

flexここで問題がある場合は、zlexをご覧ください。

+0

これは興味深いプロジェクトですが、この問題で対処された問題を正確には解決できません。 16ビット文字はUTF-8エンコード文字とは異なります(UTF-8は最大4バイトまで可能です)。 – eduffy

0

これは4年前の質問ですが、私は同じ問題に直面しています。私はアイデアを共有したいと思います。

UTF-8では、読み込むバイト数がわからないという問題があります。上に示唆したように、独自のレクサーを使用して、行全体を読み取るか、毎回4バイトずつ読むようにすることができます。それからUTF-8文字を抽出し、さらに多くのバイトを読み取って4バイトまで再完成します。

+0

あなたが実際にそれらを読むまでは、1文字あたり何バイト読みかけるのか分からないかもしれませんが、おそらく知る必要はありません。バイトストリームを適切にトークン化するためには、実際に知る必要があるのは、バイトパターンがキーワード、デリミタなどとして重要であることだけです。レクサーは何も解釈する必要はありません。バイトシーケンスをトークンに集めるだけです。文字リテラルトークンを呼び出し元に報告したい場合でも、有効なUTF-8コードシーケンスと一致する字句パターンルールを作成し、それらを使用してマルチバイト文字を正しくスキャンすることができます。 –