<p>以下代码</p>
<pre><code>import re
OPERATORS_DIC = {'and': 2, 'or': 2, 'iff': 2, 'imp': 2, 'neg': 1}
EXPRESSIONS = [ 'neg(or(p,q))'
, 'imp(p,q)'
, 'imp(neg(r),neg(q))'
, 'and(and(p,q),r)' ]
def digest(expression):
"""expression is an expression that should be recursively digested
"""
for op in OPERATORS_DIC:
match = re.search( op + '\((.*)\)', expression )
if not match:
continue
inside = match.groups()[0]
# examples: inside is 'p,q' or 'p,neg(q)', or 'p,neg(and(q,r))'
if OPERATORS_DIC[op] == 1:
return (op, digest(inside))
# else we try to get the two arguments by counting parentheses
for k in range(len(inside)):
if inside[k] != ',':
continue
before, after = inside[:k], inside[k+1:]
if ( before.count('(') == before.count(')') and
after .count('(') == after .count(')') ):
return (op, digest(before), digest(after))
return expression
for expr in EXPRESSIONS:
print('{} -> {}'.format(expr, digest(expr)))
</code></pre>
<p>提供:</p>
<pre><code>neg(or(p,q)) -> ('neg', ('or', 'p', 'q'))
imp(p,q) -> ('imp', 'p', 'q')
imp(neg(r),neg(q)) -> ('imp', ('neg', 'r'), ('neg', 'q'))
and(and(p,q),r) -> ('and', ('and', 'p', 'q'), 'r')
</code></pre>
<p>因此<code>EXPRESSIONS</code>的输入所需的输出是</p>
<pre><code>[ digest(expr) for expr in EXPRESSIONS ]
</code></pre>