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