Skip to main content

online_dsl_forge/parser/
ast.rs

1use serde::{Deserialize, Serialize};
2
3use super::span::SourceSpan;
4
5#[derive(Debug, Clone, Deserialize, PartialEq, Serialize)]
6pub struct AstExpression {
7  pub kind: ExprKind,
8  pub span: SourceSpan,
9}
10
11impl AstExpression {
12  pub fn new(kind: ExprKind, span: SourceSpan) -> Self {
13    Self { kind, span }
14  }
15}
16
17#[derive(Debug, Clone, Deserialize, PartialEq, Serialize)]
18#[serde(tag = "kind", rename_all = "snake_case")]
19pub enum ExprKind {
20  Null,
21  Bool {
22    value: bool,
23  },
24  Int {
25    value: i64,
26  },
27  Float {
28    value: f64,
29  },
30  String {
31    value: String,
32  },
33  Array {
34    items: Vec<AstExpression>,
35  },
36  Identifier {
37    name: String,
38  },
39  Member {
40    receiver: Box<AstExpression>,
41    name: String,
42  },
43  FunctionCall {
44    name: String,
45    args: Vec<AstExpression>,
46  },
47  MethodCall {
48    receiver: Box<AstExpression>,
49    name: String,
50    args: Vec<AstExpression>,
51  },
52  Unary {
53    op: UnaryOp,
54    expr: Box<AstExpression>,
55  },
56  Binary {
57    left: Box<AstExpression>,
58    op: BinaryOp,
59    right: Box<AstExpression>,
60  },
61}
62
63#[derive(Debug, Clone, Copy, Deserialize, Eq, Hash, PartialEq, Serialize)]
64#[serde(rename_all = "snake_case")]
65pub enum UnaryOp {
66  Not,
67  Neg,
68}
69
70#[derive(Debug, Clone, Copy, Deserialize, Eq, Hash, PartialEq, Serialize)]
71#[serde(rename_all = "snake_case")]
72pub enum BinaryOp {
73  Or,
74  And,
75  Eq,
76  Ne,
77  Lt,
78  Le,
79  Gt,
80  Ge,
81  Add,
82  Sub,
83  Mul,
84  Div,
85  Rem,
86}
87
88impl BinaryOp {
89  pub fn as_str(self) -> &'static str {
90    match self {
91      Self::Or => "||",
92      Self::And => "&&",
93      Self::Eq => "==",
94      Self::Ne => "!=",
95      Self::Lt => "<",
96      Self::Le => "<=",
97      Self::Gt => ">",
98      Self::Ge => ">=",
99      Self::Add => "+",
100      Self::Sub => "-",
101      Self::Mul => "*",
102      Self::Div => "/",
103      Self::Rem => "%",
104    }
105  }
106}
107
108impl UnaryOp {
109  pub fn as_str(self) -> &'static str {
110    match self {
111      Self::Not => "!",
112      Self::Neg => "-",
113    }
114  }
115}