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="[+\-*/%&amp;|&lt;&gt;^!@=]">
 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="&quot;[^&quot;]*&quot;">
 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>