私はJFlexを初めて使用します。JFlex はパーサー ジェネレーターであることがわかりました。ただし、以下についてはまだ明確ではなく、同じことを明確にする必要があります。
これがパターン識別とデータ分離に正規表現を使用することとどのように異なるか、また JFlex を使用することの追加の利点は何ですか。
JFlex が正規表現よりも有用な特定のユース ケース。
とにかく、テキスト/xmlファイルの一般的な解析に役立ちますか?
前もって感謝します。
JFlexはパーサー ジェネレーターではなく、スキャナー ジェネレーターです。入力をトークン化します。CUPやBYACC/Jなどのパーサー ジェネレーターと組み合わせて使用します。
スキャナーとパーサーには重要な違いがあります。
あなたの質問:
1) および 2) 次のパターンで、文字の入力ストリームをトークンのストリームに変換する必要があるとします。
[0-9]+
(次のものとは異なるもの\.
)、それは符号なし整数です。出力に送信"INTEGER"
します。[0.9]+\.[0-9]*
それは符号なし浮動小数点です。出力に送信"FLOAT"
します。これらは共通のプレフィックスを共有していることに注意してください。入力を正規表現でスキャンしたい場合は、それらを共通のプレフィックスで分割する必要があります (正規表現は高価なので非常に遅くしたくない場合を除きます)。実行時に、最初にプレフィックスを評価する必要があります。一致する場合は、次に続くもの^\.
を\.
評価します。番号。もしそうなら、あなたは持っていFLOAT
ます。
基本的に構築する必要があるのは、状態が決定点であり、これまでに見られた入力を反映し、遷移が入力で見られる現在の文字の評価である有限状態オートマトンです。
JFlex (他の多くのスキャナー ジェネレーターと同様) を使用すると、(基本的に) 正規表現を提供するだけで、そのようなオートマトンのコードを自動的に生成できます。そして、非常に効率的なコードを生成します。
3) 生成されたスキャナーと生成されたパーサーを併用して、文脈自由言語を認識することができます。プログラミング言語など。それを使用して XML を解析できるはずですが (試したことはありません)、XML にはよく知られた構造があり、必要がないため、通常は特定の目的のパーサーが XML ( SAX、StAXなど) に使用されます。パーサーを生成します。
ところで、XML を Regex で解析できないことに注意してください。;)
よろしく。