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("@tween")]
99 TweenDeclaration,
100
101 #[token("true")]
102 BoolTrue,
103
104 #[token("false")]
105 BoolFalse,
106
107 #[token("nil")]
108 Nil,
109
110 #[token("Enum")]
111 EnumKeyword,
112
113 #[regex(r"(?i)tw:[a-z]+(:\d+)?")]
114 ColorTailwind,
115
116 #[regex(r"(?i)skin:[a-z]+(:\d+)?")]
117 ColorSkin,
118
119 #[regex(r"(?i)bc:[a-z]+")]
120 ColorBrick,
121
122 #[regex(r"(?i)css:[a-z]+")]
123 ColorCss,
124
125 #[regex(r"#[\da-fA-F]+")]
126 ColorHex,
127
128 #[regex(r"[\d_]*\.?[\d_]+", priority = 4)]
129 Number,
130
131 #[token("px", priority = 45)]
132 Offset,
133
134 #[token(".")]
135 TagOrEnumIdentifier,
136
137 #[regex(r#""[^\"\n\t]*""#)]
138 #[regex(r#"'[^\'\n\t]*'"#)]
139 StringSingle,
140
141 #[regex(r"rbxassetid://\d+")]
142 #[regex(r"(rbxasset|rbxthumb|rbxgameasset|rbxhttp|rbxtemp|https?)://[^) ]*")]
143 RobloxAsset,
144
145 #[regex(r"contentid://\d+", priority = 999)]
146 RobloxContent,
147
148 #[regex(r"[_A-Za-z][_A-Za-z\d]*|[_A-Za-z]+(-[A-Za-z\d_]+)+")]
149 Text,
150
151 #[regex(r"([_A-Za-z][_A-Za-z\d]*|[_A-Za-z]+(-[A-Za-z\d_]+)+)!")]
152 MacroCall
153}
154
155pub fn lex_rsml<'a>(content: &'a str) -> logos::Lexer<'a, Token> {
156 Token::lexer(&content)
157}