<p>我想如果你想写一个<a href="https://en.wikipedia.org/wiki/Context-free_grammar#Well-formed_parentheses" rel="nofollow noreferrer">classical bracket parser</a>,逻辑中的一个错误是调用堆栈上的<code>remove</code>,而不是比较<code>pop</code>。你知道吗</p>
<p>要确定它什么时候按预期工作,什么时候不按预期工作并不容易,所以一些测试用例和它们的预期行为有很大的帮助,比如说,对于<code>'(asd(gdgd)[dfdf])'</code>、<code>'[(asd(gdgd)[dfdf])'</code>和<code>'(asd(gdg{d)[df}df])'</code>,您希望得到什么作为输出?你知道吗</p>
<p>以这段代码为例:</p>
<pre class="lang-py prettyprint-override"><code>BRACKET_MATCHES = {')': '(', ']': '[', '}': '{'}
def bracket_check(text):
stack = []
for n, char in enumerate(text):
if char in '([{':
stack.append((char, n))
if char in ')]}':
match = stack.pop()
if match[0] != BRACKET_MATCHES[char]:
print(f"Can't match bracket '{char}' at {n}, "
f"conflicting with '{match[0]}' at {match[1]}.")
return False
if len(stack) != 0:
print(f"Open brackets remaining at positions: "
f"{' '.join(map(str, stack))}")
return False
return True
</code></pre>
<p>根据之前的样本,我们得到:</p>
<pre class="lang-py prettyprint-override"><code>>>> bracket_check('(asd(gdgd)[dfdf])')
True
>>> bracket_check('(asd(gdg{d)[df}df])')
"Can't match bracket ')' at 10, conflicting with '{' at 8."
False
>>> bracket_check('[(asd(gdgd)[dfdf])')
"Open brackets remaining at positions: ('[', 0)"
False
</code></pre>
<p>这个解决方案停留在第一个不匹配的括号上,主要是因为这个问题比以人类的方式找到所有不匹配的括号要容易得多。后者在规则大小的文本中计算起来相当复杂,仍然不能确定是否能给出所需的结果。你知道吗</p>
<p>除非这是绝对不可行的,否则在我看来,通过修复括号错误来迭代工作是更可取的。你知道吗</p>