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 #[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}