python etree.parse参数_Python解析树ParseTree

'''

构造一棵解析树

需要调用之前写过的Stack文件和BinaryTree文件

'''

from Stack import Stack

from BinaryTree import BinaryTree

import operator

# 构造解析树

def buildParseTree(fpexp):

fplist = fpexp.split()

pStack = Stack()

eTree = BinaryTree('')

pStack.push(eTree)

currentTree = eTree

for i in fplist:

if i == '(':

currentTree.insertLeft('')

pStack.push(currentTree)

currentTree = currentTree.getLeftChild()

elif i not in ['+', '-', '*', '/', ')']:

currentTree.setRootVal(int(i))

parent = pStack.pop()

currentTree = parent

elif i in ['+', '-', '*', '/']:

currentTree.setRootVal(i)

currentTree.insertRight('')

pStack.push(currentTree)

currentTree = currentTree.getRightChild()

elif i == ')':

currentTree = pStack.pop()

else:

raise ValueError

return eTree

# 递归实现两个叶结点的运算

def evaluate(parseTree):

opers = {'+':operator.add, '-':operator.sub, '*':operator.mul, '/':operator.truediv}

leftC = parseTree.getLeftChild()

rightC = parseTree.getRightChild()

if leftC and rightC:

fn = opers[parseTree.getRootVal()]

return fn(evaluate(leftC), evaluate(rightC))

else:

return parseTree.getRootVal()

# 递归实现树的后序遍历

def postorder(tree):

if tree != None:

postorder(tree.getLeftChild())

postorder(tree.getRightChild())

print(tree.getRootVal())

# 利用后序遍历实现两个叶结点的运算

def postordereval(tree):

opers = {'+': operator.add, '-': operator.sub, '*': operator.mul, '/': operator.truediv}

res1 = None

res2 = None

if tree:

res1 = postordereval(tree.getLeftChild())

res2 = postordereval(tree.getRightChild())

if res1 and res2:

return opers[tree.getRootVal()](res1, res2)

else:

return tree.getRootVal()

# 递归实现中序遍历

def inorder(tree):

if tree != None:

inorder(tree.getLeftChild())

print(tree.getRootVal())

inorder(tree.getRightChild())

# 因为中序遍历会丢失括号信息, 因此尝试构造一个函数回复解析表达式

def printexp(tree):

sVal = ''

if tree:

sVal = '(' + printexp(tree.getLeftChild())

sVal = sVal + str(tree.getRootVal())

sVal = sVal + printexp(tree.getRightChild()) + ')'

return sVal

pt = buildParseTree("( ( 10 + 5 ) * 3 )")

# pt.preorder()

# postorder(pt)

# ans = evaluate(pt)

# print(ans)

# print(postordereval(pt))

# inorder(pt)

# print(pt)

sVal = printexp(pt)

print(sVal)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值