python求表达式值例题,用python编写表达式求值

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: