構文解析!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という文字列を入れると終わります。

〜終わり〜

広告を非表示にする