1<lexer>
2 <config>
3 <name>microcad</name>
4 <alias>µcad</alias>
5 <filename>*.µcad</filename>
6 <filename>*.ucad</filename>
7 <filename>*.mcad</filename>
8 <mime_type>text/microcad</mime_type>
9 <ensure_nl>true</ensure_nl>
10 </config>
11
12 <rules>
13 <!-- Root state -->
14 <state name="root">
15 <rule pattern="\n">
16 <token type="TextWhitespace"/>
17 </rule>
18 <rule pattern="\s+">
19 <token type="TextWhitespace"/>
20 </rule>
21
22 <!-- COMMENTS -->
23 <rule pattern="///.*">
24 <token type="LiteralStringDoc"/>
25 </rule>
26
27 <rule pattern="//.*">
28 <token type="CommentSingle"/>
29 </rule>
30
31 <rule pattern="/\*.*">
32 <token type="CommentMultiline"/>
33 <push state="comment"/>
34 </rule>
35
36 <!-- KEYWORDS -->
37 <rule pattern="\b(pub|sketch|part|op|mod|use|fn|const|prop|init|return|if|else|mat|__builtin|or|and|not|as)\b">
38 <token type="Keyword"/>
39 </rule>
40
41 <!-- TYPES -->
42 <rule pattern="\b(Integer|Scalar|String|Color|Length|Area|Volume|Angle|Weight|Density|Bool|Matrix[0-9])\b">
43 <token type="KeywordType"/>
44 </rule>
45
46 <!-- FUNCTION NAMES -->
47 <rule pattern="\b([a-z_][a-zA-Z0-9_]*)\s*(?=\()">
48 <token type="NameFunction"/>
49 </rule>
50
51 <!-- OPERATORS -->
52 <rule pattern="[+\-*/%&|<>^!@=]">
53 <token type="Operator"/>
54 </rule>
55
56 <!-- NUMBERS + UNITS -->
57 <rule pattern="\b(([0-9]+(\.[0-9]+)?)(%|m²|cm²|mm²|µm²|in²|ft²|yd²|m³|cm³|mm³|µm³|in³|ft³|yd³|ml|cl|l|µl|cm|mm|m|µm|in|ft|yd|deg|°|grad|turn|rad|g|kg|lb|oz)?)|true|false\b">
58 <token type="LiteralNumber"/>
59 </rule>
60
61 <!-- NAMESPACES -->
62 <rule pattern="([a-z_][a-z0-9_]*)(::)">
63 <bygroups>
64 <token type="NameNamespace"/>
65 <token type="Operator"/>
66 </bygroups>
67 </rule>
68
69 <!-- CONSTANTS (ALL CAPS) -->
70 <rule pattern="\b([A-Z_][A-Z0-9_]*)\b">
71 <token type="NameConstant"/>
72 </rule>
73
74 <!-- CUSTOM TYPES (Capitalized identifiers) -->
75 <rule pattern="\b([A-Z_][a-zA-Z0-9_]*)\b">
76 <token type="NameClass"/>
77 </rule>
78
79 <!-- VARIABLES -->
80 <rule pattern="\b([a-z_][a-zA-Z0-9_]*)\b">
81 <token type="Name"/>
82 </rule>
83
84 <!-- STRINGS -->
85 <rule pattern=""[^"]*"">
86 <token type="LiteralString"/>
87 </rule>
88
89 <!-- PAREN GROUP -->
90 <rule pattern="[{}()\[\],.;:]">
91 <token type="Punctuation"/>
92 </rule>
93
94
95 <!-- BRACE GROUP -->
96 <rule pattern="\{">
97 <token type="Punctuation"/>
98 <push state="brace"/>
99 </rule>
100
101 <rule pattern="[\}\)]">
102 <token type="Punctuation"/>
103 </rule>
104
105 </state>
106
107 <!-- Parenthesized expression -->
108 <state name="paren">
109 <rule pattern="\)">
110 <token type="Punctuation"/>
111 <pop/>
112 </rule>
113 <rule>
114 <include state="root"/>
115 </rule>
116 </state>
117
118 <!-- Braced expression -->
119 <state name="brace">
120 <rule pattern="\}">
121 <token type="Punctuation"/>
122 <pop/>
123 </rule>
124 <rule>
125 <include state="root"/>
126 </rule>
127 </state>
128
129 <state name="comment">
130 <!-- End of comment -->
131 <rule pattern="\*/">
132 <token type="CommentMultiline"/>
133 <pop/>
134 </rule>
135 </state>
136
137
138 </rules>
139</lexer>