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