数式をpeggedで構文木生成
文法:
Arithmetic:
Term < Factor (Add / Sub)*
Add < "+" Factor
Sub < "-" Factor
Factor < Primary (Mul / Div)*
Mul < "*" Primary
Div < "/" Primary
Primary < Parens / Neg / Pos / Number / Variable
Parens < "(" Term ")"
Neg < "-" Primary
Pos < "+" Primary
Number < ~([0-9]+)
Variable <- identifier
数式
1 + 2 - (3*x-5)*6
生成結果:
Arithmetic("1 + 2 - (3*x-5)*6").writeln;
=>
Arithmetic [0, 17]["1", "+", "2", "-", "(", "3", "*", "x", "-", "5", ")", "*", "6"]
+-Arithmetic.Term [0, 17]["1", "+", "2", "-", "(", "3", "*", "x", "-", "5", ")", "*", "6"]
+-Arithmetic.Factor [0, 2]["1"]
| +-Arithmetic.Primary [0, 2]["1"]
| +-Arithmetic.Number [0, 2]["1"]
+-Arithmetic.Add [2, 6]["+", "2"]
| +-Arithmetic.Factor [4, 6]["2"]
| +-Arithmetic.Primary [4, 6]["2"]
| +-Arithmetic.Number [4, 6]["2"]
+-Arithmetic.Sub [6, 17]["-", "(", "3", "*", "x", "-", "5", ")", "*", "6"]
+-Arithmetic.Factor [8, 17]["(", "3", "*", "x", "-", "5", ")", "*", "6"]
+-Arithmetic.Primary [8, 15]["(", "3", "*", "x", "-", "5", ")"]
| +-Arithmetic.Parens [8, 15]["(", "3", "*", "x", "-", "5", ")"]
| +-Arithmetic.Term [9, 14]["3", "*", "x", "-", "5"]
| +-Arithmetic.Factor [9, 12]["3", "*", "x"]
| | +-Arithmetic.Primary [9, 10]["3"]
| | | +-Arithmetic.Number [9, 10]["3"]
| | +-Arithmetic.Mul [10, 12]["*", "x"]
| | +-Arithmetic.Primary [11, 12]["x"]
| | +-Arithmetic.Variable [11, 12]["x"]
| +-Arithmetic.Sub [12, 14]["-", "5"]
| +-Arithmetic.Factor [13, 14]["5"]
| +-Arithmetic.Primary [13, 14]["5"]
| +-Arithmetic.Number [13, 14]["5"]
+-Arithmetic.Mul [15, 17]["*", "6"]
+-Arithmetic.Primary [16, 17]["6"]
+-Arithmetic.Number [16, 17]["6"]
pegged調査
2020年8月26日
8:00 起床
8:30 朝食 ヨーロピアンシュガーコーン 130kcal
9:00 業務開始
12:00 昼食 スパゲッティ 650kcal
15:00 睡眠 1.5時間
19:00 夕食 焼肉定食(ごはん: 200kcal, カルビ: 400kcal, ホルモン: 300kcal) 900kcal
19:30 散歩 60分
20:00 間食 ポテサラ:250kcal ヨーロピアンシュガーコーン:130kcal
総カロリー
130+650+900+250+130 = 2060 kcal