ast.parse
機能はほぼ正確にあなたがやりたいようだ:
ast.dump(ast.parse("""And(
AND(AND(xyz,wxy),xzy),
XOR(x1,y1, AND(xy,zz),OR(x3,y3))
)""").body[0].value)
Call(func=Name(id='And', ctx=Load()), args=[Call(func=Name(id='AND', ctx=Load()), args=[Call(func=Name(id='AND', ctx=Load()), args=[Name(id='xyz', ctx=Load()), Name(id='wxy', ctx=Load())], keywords=[], starargs=None, kwargs=None), Name(id='xzy', ctx=Load())], keywords=[], starargs=None, kwargs=None), Call(func=Name(id='XOR', ctx=Load()), args=[Name(id='x1', ctx=Load()), Name(id='y1', ctx=Load()), Call(func=Name(id='AND', ctx=Load()), args=[Name(id='xy', ctx=Load()), Name(id='zz', ctx=Load())], keywords=[], starargs=None, kwargs=None), Call(func=Name(id='OR', ctx=Load()), args=[Name(id='x3', ctx=Load()), Name(id='y3', ctx=Load())], keywords=[], starargs=None, kwargs=None)], keywords=[], starargs=None, kwargs=None)], keywords=[], starargs=None, kwargs=None)
は(.body[0].value
は、次の2つの抽象無意味な層を除去し、そして.dump
はちょうど出力のためです。
ここで、あなたが要求した変換を行うコードはありますか? n個の出力:
class Filterer(ast.NodeTransformer):
def visit_Call(self, node):
name=node.func.id
if name == "OR" and len(node.args) == 3:
return None
elif name == "XOR":
args = [ast.Name("x3",ast.Load()),
ast.Name("y3",ast.Load())]
func = ast.Name("OR",ast.Load())
node.args.append(ast.Call(func, args, [], None, None))
return self.generic_visit(node)
、ここでは、空白を除いて、あなたの形式で結果を出力するコードは次のとおりです(Pythonはこのためにそのast
モジュール内の組み込みを持っていません):
class Printer(ast.NodeVisitor):
def visit_Call(self, node):
self.visit(node.func)
print("(",end="")
comma = False
for arg in node.args:
if comma:
print(",",end="")
comma=True
self.visit(arg)
print(")",end="")
def visit_Name(self, node):
print(node.id,end="")
したがって、最終的なコードは次のようになります。
Printer().visit(Filterer().visit(ast.parse(queryString)))
おかげで、あなたは喜ばも '' 'queryString'''を取り、その後、所望の出力を出力するコードを書くことができます'' 'resultQueryString''' – Watt
@WattDoneと表示されています。 (そしてやや複雑な印刷) – ppperry