1

文字列があると仮定しましょうONE|(TWO|(THREE|FOUR))...
std:: regexが再帰をサポートしていないことを知っているので、この文字列を文字列のstd :: vectorに分解するにはどうすればよいですか?

  • THREE|FOUR
  • TWO|{0}
  • ONE|{1}

前述の方法でこれを変換する目的は、トラバース可能な式リストを作成することです。このリストは、ネストされたif/thenステートメントを意味的に表す必要があります。これはどのように達成できますか?

4

2 に答える 2

2

正規表現ライブラリを使用して字句解析を行うことは、重要なことを行うための恐ろしい方法です。一致した場合、後処理なしではが一致したかを知ることはできません。サードパーティのライブラリを使用したくない場合は、初心者向けに独自のレクサージェネレータを作成するかどうかを真剣に自問する必要があります。あなたがそれをしたいのであれば、私はあなたにヒントを与えてうれしいです。

信頼できる字句解析が機能するようになると、次の部分がはるかに簡単になります。次に、アドホックパーサーを作成するか、独自のパーサージェネレーターを作成します。

于 2013-03-17T13:42:05.647 に答える
1

最も内側のコンテンツが最初に必要なので、怠惰な/貪欲でない正規表現の動作を利用して、)とまですべてを一致させる(.*?)\)か、丸括弧以外のすべてをと一致させることができます\([^\)\(]+

擬似コード:

while ( regex_match(string, regex) ) {
    add matches to vector
    replace matches in string with vector index in curly brackets
}

正規表現の例:((?:\(|^)[^\)\(]+(?:\)|$))
ここでの正規表現デモ:http ://regex101.com/r/pJ4pO7

于 2013-03-17T01:52:14.267 に答える