0

私は現在、ユーザーがいくつかのロジックを定義できるようにするGUIを設計しています。複雑になりすぎないようにするため、1セットの角かっこに制限しています。したがって、開始ブラケットと終了ブラケットの間に他の開始ブラケットがないことを確認するという考え方です。

例えば。IF ( a + b OR **(** b+ c)エラーで警告します。

だから私は次のルートで決めました:

  • 最初の開いたブラケットを見つける
  • 最初の閉じ括弧を見つける
  • これらのインデックスを使用して、中かっこを検索して見つけます
  • 開いた角かっこが見つかった場合は、エラーが表示されます
  • 他のロジックのループを続行します

これがコードです。私はそれがかなり恐ろしいと思います、そして私はこれをするためのより良い方法があるに違いないと確信しています。ある種のIndexOfかもしれません。

<select rel="OpenBracket" id="open1">
    <option value=""></option>
    <option value="(">(</option>
</select>
Some True/Fale here
<select rel="CloseBracket" id="close1">
    <option value=""></option>
    <option value=")">)</option>
</select>
AND
<br />
<select rel="OpenBracket" id="open2">
    <option value=""></option>
    <option value="(">(</option>
</select>
Some True/Fale here
<select rel="CloseBracket" id="close2">
    <option value=""></option>
    <option value=")">)</option>
</select>
<button onclick="javascript:TestingRules();">Check</button>

function GetOpenBrackets() {
    var openBracketArray = [];
    jQuery('[rel="OpenBracket"]').each(function() {
        if (jQuery(this).val() == "(") {
            openBracketArray.push(jQuery(this).attr('id'));
        } else {
            openBracketArray.push(jQuery(this).val());
        }

    });
    return openBracketArray;
}

function GetCloseBrackets() {
    var closeBracketArray = [];
    jQuery('[rel="CloseBracket"]').each(function() {
        if (jQuery(this).val() == "(") {
            closeBracketArray.push(jQuery(this).attr('id'));
        } else {
            closeBracketArray.push(jQuery(this).val());
        }
    });
    return closeBracketArray;
}
function TestingRules() {
    var openBrackets = GetOpenBrackets();
    var closeBrackets = GetCloseBrackets();
    var closeBracketIndex;
    var openBracketIndex;
    for (openBracketIndex in openBrackets) {
        if (openBrackets[openBracketIndex] !== "") {

            var foundCloseBracketIndex = -1;
            for (closeBracketIndex in closeBrackets) {
                if (openBracketIndex <= closeBracketIndex) {
                    if (closeBrackets[closeBracketIndex] !== "") {
                        foundCloseBracketIndex = closeBracketIndex;
                        break;
                    }
                }
            }
            if (foundCloseBracketIndex > -1) {
            var openBracketCheck;
                for (openBracketCheck in openBrackets) {

                    if (openBracketIndex < openBracketCheck && closeBracketIndex >= openBracketCheck) {
                        if (openBrackets[openBracketCheck] !== "") {
                            alert('error');
                        }
                    }

                }
            }
        }

    }

    // for testing:
    //  console.log(OpenBracketArray.length);
}
4

3 に答える 3

1

カウンターを保持したり、パレンスタックの深さを数えたりしないのはなぜですか?オープンパレンの場合はinc、クローズの場合はdecで、カウンターが1を超えると、エラーが発生します。(私があなたの要件を正しく理解していれば。)

于 2012-08-15T16:26:47.067 に答える
1

簡単に実装してみてください

概念的stack(top=0)および

push(top=top+1)あなたが見るときはいつ(でも

[(オプション)top> Xの場合、Xは許可される深さであり、無効な式の長さをエラーにします]

pop(top=top-1)あなたが見るときはいつでも)

式が完成し、まだ何かが残っている場合はstack(top>0)、式のバランスが取れていないことを推測できます。

于 2012-08-15T16:27:27.530 に答える
0

角かっこのペアを検索する代わりに、2つの開いている角かっこを続けて検索してみませんか?最初の開いたブラケットを見つけると、次の2つのいずれかが可能です。次のコンテンツが閉じたブラケットで囲まれている(ユーザーがネストしなかった)か、別の開いたブラケットを見つけます。別の開き角かっこが見つかった場合、ユーザーはステートメントをネストしようとしています。これにより、戻って同じスペースを再度検索する必要がなくなります。

于 2012-08-15T16:27:43.287 に答える