文字列があると仮定しましょうONE|(TWO|(THREE|FOUR))
...
std:: regexが再帰をサポートしていないことを知っているので、この文字列を文字列のstd :: vectorに分解するにはどうすればよいですか?
THREE|FOUR
TWO|{0}
ONE|{1}
前述の方法でこれを変換する目的は、トラバース可能な式リストを作成することです。このリストは、ネストされたif/thenステートメントを意味的に表す必要があります。これはどのように達成できますか?
正規表現ライブラリを使用して字句解析を行うことは、重要なことを行うための恐ろしい方法です。一致した場合、後処理なしでは何が一致したかを知ることはできません。サードパーティのライブラリを使用したくない場合は、初心者向けに独自のレクサージェネレータを作成するかどうかを真剣に自問する必要があります。あなたがそれをしたいのであれば、私はあなたにヒントを与えてうれしいです。
信頼できる字句解析が機能するようになると、次の部分がはるかに簡単になります。次に、アドホックパーサーを作成するか、独自のパーサージェネレーターを作成します。
最も内側のコンテンツが最初に必要なので、怠惰な/貪欲でない正規表現の動作を利用して、)
とまですべてを一致させる(.*?)\)
か、丸括弧以外のすべてをと一致させることができます\([^\)\(]+
。
擬似コード:
while ( regex_match(string, regex) ) {
add matches to vector
replace matches in string with vector index in curly brackets
}
正規表現の例:((?:\(|^)[^\)\(]+(?:\)|$))
ここでの正規表現デモ:http ://regex101.com/r/pJ4pO7