<lexer>
  <config>
    <name>ANTLR</name>
    <alias>antlr</alias>
  </config>
  <rules>
    <state name="nested-arg-action">
      <rule pattern="([^$\[\]\&#39;&#34;/]+|&#34;(\\\\|\\&#34;|[^&#34;])*&#34;|&#39;(\\\\|\\&#39;|[^&#39;])*&#39;|//.*$\n?|/\*(.|\n)*?\*/|/(?!\*)(\\\\|\\/|[^/])*/|/)+">
        <token type="Other"/>
      </rule>
      <rule pattern="\[">
        <token type="Punctuation"/>
        <push/>
      </rule>
      <rule pattern="\]">
        <token type="Punctuation"/>
        <pop depth="1"/>
      </rule>
      <rule pattern="(\$[a-zA-Z]+)(\.?)(text|value)?">
        <bygroups>
          <token type="NameVariable"/>
          <token type="Punctuation"/>
          <token type="NameProperty"/>
        </bygroups>
      </rule>
      <rule pattern="(\\\\|\\\]|\\\[|[^\[\]])+">
        <token type="Other"/>
      </rule>
    </state>
    <state name="exception">
      <rule pattern="\n">
        <token type="TextWhitespace"/>
        <pop depth="1"/>
      </rule>
      <rule pattern="\s">
        <token type="TextWhitespace"/>
      </rule>
      <rule>
        <include state="comments"/>
      </rule>
      <rule pattern="\[">
        <token type="Punctuation"/>
        <push state="nested-arg-action"/>
      </rule>
      <rule pattern="\{">
        <token type="Punctuation"/>
        <push state="action"/>
      </rule>
    </state>
    <state name="whitespace">
      <rule pattern="\s+">
        <token type="TextWhitespace"/>
      </rule>
    </state>
    <state name="root">
      <rule>
        <include state="whitespace"/>
      </rule>
      <rule>
        <include state="comments"/>
      </rule>
      <rule pattern="(lexer|parser|tree)?(\s*)(grammar\b)(\s*)([A-Za-z]\w*)(;)">
        <bygroups>
          <token type="Keyword"/>
          <token type="TextWhitespace"/>
          <token type="Keyword"/>
          <token type="TextWhitespace"/>
          <token type="NameClass"/>
          <token type="Punctuation"/>
        </bygroups>
      </rule>
      <rule pattern="options\b">
        <token type="Keyword"/>
        <push state="options"/>
      </rule>
      <rule pattern="tokens\b">
        <token type="Keyword"/>
        <push state="tokens"/>
      </rule>
      <rule pattern="(scope)(\s*)([A-Za-z]\w*)(\s*)(\{)">
        <bygroups>
          <token type="Keyword"/>
          <token type="TextWhitespace"/>
          <token type="NameVariable"/>
          <token type="TextWhitespace"/>
          <token type="Punctuation"/>
        </bygroups>
        <push state="action"/>
      </rule>
      <rule pattern="(catch|finally)\b">
        <token type="Keyword"/>
        <push state="exception"/>
      </rule>
      <rule pattern="(@[A-Za-z]\w*)(\s*)(::)?(\s*)([A-Za-z]\w*)(\s*)(\{)">
        <bygroups>
          <token type="NameLabel"/>
          <token type="TextWhitespace"/>
          <token type="Punctuation"/>
          <token type="TextWhitespace"/>
          <token type="NameLabel"/>
          <token type="TextWhitespace"/>
          <token type="Punctuation"/>
        </bygroups>
        <push state="action"/>
      </rule>
      <rule pattern="((?:protected|private|public|fragment)\b)?(\s*)([A-Za-z]\w*)(!)?">
        <bygroups>
          <token type="Keyword"/>
          <token type="TextWhitespace"/>
          <token type="NameLabel"/>
          <token type="Punctuation"/>
        </bygroups>
        <push state="rule-alts" state="rule-prelims"/>
      </rule>
    </state>
    <state name="tokens">
      <rule>
        <include state="whitespace"/>
      </rule>
      <rule>
        <include state="comments"/>
      </rule>
      <rule pattern="\{">
        <token type="Punctuation"/>
      </rule>
      <rule pattern="([A-Z]\w*)(\s*)(=)?(\s*)(\&#39;(?:\\\\|\\\&#39;|[^\&#39;]*)\&#39;)?(\s*)(;)">
        <bygroups>
          <token type="NameLabel"/>
          <token type="TextWhitespace"/>
          <token type="Punctuation"/>
          <token type="TextWhitespace"/>
          <token type="LiteralString"/>
          <token type="TextWhitespace"/>
          <token type="Punctuation"/>
        </bygroups>
      </rule>
      <rule pattern="\}">
        <token type="Punctuation"/>
        <pop depth="1"/>
      </rule>
    </state>
    <state name="options">
      <rule>
        <include state="whitespace"/>
      </rule>
      <rule>
        <include state="comments"/>
      </rule>
      <rule pattern="\{">
        <token type="Punctuation"/>
      </rule>
      <rule pattern="([A-Za-z]\w*)(\s*)(=)(\s*)([A-Za-z]\w*|\&#39;(?:\\\\|\\\&#39;|[^\&#39;]*)\&#39;|[0-9]+|\*)(\s*)(;)">
        <bygroups>
          <token type="NameVariable"/>
          <token type="TextWhitespace"/>
          <token type="Punctuation"/>
          <token type="TextWhitespace"/>
          <token type="Text"/>
          <token type="TextWhitespace"/>
          <token type="Punctuation"/>
        </bygroups>
      </rule>
      <rule pattern="\}">
        <token type="Punctuation"/>
        <pop depth="1"/>
      </rule>
    </state>
    <state name="rule-alts">
      <rule>
        <include state="whitespace"/>
      </rule>
      <rule>
        <include state="comments"/>
      </rule>
      <rule pattern="options\b">
        <token type="Keyword"/>
        <push state="options"/>
      </rule>
      <rule pattern=":">
        <token type="Punctuation"/>
      </rule>
      <rule pattern="&#39;(\\\\|\\&#39;|[^&#39;])*&#39;">
        <token type="LiteralString"/>
      </rule>
      <rule pattern="&#34;(\\\\|\\&#34;|[^&#34;])*&#34;">
        <token type="LiteralString"/>
      </rule>
      <rule pattern="&lt;&lt;([^&gt;]|&gt;[^&gt;])&gt;&gt;">
        <token type="LiteralString"/>
      </rule>
      <rule pattern="\$?[A-Z_]\w*">
        <token type="NameConstant"/>
      </rule>
      <rule pattern="\$?[a-z_]\w*">
        <token type="NameVariable"/>
      </rule>
      <rule pattern="(\+|\||-&gt;|=&gt;|=|\(|\)|\.\.|\.|\?|\*|\^|!|\#|~)">
        <token type="Operator"/>
      </rule>
      <rule pattern=",">
        <token type="Punctuation"/>
      </rule>
      <rule pattern="\[">
        <token type="Punctuation"/>
        <push state="nested-arg-action"/>
      </rule>
      <rule pattern="\{">
        <token type="Punctuation"/>
        <push state="action"/>
      </rule>
      <rule pattern=";">
        <token type="Punctuation"/>
        <pop depth="1"/>
      </rule>
    </state>
    <state name="rule-prelims">
      <rule>
        <include state="whitespace"/>
      </rule>
      <rule>
        <include state="comments"/>
      </rule>
      <rule pattern="returns\b">
        <token type="Keyword"/>
      </rule>
      <rule pattern="\[">
        <token type="Punctuation"/>
        <push state="nested-arg-action"/>
      </rule>
      <rule pattern="\{">
        <token type="Punctuation"/>
        <push state="action"/>
      </rule>
      <rule pattern="(throws)(\s+)([A-Za-z]\w*)">
        <bygroups>
          <token type="Keyword"/>
          <token type="TextWhitespace"/>
          <token type="NameLabel"/>
        </bygroups>
      </rule>
      <rule pattern="(,)(\s*)([A-Za-z]\w*)">
        <bygroups>
          <token type="Punctuation"/>
          <token type="TextWhitespace"/>
          <token type="NameLabel"/>
        </bygroups>
      </rule>
      <rule pattern="options\b">
        <token type="Keyword"/>
        <push state="options"/>
      </rule>
      <rule pattern="(scope)(\s+)(\{)">
        <bygroups>
          <token type="Keyword"/>
          <token type="TextWhitespace"/>
          <token type="Punctuation"/>
        </bygroups>
        <push state="action"/>
      </rule>
      <rule pattern="(scope)(\s+)([A-Za-z]\w*)(\s*)(;)">
        <bygroups>
          <token type="Keyword"/>
          <token type="TextWhitespace"/>
          <token type="NameLabel"/>
          <token type="TextWhitespace"/>
          <token type="Punctuation"/>
        </bygroups>
      </rule>
      <rule pattern="(@[A-Za-z]\w*)(\s*)(\{)">
        <bygroups>
          <token type="NameLabel"/>
          <token type="TextWhitespace"/>
          <token type="Punctuation"/>
        </bygroups>
        <push state="action"/>
      </rule>
      <rule pattern=":">
        <token type="Punctuation"/>
        <pop depth="1"/>
      </rule>
    </state>
    <state name="action">
      <rule pattern="([^${}\&#39;&#34;/\\]+|&#34;(\\\\|\\&#34;|[^&#34;])*&#34;|&#39;(\\\\|\\&#39;|[^&#39;])*&#39;|//.*$\n?|/\*(.|\n)*?\*/|/(?!\*)(\\\\|\\/|[^/])*/|\\(?!%)|/)+">
        <token type="Other"/>
      </rule>
      <rule pattern="(\\)(%)">
        <bygroups>
          <token type="Punctuation"/>
          <token type="Other"/>
        </bygroups>
      </rule>
      <rule pattern="(\$[a-zA-Z]+)(\.?)(text|value)?">
        <bygroups>
          <token type="NameVariable"/>
          <token type="Punctuation"/>
          <token type="NameProperty"/>
        </bygroups>
      </rule>
      <rule pattern="\{">
        <token type="Punctuation"/>
        <push/>
      </rule>
      <rule pattern="\}">
        <token type="Punctuation"/>
        <pop depth="1"/>
      </rule>
    </state>
    <state name="comments">
      <rule pattern="//.*$">
        <token type="Comment"/>
      </rule>
      <rule pattern="/\*(.|\n)*?\*/">
        <token type="Comment"/>
      </rule>
    </state>
  </rules>
</lexer>