0

私はIFステートメントを以下のように変換しようとしています

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

以下のような条件文に

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

文字列全体をスキャンし、、、およびの出現を確認するコードを作成しIFまし(,IF以下のようなステートメントが複数ある場合、私のアルゴリズムは機能しません

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

これがコードです...

        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または他の文字列置換操作を使用しています。

4

1 に答える 1

0

あなたは正しい軌道に乗っています。

私は...するだろう:

  • 各文字を小さなバッファに読み込む
  • バッファを評価して単語「IF」を探します
  • IF ステートメントにいることがわかるようにフラグを設定する
  • バッファをクリアする
  • 括弧を評価する
  • 括弧の開閉を追跡する
  • 追加のロジック (カンマ解析など) を実行する
  • 文字列の終わりまで続ける

おそらく、正規表現またはその他の文字列置換操作を使用しています..

(IF.*?(?=IF|$))複数の IF ステートメントを分割しますが、追加の解析を処理せず、入力データが厳密な構造に従う必要があります。括弧を追跡することはトリッキー/不可能であり (この回答のコメントを参照)、ステート マシンによってより簡単に処理されます。

個人的には、文字ごとの解析の制御/柔軟性が気に入っています。Code Mirrorなどのツールは、このアプローチを使用してソース コードを解析します。

文字列の一部を正常に抽出すると、正規表現が役立つことがわかる場合があります (たとえば、式A + B > Cをその部分に分解する場合など)。

于 2012-04-23T01:26:26.053 に答える