2012-04-23 11 views
0

私は文字列全体をスキャンコードを書いている条件文への文

SET RESULT = C>(X-2)?(A+B):C 

次のように条件文に

SET RESULT = IF(C>(X-2), (A+B), C) //IF C< X-2 return A+B otherwise return C 

以下のようにIF声明を変換しようとしていた場合に変換し、出現の外観はIF,(および,である。私のアルゴリズムが動作していないここでは、このような

SET RESULT = IF(C>(X-2), IF(P>C,2,3),C) 

以下のようにする場合がある以上1つのIF文はコードでは、私は、これは複雑なシナリオのために働くかどうかわからない...

 string data = "SET RESULT=IF(C>(X-2), (A+B), C)"; 
     string output = string.Empty; 

     int indexofIF = data.IndexOf("IF"); 
     int obCount = 0; 
     int cbCount = 0; 
     if (indexofIF > -1) 
     { 
      string script = data.Substring(indexOfIF, (data.Length-indexOfIF-1)) 
      for(int index=0; index<script.Length; index++) 
      { 
       int obIndex = data.IndexOf('(', index); 
       if(obIndex>-1) 
        obCount++; 
       int cbIndex = data.IndexOf(')', index); 
       if(cbIndex>-1) 
        cbCount++; 

       if(obCount==cbCount)//Found the end of If statement 
       { 
        string tempData = data.Substring(0, index); 
        int count = tempData.Count(f => f == ',');//Get the number of occurences of ',' 
        if (count == 2)//There are only 2 commas 
        { 
         int firstIndex = tempData.IndexOf(','); 
         int lastIndex = tempData.LastIndexOf(','); 
         string condtion = tempData.Substring(3, (firstIndex - 4)); 
         string trueCond = tempData.Substring(firstIndex + 1, (lastIndex - firstIndex - 1)); 
         string falseCond = tempData.Substring(lastIndex + 1, (index - lastIndex - 1)); 
         output = condtion + "?" + trueCond + ":" + falseCond; 

        } 
        else //More than 2 commas 
        { 

        } 
       } 

      } 

     } 

です。これを行うには他の方法がありますか?おそらくregexまたはその他の文字列置換操作を使用している可能性があります。

答えて

0

あなたは正しい方向にあります。

私はなります

  • 小さなバッファ
  • に各文字を読んで、あなたがIF文
  • である知っているので
  • 「IF」はフラグを設定する単語を探すために、バッファを評価します
  • 明らか
  • は括弧のための開口部の
  • キープトラック/カッコ
  • の閉鎖を評価するバッファ
  • アウト

    (IF.*?(?=IF|$))改..おそらく正規表現または他の任意の文字列置換操作を使用して

文字列の最後まで続ける(例えばコンマ解析など)の任意の追加のロジックを実行します複数のIF文を使用できますが、追加の解析を処理しないため、入力データが厳密な構造に従う必要があります。かっこを追跡するのは難しい/不可能です(この回答のコメントを参照)。また、ステートマシンによってより簡単に処理されます。

個人的には、私はキャラクターごとの解析のコントロール/柔軟性が好きです。 Code Mirrorのようなツールは、このアプローチをソースコードの解析に使用します。

正規表現は、文字列の一部を正常に抽出すると便利です(たとえば、A + B > Cのような式を解体するなど)。

+0

任意のネストされた括弧の一致は通常の言語ではないため、問題の領域を制限しない限り、純粋な正規表現の解決策は見つかりません。 –

+0

@RaymondChen - 私が正規表現の仕事をする唯一の方法は、固定データの括弧に入力データを制約することでした。これは実行可能な解決策ではありません。 –

+0

FWIW、Perl5のいわゆる「正規表現」と、それから借りてきた多くの言語のものは、再帰補間を使用して、任意にネストされたデリミタのペアと実際にマッチすることができます。私は実際にそれを行うことをお勧めしません。私はC#は、とにかくできるとは思わない。 –