Warning, /frameworks/syntax-highlighting/data/syntax/zsh.xml is written in an unsupported language. File is not indexed.

0001 <?xml version="1.0" encoding="UTF-8"?>
0002 <!DOCTYPE language
0003 [
0004         <!ENTITY tab      "&#009;">
0005         <!ENTITY funcname "[^&_fragpathseps;=]*+">
0006         <!ENTITY varname  "[A-Za-z_][A-Za-z0-9_]*">
0007         <!ENTITY eos      "(?=$|[ &tab;])">                 <!-- eol or space following -->
0008         <!ENTITY eoexpr   "(?=$|[ &tab;&lt;>|&amp;;)])">
0009 
0010         <!ENTITY substseps  "${}'&quot;`\\">
0011         <!ENTITY symbolseps "&lt;>|&amp;;()">
0012         <!ENTITY wordseps   " &tab;&symbolseps;">
0013         <!ENTITY wordseps_or_extglog " &tab;>|&amp;;)`"> <!-- wordseps without < and ( -->
0014 
0015         <!ENTITY bq_string  "`[^`]*+`">
0016         <!ENTITY sq_string  "'[^']*+'">
0017         <!ENTITY dq_string  "&quot;(?:[^&quot;\\`]*+|&bq_string;|\\.)*+&quot;">
0018         <!ENTITY strings    "(?:&sq_string;|&dq_string;|&bq_string;)">
0019 
0020         <!ENTITY simpleglob "*?#^~">
0021         <!ENTITY globrange  "&lt;[0-9]*-[0-9]*>">
0022         <!ENTITY globany    "\[(?:[^&wordseps;&quot;'`\\\[\]]+|\\.|&strings;|\[:\w+:\]|\[)*\]">
0023 
0024         <!ENTITY _fragpathseps  "&simpleglob;[&wordseps;&substseps;">
0025         <!ENTITY _fragpathnosep "(?:&_brace_noexpansion;)?+">
0026         <!ENTITY path        "(?:[^&_fragpathseps;]*+&_fragpathnosep;)*+">
0027         <!ENTITY fragpath    "(?:[^&_fragpathseps;/]*+&_fragpathnosep;)*+">
0028         <!ENTITY fragpathesc "\\.(?:[^&_fragpathseps;/]*+(?:\\.|&_brace_noexpansion;)?+)*+">
0029         <!ENTITY opt         "(?:[^&_fragpathseps;=/]*+&_fragpathnosep;)*+">
0030         <!ENTITY assumepath  "/&path;|(?=[&simpleglob;([]|&globrange;)">
0031         <!ENTITY pathpart    "(?:~(?:/&path;|(?=[&wordseps;]|$))|&fragpath;(?:&assumepath;|(?=&fragpathesc;&assumepath;))|\.\.?(?=[&wordseps;]|$))">
0032 
0033         <!-- Path only with / -->
0034         <!ENTITY path_with_sep_text  "[^[&wordseps;'&quot;`\\/]">
0035         <!ENTITY path_with_sep_text2 "[^[()&lt;>'&quot;`\\/]">
0036         <!ENTITY path_with_sep_expr  "\\.|&strings;|&globany;|&globrange;">
0037         <!ENTITY path_with_sep_spe   "(~|\.\.?)($|[/ &tab;&lt;>|&amp;;)])">
0038         <!ENTITY path_with_sep_sub   "\((&path_with_sep_text2;++|&path_with_sep_expr;)*+(\)|(?=/))">
0039         <!ENTITY path_with_sep "/|&path_with_sep_spe;|(&path_with_sep_text;++|&path_with_sep_expr;|&path_with_sep_sub;)*+/">
0040 
0041         <!ENTITY _braceexpansion_spe     " &tab;&lt;>|&amp;;{}\\`'&quot;$">
0042         <!ENTITY _brace_noexpansion      "\{[^&_braceexpansion_spe;,]*+\}">
0043         <!ENTITY _braceexpansion_var     "\$(?:\{[^\[\]&_braceexpansion_spe;]*+(?:\[[*@a-zA-Z0-9]\])\})?">
0044         <!ENTITY _braceexpansion_elems   "\\.|&strings;|&_braceexpansion_var;|&_brace_noexpansion;">
0045         <!ENTITY _braceexpansion_consume "&_braceexpansion_elems;|{(?:[^&_braceexpansion_spe;,]++|&_braceexpansion_elems;)*?}|(?R)?+">
0046         <!ENTITY _braceexpansion "(?:[^&_braceexpansion_spe;,]++|&_braceexpansion_consume;)*?,(?:[^&_braceexpansion_spe;]++|&_braceexpansion_consume;)*?}">
0047         <!ENTITY braceexpansion "{&_braceexpansion;">
0048 
0049         <!ENTITY _bracerangevar "\$([#+^=~]*([_a-zA-Z0-9]+|[*@#])(\[((\$[#+^=~]*)?([-+_a-zA-Z0-9]+|[*@])|$#)\])?|#|'(\\.|[^'\\])')">
0050         <!ENTITY _bracerangeoperand "-?([0-9]+|[a-zA-Z!#$&#37;*+,-./:=?@^_~]|&_bracerangevar;|\\.|'[^'\\]'|&quot;(\\.|[^&quot;\\`])&quot;|`[^`]*`)">
0051         <!ENTITY bracerangeexpansion "{(?=&_bracerangeoperand;\.\.&_bracerangeoperand;(\.\.-?([0-9]+|&_bracerangevar;))?})">
0052 
0053         <!ENTITY nobraceexpansion "(?:{([^&_braceexpansion_spe;/{},]++|(?R))+?})+">
0054         <!ENTITY nogroupend "(?:}+(?:[^&_fragpathseps;]|(?=[}$'&quot;`\\])))">
0055 
0056         <!-- glob with |, ( or spaces is a pattern -->
0057         <!ENTITY _ispattern_ugN "[ug][0123456789]+">
0058         <!ENTITY _ispattern_ugeP "[ugeP](?:&_ispattern_ugeP_0;|&_ispattern_ugeP_1;|&_ispattern_ugeP_2;|&_ispattern_ugeP_3;|&_ispattern_ugeP_4;|(?=\|))">
0059         <!ENTITY _ispattern_ugeP_0    ":(?:[^:'`&quot;\\|()]*+(?:&_ispattern_q;)?)*(?::|(?=[|()]))">
0060         <!ENTITY _ispattern_ugeP_1   "\[(?:[^]'`&quot;\\|()]*+(?:&_ispattern_q;)?)*(?:\](?=[|()]))">
0061         <!ENTITY _ispattern_ugeP_2    "{(?:[^}'`&quot;\\|()]*+(?:&_ispattern_q;)?)*(?:}(?=[|()]))">
0062         <!ENTITY _ispattern_ugeP_3 "&lt;(?:[^>'`&quot;\\|()]*+(?:&_ispattern_q;)?)*(?:>|(?=[|()]))">
0063         <!ENTITY _ispattern_ugeP_4  "([^&wordseps;{}'&quot;`\\])(?:(?:(?!\1)[^'`&quot;\\\1|()])*+(?:&_ispattern_q;)?)*(?:\1|(?=[|()]))">
0064         <!ENTITY _ispattern_q "\\.|&strings;">
0065         <!ENTITY _ispattern_check "(?:\)(?:[^ &tab;}&lt;>|&amp;;)]|&nogroupend;)|[ &tab;|(]|$)">
0066         <!ENTITY ispattern "(?:[^ &tab;\\'&quot;|()`ugeP]*+(?:&_ispattern_ugN;|&_ispattern_ugeP;|&_ispattern_q;)?)*&_ispattern_check;">
0067 
0068         <!ENTITY heredocq "(?|&quot;([^&quot;]+)&quot;|'([^']+)'|\\(.[^&wordseps;&substseps;]*))">
0069 
0070         <!ENTITY arithmetic_as_subshell "\(((?:[^`'&quot;()$]++|\$\{[^`'&quot;(){}$]+\}|\$(?=[^{`'&quot;()])|&bq_string;|\((?1)(?:[)]|(?=['&quot;])))++)(?:[)](?=$|[^)])|[&quot;'])">
0071 
0072         <!ENTITY unary_operators  "-[abcdefghknoprstuvwxzLOGNS]&eos;">
0073         <!ENTITY binary_operators "(?:-(?:e[fq]|[nolg]t|[nlg]e)|==?|!=)&eos;">
0074 
0075         <!ENTITY dblbracket_close "\]\](?=($|[ &tab;;|&amp;)]))">
0076 
0077         <!ENTITY int "(?:[0-9]++[_0-9]*+)">
0078         <!ENTITY exp "(?:[eE][-+]?&int;)">
0079 ]>
0080 <language name="Zsh" version="32" kateversion="5.79" section="Scripts" extensions="*.sh;*.zsh;.zshrc;.zprofile;.zlogin;.zlogout;.profile" mimetype="application/x-shellscript" casesensitive="1" author="Jonathan Poelen (jonathan.poelen@gmail.com)" license="MIT">
0081 
0082   <highlighting>
0083     <list name="keywords">
0084       <item>continue</item>
0085       <item>break</item>
0086       <item>case</item>
0087       <item>do</item>
0088       <item>done</item>
0089       <item>elif</item>
0090       <item>else</item>
0091       <item>end</item>
0092       <item>esac</item>
0093       <item>fi</item>
0094       <item>for</item>
0095       <item>foreach</item>
0096       <item>function</item>
0097       <item>if</item>
0098       <item>in</item>
0099       <item>repeat</item>
0100       <item>return</item>
0101       <item>select</item>
0102       <item>then</item>
0103       <item>until</item>
0104       <item>while</item>
0105     </list>
0106 
0107 <list name="builtins"><!-- see man zshbuiltins -->
0108         <item>-</item>
0109         <item>.</item>
0110         <item>:</item>
0111         <item>alias</item>
0112         <item>autoload</item>
0113         <item>bg</item>
0114         <item>bindkey</item>
0115         <item>builtin</item>
0116         <item>bye</item>
0117         <item>cap</item>
0118         <item>cd</item>
0119         <item>chdir</item>
0120         <item>clone</item>
0121         <item>command</item>
0122         <item>comparguments</item>
0123         <item>compcall</item>
0124         <item>compctl</item>
0125         <item>compdescribe</item>
0126         <item>compfiles</item>
0127         <item>compgroups</item>
0128         <item>compquote</item>
0129         <item>comptags</item>
0130         <item>comptry</item>
0131         <item>compvalues</item>
0132         <item>coproc</item>
0133         <item>dirs</item>
0134         <item>disable</item>
0135         <item>disown</item>
0136         <item>echo</item>
0137         <item>echotc</item>
0138         <item>echoti</item>
0139         <item>emulate</item>
0140         <item>enable</item>
0141         <item>eval</item>
0142         <item>exec</item>
0143         <item>exit</item>
0144         <item>false</item>
0145         <item>fc</item>
0146         <item>fg</item>
0147         <item>functions</item>
0148         <item>getcap</item>
0149         <item>hash</item>
0150         <item>history</item>
0151         <item>jobs</item>
0152         <item>kill</item>
0153         <item>limit</item>
0154         <item>log</item>
0155         <item>logout</item>
0156         <item>nocorrect</item>
0157         <item>noglob</item>
0158         <item>popd</item>
0159         <item>print</item>
0160         <item>printf</item>
0161         <item>pushd</item>
0162         <item>pushln</item>
0163         <item>pwd</item>
0164         <item>r</item>
0165         <item>rehash</item>
0166         <item>sched</item>
0167         <item>set</item>
0168         <item>setcap</item>
0169         <item>setopt</item>
0170         <item>shift</item>
0171         <item>source</item>
0172         <item>stat</item>
0173         <item>suspend</item>
0174         <item>test</item>
0175         <item>times</item>
0176         <item>trap</item>
0177         <item>true</item>
0178         <item>ttyctl</item>
0179         <item>type</item>
0180         <item>ulimit</item>
0181         <item>umask</item>
0182         <item>unalias</item>
0183         <item>unfunction</item>
0184         <item>unhash</item>
0185         <item>unlimit</item>
0186         <item>unset</item>
0187         <item>unsetopt</item>
0188         <item>vared</item>
0189         <item>wait</item>
0190         <item>whence</item>
0191         <item>where</item>
0192         <item>which</item>
0193         <item>zcompile</item>
0194         <item>zformat</item>
0195         <item>zftp</item>
0196         <item>zle</item>
0197         <item>zmodload</item>
0198         <item>zparseopts</item>
0199         <item>zprof</item>
0200         <item>zpty</item>
0201         <item>zregexparse</item>
0202         <item>zsocket</item>
0203         <item>zstyle</item>
0204         <item>ztcp</item>
0205     </list>
0206 
0207     <list name="builtins_var">
0208         <item>declare</item>
0209         <item>export</item>
0210         <item>float</item>
0211         <item>getln</item>
0212         <item>getopts</item>
0213         <item>integer</item>
0214         <item>let</item>
0215         <item>local</item>
0216         <item>read</item>
0217         <item>readonly</item>
0218         <item>typeset</item>
0219         <item>unset</item>
0220     </list>
0221 
0222     <list name="unixcommands">
0223       <include>unixcommands##Bash</include>
0224     </list>
0225 
0226     <contexts>
0227       <context attribute="Normal Text" lineEndContext="#stay" name="Start" fallthroughContext="Command">
0228         <DetectSpaces attribute="Normal Text" context="#stay"/>
0229         <DetectChar attribute="Comment" context="Comment" char="#"/>
0230         <!-- start expression in double parentheses -->
0231         <Detect2Chars context="ExprDblParenOrSubShell" char="(" char1="(" lookAhead="1"/>
0232         <!-- start a subshell -->
0233         <DetectChar attribute="Keyword" context="SubShell" char="(" beginRegion="subshell"/>
0234         <!-- start expression in single/double brackets -->
0235         <DetectChar context="MaybeBracketExpression" char="[" lookAhead="1"/>
0236         <!-- start a group command or BraceExpansion with { -->
0237         <DetectChar attribute="Keyword" context="Group" char="{" beginRegion="group"/>
0238 
0239         <!-- handle ` -->
0240         <DetectChar attribute="Backquote" context="CommandBackq" char="`"/>
0241 
0242         <!-- &> redirections -->
0243         <Detect2Chars attribute="Redirection" context="Prefix&amp;>" char="&amp;" char1=">"/>
0244         <Detect2Chars attribute="Control" context="#stay" char="&amp;" char1="!"/>
0245 
0246         <!-- handle branche conditions -->
0247         <Detect2Chars attribute="Control" context="#stay" char="&amp;" char1="&amp;"/>
0248         <Detect2Chars attribute="Control" context="#stay" char="|" char1="|"/>
0249 
0250         <!-- handle &, |, ; -->
0251         <AnyChar attribute="Control" context="#stay" String="&amp;|;"/>
0252 
0253         <!-- handle variable assignments -->
0254         <RegExpr attribute="Variable" context="VarAssign" String="&varname;(?=\+?=|\[(?:$|[^]]))|[0-9]+(?=\+?=)"/>
0255         <!-- handle keywords -->
0256         <keyword context="DispatchKeyword" String="keywords" lookAhead="1"/>
0257         <!-- handle commands that have variable names as argument -->
0258         <keyword attribute="Builtin" context="VarName" String="builtins_var" lookAhead="1"/>
0259         <WordDetect attribute="Builtin" context="#stay" String="noglob"/>
0260         <WordDetect attribute="Builtin" context="#stay" String="coproc"/>
0261         <!-- mark function definitions without function keyword -->
0262         <RegExpr attribute="Function" context="#stay" String="&funcname;[ &tab;]*\(\)"/>
0263         <keyword attribute="Builtin" context="CommandArgs" String="builtins"/>
0264         <keyword attribute="Command" context="CommandArgs" String="unixcommands"/>
0265 
0266         <!-- handle redirection -->
0267         <AnyChar context="CommandMaybeRedirection" String="&lt;&gt;0123456789" lookAhead="1"/>
0268 
0269         <DetectChar attribute="Error" context="#stay" char=")"/>
0270         <DetectChar context="MaybeGroupEnd" char="}" lookAhead="1"/>
0271 
0272         <LineContinue attribute="Escape" context="#stay"/>
0273 
0274         <Detect2Chars attribute="Expression" context="#stay" char="!" char1=" "/>
0275       </context>
0276       <context attribute="Normal Text" lineEndContext="#pop" name="MaybeGroupEnd">
0277         <RegExpr context="#pop!Command" String="&nogroupend;" lookAhead="1"/>
0278         <DetectChar attribute="Error" context="#pop" char="}"/>
0279       </context>
0280       <context attribute="Normal Text" lineEndContext="#pop" name="MaybeBracketExpression" fallthroughContext="#pop!Command">
0281         <!-- start expression in double brackets -->
0282         <RegExpr attribute="Keyword" context="#pop!ExprDblBracket" String="\[\[(?=$|[ &tab;(])" beginRegion="expression"/>
0283         <!-- start expression in single brackets -->
0284         <RegExpr attribute="Builtin" context="#pop!ExprBracket" String="\[&eos;" beginRegion="expression"/>
0285       </context>
0286       <context attribute="Normal Text" lineEndContext="#pop" name="CommandMaybeRedirection" fallthroughContext="#pop!Command">
0287         <IncludeRules context="FindRedirection"/>
0288       </context>
0289       <context attribute="Normal Text" lineEndContext="#pop" name="Return" fallthroughContext="#pop">
0290         <DetectSpaces attribute="Normal Text" context="#stay"/>
0291         <Int attribute="Number" context="#stay"/>
0292       </context>
0293       <!-- Comment consumes shell comments till EOL -->
0294       <context attribute="Comment" lineEndContext="#pop" name="Comment">
0295         <DetectSpaces attribute="Comment"/>
0296         <IncludeRules context="##Comments"/>
0297         <DetectIdentifier attribute="Comment" context="#stay"/>
0298       </context>
0299 
0300       <!-- Group is called after a { is encountered -->
0301       <context attribute="Normal Text" lineEndContext="#stay" name="Group" fallthroughContext="Command">
0302         <DetectChar attribute="Keyword" context="#pop!GroupEnd" char="}" endRegion="group"/>
0303         <IncludeRules context="Start"/>
0304       </context>
0305       <context attribute="Normal Text" lineEndContext="#pop" name="GroupEnd" fallthroughContext="#pop!CommandArgs">
0306         <DetectSpaces attribute="Normal Text" context="#stay"/>
0307         <WordDetect attribute="Control Flow" context="#pop" String="always"/>
0308       </context>
0309 
0310       <context attribute="OtherCommand" lineEndContext="#pop" name="Command">
0311         <DetectSpaces attribute="Normal Text" context="#pop!CommandArgs"/>
0312         <DetectIdentifier attribute="OtherCommand" context="#stay"/>
0313         <DetectChar context="CommandVariables" char="$" lookAhead="1"/>
0314         <IncludeRules context="FindStrings"/>
0315         <Detect2Chars attribute="Control" context="#pop" char="&amp;" char1="&amp;"/>
0316         <Detect2Chars attribute="Control" context="#pop" char="|" char1="|"/>
0317         <DetectChar attribute="Control" context="#pop" char="|"/>
0318         <AnyChar context="#pop" String=";)`" lookAhead="1"/>
0319         <AnyChar context="#pop!CommandArgs" String="&amp;&lt;>" lookAhead="1"/>
0320         <!-- start expression in double parentheses -->
0321         <Detect2Chars attribute="Error" context="#pop!ExprDblParen" char="(" char1="(" beginRegion="expression"/>
0322         <!-- start a subshell -->
0323         <DetectChar attribute="Error" context="#pop!SubShell" char="(" beginRegion="subshell"/>
0324         <DetectChar context="CommandAssumeEscape" char="\" lookAhead="1"/>
0325         <DetectChar context="CommandMaybeBraceExpansion" char="{" lookAhead="1"/>
0326         <DetectChar context="CommandMaybeGroupEnd" char="}" lookAhead="1"/>
0327       </context>
0328       <context attribute="Command" lineEndContext="#pop" name="CommandVariables">
0329         <IncludeRules context="DispatchVariables"/>
0330         <DetectChar attribute="OtherCommand" context="#pop" char="$"/>
0331       </context>
0332       <context attribute="OtherCommand" lineEndContext="#pop" name="CommandAssumeEscape">
0333         <LineContinue attribute="Escape" context="#pop"/>
0334         <RegExpr attribute="OtherCommand" context="#pop" String="\\."/>
0335       </context>
0336       <context attribute="OtherCommand" lineEndContext="#pop" name="CommandMaybeBraceExpansion">
0337         <IncludeRules context="DispatchBraceExpansion"/>
0338         <DetectChar attribute="OtherCommand" context="#pop" char="{"/>
0339       </context>
0340       <context attribute="Normal Text" lineEndContext="#pop" name="CommandMaybeGroupEnd">
0341         <RegExpr attribute="OtherCommand" context="#pop" String="&nogroupend;+"/>
0342         <DetectChar context="#pop#pop" char="}" lookAhead="1"/>
0343       </context>
0344 
0345       <context attribute="Variable" lineEndContext="#pop" name="DispatchVariables">
0346         <IncludeRules context="DispatchSubstVariables"/>
0347         <IncludeRules context="DispatchStringVariables"/>
0348         <IncludeRules context="DispatchVarNameVariables"/>
0349       </context>
0350       <context attribute="Variable" lineEndContext="#pop" name="DispatchSubstVariables">
0351         <Detect2Chars attribute="Parameter Expansion" context="#pop!VarBraceStart" char="$" char1="{"/>
0352         <StringDetect context="#pop!ExprDblParenSubstOrSubstCommand" String="$((" lookAhead="1"/>
0353         <Detect2Chars attribute="Parameter Expansion" context="#pop!SubstCommand" char="$" char1="(" beginRegion="subshell"/>
0354       </context>
0355       <context attribute="Variable" lineEndContext="#pop" name="DispatchStringVariables">
0356         <Detect2Chars attribute="String SingleQ" context="#pop!StringEsc" char="$" char1="'"/>
0357         <Detect2Chars attribute="String Transl." context="#pop!StringDQ" char="$" char1="&quot;"/>
0358       </context>
0359       <context attribute="Variable" lineEndContext="#pop" name="DispatchVarNameVariables">
0360         <RegExpr attribute="Dollar Prefix" context="#pop!VarNamePrefixedWithDollar" String="\$(?=&varname;|[0-9]+|[-*@?$!#~=^+])"/>
0361       </context>
0362       <context attribute="Variable" lineEndContext="#pop" name="VarNamePrefixedWithDollar">
0363         <DetectIdentifier attribute="Variable" context="#pop!AfterVarName"/>
0364         <Int attribute="Variable" context="#pop!AfterVarName" additionalDeliminator="$"/>
0365         <AnyChar attribute="Variable" context="#pop!AfterVarName" String="-*@?$!"/>
0366         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarNameSubstLen" char="#"/>
0367         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarNameParam+" char="+"/>
0368         <AnyChar attribute="Parameter Expansion Operator" context="#pop!VarNameParam" String="~=^"/>
0369       </context>
0370       <context attribute="Variable" lineEndContext="#pop" name="VarNameSubstLen" fallthroughContext="#pop!AfterVarName">
0371         <DetectIdentifier attribute="Variable" context="#pop!AfterVarName"/>
0372         <AnyChar attribute="Variable" context="#pop!AfterVarName" String="-*@?$!"/>
0373         <Int attribute="Variable" context="#pop!AfterVarName" additionalDeliminator="#~=^+{}[]:-/$"/>
0374       </context>
0375       <context attribute="Variable" lineEndContext="#pop" name="VarNameParam" fallthroughContext="#pop!AfterVarName">
0376         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarNameSubstLen" char="#"/>
0377         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarNameParam+" char="+"/>
0378         <AnyChar attribute="Parameter Expansion Operator" context="#stay" String="^=~"/>
0379         <IncludeRules context="VarNameSubstLen"/>
0380       </context>
0381       <context attribute="Variable" lineEndContext="#pop" name="VarNameParam+" fallthroughContext="#pop">
0382         <IncludeRules context="VarNameSubstLen"/>
0383       </context>
0384 
0385       <!-- called as soon as $xxx is encoutered -->
0386       <context attribute="Normal Text" lineEndContext="#pop" name="AfterVarName" fallthroughContext="#pop">
0387         <DetectChar context="VarNameDispatchModifiers" char=":" lookAhead="1"/>
0388         <DetectChar attribute="Parameter Expansion Operator" context="Subscript" char="["/>
0389       </context>
0390       <context attribute="Normal Text" lineEndContext="#pop#pop" name="VarNameDispatchModifiers" fallthroughContext="#pop#pop">
0391         <Detect2Chars attribute="Parameter Expansion" context="#pop" char=":" char1="a"/>
0392         <Detect2Chars attribute="Parameter Expansion" context="#pop" char=":" char1="A"/>
0393         <Detect2Chars attribute="Parameter Expansion" context="#pop" char=":" char1="c"/>
0394         <Detect2Chars attribute="Parameter Expansion" context="#pop" char=":" char1="e"/>
0395         <Detect2Chars attribute="Parameter Expansion" context="#pop!VarNameModifier_h" char=":" char1="h"/>
0396         <Detect2Chars attribute="Parameter Expansion" context="#pop" char=":" char1="l"/>
0397         <Detect2Chars attribute="Parameter Expansion" context="#pop" char=":" char1="p"/>
0398         <Detect2Chars attribute="Parameter Expansion" context="#pop" char=":" char1="P"/>
0399         <Detect2Chars attribute="Parameter Expansion" context="#pop" char=":" char1="q"/>
0400         <Detect2Chars attribute="Parameter Expansion" context="#pop" char=":" char1="Q"/>
0401         <Detect2Chars attribute="Parameter Expansion" context="#pop" char=":" char1="r"/>
0402         <Detect2Chars attribute="Parameter Expansion" context="#pop!VarNameModifier_s" char=":" char1="s"/>
0403         <Detect2Chars attribute="Parameter Expansion" context="#pop!VarNameModifier_h" char=":" char1="t"/>
0404         <Detect2Chars attribute="Parameter Expansion" context="#pop" char=":" char1="u"/>
0405         <Detect2Chars attribute="Parameter Expansion" context="#pop" char=":" char1="x"/>
0406         <Detect2Chars attribute="Parameter Expansion" context="#pop" char=":" char1="&amp;"/>
0407         <StringDetect attribute="Parameter Expansion" context="#pop!VarNameModifier_s" String=":gs"/>
0408       </context>
0409       <context attribute="Normal Text" lineEndContext="#pop#pop" name="VarNameModifier_h" fallthroughContext="#pop">
0410         <AnyChar attribute="Number" context="#stay" String="0123456789"/>
0411       </context>
0412       <context attribute="Parameter Expansion Operator" lineEndContext="#pop#pop" name="VarNameModifier_s" fallthroughContext="#pop#pop">
0413         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarNameModifier_s_Str" char="/"/>
0414       </context>
0415       <context attribute="String SingleQ" lineEndContext="#pop#pop" name="VarNameModifier_s_Str">
0416         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarNameModifier_s_Rep" char="/"/>
0417         <DetectChar context="AssumeEscape" char="\" lookAhead="1"/>
0418         <DetectChar attribute="String DoubleQ" context="#pop" char="&quot;"/>
0419         <DetectChar attribute="String SingleQ" context="#pop" char="'"/>
0420       </context>
0421       <context attribute="String SingleQ" lineEndContext="#pop#pop" name="VarNameModifier_s_Rep">
0422         <DetectChar context="AssumeEscape" char="\" lookAhead="1"/>
0423         <IncludeRules context="FindWord"/>
0424         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="/"/>
0425         <AnyChar context="#pop#pop" String=" &tab;&lt;>|&amp;;()" lookAhead="1"/>
0426         <DetectIdentifier attribute="String SingleQ"/>
0427       </context>
0428 
0429       <context attribute="Normal Text" lineEndContext="#stay" name="CommandBackq" fallthroughContext="Command">
0430         <DetectChar attribute="Backquote" context="#pop!CommandArgs" char="`"/>
0431         <DetectChar attribute="Comment" context="CommentBackq" char="#"/>
0432         <IncludeRules context="Start"/>
0433       </context>
0434       <!-- CommentBackq consumes shell comments till EOL or a backquote -->
0435       <context attribute="Comment" lineEndContext="#pop" name="CommentBackq">
0436         <DetectChar context="#pop" char="`" lookAhead="1"/>
0437         <IncludeRules context="Comment"/>
0438       </context>
0439 
0440       <!-- CommandArgs matches the items after a command -->
0441       <context attribute="Normal Text" lineEndContext="#pop" name="CommandArgs" fallthroughContext="CommandArg">
0442         <DetectSpaces attribute="Normal Text" context="#stay"/>
0443 
0444         <!-- &> redirections -->
0445         <Detect2Chars attribute="Redirection" context="Prefix&amp;>" char="&amp;" char1=">"/>
0446 
0447         <!-- handle &, |, ;, ` -->
0448         <AnyChar context="#pop" String="&amp;|;`" lookAhead="1"/>
0449 
0450         <!-- handle process subst -->
0451         <Detect2Chars attribute="Redirection" context="ProcessSubst" char="=" char1="("/>
0452         <!-- handle redirection -->
0453         <AnyChar context="CommandArgMaybeRedirection" String="&gt;&lt;0123456789" lookAhead="1"/>
0454 
0455         <DetectChar context="#pop" char=")" lookAhead="1"/>
0456       </context>
0457       <context attribute="Normal Text" lineEndContext="#pop#pop" name="CommandArg" fallthroughContext="#pop!NormalOption">
0458         <!-- In command arguments, do not allow comments after escaped characters.
0459              This avoids highlighting comments within paths or other text. Ex: pathtext\ #no\ comment -->
0460         <DetectChar context="#pop#pop" char="#" lookAhead="1"/>
0461         <Detect2Chars attribute="Option" context="#pop!LongOption" char="-" char1="-"/>
0462         <DetectChar attribute="Option" context="#pop!ShortOption" char="-"/>
0463         <DetectChar attribute="Keyword" context="#pop!NormalOption" char="="/>
0464       </context>
0465       <context attribute="Normal Text" lineEndContext="#pop" name="CommandArgMaybeRedirection" fallthroughContext="#pop!NormalOption">
0466         <IncludeRules context="FindRedirection"/>
0467       </context>
0468 
0469       <context attribute="Option" lineEndContext="#pop" name="ShortOption" fallthroughContext="#pop">
0470         <DetectChar attribute="Path" context="PathThenPop" char="/"/>
0471         <IncludeRules context="LongOption"/>
0472       </context>
0473       <context attribute="Option" lineEndContext="#pop" name="LongOption" fallthroughContext="#pop">
0474         <AnyChar context="#pop" String="&wordseps_or_extglog;" lookAhead="1"/>
0475         <DetectChar attribute="Operator" context="#pop!NormalOption" char="="/>
0476         <IncludeRules context="FindWord"/>
0477         <IncludeRules context="FindSingleGlob"/>
0478         <IncludeRules context="FindGlobAny"/>
0479         <AnyChar context="#pop!NormalOption" String="({}&lt;" lookAhead="1"/>
0480         <RegExpr attribute="Option" context="#stay" String="&opt;"/>
0481       </context>
0482       <context attribute="Normal Text" lineEndContext="#pop" name="NormalOption" fallthroughContext="#pop">
0483         <AnyChar context="#pop" String="&wordseps_or_extglog;" lookAhead="1"/>
0484         <IncludeRules context="FindWord"/>
0485         <DetectChar attribute="Glob" context="PathThenPop" char="[" lookAhead="1"/>
0486         <DetectChar context="ExprGlobParenThenPath" char="(" lookAhead="1"/>
0487         <IncludeRules context="FindPathThenPop"/>
0488         <DetectChar context="NormalOptionMaybeBraceExpansion" char="{" lookAhead="1"/>
0489         <DetectChar context="NormalOptionMaybeGroupEnd" char="}" lookAhead="1"/>
0490         <IncludeRules context="FindNormalTextOption"/>
0491         <DetectChar context="MaybeGlobRangeOrPop" char="&lt;" lookAhead="1"/>
0492       </context>
0493       <context attribute="Normal Text" lineEndContext="#pop#pop" name="NormalOptionRecBrace">
0494         <AnyChar context="#pop#pop" String="&wordseps_or_extglog;" lookAhead="1"/>
0495         <IncludeRules context="FindWord"/>
0496         <IncludeRules context="FindSingleGlob"/>
0497         <IncludeRules context="FindGlobAny"/>
0498         <DetectChar context="ExprGlobParen" char="(" lookAhead="1"/>
0499         <DetectChar context="NormalOptionMaybeBraceExpansion" char="{" lookAhead="1"/>
0500         <DetectChar attribute="Normal Text" context="#pop" char="}"/>
0501         <DetectChar context="MaybeGlobRangeOrPop" char="&lt;" lookAhead="1"/>
0502         <DetectIdentifier/>
0503       </context>
0504       <context attribute="Normal Text" lineEndContext="#pop" name="NormalOptionMaybeGroupEnd">
0505         <IncludeRules context="FindNoGroupEndThenPop"/>
0506         <DetectChar context="#pop#pop#pop" char="}" lookAhead="1"/>
0507       </context>
0508       <context attribute="Normal Text" lineEndContext="#pop" name="FindNoGroupEndThenPop">
0509         <RegExpr context="#pop" String="&nogroupend;"/>
0510       </context>
0511       <context attribute="Normal Text" lineEndContext="#stay" name="FindNormalTextOption">
0512         <RegExpr attribute="Normal Text" context="#stay" String="([^[&wordseps;&substseps;]+|&nogroupend;)+"/>
0513       </context>
0514       <context attribute="Normal Text" lineEndContext="#pop" name="NormalOptionMaybeBraceExpansion">
0515         <IncludeRules context="DispatchBraceExpansion"/>
0516         <DetectChar attribute="Normal Text" context="#pop!NormalOptionRecBrace" char="{"/>
0517       </context>
0518 
0519       <context attribute="Normal Text" lineEndContext="#pop" name="AssumeEscape">
0520         <LineContinue attribute="Escape" context="#pop"/>
0521         <RegExpr attribute="Escape" context="#pop" String="\\."/>
0522       </context>
0523 
0524 <!-- ====== The following rulessets are meant to be included ======== -->
0525 
0526       <!-- FindRedirection consumes shell redirection -->
0527       <context attribute="Normal Text" lineEndContext="#pop" name="FindRedirection">
0528         <RegExpr attribute="File Descriptor" context="#pop!AssumeRedirection" String="[0-9]++(?=[&lt;>])"/>
0529         <IncludeRules context="AssumeRedirection"/>
0530       </context>
0531 
0532       <!-- DispatchBraceExpansion consumes brace expansions -->
0533       <context attribute="Normal Text" lineEndContext="#pop" name="DispatchBraceExpansion">
0534         <RegExpr context="#pop!BraceExpansion" String="&braceexpansion;" lookAhead="1"/>
0535         <IncludeRules context="IncBraceExpansion"/>
0536       </context>
0537       <context attribute="Normal Text" lineEndContext="#pop" name="DispatchPathBraceExpansion">
0538         <RegExpr context="#pop!PathBraceExpansion" String="&braceexpansion;" lookAhead="1"/>
0539         <IncludeRules context="IncBraceExpansion"/>
0540       </context>
0541       <context attribute="Normal Text" lineEndContext="#pop" name="IncBraceExpansion">
0542         <RegExpr attribute="Escape" context="#pop!SequenceExpression" String="&bracerangeexpansion;"/>
0543         <RegExpr context="#pop" String="&nobraceexpansion;"/>
0544       </context>
0545 
0546       <!-- FindPathThenPop consumes path -->
0547       <context attribute="Normal Text" lineEndContext="#pop" name="FindPathThenPop">
0548         <AnyChar attribute="Glob" context="PathThenPop" String="?*#^"/>
0549         <RegExpr attribute="Path" context="PathThenPop" String="&pathpart;"/>
0550         <DetectChar attribute="Glob" context="PathThenPop" char="~"/>
0551       </context>
0552       <context attribute="Path" lineEndContext="#pop#pop" name="IncPath">
0553         <IncludeRules context="FindWord"/>
0554         <IncludeRules context="FindSingleGlob"/>
0555         <IncludeRules context="FindGlobAny"/>
0556         <DetectChar context="ExprGlobParen" char="(" lookAhead="1"/>
0557         <RegExpr attribute="Path" context="#stay" String="&path;"/>
0558         <DetectChar context="MaybeGlobRangeOrPop" char="&lt;" lookAhead="1"/>
0559         <DetectChar context="PathMaybeBraceExpansion" char="{" lookAhead="1"/>
0560       </context>
0561       <context attribute="Path" lineEndContext="#pop#pop" name="PathThenPop">
0562         <AnyChar context="#pop#pop" String="&wordseps_or_extglog;" lookAhead="1"/>
0563         <IncludeRules context="IncPath"/>
0564         <DetectChar context="PathMaybeGroupEnd" char="}" lookAhead="1"/>
0565         <DetectIdentifier attribute="Path"/>
0566       </context>
0567       <context attribute="Path" lineEndContext="#pop" name="PathRecBrace">
0568         <AnyChar context="#pop" String="&wordseps_or_extglog;" lookAhead="1"/>
0569         <IncludeRules context="IncPath"/>
0570         <DetectChar attribute="Path" context="#pop" char="}"/>
0571         <DetectIdentifier attribute="Path"/>
0572       </context>
0573       <context attribute="Glob" lineEndContext="#stay" name="MaybeGlobRangeOrPop" fallthroughContext="#pop#pop">
0574         <IncludeRules context="FindGlobRangeThenPop"/>
0575       </context>
0576       <context attribute="Path" lineEndContext="#pop" name="PathMaybeBraceExpansion">
0577         <IncludeRules context="DispatchPathBraceExpansion"/>
0578         <DetectChar attribute="Path" context="#pop!PathRecBrace" char="{"/>
0579       </context>
0580       <context attribute="Path" lineEndContext="#pop" name="PathMaybeGroupEnd">
0581         <IncludeRules context="FindNoGroupEndThenPop"/>
0582         <DetectChar context="#pop#pop#pop" char="}" lookAhead="1"/>
0583       </context>
0584       <context attribute="Glob" lineEndContext="#stay" name="FindGlobRangeThenPop">
0585         <RegExpr attribute="Glob" context="#pop!InGlobRange" String="&lt;(?=[0-9]*-[0-9]*>)"/>
0586       </context>
0587       <context attribute="Number" lineEndContext="#stay" name="InGlobRange">
0588         <AnyChar attribute="Number" context="#stay" String="0123456789"/>
0589         <DetectChar attribute="Glob" context="#stay" char="-"/>
0590         <DetectChar attribute="Glob" context="#pop" char=">"/>
0591       </context>
0592 
0593       <!-- FindPathThenPopInAlternateValue consumes path in ${xx:here}-->
0594       <context attribute="Normal Text" lineEndContext="#pop" name="FindPathThenPopInAlternateValue">
0595         <AnyChar attribute="Glob" context="PathThenPopInAlternateValue" String="&simpleglob;|"/>
0596         <Detect2Chars context="PathThenPopInAlternateValue" char="(" char1="#" lookAhead="1"/>
0597         <AnyChar context="PathThenPopInAlternateValue" String="[(" lookAhead="1"/>
0598         <RegExpr attribute="Path" context="PathThenPopInAlternateValue" String="&pathpart;"/>
0599       </context>
0600       <context attribute="Path" lineEndContext="#pop" name="PathThenPopInAlternateValue">
0601         <AnyChar context="#pop" String="&wordseps_or_extglog;}" lookAhead="1"/>
0602         <IncludeRules context="IncPath"/>
0603         <DetectIdentifier/>
0604       </context>
0605 
0606       <context attribute="Glob" lineEndContext="#stay" name="FindGlobAny">
0607         <DetectChar attribute="Glob" context="GlobAnyFlag" char="["/>
0608       </context>
0609       <context attribute="String SingleQ" lineEndContext="#pop" name="GlobAnyFlag" fallthroughContext="#pop!GlobAny">
0610         <DetectChar attribute="Glob Flag" context="#pop!GlobAny" char="^"/>
0611       </context>
0612       <context attribute="String SingleQ" lineEndContext="#pop" name="GlobAny">
0613         <DetectIdentifier attribute="String SingleQ"/>
0614         <DetectChar context="AssumeEscape" char="\" lookAhead="1"/>
0615         <DetectChar attribute="Glob Flag" context="#stay" char="-"/>
0616         <IncludeRules context="FindStrings"/>
0617         <DetectChar attribute="Glob" context="#pop" char="]"/>
0618         <Detect2Chars attribute="Glob" context="GlobClass" char="[" char1=":"/>
0619       </context>
0620       <context attribute="Glob" lineEndContext="#pop#pop" name="GlobClass">
0621         <DetectIdentifier attribute="Pattern"/>
0622         <Detect2Chars attribute="Glob" context="#pop" char=":" char1="]"/>
0623         <DetectChar attribute="Error" context="#pop" char="]"/>
0624       </context>
0625 
0626       <context attribute="Pattern" lineEndContext="#stay" name="FindSingleGlob">
0627         <AnyChar attribute="Glob" context="#stay" String="&simpleglob;"/>
0628       </context>
0629 
0630       <context attribute="Pattern" lineEndContext="#stay" name="FindGlobPattern">
0631         <AnyChar attribute="Glob" context="#stay" String="&simpleglob;|"/>
0632         <IncludeRules context="FindGlobAny"/>
0633         <IncludeRules context="FindGroupPattern"/>
0634       </context>
0635 
0636       <context attribute="Pattern" lineEndContext="#stay" name="FindPattern">
0637         <IncludeRules context="FindGlobPattern"/>
0638         <DetectChar context="GlobRangeOrError" char="&lt;" lookAhead="1"/>
0639       </context>
0640       <context attribute="Glob" lineEndContext="#stay" name="GlobRangeOrError">
0641         <IncludeRules context="FindGlobRangeThenPop"/>
0642         <DetectChar attribute="Error" context="#pop" char="&lt;"/>
0643       </context>
0644 
0645       <context attribute="Pattern" lineEndContext="#stay" name="FindSubPattern">
0646         <IncludeRules context="FindGlobPattern"/>
0647         <DetectChar context="GlobRangeOrPattern" char="&lt;" lookAhead="1"/>
0648       </context>
0649       <context attribute="Pattern" lineEndContext="#stay" name="GlobRangeOrPattern">
0650         <IncludeRules context="FindGlobRangeThenPop"/>
0651         <DetectChar attribute="Pattern" context="#pop" char="&lt;"/>
0652       </context>
0653 
0654       <context attribute="Pattern" lineEndContext="#stay" name="FindStringDQPattern">
0655         <IncludeRules context="FindGlobPattern"/>
0656         <DetectChar context="GlobRangeOrStringDQ" char="&lt;" lookAhead="1"/>
0657       </context>
0658       <context attribute="String DoubleQ" lineEndContext="#stay" name="GlobRangeOrStringDQ">
0659         <IncludeRules context="FindGlobRangeThenPop"/>
0660         <DetectChar attribute="String DoubleQ" context="#pop" char="&lt;"/>
0661       </context>
0662 
0663       <context attribute="Glob Flag" lineEndContext="#stay" name="FindGroupPattern">
0664         <Detect2Chars attribute="Glob Flag" context="GlobPatFlag" char="(" char1="#"/>
0665         <DetectChar attribute="Glob" context="ExtGlobPattern" char="("/>
0666       </context>
0667       <context attribute="Pattern" lineEndContext="#stay" name="ExtGlobPattern">
0668         <DetectChar attribute="Glob" context="#pop" char=")"/>
0669         <IncludeRules context="FindWord"/>
0670         <IncludeRules context="FindSubPattern"/>
0671         <DetectIdentifier attribute="Pattern"/>
0672       </context>
0673       <context attribute="Pattern" lineEndContext="#stay" name="ExtGlobPatternThenPath">
0674         <DetectChar attribute="Glob" context="#pop!PathThenPop" char=")"/>
0675         <IncludeRules context="FindWord"/>
0676         <IncludeRules context="FindSubPattern"/>
0677         <DetectIdentifier attribute="Pattern"/>
0678       </context>
0679 
0680       <context attribute="Normal Text" lineEndContext="#pop" name="VarAssign" fallthroughContext="#pop">
0681         <DetectChar attribute="Parameter Expansion Operator" context="Subscript" char="["/>
0682         <DetectChar attribute="Operator" context="#pop!Assign" char="="/>
0683         <Detect2Chars attribute="Operator" context="#pop!Assign" char="+" char1="="/>
0684       </context>
0685 
0686       <context attribute="Normal Text" lineEndContext="#pop" name="DispatchKeyword">
0687         <!-- match do and if blocks -->
0688         <Detect2Chars attribute="Control Flow" context="#pop!NotCond" char="i" char1="f" beginRegion="if"/>
0689         <Detect2Chars attribute="Control Flow" context="#pop" char="f" char1="i" endRegion="if"/>
0690         <StringDetect attribute="Control Flow" context="#pop" String="done" endRegion="do"/>
0691         <Detect2Chars attribute="Control Flow" context="#pop" char="d" char1="o" beginRegion="do"/>
0692         <!-- handle while/until as a special case -->
0693         <StringDetect attribute="Control Flow" context="#pop!NotCond" String="while"/>
0694         <StringDetect attribute="Control Flow" context="#pop!NotCond" String="until"/>
0695         <!-- handle for as a special case -->
0696         <StringDetect attribute="Control Flow" context="#pop!Foreach" String="foreach"/>
0697         <StringDetect attribute="Control Flow" context="#pop!For" String="for"/>
0698         <!-- handle select as a special case -->
0699         <StringDetect attribute="Control Flow" context="#pop!Select" String="select"/>
0700         <StringDetect attribute="Control Flow" context="#pop!Repeat" String="repeat"/>
0701         <!-- handle case as a special case -->
0702         <StringDetect attribute="Control Flow" context="#pop!Case" String="case" beginRegion="case"/>
0703         <!-- handle functions with function keyword before keywords -->
0704         <StringDetect attribute="Keyword" context="#pop!FunctionDef" String="function"/>
0705         <StringDetect attribute="Control Flow" context="#pop!Return" String="return"/>
0706         <!-- not a keyword in this context -->
0707         <Detect2Chars attribute="Error" context="#pop" char="i" char1="n"/>
0708         <StringDetect attribute="Error" context="#pop" String="esac"/>
0709         <!-- handle keywords -->
0710         <DetectIdentifier attribute="Control Flow" context="#pop"/>
0711       </context>
0712 
0713       <!-- if ! ... and while ! ... -->
0714       <context attribute="Normal Text" lineEndContext="#pop" name="NotCond" fallthroughContext="#pop">
0715         <DetectSpaces attribute="Normal Text" context="#pop!NotCond2"/>
0716       </context>
0717       <context attribute="Normal Text" lineEndContext="#pop" name="NotCond2" fallthroughContext="#pop">
0718         <Detect2Chars attribute="Expression" context="#pop" char="!" char1="&tab;"/>
0719         <Detect2Chars attribute="Expression" context="#pop" char="!" char1=" "/>
0720         <LineContinue attribute="Expression" context="#pop" char="!"/>
0721       </context>
0722 
0723       <context attribute="Normal Text" lineEndContext="#pop" name="Foreach" fallthroughContext="#pop">
0724         <LineContinue attribute="Escape" context="#stay"/>
0725         <DetectSpaces attribute="Normal Text" context="#stay"/>
0726         <DetectIdentifier attribute="Normal Text" context="#stay"/>
0727         <DetectChar attribute="Keyword" context="#pop!ForeachWord" char="("/>
0728       </context>
0729       <context attribute="Normal Text" lineEndContext="#stay" name="ForeachWord" fallthroughContext="NormalOption">
0730         <DetectSpaces attribute="Normal Text" context="#stay"/>
0731         <DetectChar attribute="Control" context="#stay" char=";"/>
0732         <DetectChar attribute="Keyword" context="#pop" char=")"/>
0733         <DetectChar attribute="Backquote" context="CommandBackq" char="`"/>
0734         <AnyChar attribute="Control" context="#stay" String="&symbolseps;"/>
0735       </context>
0736 
0737       <context attribute="Normal Text" lineEndContext="#pop" name="For" fallthroughContext="#pop">
0738         <LineContinue attribute="Escape" context="#stay"/>
0739         <DetectSpaces attribute="Normal Text" context="#stay"/>
0740         <WordDetect attribute="Keyword" context="#pop!CommandArgs" String="in"/>
0741         <DetectIdentifier attribute="Normal Text" context="#stay"/>
0742         <Detect2Chars attribute="Keyword" context="#pop!ForArithmeticExpr" char="(" char1="("/>
0743         <DetectChar attribute="Keyword" context="#pop!ForeachWord" char="("/>
0744       </context>
0745       <context attribute="Normal Text" lineEndContext="#pop" name="ForArithmeticExpr">
0746         <DetectSpaces attribute="Normal Text" context="#stay"/>
0747         <DetectChar attribute="Control" context="#stay" char=";"/>
0748         <Detect2Chars attribute="Keyword" context="#pop" char=")" char1=")"/>
0749         <IncludeRules context="FindExprDblParen"/>
0750       </context>
0751 
0752       <context attribute="Normal Text" lineEndContext="#pop" name="Select" fallthroughContext="#pop">
0753         <LineContinue attribute="Escape" context="#stay"/>
0754         <DetectSpaces attribute="Normal Text" context="#stay"/>
0755         <DetectIdentifier attribute="Normal Text" context="#pop!SelectIn"/>
0756       </context>
0757       <context attribute="Normal Text" lineEndContext="#pop" name="SelectIn" fallthroughContext="#pop">
0758         <LineContinue attribute="Escape" context="#stay"/>
0759         <DetectSpaces attribute="Normal Text" context="#stay"/>
0760         <WordDetect attribute="Keyword" context="#pop!CommandArgs" String="in"/>
0761       </context>
0762 
0763       <context attribute="Normal Text" lineEndContext="#pop" name="Repeat" fallthroughContext="#pop!RepeatArithmeticExpr">
0764         <LineContinue attribute="Escape" context="#stay"/>
0765         <DetectSpaces attribute="Normal Text" context="#stay"/>
0766       </context>
0767       <context attribute="Normal Text" lineEndContext="#pop" name="RepeatArithmeticExpr">
0768         <DetectSpaces attribute="Normal Text" context="#pop"/>
0769         <DetectChar attribute="Control" context="#pop" char=";"/>
0770         <IncludeRules context="FindExprDblParen"/>
0771       </context>
0772 
0773       <!-- &> and &>> redirection -->
0774       <context attribute="Normal Text" lineEndContext="#pop" name="Prefix&amp;>" fallthroughContext="#pop!FdRedirection">
0775         <Detect2Chars attribute="Redirection" context="#pop!WordRedirection" char=">" char1="|"/>
0776         <Detect2Chars attribute="Redirection" context="#pop!WordRedirection" char=">" char1="!"/>
0777         <AnyChar attribute="Redirection" context="#pop!WordRedirection" String=">|!"/>
0778       </context>
0779 
0780       <context attribute="Normal Text" lineEndContext="#pop" name="AssumeRedirection">
0781         <!-- handle output redirection -->
0782         <StringDetect attribute="Redirection" context="#pop!WordRedirection" String=">>|"/>
0783         <StringDetect attribute="Redirection" context="#pop!WordRedirection" String=">>!"/>
0784         <StringDetect attribute="Redirection" context="#pop!WordRedirection" String=">>&amp;|"/>
0785         <StringDetect attribute="Redirection" context="#pop!WordRedirection" String=">>&amp;!"/>
0786         <StringDetect attribute="Redirection" context="#pop!ProcessSubst" String=">>("/>
0787         <Detect2Chars attribute="Redirection" context="#pop!WordRedirection" char=">" char1=">"/>
0788         <Detect2Chars attribute="Redirection" context="#pop!WordRedirection" char=">" char1="|"/>
0789         <Detect2Chars attribute="Redirection" context="#pop!WordRedirection" char=">" char1="!"/>
0790         <StringDetect attribute="Redirection" context="#pop!WordRedirection" String=">&amp;|"/>
0791         <StringDetect attribute="Redirection" context="#pop!WordRedirection" String=">&amp;!"/>
0792         <Detect2Chars attribute="Redirection" context="#pop!FdRedirection" char=">" char1="&amp;"/>
0793         <Detect2Chars attribute="Redirection" context="#pop!ProcessSubst" char=">" char1="("/>
0794         <DetectChar attribute="Redirection" context="#pop!WordRedirection" char=">"/>
0795         <!-- handle input redirection -->
0796         <Detect2Chars attribute="Redirection" context="#pop!ProcessSubst" char="&lt;" char1="("/>
0797         <StringDetect attribute="Redirection" context="#pop!ProcessSubst" String="&lt;&lt;("/>
0798         <StringDetect attribute="Redirection" context="#pop!StringRedirection" String="&lt;&lt;&lt;"/>
0799         <!-- handle here document -->
0800         <Detect2Chars context="#pop!HereDoc" char="&lt;" char1="&lt;" lookAhead="1"/>
0801         <Detect2Chars attribute="Redirection" context="#pop!FdRedirection" char="&lt;" char1="&amp;"/>
0802         <Detect2Chars attribute="Redirection" context="#pop!WordRedirection" char="&lt;" char1=">"/>
0803         <IncludeRules context="FindGlobRangeThenPop"/>
0804         <DetectChar attribute="Redirection" context="#pop!WordRedirection" char="&lt;"/>
0805       </context>
0806       <context attribute="Normal Text" lineEndContext="#pop" name="FdRedirection" fallthroughContext="#pop!FdRedirection2">
0807         <DetectSpaces attribute="Normal Text" context="#pop!FdRedirection2"/>
0808       </context>
0809       <context attribute="Normal Text" lineEndContext="#pop" name="FdRedirection2" fallthroughContext="#pop!WordRedirection2">
0810         <RegExpr attribute="File Descriptor" context="#pop!CloseFile" String="[0-9]+(?=-?&eoexpr;)"/>
0811       </context>
0812       <context attribute="Normal Text" lineEndContext="#pop" name="WordRedirection" fallthroughContext="#pop!WordRedirection2">
0813         <DetectSpaces attribute="Normal Text" context="#pop!WordRedirection2"/>
0814       </context>
0815       <context attribute="Normal Text" lineEndContext="#pop" name="WordRedirection2" fallthroughContext="#pop">
0816         <AnyChar context="#pop" String="&wordseps;`" lookAhead="1"/>
0817         <IncludeRules context="FindWord"/>
0818         <RegExpr attribute="Path" context="PathThenPop" String="&path;"/>
0819       </context>
0820       <context attribute="Normal Text" lineEndContext="#pop" name="StringRedirection" fallthroughContext="#pop!StringRedirection2">
0821         <DetectSpaces attribute="Normal Text" context="#pop!StringRedirection2"/>
0822       </context>
0823       <context attribute="Normal Text" lineEndContext="#pop" name="StringRedirection2">
0824         <AnyChar context="#pop" String="&wordseps;`" lookAhead="1"/>
0825         <IncludeRules context="FindWord"/>
0826         <DetectIdentifier attribute="Normal Text"/>
0827       </context>
0828       <context attribute="Normal Text" lineEndContext="#pop" name="CloseFile" fallthroughContext="#pop">
0829         <DetectChar attribute="Keyword" context="#pop" char="-"/>
0830       </context>
0831 
0832       <!-- HereDoc consumes Here-documents. It is called at the beginning of the "<<" construct. -->
0833       <context attribute="Normal Text" lineEndContext="#stay" name="HereDoc">
0834         <RegExpr attribute="Redirection" context="HereDocIQ"  String="&lt;&lt;-[ &tab;]*&heredocq;(?=[ &tab;]*$)"/>
0835         <RegExpr attribute="Redirection" context="HereDocINQ" String="&lt;&lt;-[ &tab;]*([^&wordseps;]+)(?=[ &tab;]*$)"/>
0836         <RegExpr attribute="Redirection" context="HereDocQ"   String="&lt;&lt;[ &tab;]*&heredocq;(?=[ &tab;]*$)"/>
0837         <RegExpr attribute="Redirection" context="HereDocNQ"  String="&lt;&lt;[ &tab;]*([^&wordseps;]+)(?=[ &tab;]*$)"/>
0838 
0839         <RegExpr context="HereDocIQCmd"  String="(&lt;&lt;-[ &tab;]*&heredocq;)" lookAhead="1"/>
0840         <RegExpr context="HereDocINQCmd" String="(&lt;&lt;-[ &tab;]*([^&wordseps;]+))" lookAhead="1"/>
0841         <RegExpr context="HereDocQCmd"   String="(&lt;&lt;[ &tab;]*&heredocq;)" lookAhead="1"/>
0842         <RegExpr context="HereDocNQCmd"  String="(&lt;&lt;[ &tab;]*([^&wordseps;]+))" lookAhead="1"/>
0843 
0844         <Detect2Chars attribute="Redirection" context="#pop"  char="&lt;" char1="&lt;"/><!-- always met -->
0845       </context>
0846 
0847       <context attribute="Normal Text" lineEndContext="#pop" name="HereDocRemainder" fallthroughContext="CommandArg">
0848         <AnyChar context="ZshOneLine" String="&amp;|;`" lookAhead="1"/>
0849         <IncludeRules context="CommandArgs"/>
0850       </context>
0851       <context attribute="Normal Text" lineEndContext="#pop" name="ZshOneLine" fallthroughContext="Command">
0852         <IncludeRules context="Start"/>
0853       </context>
0854 
0855       <context attribute="Here Doc" lineEndContext="#stay" name="HereDocQ" dynamic="1" fallthroughContext="HereDocText">
0856         <RegExpr attribute="Redirection" context="#pop#pop" String="^%1$" dynamic="1" column="0"/>
0857       </context>
0858 
0859       <context attribute="Here Doc" lineEndContext="#stay" name="HereDocNQ" dynamic="1" fallthroughContext="HereDocSubstitutions">
0860         <IncludeRules context="HereDocQ" />
0861       </context>
0862 
0863       <context attribute="Here Doc" lineEndContext="#stay" name="HereDocIQ" dynamic="1" fallthroughContext="HereDocText">
0864         <RegExpr attribute="Redirection" context="#pop#pop" String="^\t*%1$" dynamic="1" column="0"/>
0865       </context>
0866 
0867       <context attribute="Here Doc" lineEndContext="#stay" name="HereDocINQ" dynamic="1" fallthroughContext="HereDocSubstitutions">
0868         <IncludeRules context="HereDocIQ" />
0869       </context>
0870 
0871       <context attribute="Here Doc" lineEndContext="#stay" name="HereDocCmd">
0872         <!-- Only if the redirect is before the command, but as this is too complicated,
0873              check if the redirect is at the beginning of the line. -->
0874         <StringDetect attribute="Redirection" context="ZshOneLine" String="%1" dynamic="true" firstNonSpace="1"/>
0875         <StringDetect attribute="Redirection" context="HereDocRemainder" String="%1" dynamic="true"/>
0876       </context>
0877 
0878       <context attribute="Here Doc" lineEndContext="#stay" name="HereDocQCmd" dynamic="1" fallthroughContext="HereDocText">
0879         <IncludeRules context="HereDocCmd"/>
0880         <RegExpr attribute="Redirection" context="#pop#pop" String="^%2$" dynamic="1" column="0"/>
0881       </context>
0882 
0883       <context attribute="Here Doc" lineEndContext="#stay" name="HereDocNQCmd" dynamic="1" fallthroughContext="HereDocSubstitutions">
0884         <IncludeRules context="HereDocQCmd"/>
0885       </context>
0886 
0887       <context attribute="Here Doc" lineEndContext="#stay" name="HereDocIQCmd" dynamic="1" fallthroughContext="HereDocText">
0888         <IncludeRules context="HereDocCmd"/>
0889         <RegExpr attribute="Redirection" context="#pop#pop" String="^\t*%2$" dynamic="1" column="0"/>
0890       </context>
0891 
0892       <context attribute="Here Doc" lineEndContext="#stay" name="HereDocINQCmd" dynamic="1" fallthroughContext="HereDocSubstitutions">
0893         <IncludeRules context="HereDocIQCmd"/>
0894       </context>
0895 
0896       <context attribute="Here Doc" lineEndContext="#pop" name="HereDocText">
0897       </context>
0898 
0899       <context attribute="Here Doc" lineEndContext="#pop" name="HereDocSubstitutions">
0900         <DetectSpaces attribute="Here Doc"/>
0901         <DetectIdentifier attribute="Here Doc"/>
0902         <DetectChar context="HereDocVariables" char="$" lookAhead="1"/>
0903         <DetectChar attribute="Backquote" context="CommandBackq" char="`"/>
0904         <DetectChar context="AssumeEscape" char="\" lookAhead="1"/>
0905       </context>
0906       <context attribute="Here Doc" lineEndContext="#pop" name="HereDocVariables">
0907         <IncludeRules context="DispatchSubstVariables"/>
0908         <IncludeRules context="DispatchVarNameVariables"/>
0909         <DetectChar attribute="Here Doc" context="#pop" char="$"/>
0910       </context>
0911 
0912       <!-- VarName consumes spare variable names and assignments -->
0913       <context attribute="Normal Text" lineEndContext="#pop" name="VarName">
0914         <StringDetect attribute="Builtin" context="#pop!BuiltinGetopts" String="getopts"/>
0915         <StringDetect attribute="Builtin" context="#pop!BuiltinLet" String="let"/>
0916         <DetectIdentifier attribute="Builtin" context="#pop!VarNameArgs"/>
0917         <AnyChar attribute="Builtin" context="#pop!VarNameArgs" String=".:-"/>
0918       </context>
0919       <context attribute="Normal Text" lineEndContext="#pop" name="VarNameArgs" fallthroughContext="#pop!CommandArgs">
0920         <DetectSpaces attribute="Normal Text" context="VarNameArg"/>
0921         <LineContinue attribute="Escape" context="#stay"/>
0922       </context>
0923       <context attribute="Normal Text" lineEndContext="#pop#pop" name="VarNameArg" fallthroughContext="#pop!VarNameArg2">
0924         <!-- In command arguments, do not allow comments after escaped characters.
0925              This avoids highlighting comments within paths or other text. Ex: pathtext\ #no\ comment -->
0926         <DetectChar context="#pop#pop" char="#" lookAhead="1"/>
0927         <AnyChar attribute="Option" context="#pop!ShortOption" String="-+"/>
0928         <DetectChar attribute="Keyword" context="#pop!VarNameArg2" char="="/>
0929       </context>
0930       <context attribute="Normal Text" lineEndContext="#pop" name="VarNameArg2" fallthroughContext="#pop!NormalOption">
0931         <DetectChar attribute="Variable" context="Subscript" char="["/>
0932         <DetectChar attribute="Operator" context="Assign" char="="/>
0933         <DetectChar attribute="Variable" context="AssignArray" char="("/>
0934         <DetectIdentifier attribute="Variable" context="#stay"/>
0935       </context>
0936       <context attribute="Normal Text" lineEndContext="#pop" name="BuiltinGetopts" fallthroughContext="#pop!CommandArgs">
0937         <DetectSpaces attribute="Normal Text" context="#pop!BuiltinGetoptsOpt"/>
0938         <LineContinue attribute="Escape" context="#stay"/>
0939       </context>
0940       <context attribute="Normal Text" lineEndContext="#pop#pop" name="BuiltinGetoptsOpt" fallthroughContext="#pop!BuiltinGetoptsOpt2">
0941         <DetectChar context="#pop#pop" char="#" lookAhead="1"/>
0942         <DetectChar attribute="Keyword" context="#pop!NormalOption" char="="/>
0943       </context>
0944       <context attribute="Normal Text" lineEndContext="#pop" name="BuiltinGetoptsOpt2" fallthroughContext="#pop!NormalOption">
0945         <DetectChar attribute="Operator" context="#stay" char=":"/>
0946         <DetectIdentifier attribute="Normal Text" context="#stay" />
0947         <DetectSpaces attribute="Normal Text" context="#pop!BuiltinGetoptsVar"/>
0948         <AnyChar context="#pop" String="&wordseps_or_extglog;" lookAhead="1"/>
0949         <IncludeRules context="FindWord"/>
0950         <DetectChar context="NormalOptionMaybeBraceExpansion" char="{" lookAhead="1"/>
0951         <DetectChar context="NormalOptionMaybeGroupEnd" char="}" lookAhead="1"/>
0952         <AnyChar attribute="Normal Text" context="#stay" String="/%.0123456789"/>
0953       </context>
0954       <context attribute="Normal Text" lineEndContext="#pop" name="BuiltinGetoptsVar" fallthroughContext="#pop!CommandArgs">
0955         <DetectIdentifier attribute="Variable" context="#pop!CommandArgs"/>
0956       </context>
0957       <context attribute="Normal Text" lineEndContext="#pop" name="BuiltinLet" fallthroughContext="#pop!CommandArgs">
0958         <DetectSpaces attribute="Normal Text" context="#pop!BuiltinLetArgs"/>
0959         <LineContinue attribute="Escape" context="#stay"/>
0960       </context>
0961       <context attribute="Normal Text" lineEndContext="#pop" name="BuiltinLetArgs" fallthroughContext="BuiltinLetArg">
0962         <AnyChar context="BuiltinLetArgsNumber" String="0123456789" lookAhead="1"/>
0963         <IncludeRules context="CommandArgs"/>
0964       </context>
0965       <context attribute="Normal Text" lineEndContext="#pop" name="BuiltinLetArgsNumber" fallthroughContext="#pop!BuiltinLetArg">
0966         <IncludeRules context="FindRedirection"/>
0967       </context>
0968       <context attribute="Normal Text" lineEndContext="#pop#pop" name="BuiltinLetArg" fallthroughContext="#pop!BuiltinLetExpr">
0969         <DetectChar context="#pop#pop" char="#" lookAhead="1"/>
0970         <DetectChar attribute="Keyword" context="#pop!NormalOption" char="="/>
0971       </context>
0972       <context attribute="Normal Text" lineEndContext="#pop" name="BuiltinLetExpr" fallthroughContext="#pop!NormalOption">
0973         <DetectIdentifier attribute="Variable" context="#stay" />
0974         <AnyChar context="#pop" String="&wordseps_or_extglog;" lookAhead="1"/>
0975         <AnyChar attribute="Operator" context="#stay" String="+-!%=^:"/>
0976         <AnyChar context="Number" String="0123456789." lookAhead="1"/>
0977         <DetectChar attribute="Parameter Expansion Operator" context="Subscript" char="["/>
0978         <IncludeRules context="FindWord"/>
0979         <Detect2Chars attribute="BaseN" context="NoPrefix" char="#" char1="#"/>
0980         <DetectChar attribute="Error" context="#stay" char="#"/>
0981         <DetectChar context="NormalOptionMaybeBraceExpansion" char="{" lookAhead="1"/>
0982         <DetectChar context="NormalOptionMaybeGroupEnd" char="}" lookAhead="1"/>
0983       </context>
0984 
0985       <!-- ProcessSubst handles <(command) and >(command) -->
0986       <context attribute="Normal Text" lineEndContext="#stay" name="ProcessSubst" fallthroughContext="Command">
0987         <DetectChar attribute="Redirection" context="#pop" char=")"/>
0988         <IncludeRules context="Start"/>
0989       </context>
0990 
0991       <!-- StringSQ consumes anything till ' -->
0992       <context attribute="String SingleQ" lineEndContext="#stay" name="StringSQ">
0993         <DetectSpaces attribute="String SingleQ"/>
0994         <DetectIdentifier attribute="String SingleQ"/>
0995         <DetectChar attribute="String SingleQ" context="#pop" char="'"/>
0996       </context>
0997 
0998       <!-- StringDQ consumes anything till ", substitutes vars and expressions -->
0999       <context attribute="String DoubleQ" lineEndContext="#stay" name="StringDQ">
1000         <DetectSpaces attribute="String DoubleQ"/>
1001         <DetectIdentifier attribute="String DoubleQ"/>
1002         <DetectChar attribute="String DoubleQ" context="#pop" char="&quot;"/>
1003         <DetectChar context="StringDQEscape" char="\" lookAhead="1"/>
1004         <DetectChar context="StringDQDispatchVariables" char="$" lookAhead="1"/>
1005         <DetectChar attribute="Backquote" context="RegularBackq" char="`"/>
1006       </context>
1007       <context attribute="String DoubleQ" lineEndContext="#stay" name="StringDQDispatchVariables">
1008         <IncludeRules context="DispatchSubstVariables"/>
1009         <IncludeRules context="DispatchVarNameVariables"/>
1010         <DetectChar attribute="String DoubleQ" context="#pop" char="$"/>
1011       </context>
1012       <context attribute="String DoubleQ" lineEndContext="#pop" name="StringDQEscape">
1013         <Detect2Chars attribute="String Escape" context="#pop" char="\" char1="&quot;"/>
1014         <Detect2Chars attribute="String Escape" context="#pop" char="\" char1="\"/>
1015         <Detect2Chars attribute="String Escape" context="#pop" char="\" char1="`"/>
1016         <Detect2Chars attribute="String Escape" context="#pop" char="\" char1="$"/>
1017         <LineContinue attribute="String Escape" context="#pop"/>
1018         <DetectChar attribute="String DoubleQ" context="#pop" char="\"/>
1019       </context>
1020 
1021       <!-- RegularBackq consumes anything till ` -->
1022       <context attribute="Normal Text" lineEndContext="#stay" name="RegularBackq" fallthroughContext="Command">
1023         <DetectChar attribute="Backquote" context="#pop" char="`"/>
1024         <DetectChar attribute="Comment" context="CommentBackq" char="#"/>
1025         <IncludeRules context="Start"/>
1026       </context>
1027 
1028       <!-- StringEsc eats till ', but escaping many characters -->
1029       <context attribute="String SingleQ" lineEndContext="#stay" name="StringEsc">
1030         <DetectSpaces attribute="String SingleQ"/>
1031         <DetectIdentifier attribute="String SingleQ"/>
1032         <DetectChar attribute="String SingleQ" context="#pop" char="'"/>
1033         <RegExpr attribute="String Escape" context="#stay" String="\\(?:[abefnrtv\\']|[0-7]{1,3}|x[A-Fa-f0-9]{1,2}|c.)"/>
1034       </context>
1035 
1036       <context attribute="Normal Text" lineEndContext="#stay" name="FindWord">
1037         <IncludeRules context="FindStrings"/>
1038         <DetectChar context="RegularVariable" char="$" lookAhead="1"/>
1039         <DetectChar attribute="Backquote" context="RegularBackq" char="`"/>
1040         <DetectChar context="AssumeEscape" char="\" lookAhead="1"/>
1041       </context>
1042       <context attribute="Normal Text" lineEndContext="#pop" name="RegularVariable">
1043         <IncludeRules context="DispatchVariables"/>
1044         <DetectChar attribute="Normal Text" context="#pop" char="$"/>
1045       </context>
1046 
1047       <context attribute="Normal Text" lineEndContext="#pop" name="FindStrings">
1048         <DetectChar attribute="String SingleQ" context="StringSQ" char="'"/>
1049         <DetectChar attribute="String DoubleQ" context="StringDQ" char="&quot;"/>
1050       </context>
1051 
1052       <!-- SubstCommand is called after a $( is encountered -->
1053       <context attribute="Normal Text" lineEndContext="#stay" name="SubstCommand" fallthroughContext="Command">
1054         <DetectChar attribute="Parameter Expansion" context="#pop" char=")" endRegion="subshell"/>
1055         <IncludeRules context="Start"/>
1056       </context>
1057 
1058       <!-- VarBraceStart is called as soon as ${ is encoutered -->
1059       <context attribute="Variable" lineEndContext="#pop" name="VarBraceStart" fallthroughContext="#pop!CheckVarAlt">
1060         <DetectChar attribute="Parameter Expansion" context="#pop!VarFlags" char="("/>
1061         <IncludeRules context="VarFlagsVar"/>
1062       </context>
1063       <context attribute="Variable" lineEndContext="#stay" name="VarBraceStartRecursive" fallthroughContext="#pop#pop!CheckVarAlt">
1064         <Detect2Chars attribute="Parameter Expansion" context="VarBraceStart" char="$" char1="{"/>
1065         <StringDetect context="#pop!ExprDblParenSubstOrSubstCommand" String="$((" lookAhead="1"/>
1066         <Detect2Chars attribute="Parameter Expansion" context="#pop!SubstCommand" char="$" char1="(" beginRegion="subshell"/>
1067         <DetectChar attribute="Error" context="#pop" char="$"/>
1068       </context>
1069       <context attribute="Error" lineEndContext="#stay" name="VarError">
1070         <DetectChar attribute="Parameter Expansion" context="#pop" char="}"/>
1071       </context>
1072       <context attribute="Normal Text" lineEndContext="#stay" name="CheckVarAlt" fallthroughContext="#pop!VarError">
1073         <DetectChar attribute="Parameter Expansion" context="#pop" char="}"/>
1074         <StringDetect attribute="Parameter Expansion Operator" context="#stay" String="[@]"/>
1075         <StringDetect attribute="Parameter Expansion Operator" context="#stay" String="[*]"/>
1076         <DetectChar attribute="Parameter Expansion Operator" context="Subscript" char="["/>
1077         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!AlternatePatternValue" char="%" char1="%"/>
1078         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!AlternatePatternValue" char="#" char1="#"/>
1079         <AnyChar attribute="Parameter Expansion Operator" context="#pop!AlternatePatternValue" String="#%"/>
1080         <AnyChar attribute="Parameter Expansion Operator" context="#pop!AlternateValue" String="-+=?"/>
1081         <DetectChar attribute="Parameter Expansion Operator" context="#pop!AlternateValuePrefix" char=":"/>
1082         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!VarBraceSubst" char="/" char1="/"/>
1083         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarBraceSubst" char="/"/>
1084       </context>
1085       <context attribute="Parameter Expansion" lineEndContext="#stay" name="AlternateValuePrefix" fallthroughContext="#pop!VarSub">
1086         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!AlternateValue" char="^" char1="^"/>
1087         <DetectChar attribute="Parameter Expansion Operator" context="#pop!AlternatePatternValue" char="#"/>
1088         <AnyChar attribute="Parameter Expansion Operator" context="#pop!AlternateValue" String="-+=?|*^"/>
1089         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!AlternateValue" char=":" char1="="/>
1090         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarBraceSubst" char="/"/>
1091 
1092         <!-- Modifiers -->
1093         <AnyChar attribute="Parameter Expansion" context="#pop!VarBraceModifiers" String="aAcehlpPqQrsg&amp;tux" lookAhead="1"/>
1094       </context>
1095 
1096       <!-- called as soon as ${xxx:y (with y a modifier) is encoutered -->
1097       <context attribute="Parameter Expansion" lineEndContext="#stay" name="VarBraceModifiers">
1098         <DetectChar attribute="Parameter Expansion" context="#pop" char="}"/>
1099         <DetectChar attribute="Parameter Expansion Operator" context="#stay" char=":"/>
1100         <AnyChar attribute="Parameter Expansion" context="VarBraceModifier_h" String="ht"/>
1101         <DetectChar attribute="Parameter Expansion" context="VarBraceModifier_s" char="s"/>
1102         <Detect2Chars attribute="Parameter Expansion" context="VarBraceModifier_s" char="g" char1="s"/>
1103       </context>
1104       <context attribute="Parameter Expansion" lineEndContext="#stay" name="VarBraceModifier_h" fallthroughContext="#pop">
1105         <AnyChar attribute="Number" context="#stay" String="0123456789"/>
1106       </context>
1107 
1108       <!-- called as soon as ${xxx:s and ${xxx:gs is encoutered -->
1109       <context attribute="Parameter Expansion" lineEndContext="#stay" name="VarBraceModifier_s">
1110         <DetectChar attribute="Error" context="#pop#pop" char="}"/>
1111         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarBraceModifier_s_Str" char="/"/>
1112         <DetectChar context="AssumeEscape" char="\" lookAhead="1"/>
1113       </context>
1114       <context attribute="String SingleQ" lineEndContext="#stay" name="VarBraceModifier_s_Str">
1115         <DetectChar attribute="Parameter Expansion" context="#pop#pop" char="}"/>
1116         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarBraceModifier_s_Rep" char="/"/>
1117         <DetectChar context="AssumeEscape" char="\" lookAhead="1"/>
1118         <DetectChar attribute="String SingleQ" context="RecursiveVarBraceModifier_s" char="{"/>
1119       </context>
1120       <context attribute="String SingleQ" lineEndContext="#stay" name="RecursiveVarBraceModifier_s">
1121         <DetectChar context="AssumeEscape" char="\" lookAhead="1"/>
1122         <DetectChar attribute="String SingleQ" context="#pop" char="}"/>
1123       </context>
1124       <context attribute="String SingleQ" lineEndContext="#stay" name="VarBraceModifier_s_Rep">
1125         <DetectChar attribute="Parameter Expansion" context="#pop#pop" char="}"/>
1126         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="/"/>
1127         <DetectChar attribute="String SingleQ" context="RecursiveVarBraceModifier_s" char="{"/>
1128       </context>
1129 
1130       <!-- called as soon as ${xxx: is encoutered -->
1131       <context attribute="Normal Text" lineEndContext="#stay" name="VarSub">
1132         <DetectChar attribute="Parameter Expansion" context="#pop" char="}"/>
1133         <AnyChar context="VarOffset" String="0123456789" lookAhead="1"/>
1134         <AnyChar attribute="Operator" context="#stay" String="+-!~*/%&lt;>=&amp;^|"/>
1135         <DetectChar attribute="Parameter Expansion Operator" context="#stay" char=":"/>
1136         <DetectChar context="VarVariables" char="$" lookAhead="1"/>
1137         <IncludeRules context="FindStrings"/>
1138         <DetectChar attribute="Backquote" context="RegularBackq" char="`"/>
1139         <DetectChar context="AssumeEscape" char="\" lookAhead="1"/>
1140       </context>
1141       <context attribute="Command" lineEndContext="#pop" name="VarVariables">
1142         <IncludeRules context="DispatchVariables"/>
1143         <DetectChar attribute="Error" context="#pop" char="$"/>
1144       </context>
1145       <context attribute="Number" lineEndContext="#pop" name="VarOffset" fallthroughContext="#pop">
1146         <Detect2Chars attribute="Hex" context="#pop!Hex" char="0" char1="x"/>
1147         <Detect2Chars attribute="Hex" context="#pop!Hex" char="0" char1="X"/>
1148         <AnyChar attribute="Number" context="#stay" String="0123456789_"/>
1149         <DetectChar attribute="Base" context="#stay" char="#"/>
1150       </context>
1151 
1152       <!-- called as soon as ${xxx:-, etc are encoutered -->
1153       <context attribute="String DoubleQ" lineEndContext="#stay" name="AlternateValue">
1154         <DetectChar attribute="String DoubleQ" context="RecursiveAlternateValue" char="{"/>
1155         <DetectChar attribute="Parameter Expansion" context="#pop" char="}"/>
1156         <IncludeRules context="FindWord"/>
1157         <IncludeRules context="FindPathThenPopInAlternateValue"/>
1158         <DetectIdentifier attribute="String DoubleQ"/>
1159       </context>
1160       <context attribute="String DoubleQ" lineEndContext="#stay" name="RecursiveAlternateValue">
1161         <DetectChar attribute="String DoubleQ" context="RecursiveAlternateValue" char="{"/>
1162         <DetectChar attribute="String DoubleQ" context="#pop" char="}"/>
1163         <IncludeRules context="FindWord"/>
1164         <IncludeRules context="FindPathThenPopInAlternateValue"/>
1165         <DetectIdentifier attribute="String DoubleQ"/>
1166       </context>
1167 
1168       <!-- called as soon as ${xxx%, etc are encoutered -->
1169       <context attribute="String DoubleQ" lineEndContext="#stay" name="AlternatePatternValue">
1170         <DetectChar attribute="String DoubleQ" context="RecursiveAlternatePatternValue" char="{"/>
1171         <DetectChar attribute="Parameter Expansion" context="#pop" char="}"/>
1172         <IncludeRules context="FindWord"/>
1173         <IncludeRules context="FindStringDQPattern"/>
1174         <DetectIdentifier attribute="String DoubleQ"/>
1175       </context>
1176       <context attribute="String DoubleQ" lineEndContext="#stay" name="RecursiveAlternatePatternValue">
1177         <DetectChar attribute="String DoubleQ" context="RecursiveAlternateValue" char="{"/>
1178         <DetectChar attribute="String DoubleQ" context="#pop" char="}"/>
1179         <IncludeRules context="FindWord"/>
1180         <IncludeRules context="FindStringDQPattern"/>
1181         <DetectIdentifier attribute="String DoubleQ"/>
1182       </context>
1183 
1184       <!-- called as soon as ${xxx/ ${xxx// ${xxx:/ are encoutered -->
1185       <context attribute="Normal Text" lineEndContext="#stay" name="VarBraceSubst" fallthroughContext="#pop!VarBraceSubstPat">
1186         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!VarBraceSubstPat" char="#" char1="%"/>
1187         <AnyChar attribute="Parameter Expansion Operator" context="#pop!VarBraceSubstPat" String="#%"/>
1188       </context>
1189       <context attribute="Pattern" lineEndContext="#stay" name="VarBraceSubstPat">
1190         <DetectChar attribute="Parameter Expansion Operator" context="#pop!AlternateValue" char="/"/>
1191         <DetectChar attribute="String DoubleQ" context="RecursiveAlternateValue" char="{"/>
1192         <DetectChar attribute="Parameter Expansion" context="#pop" char="}"/>
1193         <IncludeRules context="FindWord"/>
1194         <IncludeRules context="FindSubPattern"/>
1195         <DetectIdentifier attribute="Pattern"/>
1196       </context>
1197 
1198       <!-- called as soon as ${( is encoutered -->
1199       <context attribute="Parameter Expansion" lineEndContext="#stay" name="VarFlags">
1200         <AnyChar attribute="Parameter Expansion Operator" context="#stay" String="#%*q@AabcCDefFikLnoOPqQ+-tuUvVwWXz0~mSBEMNR"/>
1201         <AnyChar attribute="Parameter Expansion Operator" context="VarFlag_s" String="sjgZ_"/>
1202         <AnyChar attribute="Parameter Expansion Operator" context="VarFlag_l" String="lrI"/>
1203         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarFlagsSubs" char="p"/>
1204 
1205         <DetectChar attribute="Parameter Expansion" context="#pop!VarFlagsVar" char=")"/>
1206         <DetectChar attribute="Error" context="#pop" char="}"/>
1207       </context>
1208       <context attribute="Parameter Expansion" lineEndContext="#stay" name="VarFlagsSubs">
1209         <AnyChar attribute="Parameter Expansion Operator" context="#stay" String="#q@AabcCDefFikLnoOPqQ+-tuUvVwWXz0~mSBEMNRp"/>
1210         <AnyChar attribute="Parameter Expansion Operator" context="VarFlag_s" String="gZ"/>
1211         <AnyChar attribute="Parameter Expansion Operator" context="VarFlag_ps" String="sj_"/>
1212         <AnyChar attribute="Parameter Expansion Operator" context="VarFlag_pl" String="lrI"/>
1213 
1214         <DetectChar attribute="Parameter Expansion" context="#pop!VarFlagsVar" char=")"/>
1215         <DetectChar attribute="Error" context="#pop" char="}"/>
1216       </context>
1217       <context attribute="Variable" lineEndContext="#stay" name="VarFlagsVar" fallthroughContext="#pop!CheckVarAlt">
1218         <DetectChar context="VarBraceStartRecursive" char="$" lookAhead="1"/>
1219         <DetectChar attribute="Parameter Expansion" context="#pop" char="}"/>
1220         <DetectChar attribute="String DoubleQ" context="StringDQ" char="&quot;"/>
1221         <AnyChar attribute="Parameter Expansion Operator" context="#stay" String="#+^=~"/>
1222         <DetectIdentifier attribute="Variable" context="#pop!CheckVarAlt"/>
1223         <AnyChar attribute="Variable" context="#pop!CheckVarAlt" String="*@?$-"/>
1224         <Int attribute="Variable" context="#pop!CheckVarAlt" additionalDeliminator="#~=^+{}[]:-/$"/>
1225         <Detect2Chars context="#pop!VarSubShell" char="!" char1="}" lookAhead="1"/>
1226         <DetectChar attribute="Parameter Expansion Operator" context="#pop!AlternateValue" char="!"/>
1227       </context>
1228 
1229       <context attribute="Parameter Expansion" lineEndContext="#stay" name="VarSubShell">
1230         <DetectChar attribute="Variable" context="#pop!CheckVarAlt" char="!"/>
1231       </context>
1232 
1233       <context attribute="Parameter Expansion" lineEndContext="#stay" name="VarFlag_s">
1234         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarFlag_s[" char="["/>
1235         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarFlag_s&lt;" char="&lt;"/>
1236         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarFlag_s{" char="{"/>
1237         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarFlag_s(" char="("/>
1238         <RegExpr attribute="Parameter Expansion Operator" context="#pop!VarFlag_sx" String="(.)"/>
1239       </context>
1240       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_s[">
1241         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="]"/>
1242       </context>
1243       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_s&lt;">
1244         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char=">"/>
1245       </context>
1246       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_s{">
1247         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="}"/>
1248       </context>
1249       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_s(">
1250         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char=")"/>
1251       </context>
1252       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_sx">
1253         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="1" dynamic="1"/>
1254       </context>
1255 
1256       <context attribute="Normal Text" lineEndContext="#stay" name="VarFlag_l">
1257         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarFlag_l[" char="["/>
1258         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarFlag_l&lt;" char="&lt;"/>
1259         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarFlag_l{" char="{"/>
1260         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarFlag_l(" char="("/>
1261         <RegExpr attribute="Parameter Expansion Operator" context="#pop!VarFlag_lx" String="(.)"/>
1262       </context>
1263       <context attribute="Normal Text" lineEndContext="#stay" name="VarFlag_l[">
1264         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!VarFlag_l[s" char="]" char1="["/>
1265         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="]"/>
1266         <IncludeRules context="FindExprDblParen"/>
1267       </context>
1268       <context attribute="Normal Text" lineEndContext="#stay" name="VarFlag_l&lt;">
1269         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!VarFlag_l&lt;s" char=">" char1="&lt;"/>
1270         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char=">"/>
1271         <IncludeRules context="FindExprDblParen"/>
1272       </context>
1273       <context attribute="Normal Text" lineEndContext="#stay" name="VarFlag_l{">
1274         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!VarFlag_l{s" char="}" char1="{"/>
1275         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="}"/>
1276         <IncludeRules context="FindExprDblParen"/>
1277       </context>
1278       <context attribute="Normal Text" lineEndContext="#stay" name="VarFlag_l(">
1279         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!VarFlag_l(s" char=")" char1="("/>
1280         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char=")"/>
1281         <IncludeRules context="FindExprDblParen"/>
1282       </context>
1283       <context attribute="Normal Text" lineEndContext="#stay" name="VarFlag_lx">
1284         <RegExpr attribute="Parameter Expansion Operator" context="#pop!VarFlag_lxs" String="(%1)%1" dynamic="1"/>
1285         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="1" dynamic="1"/>
1286         <IncludeRules context="FindExprDblParen"/>
1287       </context>
1288       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_l[s">
1289         <Detect2Chars attribute="Parameter Expansion Operator" context="#stay" char="]" char1="["/>
1290         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="]"/>
1291       </context>
1292       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_l&lt;s">
1293         <Detect2Chars attribute="Parameter Expansion Operator" context="#stay" char=">" char1="&lt;"/>
1294         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char=">"/>
1295       </context>
1296       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_l{s">
1297         <Detect2Chars attribute="Parameter Expansion Operator" context="#stay" char="}" char1="{"/>
1298         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="}"/>
1299       </context>
1300       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_l(s">
1301         <Detect2Chars attribute="Parameter Expansion Operator" context="#stay" char=")" char1="("/>
1302         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char=")"/>
1303       </context>
1304       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_lxs">
1305         <StringDetect attribute="Parameter Expansion Operator" context="#stay" String="%1%1" dynamic="1"/>
1306         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="1" dynamic="1"/>
1307       </context>
1308 
1309       <context attribute="Parameter Expansion" lineEndContext="#stay" name="VarFlag_ps">
1310         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarFlag_ps[" char="["/>
1311         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarFlag_ps&lt;" char="&lt;"/>
1312         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarFlag_ps{" char="{"/>
1313         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarFlag_ps(" char="("/>
1314         <RegExpr attribute="Parameter Expansion Operator" context="#pop!VarFlag_psx" String="(.)"/>
1315       </context>
1316       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_ps[">
1317         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="]"/>
1318         <RegExpr attribute="Variable" context="#stay" String="\$(&varname;|[0-9]+)(?=\])"/>
1319       </context>
1320       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_ps&lt;">
1321         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char=">"/>
1322         <RegExpr attribute="Variable" context="#stay" String="\$(&varname;|[0-9]+)(?=>)"/>
1323       </context>
1324       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_ps{">
1325         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="}"/>
1326         <RegExpr attribute="Variable" context="#stay" String="\$(&varname;|[0-9]+)(?=})"/>
1327       </context>
1328       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_ps(">
1329         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char=")"/>
1330         <RegExpr attribute="Variable" context="#stay" String="\$(&varname;|[0-9]+)(?=\))"/>
1331       </context>
1332       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_psx">
1333         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="1" dynamic="1"/>
1334         <RegExpr attribute="Variable" context="#stay" String="\$(?!%1)(?:[A-Za-z_](?:(?!%1)[A-Za-z0-9_])*+|(?:(?!%1)[0-9])++)(?=%1)" dynamic="1"/>
1335         <RegExpr attribute="String SingleQ" context="#stay" String="[^%1]+" dynamic="1"/>
1336       </context>
1337 
1338       <context attribute="Normal Text" lineEndContext="#stay" name="VarFlag_pl">
1339         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarFlag_pl[" char="["/>
1340         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarFlag_pl&lt;" char="&lt;"/>
1341         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarFlag_pl{" char="{"/>
1342         <DetectChar attribute="Parameter Expansion Operator" context="#pop!VarFlag_pl(" char="("/>
1343         <RegExpr attribute="Parameter Expansion Operator" context="#pop!VarFlag_plx" String="(.)"/>
1344       </context>
1345       <context attribute="Normal Text" lineEndContext="#stay" name="VarFlag_pl[">
1346         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!VarFlag_pl[s" char="]" char1="["/>
1347         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="]"/>
1348         <IncludeRules context="FindExprDblParen"/>
1349       </context>
1350       <context attribute="Normal Text" lineEndContext="#stay" name="VarFlag_pl&lt;">
1351         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!VarFlag_pl&lt;s" char=">" char1="&lt;"/>
1352         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char=">"/>
1353         <IncludeRules context="FindExprDblParen"/>
1354       </context>
1355       <context attribute="Normal Text" lineEndContext="#stay" name="VarFlag_pl{">
1356         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!VarFlag_pl{s" char="}" char1="{"/>
1357         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="}"/>
1358         <IncludeRules context="FindExprDblParen"/>
1359       </context>
1360       <context attribute="Normal Text" lineEndContext="#stay" name="VarFlag_pl(">
1361         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!VarFlag_pl(s" char=")" char1="("/>
1362         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char=")"/>
1363         <IncludeRules context="FindExprDblParen"/>
1364       </context>
1365       <context attribute="Normal Text" lineEndContext="#stay" name="VarFlag_plx">
1366         <RegExpr attribute="Parameter Expansion Operator" context="#pop!VarFlag_plxs" String="(%1)%1" dynamic="1"/>
1367         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="1" dynamic="1"/>
1368         <IncludeRules context="FindExprDblParen"/>
1369       </context>
1370       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_pl[s">
1371         <Detect2Chars attribute="Parameter Expansion Operator" context="#stay" char="]" char1="["/>
1372         <IncludeRules context="VarFlag_ps["/>
1373       </context>
1374       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_pl&lt;s">
1375         <Detect2Chars attribute="Parameter Expansion Operator" context="#stay" char=">" char1="&lt;"/>
1376         <IncludeRules context="VarFlag_ps&lt;"/>
1377       </context>
1378       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_pl{s">
1379         <Detect2Chars attribute="Parameter Expansion Operator" context="#stay" char="}" char1="{"/>
1380         <IncludeRules context="VarFlag_ps{"/>
1381       </context>
1382       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_pl(s">
1383         <Detect2Chars attribute="Parameter Expansion Operator" context="#stay" char=")" char1="("/>
1384         <IncludeRules context="VarFlag_ps("/>
1385       </context>
1386       <context attribute="String SingleQ" lineEndContext="#stay" name="VarFlag_plxs">
1387         <StringDetect attribute="Parameter Expansion Operator" context="#stay" String="%1%1" dynamic="1"/>
1388         <IncludeRules context="VarFlag_psx"/>
1389       </context>
1390 
1391       <context attribute="Escape" lineEndContext="#pop" name="BraceExpansion">
1392         <DetectChar attribute="Escape" context="#pop!BraceExpansion2" char="{"/>
1393       </context>
1394       <context attribute="Escape" lineEndContext="#pop" name="BraceExpansion2">
1395         <DetectChar attribute="Operator" context="#stay" char=","/>
1396         <DetectChar attribute="Escape" context="#pop" char="}"/>
1397         <DetectChar context="EscapeMaybeBraceExpansion" char="{" lookAhead="1"/>
1398         <DetectChar context="AssumeEscape" char="\" lookAhead="1"/>
1399         <DetectChar attribute="Backquote" context="CommandBackq" char="`"/>
1400         <DetectChar context="BraceExpansionVariables" char="$" lookAhead="1"/>
1401         <IncludeRules context="FindStrings"/>
1402         <IncludeRules context="FindPattern"/>
1403         <DetectIdentifier attribute="Escape"/>
1404       </context>
1405       <context attribute="Escape" lineEndContext="#pop" name="EscapeMaybeBraceExpansion">
1406         <IncludeRules context="DispatchBraceExpansion"/>
1407         <DetectChar attribute="Escape" context="#pop!BraceExpansion2" char="{"/>
1408       </context>
1409       <context attribute="Escape" lineEndContext="#pop" name="BraceExpansionVariables">
1410         <IncludeRules context="DispatchVariables"/>
1411         <DetectChar attribute="Escape" context="#pop" char="$"/>
1412       </context>
1413 
1414       <context attribute="Escape" lineEndContext="#pop" name="PathBraceExpansion">
1415         <DetectChar attribute="Escape" context="#pop!PathBraceExpansion2" char="{"/>
1416       </context>
1417       <context attribute="Path" lineEndContext="#pop" name="PathBraceExpansion2">
1418         <DetectChar attribute="Operator" context="#stay" char=","/>
1419         <DetectChar attribute="Escape" context="#pop" char="}"/>
1420         <DetectChar context="PathMaybeBraceExpansion" char="{" lookAhead="1"/>
1421         <IncludeRules context="FindWord"/>
1422         <IncludeRules context="FindPattern"/>
1423         <DetectIdentifier attribute="Path"/>
1424       </context>
1425 
1426       <context attribute="Normal Text" lineEndContext="#pop" name="SequenceExpression">
1427         <AnyChar attribute="Number" context="#stay" String="0123456789-"/>
1428         <IncludeRules context="FindWord"/>
1429         <Detect2Chars attribute="Escape" context="#stay" char="." char1="."/>
1430         <DetectChar attribute="Escape" context="#pop" char="}"/>
1431       </context>
1432 
1433 <!-- ====== These are the contexts that can be branched to ======= -->
1434 
1435       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblParenOrSubShell">
1436         <RegExpr attribute="Keyword" context="#pop!SubShell" String="\((?=&arithmetic_as_subshell;)|" beginRegion="subshell"/>
1437         <Detect2Chars attribute="Keyword" context="#pop!ExprDblParen" char="(" char1="(" beginRegion="expression"/>
1438       </context>
1439       <!-- ExprDblParen consumes an expression started in command mode till )) -->
1440       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblParen">
1441         <DetectSpaces attribute="Normal Text" context="#stay"/>
1442         <Detect2Chars attribute="Keyword" context="#pop" char=")" char1=")" endRegion="expression"/>
1443         <IncludeRules context="FindExprDblParen"/>
1444         <!-- ((cmd
1445               ) # jump to SubShell context -->
1446         <DetectChar attribute="Keyword" context="#pop!SubShell" char=")" endRegion="expression" beginRegion="subshell"/>
1447       </context>
1448       <context attribute="Normal Text" lineEndContext="#stay" name="FindExprDblParen">
1449         <Detect2Chars attribute="Control" context="#stay" char="&amp;" char1="&amp;"/>
1450         <Detect2Chars attribute="Control" context="#stay" char="|" char1="|"/>
1451         <AnyChar attribute="Operator" context="#stay" String="+-!~*/%&lt;>=&amp;^|?:"/>
1452         <DetectChar attribute="Control" context="#stay" char=","/>
1453         <DetectChar attribute="Normal Text" context="ExprSubDblParen" char="("/>
1454         <AnyChar context="Number" String="0123456789." lookAhead="1"/>
1455         <DetectChar attribute="Parameter Expansion Operator" context="Subscript" char="["/>
1456         <IncludeRules context="FindWord"/>
1457         <DetectChar context="MaybeArithmeticBrace" char="{" lookAhead="1"/>
1458         <Detect2Chars attribute="BaseN" context="NoPrefix" char="#" char1="#"/>
1459         <DetectChar attribute="Error" context="#stay" char="#"/>
1460         <DetectIdentifier attribute="Variable" context="#stay"/>
1461       </context>
1462       <context attribute="Normal Text" lineEndContext="#stay" name="ExprSubDblParen">
1463         <DetectSpaces attribute="Normal Text" context="#stay"/>
1464         <DetectChar attribute="Normal Text" context="#pop" char=")"/>
1465         <IncludeRules context="FindExprDblParen"/>
1466       </context>
1467       <context attribute="Error" lineEndContext="#pop" name="MaybeArithmeticBrace">
1468         <IncludeRules context="DispatchBraceExpansion"/>
1469         <DetectChar attribute="Error" context="#pop" char="{"/>
1470       </context>
1471       <context attribute="Normal Text" lineEndContext="#pop" name="NoPrefix" fallthroughContext="#pop">
1472         <DetectChar context="AssumeEscape" char="\"/>
1473         <RegExpr attribute="Number" context="#pop" String="[^][()]"/>
1474       </context>
1475 
1476       <context attribute="Number" lineEndContext="#pop" name="Number">
1477         <Detect2Chars attribute="Hex" context="#pop!Hex" char="0" char1="x"/>
1478         <Detect2Chars attribute="Hex" context="#pop!Hex" char="0" char1="X"/>
1479         <RegExpr attribute="Base" context="#pop!BaseN" String="[1-9][0-9_]*+#"/>
1480         <RegExpr attribute="Number" context="#pop" String="&int;(\.(&int;&exp;?+|&exp;)?|&exp;)?|\.&int;&exp;?"/>
1481         <DetectChar attribute="Operator" context="#pop" char="."/>
1482       </context>
1483       <context attribute="Hex" lineEndContext="#pop" name="Hex" fallthroughContext="#pop">
1484         <RegExpr attribute="Hex" context="#pop" String="[0-9a-fA-F_]+"/>
1485       </context>
1486       <context attribute="BaseN" lineEndContext="#pop" name="BaseN" fallthroughContext="#pop">
1487         <RegExpr attribute="BaseN" context="#pop" String="[0-9a-zA-Z@_]+"/>
1488       </context>
1489 
1490       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblParenSubstOrSubstCommand">
1491         <RegExpr attribute="Parameter Expansion" context="#pop!SubstCommand" String="\$\((?=&arithmetic_as_subshell;)|" beginRegion="subshell"/>
1492         <StringDetect attribute="Parameter Expansion" context="#pop!ExprDblParenSubst" String="$((" beginRegion="expression"/>
1493       </context>
1494       <!-- ExprDblParenSubst like ExprDblParen but matches )) as Variable -->
1495       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblParenSubst">
1496         <DetectSpaces attribute="Normal Text" context="#stay"/>
1497         <Detect2Chars attribute="Parameter Expansion" context="#pop" char=")" char1=")" endRegion="expression"/>
1498         <IncludeRules context="FindExprDblParen"/>
1499         <!-- $((cmd
1500               ) # jump to SubstCommand context -->
1501         <DetectChar attribute="Parameter Expansion" context="#pop!SubstCommand" char=")" endRegion="expression" beginRegion="subshell"/>
1502       </context>
1503 
1504       <!-- ExprBracket consumes an expression till ] -->
1505       <context attribute="Normal Text" lineEndContext="#stay" name="ExprBracket" fallthroughContext="#pop!ExprBracketNot">
1506         <DetectSpaces attribute="Normal Text" context="#stay"/>
1507         <IncludeRules context="FindExprBracketEnd"/>
1508       </context>
1509 
1510       <context attribute="Normal Text" lineEndContext="#stay" name="ExprBracketNot" fallthroughContext="#pop!ExprBracketParam1">
1511         <DetectSpaces attribute="Normal Text" context="#pop!ExprBracketParam1"/>
1512         <Detect2Chars attribute="Expression" context="ExprBracketTestMaybeNot" char="!" char1=" " lookAhead="1"/>
1513         <Detect2Chars attribute="Expression" context="ExprBracketTestMaybeNot" char="!" char1="&tab;" lookAhead="1"/>
1514       </context>
1515       <context attribute="Normal Text" lineEndContext="#pop" name="ExprBracketTestMaybeNot">
1516         <DetectChar attribute="Expression" context="#pop" char="!"/>
1517       </context>
1518 
1519       <context attribute="Normal Text" lineEndContext="#stay" name="ExprBracketParam1" fallthroughContext="ExprBracketValue">
1520         <DetectSpaces attribute="Normal Text" context="#pop!ExprBracketParam2"/>
1521         <DetectChar context="TestMaybeUnary" char="-" lookAhead="1"/>
1522         <IncludeRules context="FindExprBracketEnd"/>
1523       </context>
1524 
1525       <context attribute="Normal Text" lineEndContext="#pop" name="ExprBracketValue">
1526         <AnyChar context="#pop" String=" &tab;" lookAhead="1"/>
1527         <AnyChar attribute="Error" context="#stay" String="&symbolseps;"/>
1528         <IncludeRules context="FindWord"/>
1529         <IncludeRules context="FindGlobAny"/>
1530         <IncludeRules context="FindPathThenPop"/>
1531         <DetectChar context="ExprBracketValueMaybeBraceExpansion" char="{" lookAhead="1"/>
1532         <DetectChar context="NormalOptionMaybeGroupEnd" char="}" lookAhead="1"/>
1533         <DetectIdentifier attribute="Normal Text"/>
1534       </context>
1535       <context attribute="Normal Text" lineEndContext="#pop" name="ExprBracketValueRecBrace">
1536         <AnyChar context="#pop#pop" String=" &tab;" lookAhead="1"/>
1537         <AnyChar attribute="Error" context="#stay" String="&symbolseps;"/>
1538         <IncludeRules context="FindWord"/>
1539         <IncludeRules context="FindGlobAny"/>
1540         <DetectChar context="ExprBracketValueMaybeBraceExpansion" char="{" lookAhead="1"/>
1541         <DetectChar attribute="Normal Text" context="#pop" char="}"/>
1542         <DetectIdentifier attribute="Normal Text"/>
1543       </context>
1544       <context attribute="Normal Text" lineEndContext="#pop" name="ExprBracketValueMaybeBraceExpansion">
1545         <IncludeRules context="DispatchBraceExpansion"/>
1546         <DetectChar attribute="Normal Text" context="#pop!ExprBracketValueRecBrace" char="{"/>
1547       </context>
1548 
1549       <context attribute="Normal Text" lineEndContext="#stay" name="ExprBracketParam2" fallthroughContext="ExprBracketValue">
1550         <DetectSpaces attribute="Normal Text" context="#pop!ExprBracketParam3"/>
1551         <AnyChar context="TestMaybeBinary" String="-=!" lookAhead="1"/>
1552         <IncludeRules context="FindExprBracketEnd"/>
1553       </context>
1554 
1555       <context attribute="Normal Text" lineEndContext="ExprBracketFinal" name="ExprBracketParam3" fallthroughContext="ExprBracketValue">
1556         <DetectSpaces attribute="Normal Text" context="#pop!ExprBracketFinal"/>
1557         <IncludeRules context="FindExprBracketEnd"/>
1558       </context>
1559 
1560       <context attribute="Normal Text" lineEndContext="#stay" name="ExprBracketFinal" fallthroughContext="ExprBracketValue">
1561         <DetectSpaces attribute="Normal Text" context="#stay"/>
1562         <IncludeRules context="FindExprBracketEnd"/>
1563         <RegExpr attribute="Expression" context="#pop!ExprBracket" String="-[ao]&eos;"/>
1564         <RegExpr attribute="Error" context="#pop" String="(?:[^] &tab;]++|\][^ &tab;])++" endRegion="expression"/>
1565       </context>
1566 
1567       <context attribute="Normal Text" lineEndContext="#stay" name="FindExprBracketEnd">
1568         <DetectChar context="AssumeEscape" char="\" lookAhead="1"/>
1569         <RegExpr attribute="Builtin" context="#pop" String="\](?=($|[ &tab;;|&amp;&lt;>)]))" endRegion="expression"/>
1570       </context>
1571 
1572       <context attribute="Normal Text" lineEndContext="#pop" name="TestMaybeUnary" fallthroughContext="#pop!ExprBracketValue">
1573         <RegExpr attribute="Expression" context="#pop#pop!ExprBracketParam2" String="&unary_operators;"/>
1574       </context>
1575       <context attribute="Normal Text" lineEndContext="#pop" name="TestMaybeBinary" fallthroughContext="#pop!ExprBracketValue">
1576         <RegExpr attribute="Expression" context="#pop" String="&binary_operators;"/>
1577       </context>
1578 
1579 
1580       <!-- ExprDblBracket consumes an expression till ]] -->
1581       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblBracket" fallthroughContext="#pop!ExprDblBracketNot">
1582         <DetectSpaces attribute="Normal Text" context="#stay"/>
1583         <IncludeRules context="FindExprDblBracketEnd"/>
1584         <DetectChar attribute="Comment" context="Comment" char="#"/>
1585       </context>
1586 
1587       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblBracketNot" fallthroughContext="#pop!ExprDblBracketParam1">
1588         <DetectChar context="ExprDblBracketTestMaybeNot" char="!" lookAhead="1"/>
1589         <DetectSpaces attribute="Normal Text" context="#stay"/>
1590         <DetectChar attribute="Comment" context="Comment" char="#"/>
1591       </context>
1592       <context attribute="Normal Text" lineEndContext="#pop" name="ExprDblBracketTestMaybeNot" fallthroughContext="#pop#pop!ExprDblBracketParam1">
1593         <RegExpr attribute="Expression" context="#pop" String="!(?=$|[ &tab;(])"/>
1594       </context>
1595 
1596       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblBracketParam1" fallthroughContext="#pop!ExprDblBracketParam1_2">
1597         <DetectSpaces attribute="Normal Text" context="#stay"/>
1598       </context>
1599       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblBracketParam1_2" fallthroughContext="ExprDblBracketValueText">
1600         <DetectSpaces attribute="Normal Text" context="#pop!ExprDblBracketParam2"/>
1601         <DetectChar context="TestMaybeUnary2" char="-" lookAhead="1"/>
1602         <DetectChar context="ExprDblBracketSubValue" char="(" lookAhead="1"/>
1603         <IncludeRules context="FindExprDblBracketEnd"/>
1604       </context>
1605       <context attribute="Normal Text" lineEndContext="#pop" name="TestMaybeUnary2" fallthroughContext="#pop!ExprDblBracketValueText">
1606         <RegExpr attribute="Expression" context="#pop!ExprDblBracketUnary" String="&unary_operators;(?!\s+(?:=~|&binary_operators;))"/>
1607       </context>
1608       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblBracketUnary" fallthroughContext="#pop!ExprDblBracketValueText">
1609         <DetectSpaces attribute="Normal Text"/>
1610         <DetectChar attribute="Comment" context="Comment" char="#"/>
1611       </context>
1612       <context attribute="Normal Text" lineEndContext="#pop" name="ExprDblBracketSubValue" fallthroughContext="#pop">
1613         <DetectChar attribute="Operator" context="ExprDblBracketNot" char="("/>
1614         <DetectChar attribute="Operator" context="#pop" char=")"/>
1615       </context>
1616 
1617       <context attribute="Normal Text" lineEndContext="#pop" name="ExprDblBracketValueText" fallthroughContext="#pop!ExprDblBracketValueText2">
1618         <Detect2Chars context="#pop!ExprDblBracketValueTextMaybeEnd" char="]" char1="]" lookAhead="1"/>
1619         <IncludeRules context="FindExprDblBracketValueTextPath"/>
1620       </context>
1621       <context attribute="Normal Text" lineEndContext="#pop" name="FindExprDblBracketValueTextPath">
1622         <RegExpr context="#pop!ExprDblBracketValueTextPath" String="&path_with_sep;|" lookAhead="1"/>
1623       </context>
1624       <context attribute="Normal Text" lineEndContext="#pop" name="ExprDblBracketValueTextMaybeEnd">
1625         <RegExpr attribute="Keyword" context="#pop#pop" String="&dblbracket_close;" endRegion="expression"/>
1626         <IncludeRules context="FindExprDblBracketValueTextPath"/>
1627         <Detect2Chars context="#pop!ExprDblBracketValueText2" char="]" char1="]" lookAhead="1"/>
1628       </context>
1629       <context attribute="Normal Text" lineEndContext="#pop" name="ExprDblBracketValueText2">
1630         <DetectIdentifier/>
1631         <AnyChar String="*?+@~^:%+-/,"/>
1632         <Detect2Chars attribute="Control" context="#pop#pop!ExprDblBracket" char="&amp;" char1="&amp;"/>
1633         <Detect2Chars attribute="Control" context="#pop#pop!ExprDblBracket" char="|" char1="|"/>
1634         <AnyChar context="#pop" String=" &tab;)" lookAhead="1"/>
1635         <IncludeRules context="FindWord"/>
1636         <IncludeRules context="FindGroupPattern"/>
1637         <AnyChar attribute="Error" context="#stay" String="&amp;;|"/>
1638         <DetectChar context="ExprDblBracketValueTextMaybeRange" char="&lt;" lookAhead="1"/>
1639         <DetectChar attribute="Expression" context="#pop!ExprDblBracketValuePattern" char=">"/>
1640       </context>
1641       <context attribute="Path" lineEndContext="#pop" name="ExprDblBracketValueTextPath">
1642         <IncludeRules context="ExprDblBracketValueText2"/>
1643       </context>
1644       <context attribute="Normal Text" lineEndContext="#pop" name="ExprDblBracketValueTextMaybeRange">
1645         <RegExpr context="#pop" String="&globrange;"/>
1646         <DetectChar attribute="Expression" context="#pop#pop!ExprDblBracketValuePattern" char="&lt;"/>
1647       </context>
1648 
1649       <context attribute="Normal Text" lineEndContext="#pop" name="ExprDblBracketValuePattern" fallthroughContext="#pop!ExprDblBracketValuePattern2">
1650         <RegExpr context="ExprDblBracketValuePatternPath" String="&path_with_sep;|" lookAhead="1"/>
1651       </context>
1652       <context attribute="Normal Text" lineEndContext="#pop" name="ExprDblBracketValuePatternPath" fallthroughContext="#pop!PathThenPop">
1653         <DetectChar attribute="Path" context="#pop!PathThenPop" char="~"/>
1654       </context>
1655       <context attribute="Normal Text" lineEndContext="#pop" name="ExprDblBracketValuePattern2">
1656         <DetectIdentifier attribute="Normal Text"/>
1657         <Detect2Chars attribute="Control" context="#pop#pop!ExprDblBracket" char="&amp;" char1="&amp;"/>
1658         <Detect2Chars attribute="Control" context="#pop#pop!ExprDblBracket" char="|" char1="|"/>
1659         <AnyChar context="#pop" String=" &tab;)" lookAhead="1"/>
1660         <IncludeRules context="FindWord"/>
1661         <IncludeRules context="FindSingleGlob"/>
1662         <IncludeRules context="FindGlobAny"/>
1663         <IncludeRules context="FindGroupPattern"/>
1664         <DetectChar context="ExprDblBracketValueMaybeGlobRange" char="&lt;" lookAhead="1"/>
1665         <AnyChar attribute="Error" context="#stay" String=">&amp;|;"/>
1666       </context>
1667       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblBracketValueMaybeGlobRange">
1668         <IncludeRules context="FindGlobRangeThenPop"/>
1669         <DetectChar attribute="Error" context="#pop" char="&lt;"/>
1670       </context>
1671 
1672       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblBracketParam2" fallthroughContext="#pop!ExprDblBracketParam2_2">
1673         <DetectSpaces attribute="Normal Text" context="#stay"/>
1674         <DetectChar attribute="Comment" context="Comment" char="#"/>
1675       </context>
1676       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblBracketParam2_2" fallthroughContext="ExprDblBracketValuePattern">
1677         <DetectSpaces attribute="Normal Text" context="#pop!ExprDblBracketParam3"/>
1678         <AnyChar context="TestMaybeBinary2" String="-=!" lookAhead="1"/>
1679         <AnyChar attribute="Expression" context="#pop!ExprDblBracketParam3Spe" String="&lt;>"/>
1680         <IncludeRules context="FindExprDblBracketEnd"/>
1681       </context>
1682       <context attribute="Normal Text" lineEndContext="#pop" name="TestMaybeBinary2" fallthroughContext="#pop!ExprDblBracketValuePattern">
1683         <IncludeRules context="TestMaybeBinary"/>
1684         <RegExpr attribute="Expression" context="#pop#pop!ExprDblBracketRegex" String="=~&eos;"/>
1685       </context>
1686 
1687       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblBracketParam3Spe" fallthroughContext="#pop!ExprDblBracketParam3">
1688         <DetectSpaces attribute="Normal Text" context="#pop!ExprDblBracketParam3"/>
1689       </context>
1690 
1691       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblBracketParam3" fallthroughContext="#pop!ExprDblBracketParam3_2">
1692         <DetectSpaces attribute="Normal Text" context="#stay"/>
1693         <DetectChar attribute="Comment" context="Comment" char="#"/>
1694       </context>
1695       <context attribute="Normal Text" lineEndContext="#pop!ExprDblBracketFinal" name="ExprDblBracketParam3_2" fallthroughContext="ExprDblBracketValuePattern">
1696         <DetectSpaces attribute="Normal Text" context="#pop!ExprDblBracketFinal"/>
1697         <IncludeRules context="FindExprDblBracketEnd"/>
1698       </context>
1699 
1700       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblBracketFinal" fallthroughContext="ExprDblBracketValuePattern">
1701         <DetectSpaces attribute="Normal Text" context="#stay"/>
1702         <IncludeRules context="FindExprDblBracketEnd"/>
1703         <DetectChar attribute="Comment" context="Comment" char="#"/>
1704         <RegExpr attribute="Error" context="#pop" String="(?:[^] &tab;]++|\](?:[^]]|\][^ &tab;]))++" endRegion="expression"/>
1705       </context>
1706 
1707       <context attribute="Normal Text" lineEndContext="#stay" name="FindExprDblBracketEnd">
1708         <DetectChar context="AssumeEscape" char="\" lookAhead="1"/>
1709         <DetectChar context="#pop" char=")" lookAhead="1"/>
1710         <Detect2Chars attribute="Control" context="#pop!ExprDblBracket" char="&amp;" char1="&amp;"/>
1711         <Detect2Chars attribute="Control" context="#pop!ExprDblBracket" char="|" char1="|"/>
1712         <RegExpr attribute="Keyword" context="#pop" String="&dblbracket_close;" endRegion="expression"/>
1713       </context>
1714 
1715       <context attribute="Normal Text" lineEndContext="#stay" name="ExprDblBracketRegex" fallthroughContext="#pop!Regex">
1716         <DetectSpaces attribute="Normal Text" context="#stay"/>
1717         <DetectChar attribute="Comment" context="Comment" char="#"/>
1718       </context>
1719       <context attribute="Pattern" lineEndContext="#stay" name="Regex">
1720         <DetectIdentifier attribute="Pattern"/>
1721         <DetectSpaces attribute="Normal Text" context="#pop!ExprDblBracketFinal"/>
1722         <DetectChar attribute="Operator" context="#pop" char=")"/>
1723         <Detect2Chars attribute="Operator" context="RegexChar" char="[" char1="^"/>
1724         <DetectChar attribute="Operator" context="RegexChar" char="["/>
1725         <IncludeRules context="FindRegex"/>
1726       </context>
1727       <context attribute="Pattern" lineEndContext="#stay" name="ExprDblBracketSubRegex">
1728         <DetectIdentifier attribute="Pattern"/>
1729         <DetectSpaces attribute="Pattern" context="#stay"/>
1730         <DetectChar attribute="Operator" context="#pop" char=")"/>
1731         <Detect2Chars attribute="Operator" context="RegexSubChar" char="[" char1="^"/>
1732         <DetectChar attribute="Operator" context="RegexSubChar" char="["/>
1733         <IncludeRules context="FindRegex"/>
1734       </context>
1735 
1736       <context attribute="Pattern" lineEndContext="#stay" name="FindRegex">
1737         <DetectChar attribute="Operator" context="ExprDblBracketSubRegex" char="("/>
1738         <DetectChar attribute="Escape" context="RegexEscape" char="\"/>
1739         <DetectChar attribute="Parameter Expansion" context="RegexDup" char="{"/>
1740         <AnyChar attribute="Glob" context="#stay" String="^?+*.|"/>
1741         <IncludeRules context="FindStrings"/>
1742         <DetectChar context="RegexDispatchVariables" char="$" lookAhead="1"/>
1743         <DetectChar attribute="Backquote" context="RegularBackq" char="`"/>
1744       </context>
1745       <context attribute="Normal Text" lineEndContext="#stay" name="RegexDispatchVariables">
1746         <IncludeRules context="DispatchVariables"/>
1747         <DetectChar attribute="Operator" context="#pop" char="$"/>
1748       </context>
1749 
1750       <context attribute="Normal Text" lineEndContext="#pop" name="RegexEscape">
1751         <RegExpr attribute="Escape" context="#pop" String="x[0-9a-fA-F]{1,2}|[0-7]{1,3}|."/>
1752       </context>
1753 
1754       <context attribute="Normal Text" lineEndContext="#pop" name="RegexDup">
1755         <Int attribute="Number"/>
1756         <DetectChar attribute="Parameter Expansion Operator" context="#stay" char=","/>
1757         <DetectChar attribute="Parameter Expansion" context="#pop" char="}"/>
1758       </context>
1759 
1760       <context attribute="Pattern" lineEndContext="#pop" name="RegexSubChar" fallthroughContext="#pop!RegexSubInChar">
1761         <AnyChar attribute="Pattern" context="#pop!RegexSubInChar" String="-]"/>
1762       </context>
1763       <context attribute="Pattern" lineEndContext="#pop" name="RegexSubInChar">
1764         <DetectSpaces attribute="Pattern" context="#stay"/>
1765         <IncludeRules context="RegexInChar"/>
1766       </context>
1767 
1768       <context attribute="Pattern" lineEndContext="#pop" name="RegexChar" fallthroughContext="#pop!RegexInChar">
1769         <AnyChar attribute="Pattern" context="#pop!RegexInChar" String="-]"/>
1770       </context>
1771       <context attribute="Pattern" lineEndContext="#pop" name="RegexInChar">
1772         <Detect2Chars context="RegexInCharEnd" char="-" char1="]" lookAhead="1"/>
1773         <DetectChar attribute="Operator" context="#stay" char="-"/>
1774         <DetectChar attribute="Escape" context="RegexEscape" char="\"/>
1775         <DetectChar context="RegexCharClassSelect" char="[" lookAhead="1"/>
1776         <DetectChar attribute="Operator" context="#pop" char="]"/>
1777         <AnyChar context="#pop" String="() &tab;" lookAhead="1"/>
1778         <IncludeRules context="FindStrings"/>
1779       </context>
1780       <context attribute="Operator" lineEndContext="#stay" name="RegexInCharEnd">
1781         <DetectChar attribute="Pattern" context="#stay" char="-"/>
1782         <DetectChar attribute="Operator" context="#pop#pop" char="]"/>
1783       </context>
1784       <context attribute="Parameter Expansion" lineEndContext="#pop#pop#pop" name="RegexCharClassSelect">
1785         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!RegexCharClass" char="[" char1=":"/>
1786         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!RegexCollatingSymbols" char="[" char1="."/>
1787         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!RegexEquivalenceClass" char="[" char1="="/>
1788         <DetectChar attribute="Pattern" context="#pop" char="["/>
1789       </context>
1790 
1791       <context attribute="Parameter Expansion" lineEndContext="#pop#pop#pop" name="RegexCharClass">
1792         <DetectIdentifier attribute="Parameter Expansion"/>
1793         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop" char=":" char1="]"/>
1794         <DetectChar attribute="Error" context="#pop" char="]"/>
1795       </context>
1796       <context attribute="Parameter Expansion" lineEndContext="#pop#pop#pop" name="RegexCollatingSymbols">
1797         <DetectIdentifier attribute="Parameter Expansion"/>
1798         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop" char="." char1="]"/>
1799         <DetectChar attribute="Error" context="#pop" char="]"/>
1800       </context>
1801       <context attribute="Parameter Expansion" lineEndContext="#pop#pop#pop" name="RegexEquivalenceClass">
1802         <DetectIdentifier attribute="Parameter Expansion"/>
1803         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop" char="=" char1="]"/>
1804         <DetectChar attribute="Error" context="#pop" char="]"/>
1805       </context>
1806 
1807       <!-- SubShell consumes shell input till ) -->
1808       <context attribute="Normal Text" lineEndContext="#stay" name="SubShell" fallthroughContext="Command">
1809         <DetectChar attribute="Keyword" context="#pop" char=")" endRegion="subshell"/>
1810         <IncludeRules context="Start"/>
1811       </context>
1812 
1813       <!-- Assign consumes an expression till EOL or whitespace -->
1814       <context attribute="Normal Text" lineEndContext="#pop" name="Assign" fallthroughContext="#pop!RegularAssign">
1815         <DetectChar attribute="Variable" context="#pop!AssignArray" char="("/>
1816       </context>
1817       <context attribute="Normal Text" lineEndContext="#pop" name="RegularAssign" fallthroughContext="#pop">
1818         <DetectChar attribute="Backquote" context="RegularBackq" char="`"/>
1819         <IncludeRules context="NormalOption"/>
1820       </context>
1821 
1822       <!-- AssignArray consumes everything till ), marking assignments -->
1823       <context attribute="Normal Text" lineEndContext="#stay" name="AssignArray" fallthroughContext="NormalOption">
1824         <DetectSpaces attribute="Normal Text" context="#stay"/>
1825         <DetectChar attribute="Comment" context="Comment" char="#"/>
1826         <DetectChar attribute="Variable" context="#pop" char=")"/>
1827         <DetectChar context="AssignArrayKey" char="[" lookAhead="1"/>
1828         <DetectChar attribute="Backquote" context="AssignArrayBackq" char="`"/>
1829         <AnyChar attribute="Error" context="#stay" String="&symbolseps;"/>
1830       </context>
1831       <context attribute="Normal Text" lineEndContext="#pop" name="AssignArrayKey" fallthroughContext="#pop">
1832         <DetectChar attribute="Parameter Expansion Operator" context="Subscript" char="["/>
1833         <DetectChar attribute="Variable" context="#pop" char="="/>
1834       </context>
1835       <context attribute="Normal Text" lineEndContext="#stay" name="AssignArrayBackq" fallthroughContext="Command">
1836         <DetectChar attribute="Backquote" context="#pop!NormalOption" char="`"/>
1837         <DetectChar attribute="Comment" context="CommentBackq" char="#"/>
1838         <IncludeRules context="Start"/>
1839       </context>
1840 
1841       <!-- Subscript consumes anything till ], marks as Variable -->
1842       <context attribute="Normal Text" lineEndContext="#stay" name="Subscript" fallthroughContext="Subscript2">
1843         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="]"/>
1844         <AnyChar attribute="Number" context="#stay" String="0123456789-"/>
1845       </context>
1846       <context attribute="Normal Text" lineEndContext="#stay" name="Subscript2">
1847         <DetectIdentifier attribute="Normal Text"/>
1848         <DetectChar attribute="Parameter Expansion Operator" context="#pop#pop" char="]"/>
1849         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char=","/>
1850         <IncludeRules context="FindGroupPattern"/>
1851         <IncludeRules context="FindStrings"/>
1852         <DetectChar context="VariableOrSubscriptPos" char="$" lookAhead="1"/>
1853         <DetectChar attribute="Backquote" context="RegularBackq" char="`"/>
1854         <DetectChar context="AssumeEscape" char="\" lookAhead="1"/>
1855         <AnyChar attribute="Operator" context="#pop" String="@+-!~*/%&lt;>=&amp;^|?:"/>
1856       </context>
1857       <context attribute="Normal Text" lineEndContext="#pop" name="VariableOrSubscriptPos">
1858         <IncludeRules context="DispatchVariables"/>
1859         <DetectChar attribute="Number" context="#pop" char="$"/>
1860       </context>
1861 
1862       <!-- FunctionDef consumes a name, possibly with (), marks as Function -->
1863       <context attribute="Function" lineEndContext="#pop" name="FunctionDef" fallthroughContext="#pop">
1864         <Detect2Chars attribute="Operator" context="#pop" char="(" char1=")"/>
1865         <DetectSpaces attribute="Normal Text" context="FunctionNameStart"/>
1866       </context>
1867       <context attribute="Function" lineEndContext="#pop" name="FunctionNameStart" fallthroughContext="#pop!FunctionName">
1868         <AnyChar context="#pop#pop" String="&symbolseps;#" lookAhead="1"/>
1869         <DetectChar context="FunctionNameStartMaybeBraceExpansion" char="{" lookAhead="1"/>
1870       </context>
1871       <context attribute="Function" lineEndContext="#pop" name="FunctionName">
1872         <AnyChar context="#pop" String=" &tab;(" lookAhead="1"/>
1873         <IncludeRules context="FindWord"/>
1874         <DetectChar context="FunctionNameMaybeBraceExpansion" char="{" lookAhead="1"/>
1875         <DetectChar context="NormalOptionMaybeGroupEnd" char="}" lookAhead="1"/>
1876         <DetectIdentifier attribute="Function"/>
1877       </context>
1878       <context attribute="Function" lineEndContext="#pop" name="FunctionNameRecBrace" fallthroughContext="#pop">
1879         <IncludeRules context="FindWord"/>
1880         <DetectChar context="FunctionNameMaybeBraceExpansion" char="{" lookAhead="1"/>
1881         <DetectChar attribute="Function" context="#pop" char="}"/>
1882         <DetectIdentifier attribute="Function"/>
1883       </context>
1884       <context attribute="Function" lineEndContext="#pop" name="FunctionNameStartMaybeBraceExpansion">
1885         <IncludeRules context="DispatchBraceExpansion"/>
1886         <DetectChar attribute="Keyword" context="#pop#pop#pop!Group" char="{" beginRegion="group"/>
1887       </context>
1888       <context attribute="Function" lineEndContext="#pop" name="FunctionNameMaybeBraceExpansion">
1889         <IncludeRules context="DispatchBraceExpansion"/>
1890         <DetectChar attribute="Function" context="#pop!FunctionNameRecBrace" char="{" beginRegion="group"/>
1891       </context>
1892 
1893       <!-- Case is called after the case keyword is encoutered. We handle this because of
1894            the lonely closing parentheses that would otherwise disturb the expr matching -->
1895       <context attribute="Normal Text" lineEndContext="#stay" name="Case">
1896         <DetectSpaces attribute="Normal Text" context="#stay"/>
1897         <DetectChar attribute="Keyword" context="#pop!CaseAlt" char="{"/>
1898         <WordDetect attribute="Keyword" context="#pop!CaseIn" String="in"/>
1899         <IncludeRules context="FindWord"/>
1900         <DetectIdentifier attribute="Normal Text" context="#stay"/>
1901       </context>
1902 
1903       <!-- CaseIn is called when the construct 'case ... in' has been found. -->
1904       <context attribute="Normal Text" lineEndContext="#stay" name="CaseIn" fallthroughContext="CasePattern">
1905         <DetectSpaces attribute="Normal Text" context="#stay"/>
1906         <DetectChar attribute="Keyword" context="CaseClosedPattern" char="("/>
1907         <DetectChar attribute="Comment" context="Comment" char="#"/>
1908       </context>
1909       <context attribute="Pattern" lineEndContext="#stay" name="CasePattern">
1910         <WordDetect attribute="Control Flow" context="#pop#pop" String="esac" endRegion="case"/>
1911         <IncludeRules context="CaseClosedPattern"/>
1912       </context>
1913       <context attribute="Pattern" lineEndContext="#stay" name="CaseClosedPattern">
1914         <DetectSpaces attribute="Normal Text" context="#stay"/>
1915         <DetectChar attribute="Keyword" context="#pop!CaseExpr" char=")" beginRegion="caseexpr"/>
1916         <DetectChar context="AssumeEscape" char="\" lookAhead="1"/>
1917         <DetectChar attribute="Keyword" context="#stay" char="|"/>
1918         <IncludeRules context="FindWord"/>
1919         <IncludeRules context="FindPattern"/>
1920         <DetectIdentifier attribute="Pattern" context="#stay"/>
1921       </context>
1922 
1923       <context attribute="Normal Text" lineEndContext="#stay" name="CaseAlt" fallthroughContext="CasePattern">
1924         <DetectSpaces attribute="Normal Text" context="#stay"/>
1925         <DetectChar attribute="Keyword" context="CasePattern" char="("/>
1926         <DetectChar attribute="Keyword" context="#pop!CaseAltEnd" char="}" endRegion="caseexpr" lookAhead="1"/>
1927       </context>
1928       <context attribute="Normal Text" lineEndContext="#stay" name="CaseAltEnd">
1929         <DetectChar attribute="Keyword" context="#pop" char="}" endRegion="case"/>
1930       </context>
1931 
1932       <!-- CaseExpr eats shell input till ;; / ;& / ;| -->
1933       <context attribute="Normal Text" lineEndContext="#stay" name="CaseExpr" fallthroughContext="Command">
1934         <Detect2Chars attribute="Control Flow" context="#pop" char=";" char1="|" endRegion="caseexpr"/>
1935         <Detect2Chars attribute="Control Flow" context="#pop" char=";" char1=";" endRegion="caseexpr"/>
1936         <Detect2Chars attribute="Control Flow" context="#pop" char=";" char1="&amp;" endRegion="caseexpr"/>
1937         <WordDetect context="#pop" String="esac" endRegion="caseexpr" lookAhead="1"/>
1938         <DetectChar context="#pop" char="}" lookAhead="1"/>
1939         <IncludeRules context="Start"/>
1940       </context>
1941 
1942       <!-- ExprGlobParen is called after a ( is encountered in a argument -->
1943       <context attribute="Glob Flag" lineEndContext="#pop" name="ExprGlobParen" fallthroughContext="#pop">
1944         <Detect2Chars attribute="Glob Flag" context="#pop!GlobPatFlag" char="(" char1="#"/>
1945         <RegExpr attribute="Glob" context="#pop!ExtGlobPattern" String="\((?=&ispattern;)"/>
1946         <DetectChar attribute="Glob Flag" context="#pop!GlobQualifier" char="("/>
1947       </context>
1948       <context attribute="Glob Flag" lineEndContext="#pop" name="ExprGlobParenThenPath" fallthroughContext="#pop">
1949         <Detect2Chars attribute="Glob Flag" context="#pop!GlobPatFlagThenPath" char="(" char1="#"/>
1950         <RegExpr attribute="Glob" context="#pop!ExtGlobPatternThenPath" String="\((?=&ispattern;)"/>
1951         <DetectChar attribute="Glob Flag" context="#pop!GlobQualifier" char="("/>
1952       </context>
1953       <context attribute="Glob Flag" lineEndContext="#pop" name="GlobQualifier">
1954         <AnyChar attribute="Glob Flag" context="#stay" String="/F.@=p*%bcrwxAIERWXsStUG^-MTNDn"/>
1955         <AnyChar attribute="Glob Flag" context="GlobQualifier_e" String="eP"/>
1956         <AnyChar attribute="Glob Flag" context="GlobQualifier_u" String="ug"/>
1957         <AnyChar attribute="Glob Flag" context="GlobQualifier_a" String="amc"/>
1958         <AnyChar attribute="Glob Flag" context="GlobQualifier_o" String="oO"/>
1959         <DetectChar attribute="Glob Flag" context="GlobQualifier_f" char="f"/>
1960         <DetectChar attribute="Glob Flag" context="GlobQualifier_+" char="+"/>
1961         <DetectChar attribute="Glob Flag" context="GlobQualifier_d" char="d"/>
1962         <DetectChar attribute="Glob Flag" context="GlobQualifier_L" char="L"/>
1963         <DetectChar attribute="Glob Flag" context="GlobQualifier_Y" char="Y"/>
1964         <DetectChar attribute="Parameter Expansion Operator" context="Subscript" char="["/>
1965 
1966         <DetectChar attribute="Operator" context="#stay" char=","/>
1967         <DetectChar attribute="Parameter Expansion Operator" context="#pop!GlobModifier" char=":"/>
1968         <DetectChar attribute="Glob Flag" context="#pop" char=")"/>
1969         <IncludeRules context="FindWord"/>
1970       </context>
1971 
1972       <context attribute="Normal Text" lineEndContext="#pop" name="GlobQualifier_o" fallthroughContext="#pop">
1973         <AnyChar attribute="Normal Text" context="#stay" String="nLlamcdN"/>
1974       </context>
1975 
1976       <context attribute="Number" lineEndContext="#pop" name="GlobQualifier_Y" fallthroughContext="#pop">
1977         <AnyChar attribute="Number" context="#stay" String="0123456789"/>
1978       </context>
1979 
1980       <context attribute="Glob Flag" lineEndContext="#pop" name="GlobQualifier_L" fallthroughContext="#pop">
1981         <AnyChar attribute="Normal Text" context="#stay" String="kKmMpPgGtT"/>
1982         <AnyChar attribute="Number" context="#pop!GlobQualifier_Y" String="-+0123456789"/>
1983       </context>
1984 
1985       <context attribute="Glob Flag" lineEndContext="#pop" name="GlobQualifier_a" fallthroughContext="#pop">
1986         <AnyChar attribute="Normal Text" context="#stay" String="Mwhmsd"/>
1987         <AnyChar attribute="Number" context="#pop!GlobQualifier_Y" String="-+0123456789"/>
1988       </context>
1989 
1990       <context attribute="Glob Flag" lineEndContext="#pop" name="GlobQualifier_+" fallthroughContext="#pop">
1991         <RegExpr attribute="Function" context="#pop" String="[^&_fragpathseps;=,\[]+"/>
1992       </context>
1993 
1994       <context attribute="Path" lineEndContext="#pop" name="GlobQualifier_d">
1995         <AnyChar context="#pop" String=")," lookAhead="1"/>
1996       </context>
1997 
1998       <context attribute="Glob Flag" lineEndContext="#pop" name="GlobQualifier_u">
1999         <AnyChar attribute="Number" context="#pop!GlobQualifier_Y" String="0123456789"/>
2000         <IncludeRules context="GlobQualifier_e"/>
2001       </context>
2002 
2003       <context attribute="Glob Flag" lineEndContext="#pop" name="GlobQualifier_f" fallthroughContext="#pop">
2004         <AnyChar attribute="Number" context="#pop!GlobQualifier_fo" String="0123456789=+-"/>
2005         <DetectChar attribute="Glob" context="#pop!GlobQualifier_fo" char="?"/>
2006         <DetectChar attribute="Glob Flag" context="#pop!GlobQualifier_f[" char="["/>
2007         <DetectChar attribute="Glob Flag" context="#pop!GlobQualifier_f&lt;" char="&lt;"/>
2008         <DetectChar attribute="Glob Flag" context="#pop!GlobQualifier_f{" char="{"/>
2009         <RegExpr attribute="Glob Flag" context="#pop!GlobQualifier_fx" String="(.)"/>
2010       </context>
2011       <context attribute="Number" lineEndContext="#pop" name="GlobQualifier_fo" fallthroughContext="#pop">
2012         <AnyChar attribute="Number" context="#stay" String="0123456789"/>
2013         <DetectChar attribute="Glob" context="#stay" char="?"/>
2014       </context>
2015       <context attribute="Normal Text" lineEndContext="#stay" name="GlobQualifier_f[">
2016         <DetectChar attribute="Operator" context="#stay" char=","/>
2017         <DetectChar attribute="Glob Flag" context="#pop" char="]"/>
2018       </context>
2019       <context attribute="Normal Text" lineEndContext="#stay" name="GlobQualifier_f&lt;">
2020         <DetectChar attribute="Operator" context="#stay" char=","/>
2021         <DetectChar attribute="Glob Flag" context="#pop" char=">"/>
2022       </context>
2023       <context attribute="Normal Text" lineEndContext="#stay" name="GlobQualifier_f{">
2024         <DetectChar attribute="Operator" context="#stay" char=","/>
2025         <DetectChar attribute="Glob Flag" context="#pop" char="}"/>
2026       </context>
2027       <context attribute="Normal Text" lineEndContext="#stay" name="GlobQualifier_fx">
2028         <DetectChar attribute="Operator" context="#stay" char=","/>
2029         <DetectChar attribute="Glob Flag" context="#pop" char="1" dynamic="1"/>
2030       </context>
2031 
2032       <context attribute="Glob Flag" lineEndContext="#pop" name="GlobQualifier_e" fallthroughContext="#pop">
2033         <DetectChar attribute="Glob Flag" context="#pop!GlobQualifier_e[" char="["/>
2034         <DetectChar attribute="Glob Flag" context="#pop!GlobQualifier_e&lt;" char="&lt;"/>
2035         <DetectChar attribute="Glob Flag" context="#pop!GlobQualifier_e{" char="{"/>
2036         <RegExpr attribute="Glob Flag" context="#pop!GlobQualifier_ex" String="(.)"/>
2037       </context>
2038       <context attribute="Normal Text" lineEndContext="#stay" name="IncGlobQualifier_e">
2039         <IncludeRules context="FindStrings"/>
2040         <DetectChar context="RegularVariable" char="$" lookAhead="1"/>
2041         <DetectChar attribute="Backquote" context="RegularBackq" char="`"/>
2042       </context>
2043       <context attribute="Normal Text" lineEndContext="#stay" name="GlobQualifier_e[">
2044         <DetectChar attribute="Glob Flag" context="#pop" char="]"/>
2045         <IncludeRules context="IncGlobQualifier_e"/>
2046       </context>
2047       <context attribute="Normal Text" lineEndContext="#stay" name="GlobQualifier_e&lt;">
2048         <DetectChar attribute="Glob Flag" context="#pop" char=">"/>
2049         <IncludeRules context="IncGlobQualifier_e"/>
2050       </context>
2051       <context attribute="Normal Text" lineEndContext="#stay" name="GlobQualifier_e{">
2052         <DetectChar attribute="Glob Flag" context="#pop" char="}"/>
2053         <IncludeRules context="IncGlobQualifier_e"/>
2054       </context>
2055       <context attribute="Normal Text" lineEndContext="#stay" name="GlobQualifier_ex">
2056         <DetectChar attribute="Glob Flag" context="#pop" char="1" dynamic="1"/>
2057         <IncludeRules context="IncGlobQualifier_e"/>
2058       </context>
2059 
2060       <!-- GlobPatFlag is called after a (# is encountered -->
2061       <context attribute="Glob Flag" lineEndContext="#pop" name="GlobPatFlag" fallthroughContext="#pop">
2062         <IncludeRules context="IncGlobPatFlag"/>
2063         <DetectChar attribute="Glob Flag" context="#pop" char=")"/>
2064       </context>
2065       <context attribute="Glob Flag" lineEndContext="#pop" name="GlobPatFlagThenPath" fallthroughContext="#pop">
2066         <IncludeRules context="IncGlobPatFlag"/>
2067         <DetectChar attribute="Glob Flag" context="#pop!PathThenPop" char=")"/>
2068       </context>
2069       <context attribute="Glob Flag" lineEndContext="#pop" name="IncGlobPatFlag" fallthroughContext="#pop">
2070         <AnyChar attribute="Glob Flag" context="#stay" String="ilIbBcmMaseuU,"/>
2071         <AnyChar attribute="Number" context="#stay" String="0123456789"/>
2072         <DetectChar attribute="Glob Flag" context="#pop!GlobQualifier" char="q"/>
2073       </context>
2074 
2075       <!-- GlobModifier is called after a : is encountered in a GlobQualifier -->
2076       <context attribute="Parameter Expansion" lineEndContext="#pop" name="GlobModifier">
2077         <DetectChar attribute="Parameter Expansion Operator" context="#stay" char=":"/>
2078         <AnyChar attribute="Parameter Expansion" context="VarBraceModifier_h" String="ht"/>
2079         <DetectChar attribute="Parameter Expansion" context="GlobModifier_s" char="s"/>
2080         <Detect2Chars attribute="Parameter Expansion" context="GlobModifier_s" char="g" char1="s"/>
2081         <DetectChar attribute="Glob Flag" context="#pop" char=")"/>
2082       </context>
2083       <context attribute="Parameter Expansion" lineEndContext="#stay" name="GlobModifier_s" fallthroughContext="#pop">
2084         <DetectChar attribute="Error" context="#pop#pop" char=")"/>
2085         <DetectChar attribute="Parameter Expansion Operator" context="#pop!GlobModifier_s_PatPrefix" char="/"/>
2086       </context>
2087       <context attribute="Pattern" lineEndContext="#stay" name="GlobModifier_s_PatPrefix" fallthroughContext="#pop!GlobModifier_s_Pat">
2088         <Detect2Chars attribute="Parameter Expansion Operator" context="#pop!GlobModifier_s_Pat" char="#" char1="%"/>
2089         <AnyChar attribute="Parameter Expansion Operator" context="#pop!GlobModifier_s_Pat" String="#%"/>
2090       </context>
2091       <context attribute="Pattern" lineEndContext="#stay" name="GlobModifier_s_Pat">
2092         <DetectChar attribute="Parameter Expansion Operator" context="#pop!GlobModifier_s_Rep" char="/"/>
2093         <IncludeRules context="FindWord"/>
2094         <IncludeRules context="FindSubPattern"/>
2095         <DetectChar attribute="Error" context="#pop#pop" char=")"/>
2096         <DetectIdentifier attribute="Pattern"/>
2097       </context>
2098       <context attribute="String DoubleQ" lineEndContext="#stay" name="GlobModifier_s_Rep">
2099         <DetectChar attribute="Glob Flag" context="#pop#pop" char=")"/>
2100         <DetectChar attribute="Parameter Expansion Operator" context="#pop" char="/"/>
2101         <DetectChar attribute="String DoubleQ" context="GlobModifier_s_RecursiveRep" char="("/>
2102         <IncludeRules context="FindWord"/>
2103         <DetectIdentifier attribute="String DoubleQ"/>
2104       </context>
2105       <context attribute="String DoubleQ" lineEndContext="#stay" name="GlobModifier_s_RecursiveRep">
2106         <DetectChar attribute="String DoubleQ" context="#pop" char=")"/>
2107         <DetectChar attribute="String DoubleQ" context="GlobModifier_s_RecursiveRep" char="("/>
2108         <IncludeRules context="FindWord"/>
2109         <DetectIdentifier attribute="String DoubleQ"/>
2110       </context>
2111 
2112     </contexts>
2113 
2114     <itemDatas>
2115       <itemData name="Normal Text"    defStyleNum="dsNormal"/>
2116       <itemData name="Comment"        defStyleNum="dsComment"/>
2117       <itemData name="Keyword"        defStyleNum="dsKeyword"       spellChecking="false"/>
2118       <itemData name="Control"        defStyleNum="dsKeyword"       spellChecking="false"/>
2119       <itemData name="Control Flow"   defStyleNum="dsControlFlow"   spellChecking="false"/>
2120       <itemData name="Builtin"        defStyleNum="dsBuiltIn"       spellChecking="false"/>
2121       <itemData name="Command"        defStyleNum="dsFunction"      spellChecking="false"/>
2122       <itemData name="OtherCommand"   defStyleNum="dsExtension"     spellChecking="false"/>
2123       <itemData name="Redirection"    defStyleNum="dsOperator"      spellChecking="false"/>
2124       <itemData name="Escape"         defStyleNum="dsDataType"      spellChecking="false"/>
2125       <itemData name="String SingleQ" defStyleNum="dsString"/>
2126       <itemData name="String DoubleQ" defStyleNum="dsString"/>
2127       <itemData name="Here Doc"       defStyleNum="dsString"/>
2128       <itemData name="Backquote"      defStyleNum="dsKeyword"       spellChecking="false"/>
2129       <itemData name="String Transl." defStyleNum="dsString"/>
2130       <itemData name="String Escape"  defStyleNum="dsDataType"/>
2131       <itemData name="Variable"       defStyleNum="dsVariable"      spellChecking="false"/>
2132       <itemData name="Dollar Prefix"  defStyleNum="dsVariable"      spellChecking="false"/>
2133       <itemData name="Expression"     defStyleNum="dsOthers"        spellChecking="false"/>
2134       <itemData name="Function"       defStyleNum="dsFunction"      spellChecking="false"/>
2135       <itemData name="Pattern"        defStyleNum="dsSpecialString" spellChecking="false"/>
2136       <itemData name="Path"           defStyleNum="dsNormal"        spellChecking="false"/>
2137       <itemData name="Glob"           defStyleNum="dsPreprocessor"  spellChecking="false"/>
2138       <itemData name="Glob Flag"      defStyleNum="dsOperator"      spellChecking="false"/>
2139       <itemData name="Option"         defStyleNum="dsAttribute"     spellChecking="false"/>
2140       <itemData name="Hex"            defStyleNum="dsBaseN"         spellChecking="false"/>
2141       <itemData name="Number"         defStyleNum="dsDecVal"        spellChecking="false"/>
2142       <itemData name="Base"           defStyleNum="dsDataType"      spellChecking="false"/>
2143       <itemData name="BaseN"          defStyleNum="dsBaseN"         spellChecking="false"/>
2144       <itemData name="File Descriptor" defStyleNum="dsDecVal"       spellChecking="false"/>
2145       <itemData name="Parameter Expansion" defStyleNum="dsVariable" spellChecking="false"/>
2146       <itemData name="Parameter Expansion Operator" defStyleNum="dsOperator" spellChecking="false"/>
2147       <itemData name="Operator"       defStyleNum="dsOperator"      spellChecking="false"/>
2148       <itemData name="Error"          defStyleNum="dsError"         spellChecking="false"/>
2149     </itemDatas>
2150   </highlighting>
2151   <general>
2152     <comments>
2153       <comment name="singleLine" start="#"/>
2154     </comments>
2155     <keywords casesensitive="1" weakDeliminator="^%#[]$._:-/" additionalDeliminator="`"/>
2156   </general>
2157 </language>
2158 <!-- kate: replace-tabs on; indent-width 2; -->