Python:解析算数表达式

  给之前做的lisp解释器加了个解析算数表达式的模块。

首先,解析语句

  (parse(1+2-(1+2)))

将括号解析为列表,解析出的语句[1+2-,[1+2]]

然后在所有的“+-*/”左右加上空格,然后分割。

  [1,+,2,-,[1,+,2]]

根据优先级,先算乘除,再算加减,从前到后。

分析时应该从后向前,先加减后乘除分析。

例如:1+2*3

   

 1 def numParse(line):
 2     res = []
 3     for char in line:
 4         if not isinstance(char, list):
 5             for i in char.replace('+', ' + ').replace('-', ' - ').replace('/', ' / ').replace('*', ' * ').split():
 6                 res.append(i)
 7         else:
 8             res.append(numParse(char))
 9     return res
10 
11 def getRes(chars):#parse from the low priority to high
12 
13     for i in range(len(chars)-1,-1,-1):
14         if chars[i]=="+":
15             return getRes(chars[0:i])+getRes(chars[i+1:len(chars)])
16         if chars[i]=="-":
17             return getRes(chars[0:i])-getRes(chars[i+1:len(chars)])
18 
19     for i in range(len(chars) - 1, -1, -1):
20         if chars[i]=="*":
21             return getRes(chars[0:i])*getRes(chars[i+1:len(chars)])
22         if chars[i]=="/":
23             return getRes(chars[0:i])+getRes(chars[i+1:len(chars)])
24 
25     for i in range(len(chars) - 1, -1, -1):
26         if isinstance(chars[i],list):
27             return getRes(chars[i])
28         if isinstance(int(chars[i]),Number):
29             return int(chars[i])

 

posted @ 2017-05-04 21:40  爱吃土豆的男孩  阅读(2039)  评论(0编辑  收藏  举报