oak_r/parser/element_type.rs
1use oak_core::{ElementType, Parser, UniversalElementRole};
2
3/// Element types for the R language parser.
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
5#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6#[repr(u8)]
7pub enum RElementType {
8 /// Whitespace.
9 Whitespace,
10 /// Newline.
11 Newline,
12
13 /// Comment.
14 Comment,
15
16 /// String literal.
17 StringLiteral,
18 /// Integer literal.
19 IntegerLiteral,
20 /// Float literal.
21 FloatLiteral,
22 /// Boolean literal.
23 BooleanLiteral,
24 /// Null literal.
25 NullLiteral,
26 /// Infinity.
27 Inf,
28 /// Not a Number.
29 NaN,
30 /// Not Available.
31 NA,
32 /// Not Available (Integer).
33 NaInteger,
34 /// Not Available (Real).
35 NaReal,
36 /// Not Available (Complex).
37 NaComplex,
38 /// Not Available (Character).
39 NaCharacter,
40
41 /// Identifier.
42 Identifier,
43
44 /// `if` keyword.
45 If,
46 /// `else` keyword.
47 Else,
48 /// `for` keyword.
49 For,
50 /// `in` keyword.
51 In,
52 /// `while` keyword.
53 While,
54 /// `repeat` keyword.
55 Repeat,
56 /// `next` keyword.
57 Next,
58 /// `break` keyword.
59 Break,
60 /// `function` keyword.
61 Function,
62 /// `return` keyword.
63 Return,
64 /// `TRUE` keyword.
65 True,
66 /// `FALSE` keyword.
67 False,
68 /// `NULL` keyword.
69 Null,
70
71 /// `+` operator.
72 Plus,
73 /// `-` operator.
74 Minus,
75 /// `*` operator.
76 Star,
77 /// `/` operator.
78 Slash,
79 /// `%` operator.
80 Percent,
81 /// `^` operator.
82 Caret,
83 /// `=` operator.
84 Equal,
85 /// `==` operator.
86 EqualEqual,
87 /// `!=` operator.
88 NotEqual,
89 /// `<` operator.
90 Less,
91 /// `>` operator.
92 Greater,
93 /// `<=` operator.
94 LessEqual,
95 /// `>=` operator.
96 GreaterEqual,
97 /// `&` operator.
98 And,
99 /// `|` operator.
100 Or,
101 /// `!` operator.
102 Not,
103 /// `&&` operator.
104 AndAnd,
105 /// `||` operator.
106 OrOr,
107 /// `~` operator.
108 Tilde,
109 /// `<-` operator.
110 LeftArrow,
111 /// `->` operator.
112 RightArrow,
113 /// `<<-` operator.
114 DoubleLeftArrow,
115 /// `->>` operator.
116 DoubleRightArrow,
117 /// `|>` operator.
118 Pipe,
119 /// Custom operator.
120 Operator,
121
122 /// `(` symbol.
123 LeftParen,
124 /// `)` symbol.
125 RightParen,
126 /// `[` symbol.
127 LeftBracket,
128 /// `]` symbol.
129 RightBracket,
130 /// `{` symbol.
131 LeftBrace,
132 /// `}` symbol.
133 RightBrace,
134 /// `,` symbol.
135 Comma,
136 /// `;` symbol.
137 Semicolon,
138 /// `:` symbol.
139 Colon,
140 /// `::` symbol.
141 DoubleColon,
142 /// `:::` symbol.
143 TripleColon,
144 /// `.` symbol.
145 Dot,
146 /// `$` symbol.
147 Dollar,
148 /// `@` symbol.
149 At,
150 /// `?` symbol.
151 Question,
152
153 /// Root node.
154 Root,
155
156 /// Assignment expression.
157 Assignment,
158 /// Binary expression.
159 BinaryExpression,
160 /// Unary expression.
161 UnaryExpression,
162 /// Literal expression.
163 LiteralExpression,
164 /// Identifier expression.
165 IdentifierExpression,
166 /// Call expression.
167 CallExpression,
168 /// Grouping expression.
169 GroupingExpression,
170 /// Block expression.
171 BlockExpression,
172 /// If expression.
173 IfExpression,
174 /// While expression.
175 WhileExpression,
176 /// For expression.
177 ForExpression,
178 /// Repeat expression.
179 RepeatExpression,
180 /// Function definition.
181 FunctionDefinition,
182 /// Index expression.
183 IndexExpression,
184 /// Member expression.
185 MemberExpression,
186 /// Argument list.
187 ArgumentList,
188 /// Parameter list.
189 ParameterList,
190
191 /// Error token.
192 Error,
193 /// End of file token.
194 Eof,
195}
196
197impl RElementType {
198 /// Returns true if this element type is trivia (whitespace, newline, or comment).
199 pub fn is_trivia(self) -> bool {
200 matches!(self, Self::Whitespace | Self::Newline | Self::Comment)
201 }
202}
203
204impl ElementType for RElementType {
205 type Role = UniversalElementRole;
206
207 fn role(&self) -> Self::Role {
208 match self {
209 _ => UniversalElementRole::None,
210 }
211 }
212}
213
214impl From<crate::lexer::token_type::RTokenType> for RElementType {
215 fn from(token: crate::lexer::token_type::RTokenType) -> Self {
216 unsafe { std::mem::transmute(token) }
217 }
218}