0

我目前正在设计一个允许用户定义一些逻辑的 GUI。我不希望它变得太复杂,所以我将它限制在一组括号内。因此,我们的想法是检查在左括号和右括号之间是否没有任何其他左括号。

例如。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

为什么不只保留一个计数器,或者计算paren堆栈深度?如果您 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

与其尝试查找一对括号,为什么不直接搜索连续的两个开括号呢?当您找到第一个左括号时,可能会出现以下两种情况之一:或者后面的内容用右括号括起来(因此用户没有嵌套它们),或者您找到另一个左括号。如果您发现另一个开括号,则用户正在尝试嵌套语句。这使您不必返回并再次搜索相同的空间。

于 2012-08-15T16:27:43.287 回答