デジタル忍者ブログ

デジタル忍者ブログ

2019/05/12

pythonでパーサを作る(#2:n桁同士の数式)


前回は、1桁同士の数式のパーサを作りましたが、


今回は2桁以上の数値にも対応させます。


やっぱり1桁だけだとつまらないですね。




さて2桁以上の数値にも対応させるには、


入力された数式の字句解析で、


数字の次の文字が数字である


パターンに対応しないといけません。




<数式>:=<数値><記号><数値>



<数値>:=[<数字><数値>|<数字>]



<数字>:=[0|1|2|3|4|5|6|7|8|9]



<記号>:=[+|-|*|/]




<数値>は<数字><数値>のパターンと、<数字>のパターンがあります。


<数字><数値>のパターンが存在しますので、


<数値>:=<数字><数字><数字><数字><数字>・・・


と回帰するように2桁以上の数値になると示すことができます。




2桁以上の数字をint型の数値に変換するタイミングとして、


字句解析で記号が検出されたタイミングと、


数式の末尾まで字句解析が完了したタイミング


となります。



parser2.py

units = []
symbol = ''

def calc():
  if symbol == '+':
    return units[0] + units[1]
  if symbol == '-':
    return units[0] - units[1]
  if symbol == '*':
    return units[0] * units[1]
  if symbol == '/':
    return units[0] / units[1]
  return 'E'

def solve():
  global symbol
  global units
  expression = input()
  num = ''
  for c in expression:
    if c.isdigit():
      num = num + c
    else:
      units.append(int(num))
      num = ''
      symbol = c
  units.append(int(num))
  print(calc())


if __name__ == '__main__':
  solve()

実行結果は次のようになります。

$ python parser2.py
123+456
579
$ python parser2.py
121/11
11.0
$ python parser2.py
12345*1234567
15240729615



pythonなのでint型の上限制限がないというのも一つのメリットですね。


C言語やJavaであれば、2^31(2の31乗 = 2147483648) がint型の上限となっていますが、


3つ目の実行結果では明らかに算出結果が2^31を超えています。



Comment Form

コメント内容(必須)

Comment

2022年12月24日11:56  drealse@baileymail.xyz

管理者がコメントの内容を確認中・・・