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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
use crate::TokenKind;
#[derive(Debug, PartialEq)]
pub enum Expression {
String(String),
Number(f64),
Bool(bool),
Array(Vec<Expression>),
Identifier(String),
Prefix(Op, Box<Expression>),
Infix(Box<Expression>, Op, Box<Expression>),
Call(Box<Expression>, Vec<Expression>),
Assign(Box<Expression>, Box<Expression>),
SetProperty(Box<Expression>, Box<Expression>),
GetProperty(Box<Expression>, Box<Expression>),
}
impl Expression {
pub fn boxed(self) -> Box<Self> {
Box::new(self)
}
}
#[derive(Debug, PartialEq)]
pub enum Op {
Add,
Subtract,
Multiply,
Divide,
GreaterThan,
LessThan,
GreaterThanEquals,
LessThanEquals,
Equals,
NotEquals,
Assign,
}
impl From<TokenKind> for Op {
fn from(kind: TokenKind) -> Self {
match kind {
TokenKind::Plus => Op::Add,
TokenKind::Minus => Op::Subtract,
TokenKind::Asterisk => Op::Multiply,
TokenKind::Slash => Op::Divide,
TokenKind::GreaterThan => Self::GreaterThan,
TokenKind::LessThan => Self::LessThan,
TokenKind::GreaterThanEquals => Self::GreaterThanEquals,
TokenKind::LessThanEquals => Self::LessThanEquals,
TokenKind::EqualsEquals => Self::Equals,
TokenKind::NotEquals => Self::NotEquals,
TokenKind::Equals => Self::Assign,
_ => todo!()
}
}
}
impl From<&TokenKind> for Op {
fn from(kind: &TokenKind) -> Self {
match kind {
TokenKind::Plus => Op::Add,
TokenKind::Minus => Op::Subtract,
TokenKind::Asterisk => Op::Multiply,
TokenKind::Slash => Op::Divide,
TokenKind::GreaterThan => Self::GreaterThan,
TokenKind::LessThan => Self::LessThan,
TokenKind::GreaterThanEquals => Self::GreaterThanEquals,
TokenKind::LessThanEquals => Self::LessThanEquals,
TokenKind::EqualsEquals => Self::Equals,
TokenKind::NotEquals => Self::NotEquals,
TokenKind::Equals => Self::Assign,
_ => todo!()
}
}
}