2016-11-16 6 views
3

私はこれまでのところ、私はスペック(http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf)を捕獲思っJFlex文字列の正規表現奇妙な行動

string = \"((\\(\"|\\|\/|b|f|n|r|t|u[0-9a-fA-F]{4})) | [^\"\\])*\" 

を持って、JFlexでJSON文字列パーサを記述しようとしています。 私はそれを制御文字と標準の文字と記号でテストしましたが、何らかの理由で£や(または)や¬を受け入れません。誰かが私にこの行動の原因を教えてもらえますか?

答えて

4

あなたはおそらくJLex互換モードで動作していますか?その場合は、公式のJFlexユーザーズマニュアルから次の項目を参照してください。デフォルトでは7ビットの文字コードを入力するように見えますが、あなたが望むのは16ビット(ユニコード)です。

最初に%%の後に行%unicodeを追加して修正できます。

出典:

入力文字が

7ビット入力文字セット(文字コード0〜127)を使用するように生成されたスキャナを原因 %の7ビットを設定します。コードが127より大きい入力文字が実行時に入力で検出された場合、スキャナはArrayIndexOutofBoundsExceptionをスローします。このためだけでなく、%unicodeディレクティブの使用を検討する必要があります。文字エンコーディングの詳細については、エンコーディングを参照してください。これはJLex互換モードのデフォルトです。

%完全 %の8ビット

両方のオプションは、生成されたスキャナは、8ビット入力文字セット(文字コード0〜255)を使用させます。実行時に入力文字に255より大きいコードの入力文字があると、スキャナはArrayIndexOutofBoundsExceptionをスローします。あなたのプラットフォームが1文字につき1バイトしか使用しない場合でも、文字のUnicode値は255より大きい場合があることに注意してください。テキストファイルをスキャンする場合は、%unicode疑似命令の使用を検討する必要があります。文字エンコーディングの詳細については、セクションEcondingsを参照してください。 0-0x10FFFF:

%ユニコード %の16ビット

両方のオプションは、生成されたスキャナは、補助コードポイントを含む完全なUnicode入力文字セットを使用することを引き起こします。 %unicodeは、スキャナが2バイトずつ読み取ることを意味しません。何が読み込まれ、キャラクターを構成するかはランタイムプラットフォームによって異なります。文字エンコーディングの詳細については、「エンコーディング」も参照してください。これは、JLex互換モード(コマンドラインオプション--jlex)が使用されていない限り、デフォルトです。

+1

今後の参考として、ソースを引用符で囲み、自分の文章と明確に区​​別し、ソースへのハイパーリンクを提供してください。 – Laurence