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])