1use crate::token::Token;
2use crate::literal::Literal;
3
4#[derive(Debug, PartialEq, Eq, Clone)]
6pub struct LogicalData {
7 pub left: Box<Expr>,
8 pub operator: Token,
9 pub right: Box<Expr>,
10}
11
12#[derive(Debug, PartialEq, Eq, Clone)]
14pub struct UnaryData {
15 pub operator: Token,
16 pub expr: Box<Expr>,
17}
18
19#[derive(Debug, PartialEq, Eq, Clone)]
21pub struct BinaryData {
22 pub left: Box<Expr>,
23 pub operator: Token,
24 pub right: Box<Expr>,
25}
26
27#[derive(Debug, PartialEq, Eq, Clone)]
29pub struct GroupingData {
30 pub expr: Box<Expr>,
31}
32
33#[derive(Debug, PartialEq, Eq, Clone)]
35pub struct VariableData {
36 pub name: Token,
37}
38
39#[derive(Debug, PartialEq, Eq, Clone)]
41pub struct AssignData {
42 pub name: Token,
43 pub value: Box<Expr>,
44}
45
46#[derive(Debug, PartialEq, Eq, Clone)]
48pub struct CallData {
49 pub callee: Box<Expr>,
50 pub paren: Token,
51 pub arguments: Vec<Expr>,
52}
53
54#[derive(Debug, PartialEq, Eq, Clone)]
56pub struct GetData {
57 pub object: Box<Expr>,
58 pub name: Token,
59}
60
61#[derive(Debug, PartialEq, Eq, Clone)]
63pub struct SetData {
64 pub object: Box<Expr>,
65 pub name: Token,
66 pub value: Box<Expr>,
67}
68
69#[derive(Debug, PartialEq, Eq, Clone)]
71pub struct ThisData {
72 pub keyword: Token,
73}
74
75#[derive(Debug, PartialEq, Eq, Clone)]
77pub struct SuperData {
78 pub keyword: Token,
79 pub method: Token,
80}
81
82#[derive(Debug, PartialEq, Eq, Clone)]
84pub enum Expr {
85 Literal(Literal),
91
92 Logical(LogicalData),
96
97 Unary(UnaryData),
101
102 Binary(BinaryData),
108
109 Grouping(GroupingData),
114
115 Variable(VariableData),
118
119 Assign(AssignData),
124
125 Call(CallData),
130
131 Get(GetData),
135
136 Set(SetData),
140
141 This(ThisData),
145
146 Super(SuperData),
150}
151
152impl Expr {
153 pub fn accept<T>(&self, visitor: &mut impl ExprVisitor<T>) -> T {
156 use Expr::*;
157
158 match self {
159 Literal(_) => visitor.visit_literal_expr(self),
160 Logical(_) => visitor.visit_logical_expr(self),
161 Unary(_) => visitor.visit_unary_expr(self),
162 Binary(_) => visitor.visit_binary_expr(self),
163 Grouping(_) => visitor.visit_grouping_expr(self),
164 Variable(_) => visitor.visit_variable_expr(self),
165 Assign(_) => visitor.visit_assign_expr(self),
166 Call(_) => visitor.visit_call_expr(self),
167 Get(_) => visitor.visit_get_expr(self),
168 Set(_) => visitor.visit_set_expr(self),
169 This(_) => visitor.visit_this_expr(self),
170 Super(_) => visitor.visit_super_expr(self),
171 }
172 }
173}
174
175pub trait ExprVisitor<T> {
177 fn visit_literal_expr(&mut self, expr: &Expr) -> T;
178 fn visit_logical_expr(&mut self, expr: &Expr) -> T;
179 fn visit_unary_expr(&mut self, expr: &Expr) -> T;
180 fn visit_binary_expr(&mut self, expr: &Expr) -> T;
181 fn visit_grouping_expr(&mut self, expr: &Expr) -> T;
182 fn visit_variable_expr(&mut self, expr: &Expr) -> T;
183 fn visit_assign_expr(&mut self, expr: &Expr) -> T;
184 fn visit_call_expr(&mut self, expr: &Expr) -> T;
185 fn visit_get_expr(&mut self, expr: &Expr) -> T;
186 fn visit_set_expr(&mut self, expr: &Expr) -> T;
187 fn visit_this_expr(&mut self, expr: &Expr) -> T;
188 fn visit_super_expr(&mut self, expr: &Expr) -> T;
189}