1<lexer>
  2  <config>
  3    <name>Bash</name>
  4    <alias>bash</alias>
  5    <alias>sh</alias>
  6    <alias>ksh</alias>
  7    <alias>zsh</alias>
  8    <alias>shell</alias>
  9    <filename>*.sh</filename>
 10    <filename>*.ksh</filename>
 11    <filename>*.bash</filename>
 12    <filename>*.ebuild</filename>
 13    <filename>*.eclass</filename>
 14    <filename>.env</filename>
 15    <filename>.env.*</filename>
 16    <filename>*.env</filename>
 17    <filename>*.exheres-0</filename>
 18    <filename>*.exlib</filename>
 19    <filename>*.zsh</filename>
 20    <filename>*.zshrc</filename>
 21    <filename>.bashrc</filename>
 22    <filename>bashrc</filename>
 23    <filename>.bash_*</filename>
 24    <filename>bash_*</filename>
 25    <filename>zshrc</filename>
 26    <filename>.zshrc</filename>
 27    <filename>APKBUILD</filename>
 28    <filename>PKGBUILD</filename>
 29    <mime_type>application/x-sh</mime_type>
 30    <mime_type>application/x-shellscript</mime_type>
 31    <analyse first="true" >
 32      <regex pattern="(?m)^#!.*/bin/(?:env |)(?:bash|zsh|sh|ksh)" score="1.0" />
 33    </analyse>
 34  </config>
 35  <rules>
 36    <state name="data">
 37      <rule pattern="(?s)\$?&#34;(\\\\|\\[0-7]+|\\.|[^&#34;\\$])*&#34;">
 38        <token type="LiteralStringDouble"/>
 39      </rule>
 40      <rule pattern="&#34;">
 41        <token type="LiteralStringDouble"/>
 42        <push state="string"/>
 43      </rule>
 44      <rule pattern="(?s)\$&#39;(\\\\|\\[0-7]+|\\.|[^&#39;\\])*&#39;">
 45        <token type="LiteralStringSingle"/>
 46      </rule>
 47      <rule pattern="(?s)&#39;.*?&#39;">
 48        <token type="LiteralStringSingle"/>
 49      </rule>
 50      <rule pattern=";">
 51        <token type="Punctuation"/>
 52      </rule>
 53      <rule pattern="&amp;">
 54        <token type="Punctuation"/>
 55      </rule>
 56      <rule pattern="\|">
 57        <token type="Punctuation"/>
 58      </rule>
 59      <rule pattern="\s+">
 60        <token type="Text"/>
 61      </rule>
 62      <rule pattern="\d+(?= |$)">
 63        <token type="LiteralNumber"/>
 64      </rule>
 65      <rule pattern="[^=\s\[\]{}()$&#34;\&#39;`\\&lt;&amp;|;]+">
 66        <token type="Text"/>
 67      </rule>
 68      <rule pattern="&lt;">
 69        <token type="Text"/>
 70      </rule>
 71    </state>
 72    <state name="string">
 73      <rule pattern="&#34;">
 74        <token type="LiteralStringDouble"/>
 75        <pop depth="1"/>
 76      </rule>
 77      <rule pattern="(?s)(\\\\|\\[0-7]+|\\.|[^&#34;\\$])+">
 78        <token type="LiteralStringDouble"/>
 79      </rule>
 80      <rule>
 81        <include state="interp"/>
 82      </rule>
 83    </state>
 84    <state name="interp">
 85      <rule pattern="\$\(\(">
 86        <token type="Keyword"/>
 87        <push state="math"/>
 88      </rule>
 89      <rule pattern="\$\(">
 90        <token type="Keyword"/>
 91        <push state="paren"/>
 92      </rule>
 93      <rule pattern="\$\{#?">
 94        <token type="LiteralStringInterpol"/>
 95        <push state="curly"/>
 96      </rule>
 97      <rule pattern="\$[a-zA-Z_]\w*">
 98        <token type="NameVariable"/>
 99      </rule>
