前回は、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
2022年12月24日11:56 drealse@baileymail.xyz
管理者がコメントの内容を確認中・・・