ringInterpol"/>
        <push state="curly"/>
      </rule>
      <rule pattern="\$[a-zA-Z_]\w*">
        <token type="NameVariable"/>
      </rule>
      <rule pattern="\$(?:\d+|[#$?!_*@-])">
        <token type="NameVariable"/>
      </rule>
      <rule pattern="\$">
        <token type="Text"/>
      </rule>
    </state>
    <state name="paren">
      <rule pattern="\)">
        <token type="Keyword"/>
        <pop depth="1"/>
      </rule>
      <rule>
        <include state="root"/>
      </rule>
    </state>
    <state name="math">
      <rule pattern="\)\)">
        <token type="Keyword"/>
        <pop depth="1"/>
      </rule>
      <rule pattern="[-+*/%^|&amp;]|\*\*|\|\|">
        <token type="Operator"/>
      </rule>
      <rule pattern="\d+#\d+">
        <token type="LiteralNumber"/>
      </rule>
      <rule pattern="\d+#(?! )">
        <token type="LiteralNumber"/>
      </rule>
      <rule pattern="\d+">
        <token type="LiteralNumber"/>
      </rule>
      <rule>
        <include state="root"/>
      </rule>
    </state>
    <state name="backticks">
      <rule pattern="`">
        <token type="LiteralStringBacktick"/>
        <pop depth="1"/>
      </rule>
      <rule>
        <include state="root"/>
      </rule>
    </state>
    <state name="root">
      <rule>
        <include state="basic"/>
      </rule>
      <rule pattern="`">
        <token type="LiteralStringBacktick"/>
        <push state="backticks"/>
      </rule>
      <rule>
        <include state="data"/>
      </rule>
      <rule>
        <include state="interp"/>
      </rule>
    </state>
    <state name="basic">
      <rule pattern="\b(if|fi|else|while|do|done|for|then|return|function|case|select|continue|until|esac|elif)(\s*)\b">
        <bygroups>
          <token type="Keyword"/>
          <token type="Text"/>
        </bygroups>
      </rule>
      <rule pattern="\b(alias|bg|bind|break|builtin|caller|cd|command|compgen|complete|declare|dirs|disown|echo|enable|eval|exec|exit|export|false|fc|fg|getopts|hash|help|history|jobs|kill|let|local|logout|popd|printf|pushd|pwd|read|readonly|set|shift|shopt|source|suspend|test|time|times|trap|true|type|typeset|ulimit|umask|unalias|unset|wait)(?=[\s)`])">
        <token type="NameBuiltin"/>
      </rule>
      <rule pattern="\A#!.+\n">
        <token type="CommentPreproc"/>
      </rule>
      <rule pattern="#.*(\S|$)">
        <token type="CommentSingle"/>
      </rule>
      <rule pattern="\\[\w\W]">
        <token type="LiteralStringEscape"/>
      </rule>
      <rule pattern="(\b\w+)(\s*)(\+?=)">
        <bygroups>
          <token type="NameVariable"/>
          <token type="Text"/>
          <token type="Operator"/>
        </bygroups>
      </rule>
      <rule pattern="[\[\]{}()=]">
        <token type="Operator"/>
      </rule>
      <rule pattern="&lt;&lt;&lt;">
        <token type="Operator"/>
      </rule>
      <rule pattern="&lt;&lt;-?\s*(\&#39;?)\\?(\w+)[\w\W]+?\2">
        <token type="LiteralString"/>
      </rule>
      <rule pattern="&amp;&amp;|\|\|">
        <token type="Operator"/>
      </rule>
    </state>
    <state name="curly">
      <rule pattern="\}">
        <token type="LiteralStringInterpol"/>
        <pop depth="1"/>
      </rule>
      <rule pattern=":-">
        <token type="Keyword"/>
      </rule>
      <rule pattern="\w+">
        <token type="NameVariable"/>
      </rule>
      <rule pattern="[^}:&#34;\&#39;`$\\]+">
        <token type="Punctuation"/>
      </rule>
      <rule pattern=":">
        <token type="Punctuation"/>
      </rule>
      <rule>
        <include state="root"/>
      </rule>
    </state>
  </rules>
</lexer>