2016-10-12 3 views
1

私はC++でXMLスキャナを書こうとしています。私は理想的には正規表現ライブラリを使うほうがずっと簡単です。regexライブラリを使ってC++で語彙アナライザを作成しますか?

しかし、私はそれを行う方法のように少し困惑。ですからまず、各トークンの正規表現を言語で作成する必要があります。トークンの名前に加えて、これらの正規表現のペアをマップに格納することもできます。

次に、私は、入力ファイルを開いて、私のファイル内の文字列を反復処理し、正規表現にそれらを一致させるためにイテレータを使用したいと思います。ただし、XMLでは、文字列を区切るスペースがありません。

私の質問は、この方法でも機能しますか?また、どのように正確に私のニーズに合う正規表現ライブラリですか? regex_matchは自分のニーズに合っているので、私のスキャナは騙されることはありませんか?

私はちょうど私がこの上で作業を開始できるように、私の頭の中のプロセスのスケルトンを作成しようとしています。私は、他の人からの質問に、私が問題について正しく考えているかどうかを知りたがっていました。

私はこれについて何か考えていただきたいと思います。本当にありがとう!

+2

なぜ車輪を改造するのですか? lex/flexは何十年も前から存在していて、すべての絡み合いが解消されています。 –

+0

私はレキシカル分析を行う方法を学んでいます。ただ私のために生成されたコードを持っているだけではそれほど役に立ちません。 –

+0

私はそのようなツールが有用であることに同意しますが、私はそれを自分で行う方法を学びたいと思います。 –

答えて

0

字句解析は、通常、各トークンが可能正規表現のセットから可能な限り長いマッチに対応順次マッチングトークンによって進行します。各一致は、前のトークンが終了したところでアンカーされるので、検索は実行されない。

ここでは、「トークン」という単語をややゆるやかに使用しています。空白とコメントはトークンとしてもマッチしますが、ほとんどのプログラミング言語では、認識された後に単純に無視されます。準拠したXMLトークナイザはそれをトークンとして認識する必要があります。そのため、問題のドメインでの使用は正確です。

よりもむしろ迷惑な細部の海に身を浸し、あなたが効率的に正規表現のコレクションを与えられ、このアルゴリズムを実装(F)LEX、学びたいことがあります。また、バッファ処理や、字句解析プロセスの性質を理解するために集中できるようにするその他の詳細も処理します。

https://sourceforge.net/projects/re-flex

生成されたスキャナは、Boost.Regexではとして正規表現エンジンを使用する:スキャナを生成RE /フレックスと呼ばれるこのためのツールは、あり

0

。 Boost.Regexは、さまざまなタイプの入力を処理するためにAPI経由で使用されるため、いくつかの追加のC++コードがあります。ベアボーンBoost.Regex APIコールでは、あなたが探しているかもしれません。 RE /フレックスを始めるためにあなたを助けることがC++でのXMLのスキャナを含んで

例が含まれています。 RE/flexは、XMLを正しくスキャンするために必要なUTF-8エンコーディングもサポートしています。

関連する問題