python求表达式值例题,用python编写表达式求值
本文主要介绍一个全功能的python开发任意表达式求值的例子。有需要的朋友可以借鉴一下,希望能有所帮助。祝大家进步很大,早日升职加薪。
00-1010文本完整源代码
目录
在前一个的基础上,进一步实现了全函数表达式求值。
支持浮点数和字符串处理,加上一个(类似lisp语法)支持负号/负号,一符号两用机制支持所有算术运算符,包括* *、//、%支持全部7个比较运算符,AND or NOT 3个逻辑运算符,自定义数学函数(代码中预置sin函数为例),外部变量机制,外部设置函数(代码中预置isvar函数为例),列表字典。外部变量结构清晰,易于扩展,具有实用性和学习性。而不是离DSL一步之遥,DSL机制已经实现。因为函数可以任意扩展,函数的内容
完全可以自己定义。
所以分享给大家,欢迎大家的评论和建议。
正文
导入数学
opDict={}
def addoptr(ch,outLev,inLev,func,parmNum=2):
obj={name:ch, out:outLev, in:inLev, func:func, parmNum:parmNum}
opDict[ch]=obj
定义制造清单(x):
if isinstance(x[-2],list):
x[-2]。追加(x[-1])
返回x[-2]。复制()
else:
ret=[]
ret.append(x[-2])
ret.append(x[-1])
返回ret
addoptr(# ,1,1,无)
addoptr((,90,2,无)
addoptr(),2,无,无)
addoptr([,90,2,无)
addoptr(],2,2,无)
addoptr(,,8,9,makeList)
addoptr(,13,14,lambda x: x[-1]和x[-2])
addoptr(and ,13,14,lambda x: x[-1]和x[-2])
addoptr( ,11,12,lambda x: x[-1]或x[-2])
addoptr(or ,11,12,lambda x: x[-1]或x[-2])
addoptr(~ ,16,17,lambda x: not x[-1],1)
addoptr(not ,16,17,lambda x: not x[-1],1)
addoptr(=,22,23,lambda x: x[-1]==x[-2])
addoptr(,22,23,lambda x: x[-2]x[-1])
addoptr(,22,23,lambda x: x[-2]x[-1])
addoptr(=,22,23,lambda x: x[-2]=x[-1])
addoptr(=,22,23,lambda x: x[-2]=x[-1])
addoptr(!=,22,23,lambda x: x[-2]!=x[-1])
addoptr(,22,23,lambda x: x[-2]!=x[-1])
addoptr(in ,22,23,lambda x: x[-2] in x[-1])
addoptr(,31,32,lambda x: x[-2] x[-1])
addoptr(-,31,32,x : x[-2]-x[-1])
addoptr(* ,41,42,lambda x: x[-2]*x[-1])
addoptr(/,41,42,x : x[-2]/x[-1])
addoptr(//,41,42,lambda x: x[-2]//x[-1])
addoptr(% ,41,42,lambda x: x[-2]%x[-1])
a
ddoptr(neg, 51, 52, lambda x: -x[-1],1)
addoptr(**, 55, 56, lambda x: x[-2]**x[-1])
addoptr(sin, 61, 62, lambda x: math.sin(x[-1]),1)
alphabet= [chr(ord(a)+x) for x in range(26)]+[chr(ord(A)+x) for x in range(26)]
# print(opChar)
# print(opSep)
# print(alphabet)
def isfloat(str1):
try:
number = float(str1)
except ValueError:
return False
return True
class exprEngine:
def __init__(this, isVar=None, getValue=None):
this.opndStack=[]
this.optrStack=[]
this.isVar= isVar
this.getValue= getValue
# 这个状态,特为负号/减号这一特殊符的双含义号所设置
this.negState=0
# 内建函数
if isVar:
addoptr(isvar, 61, 62, lambda x: isVar(x[-1]),1)
# 处理识别
this.oplen= len(max(opDict, key=lambda x:len(x)))
this.opChar=[]
for i in range(this.oplen):
tmp=[x[0:i+1] for x in opDict if len(x)>=i+1]
this.opChar.append(tmp)
this.opSep= [x[0] for x in opDict if x[0] not in alphabet]+[ , \t]
print(this.oplen)
print(this.opChar)
print(this.opSep)
def readWord(this, cond):
cond= cond.strip()
if cond==:
return , #
if cond[0] in this.opChar[0]:
l1=this.oplen
for i in range(this.oplen):
if cond[:i+1] not in this.opChar[i]:
l1= i
break
print(l1)
if cond[:l1] in this.opChar[l1-1]:
return cond[:l1], optr
part=
for ch in cond:
if ch in this.opSep:
break
part+=ch
return part, opnd
def pushoptr(this, optr):
# 对负号/减号的特殊处理
if optr==- and this.negState==0:
# 这种情况,实际的含义是负号
optr= neg
op= opDict[optr].copy()
if len(this.optrStack)==0:
this.optrStack.append(op)
return
opTop= this.optrStack[-1]
if op[out]> opTop[in]:
this.optrStack.append(op)
elif op[out]< opTop[in]:
this.popoptr()
# 这里递归
this.pushoptr(optr)
elif op[out]== opTop[in]:
# 消括号对,简单弹出
this.optrStack.pop()
this.negState=0
def popoptr(this):
opTop= this.optrStack[-1]
a= opTop[parmNum]
if len(this.opndStack)<a:
raise Exception(操作数不足,可能有语法错误!)
ret= opTop[func](this.opndStack[-a:])
this.opndStack= this.opndStack[:-a]
this.opndStack.append(ret)
this.optrStack.pop()
def pushopnd(this, opnd):
if opnd[0]==":
# 肯定是字符串
this.opndStack.append(opnd[1:])
elif this.isVar and this.isVar(opnd):
this.opndStack.append(this.getValue(opnd))
else:
if opnd.isdigit():
this.opndStack.append(int(opnd))
elif isfloat(opnd):
this.opndStack.append(float(opnd))
else:
this.opndStack.append(opnd)
this.negState=1
def popopnd(this):
if len(this.opndStack)==1:
return this.opndStack[0]
else:
print(this.opndStack)
print(this.optrStack)
raise Exception(可能存在语法错误。)
def eval(this, cond):
this.optrStack=[]
this.opndStack=[]
this.pushoptr(#)
while True:
aword,kind= this.readWord(cond)
print(aword, cond)
cond= cond[len(aword):].strip()
if kind==#:
this.pushoptr(#)
break
elif kind==optr:
this.pushoptr(aword)
else:
if aword==:
raise Exception(操作数为空,肯定有哪里错了。)
this.pushopnd(aword)
print(this.optrStack)
print(this.opndStack)
return this.popopnd()
if __name__==__main__:
# print(opDict)
a= exprEngine()
# a.addInfo(水位, 低)
# b= a.eval(3 + 5 *2 = 13 and (3+5)*2=16 & 7-2 in [3,5,7] & 12>=15 or a in [a, b,c])
# b= a.eval(sin(-1)<1 and 3+-5=-2)
# print(b)
# b= a.eval(7*-3)
b= a.eval(3**3=27 and 19%5=4 and 21//6=3)
print(b)
以上就是python开发任意表达式求值全功能示例的详细内容,更多关于python表达式求值的资料请关注盛行IT软件开发工作室其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。