rbx_rsml/
lexer.rs

1use logos::Logos;
2
3#[derive(Clone, PartialEq, Debug)]
4pub struct LexerError(pub String);
5
6#[derive(Logos, Debug, Eq, Hash, PartialEq, Copy, Clone)]
7pub enum Token {
8    // Do not change the order of the operators.
9    #[token("^")]
10    OpPow,
11    #[token("/")]
12    OpDiv,
13    #[token("//")]
14    OpFloorDiv,
15    #[regex(r"[\n\f\t\r ]+\%")]
16    OpMod,
17    #[token("%", priority = 5)]
18    ScaleOrOpMod,
19    #[token("*")]
20    OpMult,
21    #[token("+")]
22    OpAdd,
23    #[token("-")]
24    OpSub,
25
26    #[regex(r"\-\-\[=*\[", priority = 99)]
27    CommentMultiStart,
28
29    #[regex(r"\[=*\[", priority = 98)]
30    StringMultiStart,
31
32    #[regex(r"\]=*\]", priority = 98)]
33    StringMultiEnd,
34
35    #[regex(r"\-\-[^\[\n\f\r]*", priority = 98)]
36    CommentSingle,
37
38    #[token("{", priority = 1)]
39    ScopeOpen,
40
41    #[token("}", priority = 1)]
42    ScopeClose,
43
44    #[token("(", priority = 1)]
45    ParensOpen,
46
47    #[token(")", priority = 1)]
48    ParensClose,
49
50    #[token(",", priority = 1)]
51    Comma,
52
53    #[token(";", priority = 1)]
54    SemiColon,
55
56    #[token("=", priority = 1)]
57    Equals,
58
59    #[token("$", priority = 1)]
60    AttributeIdentifier,
61
62    #[token("$!", priority = 1)]
63    StaticAttributeIdentifier,
64
65    #[token("&", priority = 1)]
66    ArgIdentifier,
67
68    #[token("#", priority = 1)]
69    NameIdentifier,
70
71    #[token("::", priority = 1)]
72    PsuedoIdentifier,
73
74    #[token(":", priority = 1)]
75    StateOrEnumIdentifier,
76
77    #[token(">>", priority = 1)]
78    ScopeToDescendants,
79
80    #[token(">", priority = 1)]
81    ScopeToChildren,
82
83    #[token("@priority", priority = 1)]
84    PriorityDeclaration,
85
86    #[token("@derive", priority = 1)]
87    DeriveDeclaration,
88
89    #[token("@name", priority = 1)]
90    NameDeclaration,
91
92    #[token("@macro")]
93    MacroDeclaration,
94
95    #[token("@util")]
96    UtilDeclaration,
97
98    #[token("true")]
99    BoolTrue,
100
101    #[token("false")]
102    BoolFalse,
103
104    #[token("nil")]
105    Nil,
106
107    #[token("Enum")]
108    EnumKeyword,
109
110    #[regex(r"(?i)tw:[a-z]+(:\d+)?")]
111    ColorTailwind,
112
113    #[regex(r"(?i)skin:[a-z]+(:\d+)?")]
114    ColorSkin,
115
116    #[regex(r"(?i)bc:[a-z]+")]
117    ColorBrick,
118
119    #[regex(r"(?i)css:[a-z]+")]
120    ColorCss,
121
122    #[regex(r"#[\da-fA-F]+")]
123    ColorHex,
124
125    #[regex(r"[\d_]*\.?[\d_]+", priority = 4)]
126    Number,
127
128    #[token("px", priority = 45)]
129    Offset,
130
131    #[token(".")]
132    TagOrEnumIdentifier,
133
134    #[regex(r#""[^\"\n\t]*""#)]
135    #[regex(r#"'[^\'\n\t]*'"#)]
136    StringSingle,
137
138    #[regex(r"rbxassetid://\d+")]
139    #[regex(r"(rbxasset|rbxthumb|rbxgameasset|rbxhttp|rbxtemp|https?)://[^) ]*")]
140    RobloxAsset,
141
142    #[regex(r"contentid://\d+", priority = 999)]
143    RobloxContent,
144
145    #[regex(r"[_A-Za-z][_A-Za-z\d]*|[_A-Za-z]+(-[A-Za-z\d_]+)+")]
146    Text,
147
148    #[regex(r"([_A-Za-z][_A-Za-z\d]*|[_A-Za-z]+(-[A-Za-z\d_]+)+)!")]
149    MacroCall
150}
151
152pub fn lex_rsml<'a>(content: &'a str) -> logos::Lexer<'a, Token> {
153    Token::lexer(&content)
154}