1. 
    
  2. <lexer>
    
  3.   <config>
    
  4.     <name>Alloy</name>
    
  5.     <alias>alloy</alias>
    
  6.     <filename>*.als</filename>
    
  7.     <mime_type>text/x-alloy</mime_type>
    
  8.     <dot_all>true</dot_all>
    
  9.   </config>
    
  10.   <rules>
    
  11.     <state name="sig">
    
  12.       <rule pattern="(extends)\b"><token type="Keyword"/><pop depth="1"/></rule>
    
  13.       <rule pattern="[a-zA-Z_][\w]*&quot;*"><token type="Name"/></rule>
    
  14.       <rule pattern="[^\S\n]+"><token type="TextWhitespace"/></rule>
    
  15.       <rule pattern=","><token type="Punctuation"/></rule>
    
  16.       <rule pattern="\{"><token type="Operator"/><pop depth="1"/></rule>
    
  17.     </state>
    
  18.     <state name="module">
    
  19.       <rule pattern="[^\S\n]+"><token type="TextWhitespace"/></rule>
    
  20.       <rule pattern="[a-zA-Z_][\w]*&quot;*"><token type="Name"/><pop depth="1"/></rule>
    
  21.     </state>
    
  22.     <state name="fun">
    
  23.       <rule pattern="[^\S\n]+"><token type="TextWhitespace"/></rule>
    
  24.       <rule pattern="\{"><token type="Operator"/><pop depth="1"/></rule>
    
  25.       <rule pattern="[a-zA-Z_][\w]*&quot;*"><token type="Name"/><pop depth="1"/></rule>
    
  26.     </state>
    
  27.     <state name="fact">
    
  28.       <rule><include state="fun"/></rule>
    
  29.       <rule pattern="&quot;\b(\\\\|\\[^\\]|[^&quot;\\])*&quot;"><token type="LiteralString"/><pop depth="1"/></rule>
    
  30.     </state>
    
  31.     <state name="root">
    
  32.       <rule pattern="--.*?$"><token type="CommentSingle"/></rule>
    
  33.       <rule pattern="//.*?$"><token type="CommentSingle"/></rule>
    
  34.       <rule pattern="/\*.*?\*/"><token type="CommentMultiline"/></rule>
    
  35.       <rule pattern="[^\S\n]+"><token type="TextWhitespace"/></rule>
    
  36.       <rule pattern="(module|open)(\s+)"><bygroups><token type="KeywordNamespace"/><token type="TextWhitespace"/></bygroups><push state="module"/></rule>
    
  37.       <rule pattern="(sig|enum)(\s+)"><bygroups><token type="KeywordDeclaration"/><token type="TextWhitespace"/></bygroups><push state="sig"/></rule>
    
  38.       <rule pattern="(iden|univ|none)\b"><token type="KeywordConstant"/></rule>
    
  39.       <rule pattern="(int|Int)\b"><token type="KeywordType"/></rule>
    
  40.       <rule pattern="(var|this|abstract|extends|set|seq|one|lone|let)\b"><token type="Keyword"/></rule>
    
  41.       <rule pattern="(all|some|no|sum|disj|when|else)\b"><token type="Keyword"/></rule>
    
  42.       <rule pattern="(run|check|for|but|exactly|expect|as|steps)\b"><token type="Keyword"/></rule>
    
  43.       <rule pattern="(always|after|eventually|until|release)\b"><token type="Keyword"/></rule>
    
  44.       <rule pattern="(historically|before|once|since|triggered)\b"><token type="Keyword"/></rule>
    
  45.       <rule pattern="(and|or|implies|iff|in)\b"><token type="OperatorWord"/></rule>
    
  46.       <rule pattern="(fun|pred|assert)(\s+)"><bygroups><token type="Keyword"/><token type="TextWhitespace"/></bygroups><push state="fun"/></rule>
    
  47.       <rule pattern="(fact)(\s+)"><bygroups><token type="Keyword"/><token type="TextWhitespace"/></bygroups><push state="fact"/></rule>
    
  48.       <rule pattern="!|#|&amp;&amp;|\+\+|&lt;&lt;|&gt;&gt;|&gt;=|&lt;=&gt;|&lt;=|\.\.|\.|-&gt;"><token type="Operator"/></rule>
    
  49.       <rule pattern="[-+/*%=&lt;&gt;&amp;!^|~{}\[\]().\&#x27;;]"><token type="Operator"/></rule>
    
  50.       <rule pattern="[a-zA-Z_][\w]*&quot;*"><token type="Name"/></rule>
    
  51.       <rule pattern="[:,]"><token type="Punctuation"/></rule>
    
  52.       <rule pattern="[0-9]+"><token type="LiteralNumberInteger"/></rule>
    
  53.       <rule pattern="&quot;\b(\\\\|\\[^\\]|[^&quot;\\])*&quot;"><token type="LiteralString"/></rule>
    
  54.       <rule pattern="\n"><token type="TextWhitespace"/></rule>
    
  55.     </state>
    
  56.   </rules>
    
  57. </lexer>
    
  58.