<lexer>
  <config>
    <name>Hare</name>
    <alias>hare</alias>
    <filename>*.ha</filename>
    <mime_type>text/x-hare</mime_type>
  </config>
  <rules>
    <state name="string">
      <rule pattern="&quot;">
        <token type="LiteralString"/>
        <pop depth="1"/>
      </rule>
      <rule pattern="\\([\\0abfnrtv&quot;']|x[a-fA-F0-9]{2}|u[a-fA-F0-9]{4}|U[a-fA-F0-9]{8})">
        <token type="LiteralStringEscape"/>
      </rule>
      <rule pattern="[^\\&quot;\n]+">
        <token type="LiteralString"/>
      </rule>
      <rule pattern="\\">
        <token type="LiteralString"/>
      </rule>
    </state>
    <state name="root">
      <rule pattern="[\s\n]+">
        <token type="TextWhitespace"/>
      </rule>
      <rule pattern="@[a-z]+">
        <token type="NameDecorator"/>
      </rule>
      <rule pattern="//.*\n">
        <token type="CommentSingle"/>
      </rule>
      <rule pattern="&quot;">
        <token type="LiteralString"/>
        <push state="string"/>
      </rule>
      <rule pattern="`[^`]*`">
        <token type="LiteralString"/>
      </rule>
      <rule pattern="'(\\[\\0abfnrtv&quot;']||\\(x[a-fA-F0-9]{2}|u[a-fA-F0-9]{4}|U[a-fA-F0-9]{8})|[^\\'])'">
        <token type="LiteralStringChar"/>
      </rule>
      <rule pattern="(0|[1-9]\d*)\.\d+([eE][+-]?\d+)?(f32|f64)?">
        <token type="LiteralNumberFloat"/>
      </rule>
      <rule pattern="(0|[1-9]\d*)([eE][+-]?\d+)?(f32|f64)">
        <token type="LiteralNumberFloat"/>
      </rule>
      <rule pattern="0x[0-9a-fA-F]+\.[0-9a-fA-F]+([pP][+-]?\d+(f32|f64)?)?">
        <token type="LiteralNumberFloat"/>
      </rule>
      <rule pattern="0x[0-9a-fA-F]+[pP][+-]?\d+(f32|f64)">
        <token type="LiteralNumberFloat"/>
      </rule>
      <rule pattern="0x[0-9a-fA-F]+(z|[iu](8|16|32|64)?)?">
        <token type="LiteralNumberHex"/>
      </rule>
      <rule pattern="0o[0-7]+(z|[iu](8|16|32|64)?)?">
        <token type="LiteralNumberOct"/>
      </rule>
      <rule pattern="0b[01]+(z|[iu](8|16|32|64)?)?">
        <token type="LiteralNumberBin"/>
      </rule>
      <rule pattern="(0|[1-9]\d*)([eE][+-]?\d+)?(z|[iu](8|16|32|64)?)?">
        <token type="LiteralNumberInteger"/>
      </rule>
      <rule pattern="[~!%^&amp;*+=|?:&lt;&gt;/-]|[ai]s\b|\.\.\.">
        <token type="Operator"/>
      </rule>
      <rule pattern="[()\[\],.{};]">
        <token type="Punctuation"/>
      </rule>
      <rule pattern="use\b">
        <token type="KeywordNamespace"/>
      </rule>
      <rule pattern="(_|align|break|const|continue|else|enum|export|for|if|return|static|struct|offset|union|fn|free|assert|abort|alloc|let|len|def|type|match|switch|case|append|delete|insert|defer|yield|vastart|vaarg|vaend)\b">
        <token type="Keyword"/>
      </rule>
      <rule pattern="(size)([\s\n]*)(\()">
        <bygroups>
          <token type="Keyword" />
          <token type="TextWhitespace" />
          <token type="Punctuation" />
        </bygroups>
      </rule>
      <rule pattern="(str|size|rune|bool|int|uint|uintptr|u8|u16|u32|u64|i8|i16|i32|i64|f32|f64|null|void|nullable|valist|opaque|never)\b">
        <token type="KeywordType"/>
      </rule>
      <rule pattern="(true|false)\b">
        <token type="NameBuiltin"/>
      </rule>
      <rule pattern="[a-zA-Z_]\w*">
        <token type="Name"/>
      </rule>
    </state>
  </rules>
</lexer>
