我也没有真正使用过pyparsing,但下面是一个直接的python实现,它可以满足您的需要:import re
from collections import namedtuple
TOKENIZER = re.compile(r"\w+==\w+|&&|\|\||[()]").findall
Node = namedtuple("Node", ["parent", "children"])
def syntax_tree(text, tokenizer, brackets):
root = cur_node = Node(None, [])
stack = []
for token in tokenizer(text):
if token == brackets["("]:
stack.append(token)
new_node = Node(cur_node, [])
cur_node.children.append(new_node)
cur_node = new_node
elif token == brackets[")"]:
if stack and stack.pop() == brackets[")"]:
cur_node = cur_node.parent
else:
raise Exception("Parse error: unmatched parentheses")
else:
cur_node.children.append(token)
if stack:
raise Exception("Parse error: unmatched parentheses")
return root
def listify(root):
if isinstance(root, Node):
return [listify(item) for item in root.children]
else:
return root
if __name__ == "__main__":
expr = "a==1&&(b==2||(c==3||d==4&&e==5)&&f==6)||(g==7&&h==8)"
tree = syntax_tree(expr, TOKENIZER, {"(": "(", ")": ")"})
obj = listify(tree)