100      <rule pattern="\$(?:\d+|[#$?!_*@-])">
101        <token type="NameVariable"/>
102      </rule>
103      <rule pattern="\$">
104        <token type="Text"/>
105      </rule>
106    </state>
107    <state name="paren">
108      <rule pattern="\)">
109        <token type="Keyword"/>
110        <pop depth="1"/>
111      </rule>
112      <rule>
113        <include state="root"/>
114      </rule>
115    </state>
116    <state name="math">
117      <rule pattern="\)\)">
118        <token type="Keyword"/>
119        <pop depth="1"/>
120      </rule>
121      <rule pattern="[-+*/%^|&amp;]|\*\*|\|\|">
122        <token type="Operator"/>
123      </rule>
124      <rule pattern="\d+#\d+">
125        <token type="LiteralNumber"/>
126      </rule>
127      <rule pattern="\d+#(?! )">
128        <token type="LiteralNumber"/>
129      </rule>
130      <rule pattern="\d+">
131        <token type="LiteralNumber"/>
132      </rule>
133      <rule>
134        <include state="root"/>
135      </rule>
136    </state>
137    <state name="backticks">
138      <rule pattern="`">
139        <token type="LiteralStringBacktick"/>
140        <pop depth="1"/>
141      </rule>
142      <rule>
143        <include state="root"/>
144      </rule>
145    </state>
146    <state name="root">
147      <rule>
148        <include state="basic"/>
149      </rule>
150      <rule pattern="`">
151        <token type="LiteralStringBacktick"/>
152        <push state="backticks"/>
153      </rule>
154      <rule>
155        <include state="data"/>
156      </rule>
157      <rule>
158        <include state="interp"/>
159      </rule>
160    </state>
161    <state name="basic">
162      <rule pattern="\b(if|fi|else|while|do|done|for|then|return|function|case|select|continue|until|esac|elif)(\s*)\b">
163        <bygroups>
164          <token type="Keyword"/>
165          <token type="Text"/>
166        </bygroups>
167      </rule>
168      <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)`])">
169        <token type="NameBuiltin"/>
170      </rule>
171      <rule pattern="\A#!.+\n">
172        <token type="CommentPreproc"/>
173      </rule>
174      <rule pattern="#.*(\S|$)">
175        <token type="CommentSingle"/>
176      </rule>
177      <rule pattern="\\[\w\W]">
178        <token type="LiteralStringEscape"/>
179      </rule>
180      <rule pattern="(\b\w+)(\s*)(\+?=)">
181        <bygroups>
182          <token type="NameVariable"/>
183          <token type="Text"/>
184          <token type="Operator"/>
185        </bygroups>
186      </rule>
187      <rule pattern="[\[\]{}()=]">
188        <token type="Operator"/>
189      </rule>
190      <rule pattern="&lt;&lt;&lt;">
191        <token type="Operator"/>
192      </rule>
193      <rule pattern="&lt;&lt;-?\s*(\&#39;?)\\?(\w+)[\w\W]+?\2">
194        <token type="LiteralString"/>
195      </rule>
196      <rule pattern="&amp;&amp;|\|\|">
197        <token type="Operator"/>
198      </rule>
199    </state>
200    <state name="curly">
201      <rule pattern="\}">
202        <token type="LiteralStringInterpol"/>
203        <pop depth="1"/>
204      </rule>
205      <rule pattern=":-">
206        <token type="Keyword"/>
207      </rule>
208      <rule pattern="\w+">
209        <token type="NameVariable"/>
210      </rule>
211      <rule pattern="[^}:&#34;\&#39;`$\\]+">
212        <token type="Punctuation"/>
213      </rule>
214      <rule pattern=":">
215        <token type="Punctuation"/>
216      </rule>
217      <rule>
218        <include state="root"/>
219      </rule>
220    </state>
221  </rules>
222</lexer>