構文解析!part2.1
さきほどの構文解析ではあるミスが有りました。
2**3/2**3
が1にならないということです。
2**3/2**3 -> 8/2**3 -> 4**3 -> 64という感じです。
だから、書き直しました。はい。
def number(begin): global i val = 0 if begin[i] == "(": i+=1 val = expression(begin) i+=1 while begin[i].isdigit(): val *= 10 val += int(begin[i]) i+=1 return val def time(begin): global i val = number(begin) while True: if begin[i] is "*": if begin[i+1] is "*": i += 2 val **= number(begin) else: return val else: break return val def term(begin): global i val = time(begin) #number(begin) while True: if begin[i] is "*": i += 1 val *= time(begin) elif begin[i] is "/": i += 1 val2 = time(begin) if val < 0 or val2 < 0: val = func1(str(abs2(val,val2))) else: val /= 1.0*val2 val = func1(str(val)) else: break return val def expression(begin): global i val = term(begin) while True: if begin[i] is "+": i += 1 val += expression(begin) elif begin[i] is "-": i += 1 val -= expression(begin) else: break return val #-3/2 == -2 abs2 = lambda x,y: int(x*1.0/y) func1 = lambda x: float(x[0:x.index('.')+3]) def main(): while True: try: ex = raw_input(">>")+"=" if ex in "exit=quit=": print "End..." ; exit(0) global i i = 0 print expression(ex) except EOFError: break if __name__ == '__main__': main()
あと+α機能として quitかexitという文字列を入れると終わります。
〜終わり〜