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)]
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}