Skip to main content

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}