<p>通常,表达式的解析器是使用递归函数实现的,因此函数将递归地调用自身或其他函数来解析子表达式、获取其结果并构建子表达式的复合表达式,而不是循环(如您或Patrick的示例中所示)。你知道吗</p>
<p>然后,您的代码不会显式地处理堆栈,而是使用常规执行堆栈来实现这一点。你知道吗</p>
<p>看看这个实现:</p>
<pre><code>class Named_List(list):
def __repr__(self):
return '%s(%s)' % (type(self).__name__, ', '.join(repr(x) for x in self))
class Parens(Named_List): pass
class Brackets(Named_List): pass
class Braces(Named_List): pass
def parse(text):
if not text:
raise Exception("empty input")
result = []
if text[0] == '(':
text = text[1:]
while text[0] != ')':
element, text = parse(text)
result.append(element)
return Parens(result), text[1:]
elif text[0] == '[':
text = text[1:]
while text[0] != ']':
element, text = parse(text)
result.append(element)
return Brackets(result), text[1:]
elif text[0] == '{':
text = text[1:]
while text[0] != '}':
element, text = parse(text)
result.append(element)
return Braces(result), text[1:]
else:
raise Exception("bad input", text)
</code></pre>
<p>此函数返回给定括号表达式及其无法分析的部分的抽象语法树(AST)。对于<code>'(((()[]{})))'</code>这样的输入,它将返回<code>Parens(Parens(Parens(Parens(), Brackets(), Braces())))</code>(以及空字符串,因为它可以解析所有内容)。对于像<code>'(((()[]{)))'</code>这样的错误输入,它将引发一个异常,抱怨不好的rest <code>')))'</code>不再可解析。你知道吗</p>