1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/// 표현식을 구성하는 AST 노드들.
/// 모든 중간 값과 최종 결과는 f64로 표현되며,
/// 비교/논리의 결과는 true=1.0, false=0.0으로 반환됩니다.
#[derive(Clone, Debug, PartialEq)]
pub enum Ast {
/// 숫자 리터럴 (예: 1, 3.14)
Num(f64),
/// 변수 참조 (예: Str, BonusStr)
Var(String),
/// 단항 음수 (예: -x)
Neg(Box<Ast>),
/// 논리 부정 (예: !x)
Not(Box<Ast>),
/// 덧셈 (a + b)
Add(Box<Ast>, Box<Ast>),
/// 뺄셈 (a - b)
Sub(Box<Ast>, Box<Ast>),
/// 곱셈 (a * b)
Mul(Box<Ast>, Box<Ast>),
/// 나눗셈 (a / b)
Div(Box<Ast>, Box<Ast>),
/// 거듭제곱 (a ^ b)
Pow(Box<Ast>, Box<Ast>),
/// 동등 비교 (a == b)
Eq(Box<Ast>, Box<Ast>),
/// 비동등 비교 (a != b)
Ne(Box<Ast>, Box<Ast>),
/// 보다 작음 (a < b)
Lt(Box<Ast>, Box<Ast>),
/// 작거나 같음 (a <= b)
Le(Box<Ast>, Box<Ast>),
/// 보다 큼 (a > b)
Gt(Box<Ast>, Box<Ast>),
/// 크거나 같음 (a >= b)
Ge(Box<Ast>, Box<Ast>),
/// 논리 AND (a && b) — 0.0이 아닌 값을 true로 간주합니다.
And(Box<Ast>, Box<Ast>),
/// 논리 OR (a || b) — 0.0이 아닌 값을 true로 간주합니다.
Or(Box<Ast>, Box<Ast>),
/// 조건식 if(cond, then, else) — cond >= 1.0이면 then, cond == 0.0이면 else를 반환합니다.
If(Box<Ast>, Box<Ast>, Box<Ast>),
/// 다중 조건식 ifs(cond1, then1, cond2, then2, ..., else)
Ifs(Vec<Box<Ast>>),
/// 최대값 함수 max(a, b) — 두 인자 중 더 큰 값을 반환합니다.
Max(Box<Ast>, Box<Ast>),
/// 최소값 함수 min(a, b) — 두 인자 중 더 작은 값을 반환합니다.
Min(Box<Ast>, Box<Ast>),
/// 일반 함수 호출 name(args..). 함수명은 변수 목록에서 제외됩니다.
Call { name: String, args: Vec<Ast> },
}