<?xml version="1.0"?>
<syntax name="name.elliottcable.Espresso.Syntax.Programming.Ruby">
<!--
We break this document down into a huge library of collections, and an
utterly simplistic primary zones section that does nothing more than
`include` the correct collections in the correct order. This allows us to
re-use groups of zones easily, as well as allowing us to order the
elements of the document however we want to, without having to worry too
much about precedence (since we can re-order the include statements
however we need to, to preserve the precedence of syntax elements'
matching rules).
-->
<zones>
<!--<zone name="end-of-file">
<starts-with>
<expression>__END__</expression>
</starts-with>
<ends-with>
<expression>NULL</expression>
</ends-with>
</zone>-->
<include collection="literal.collection.array"/>
<include collection="literal.collection.dictionary"/>
<include collection="control.flow"/>
<include collection="control.flow.exception"/>
<include collection="control.flow.case"/>
<include collection="delimiter"/>
<include collection="container.expression.parenthetical"/>
<include collection="container.class-module"/>
<include collection="metadata.comment.header"/>
<include collection="metadata.comment"/>
<include collection="literal.string.heredoc"/>
<include collection="keyword.control"/>
<include collection="literal.keyword"/>
<include collection="container.block"/>
<include collection="container.function"/>
<include collection="identifier.variable"/>
<include collection="literal.string"/>
<include collection="literal.regex"/>
<include collection="literal.numeric"/>
<include collection="operator"/>
</zones>
<library>
<!-- ============
= Literals =
============ -->
<collection name="literal.string">
<!-- 'A single-quoted string' -->
<zone name="literal.string.quoted.single">
<starts-with>
<expression>'</expression>
<capture number="0" name="begin"/>
</starts-with>
<ends-with>
<expression>'</expression>
<capture number="0" name="end"/>
</ends-with>
<subzones>
<include collection="subzones.literal.non-interpolated"/>
</subzones>
</zone>
<!-- "A double-quoted string" -->
<zone name="literal.string.quoted.double">
<starts-with>
<expression>"</expression>
<capture number="0" name="begin"/>
</starts-with>
<ends-with>
<expression>"</expression>
<capture number="0" name="end"/>
</ends-with>
<subzones>
<include collection="subzones.literal.interpolated"/>
</subzones>
</zone>
<!--
Again here, I can't really do this the "right way" without variable-
width look-behinds (to look behind and see if the starts-with
expression used the appropriate starting character). Thus, I'm going
to have to separately define each type of paired delimiter, and then
one more for the wildcard pairs.
-->
<!-- %(A percent-delimited string) -->
<zone name="literal.string.percent-delimited.interpolated.parenthesis">
<starts-with>
<expression>(%)(Q)?(\()</expression>
<capture number="1" name="delimiter.literal.percent-delimiter"/>
<capture number="2" name="delimiter.literal.percent-delimited.qualifier"/>
<capture number="3" name="delimiter.balanced.percent-delimited.begin"/>
</starts-with>
<ends-with>
<expression>(\))</expression>
<capture number="1" name="delimiter.balanced.percent-delimited.begin"/>
</ends-with>
<subzones>
<include collection="subzones.literal.interpolated"/>
</subzones>
</zone>
<zone name="literal.string.percent-delimited.interpolated.square-brace">
<starts-with>
<expression>(%)(Q)?(\[)</expression>
<capture number="1" name="delimiter.literal.percent-delimiter"/>
<capture number="2" name="delimiter.literal.percent-delimited.qualifier"/>
<capture number="3" name="delimiter.balanced.percent-delimited.begin"/>
</starts-with>
<ends-with>
<expression>(\])</expression>
<capture number="1" name="delimiter.balanced.percent-delimited.begin"/>
</ends-with>
<subzones>
<include collection="subzones.literal.interpolated"/>
</subzones>
</zone>
<zone name="literal.string.percent-delimited.interpolated.curly-brace">
<starts-with>
<expression>(%)(Q)?(\{)</expression>
<capture number="1" name="delimiter.literal.percent-delimiter"/>
<capture number="2" name="delimiter.literal.percent-delimited.qualifier"/>
<capture number="3" name="delimiter.balanced.percent-delimited.begin"/>
</starts-with>
<ends-with>
<expression>(\})</expression>
<capture number="1" name="delimiter.balanced.percent-delimited.begin"/>
</ends-with>
<subzones>
<include collection="subzones.literal.interpolated"/>
</subzones>
</zone>
<zone name="literal.string.percent-delimited.interpolated.angle-brace">
<starts-with>
<expression>(%)(Q)?(\<)</expression>
<capture number="1" name="delimiter.literal.percent-delimiter"/>
<capture number="2" name="delimiter.literal.percent-delimited.qualifier"/>
<capture number="3" name="delimiter.balanced.percent-delimited.begin"/>
</starts-with>
<ends-with>
<expression>(\>)</expression>
<capture number="1" name="delimiter.balanced.percent-delimited.begin"/>
</ends-with>
<subzones>
<include collection="subzones.literal.interpolated"/>
</subzones>
</zone>
<zone name="literal.string.percent-delimited.interpolated">
<starts-with>
<expression>(%)(Q)?([`~!@#$%^&*-_=+\|'";:.,/?])</expression>
<capture number="1" name="delimiter.literal.percent-delimiter"/>
<capture number="2" name="delimiter.literal.percent-delimited.qualifier"/>
<capture number="3" name="delimiter.balanced.percent-delimited.begin"/>
</starts-with>
<ends-with>
<expression>(\3)</expression>
<capture number="1" name="delimiter.balanced.percent-delimited.begin"/>
</ends-with>
<subzones>
<include collection="subzones.literal.interpolated"/>
</subzones>
</zone>
<zone name="literal.string.percent-delimited.non-interpolated.parenthesis">
<starts-with>
<expression>(%)(q)(\()</expression>
<capture number="1" name="delimiter.literal.percent-delimiter"/>
<capture number="2" name="delimiter.literal.percent-delimited.qualifier"/>
<capture number="3" name="delimiter.balanced.percent-delimited.begin"/>
</starts-with>
<ends-with>
<expression>(\))</expression>
<capture number="1" name="delimiter.balanced.percent-delimited.begin"/>
</ends-with>
<subzones>
<include collection="subzones.literal.non-interpolated"/>
</subzones>
</zone>
<zone name="literal.string.percent-delimited.non-interpolated.square-brace">
<starts-with>
<expression>(%)(q)(\[)</expression>
<capture number="1" name="delimiter.literal.percent-delimiter"/>
<capture number="2" name="delimiter.literal.percent-delimited.qualifier"/>
<capture number="3" name="delimiter.balanced.percent-delimited.begin"/>
</starts-with>
<ends-with>
<expression>(\])</expression>
<capture number="1" name="delimiter.balanced.percent-delimited.begin"/>
</ends-with>
<subzones>
<include collection="subzones.literal.non-interpolated"/>
</subzones>
</zone>
<zone name="literal.string.percent-delimited.non-interpolated.curly-brace">
<starts-with>
<expression>(%)(q)(\{)</expression>
<capture number="1" name="delimiter.literal.percent-delimiter"/>
<capture number="2" name="delimiter.literal.percent-delimited.qualifier"/>
<capture number="3" name="delimiter.balanced.percent-delimited.begin"/>
</starts-with>
<ends-with>
<expression>(\})</expression>
<capture number="1" name="delimiter.balanced.percent-delimited.begin"/>
</ends-with>
<subzones>
<include collection="subzones.literal.non-interpolated"/>
</subzones>
</zone>
<zone name="literal.string.percent-delimited.non-interpolated.angle-brace">
<starts-with>
<expression>(%)(q)(\<)</expression>
<capture number="1" name="delimiter.literal.percent-delimiter"/>
<capture number="2" name="delimiter.literal.percent-delimited.qualifier"/>
<capture number="3" name="delimiter.balanced.percent-delimited.begin"/>
</starts-with>
<ends-with>
<expression>(\>)</expression>
<capture number="1" name="delimiter.balanced.percent-delimited.begin"/>
</ends-with>
<subzones>
<include collection="subzones.literal.non-interpolated"/>
</subzones>
</zone>
<zone name="literal.string.percent-delimited.non-interpolated">
<starts-with>
<expression>(%)(q)?([`~!@#$%^&*-_=+\|'";:.,/?])</expression>
<capture number="1" name="delimiter.literal.percent-delimiter"/>
<capture number="2" name="delimiter.literal.percent-delimited.qualifier"/>
<capture number="3" name="delimiter.balanced.percent-delimited.begin"/>
</starts-with>
<ends-with>
<expression>(\3)</expression>
<capture number="1" name="delimiter.balanced.percent-delimited.begin"/>
</ends-with>
<subzones>
<include collection="subzones.literal.non-interpolated"/>
</subzones>
</zone>
<zone name="literal.symbol">
<expression>\B:([A-Za-z0-9_\+\/\-\*\=\"\'&\|@~<>%`]*(\[\]|\(\))*[\?\!\=]?)</expression>
<capture number="1" name="symbol.name"/>
</zone>
<!-- %s(percent_delimited_symbol) -->
<zone name="literal.symbol.percent-delimited.non-interpolated.parenthesis">
<starts-with>
<expression>(%)(s)(\()</expression>
<capture number="1" name="delimiter.literal.percent-delimiter"/>
<capture number="2" name="delimiter.literal.percent-delimited.qualifier"/>
<capture number="3" name="delimiter.balanced.percent-delimited.begin"/>
</starts-with>
<ends-with>
<expression>(\))</expression>
<capture number="1" name="delimiter.balanced.percent-delimited.begin"/>
</ends-with>
<subzones>
<include collection="subzones.literal.symbol.non-interpolated"/>
</subzones>
</zone>
<zone name="literal.symbol.percent-delimited.non-interpolated.square-brace">
<starts-with>
<expression>(%)(s)(\[)</expression>
<capture number="1" name="delimiter.literal.percent-delimiter"/>
<capture number="2" name="delimiter.literal.percent-delimited.qualifier"/>
<capture number="3" name="delimiter.balanced.percent-delimited.begin"/>
</starts-with>
<ends-with>
<expression>(\])</expression>
<capture number="1" name="delimiter.balanced.percent-delimited.begin"/>
</ends-with>
<subzones>
<include collection="subzones.literal.symbol.non-interpolated"/>
</subzones>
</zone>
<zone name="literal.symbol.percent-delimited.non-interpolated.curly-brace">
<starts-with>
<expression>(%)(s)(\{)</expression>
<capture number="1" name="delimiter.literal.percent-delimiter"/>
<capture number="2" name="delimiter.literal.percent-delimited.qualifier"/>
<capture number="3" name="delimiter.balanced.percent-delimited.begin"/>
</starts-with>
<ends-with>
<expression>(\})</expression>
<capture number="1" name="delimiter.balanced.percent-delimited.begin"/>
</ends-with>
<subzones>
<include collection="subzones.literal.symbol.non-interpolated"/>
</subzones>
</zone>
<zone name="literal.symbol.percent-delimited.non-interpolated.angle-brace">
<starts-with>
<expression>(%)(s)(\<)</expression>
<capture number="1" name="delimiter.literal.percent-delimiter"/>
<capture number="2" name="delimiter.literal.percent-delimited.qualifier"/>
<capture number="3" name="delimiter.balanced.percent-delimited.begin"/>
</starts-with>
<ends-with>
<expression>(\>)</expression>
<capture number="1" name="delimiter.balanced.percent-delimited.begin"/>
</ends-with>
<subzones>
<include collection="subzones.literal.symbol.non-interpolated"/>
</subzones>
</zone>
<zone name="literal.symbol.percent-delimited.non-interpolated">
<starts-with>
<expression>(%)(s)?([`~!@#$%^&*-_=+\|'";:.,/?])</expression>
<capture number="1" name="delimiter.literal.percent-delimiter"/>
<capture number="2" name="delimiter.literal.percent-delimited.qualifier"/>
<capture number="3" name="delimiter.balanced.percent-delimited.begin"/>
</starts-with>
<ends-with>
<expression>(\3)</expression>
<capture number="1" name="delimiter.balanced.percent-delimited.begin"/>
</ends-with>
<subzones>
<include collection="subzones.literal.non-interpolated"/>
</subzones>
</zone>
</collection>
<collection name="subzones.literal.interpolated">
<!-- "A double-quoted string with\nescape \"sequences\"" -->
<zone name="literal.escape.extended">
<expression>\\.</expression>
<capture number="1" name="delimiter.seperator.escape"/>
<capture number="2" name="character"/>
</zone>
<!-- "A double-quoted string with #{interpolations}" -->
<zone name="string.interpolation">
<starts-with>
<expression>#(\{)</expression>
<capture number="1" name="delimiter.balanced.curly-brace.begin"/>
</starts-with>
<ends-with>
<expression>\}</expression>
<capture number="0" name="delimiter.balanced.curly-brace.end"/>
</ends-with>
<subzones>
<include syntax="name.elliottcable.Espresso.Syntax.Programming.Ruby"/>
</subzones>
</zone>
</collection>
<collection name="subzones.literal.non-interpolated">
<zone name="literal.escape.brief">
<!-- 'A single-quoted string with \'escape sequences\'' -->
<expression>(\\)('|\\)</expression>
<capture number="1" name="delimiter.seperator.escape"/>
<capture number="2" name="character"/>
</zone>
</collection>
<collection name="literal.string.heredoc">
<!--
Okay, so. This is extremely messy. Different zones for every possible
situation, not very flexible. I just don't know a better way to do it.
-->
<zone name="literal.string.heredoc.no-quotes">
<starts-with>
<expression>(<<-?)(\w+)</expression>
<capture number="1" name="operator.accessor.heredoc.begin"/>
<capture number="2" name="heredoc.name"/>
</starts-with>
<ends-with>
<expression>\2</expression>
<capture number="0" name="heredoc.name.end"/>
</ends-with>
</zone>
<zone name="literal.string.heredoc.quoted">
<starts-with>
<expression>(<<-?)('|")(.*?)(\2)</expression>
<capture number="1" name="operator.accessor.heredoc.begin"/>
<capture number="2" name="delimiter.quote.balanced.begin"/>
<capture number="3" name="heredoc.name"/>
<capture number="4" name="delimiter.quote.balanced.end"/>
</starts-with>
<ends-with>
<expression>\3</expression>
<capture number="0" name="heredoc.name.end"/>
</ends-with>
</zone>
</collection>
<collection name="literal.regex">
<!-- I'm just going to come out and do this the way Pygments does it. Because it works for that.
Here is a copy of their (extended) regex. And the two smaller ones.
# After keywords or assignments
(?:^|(?<=[=<>-!])|
(?<=(?:\s|;)when\s)|
(?<=(?:\s|;)or\s)|
(?<=(?:\s|;)and\s)|
(?<=(?:\s|;|\.)index\s)|
(?<=(?:\s|;|\.)scan\s)|
(?<=(?:\s|;|\.)sub\s)|
(?<=(?:\s|;|\.)sub!\s)|
(?<=(?:\s|;|\.)gsub\s)|
(?<=(?:\s|;|\.)gsub!\s)|
(?<=(?:\s|;|\.)match\s)|
(?<=(?:\s|;|\.)if\s)|
(?<=(?:\s|;|\.)elsif\s)|
(?<=^when\s)|
(?<=^index\s)|
(?<=^scan\s)|
(?<=^sub\s)|
(?<=^gsub\s)|
(?<=^sub!\s)|
(?<=^gsub!\s)|
(?<=^match\s)|
(?<=^if\s)|
(?<=^elsif\s)
)(\s*)(\/) #=> multiline-regex
>> (?:^|(?<=[=<>-!])|
(?<=(?:\s|;)when\s)|
(?<=(?:\s|;)or\s)|
(?<=(?:\s|;)and\s)|
(?<=(?:\s|;|\.)index\s)|
(?<=(?:\s|;|\.)scan\s)|
(?<=(?:\s|;|\.)sub\s)|
(?<=(?:\s|;|\.)sub!\s)|
(?<=(?:\s|;|\.)gsub\s)|
(?<=(?:\s|;|\.)gsub!\s)|
(?<=(?:\s|;|\.)match\s)|
(?<=(?:\s|;|\.)if\s)|
(?<=(?:\s|;|\.)elsif\s)|
(?<=^when\s)|
(?<=^index\s)|
(?<=^scan\s)|
(?<=^sub\s)|
(?<=^gsub\s)|
(?<=^sub!\s)|
(?<=^gsub!\s)|
(?<=^match\s)|
(?<=^if\s)|
(?<=^elsif\s)
)(\s*)(\/)
>> (?:^|(?<=[=<>-!])|(?<=(?:\s|;)when\s)|(?<=(?:\s|;)or\s)|(?<=(?:\s|;)and\s)|(?<=(?:\s|;|\.)index\s)|(?<=(?:\s|;|\.)scan\s)|(?<=(?:\s|;|\.)sub\s)|(?<=(?:\s|;|\.)sub!\s)|(?<=(?:\s|;|\.)gsub\s)|(?<=(?:\s|;|\.)gsub!\s)|(?<=(?:\s|;|\.)match\s)|(?<=(?:\s|;|\.)if\s)|(?<=(?:\s|;|\.)elsif\s)|(?<=^when\s)|(?<=^index\s)|(?<=^scan\s)|(?<=^sub\s)|(?<=^gsub\s)|(?<=^sub!\s)|(?<=^gsub!\s)|(?<=^match\s)|(?<=^if\s)|(?<=^elsif\s))(\s*)(\/)
# In method calls
(?<=\(|,)\/ #=> multiline-regex
>> (?<=\(|,)\/
# Funny no whitespace rule
(\s+)(\/[^\s=]) #=> multiline-regex
-->
<zone name="literal.regex">
<starts-with>
<expression>(?:^|(?<=[=<>-!])|(?<=(?:\s|;)when\s)|(?<=(?:\s|;)or\s)|(?<=(?:\s|;)and\s)|(?<=(?:\s|;|\.)index\s)|(?<=(?:\s|;|\.)scan\s)|(?<=(?:\s|;|\.)sub\s)|(?<=(?:\s|;|\.)sub!\s)|(?<=(?:\s|;|\.)gsub\s)|(?<=(?:\s|;|\.)gsub!\s)|(?<=(?:\s|;|\.)match\s)|(?<=(?:\s|;|\.)if\s)|(?<=(?:\s|;|\.)elsif\s)|(?<=^when\s)|(?<=^index\s)|(?<=^scan\s)|(?<=^sub\s)|(?<=^gsub\s)|(?<=^sub!\s)|(?<=^gsub!\s)|(?<=^match\s)|(?<=^if\s)|(?<=^elsif\s))(\s*)(\/)</expression>
</starts-with>
<ends-with>
<expression>(/)([iomxneus]*)</expression>
<capture number="1" name="delimiter.balanced.slahs.end"/>
<capture number="2" name="literal.regex.modifier"/>
</ends-with>
<subzones>
<include syntax="name.elliottcable.Espresso.Syntax.Expression.Regex"/>
</subzones>
</zone>
<zone name="literal.regex">
<starts-with>
<expression>(?<=\(|,)(\/)</expression>
<capture number="3" name="delimiter.balanced.slash.begin"/>
</starts-with>
<ends-with>
<expression>(/)([iomxneus]*)</expression>
<capture number="1" name="delimiter.balanced.slahs.end"/>
<capture number="2" name="literal.regex.modifier"/>
</ends-with>
<subzones>
<include syntax="name.elliottcable.Espresso.Syntax.Expression.Regex"/>
</subzones>
</zone>
<zone name="literal.regex">
<starts-with>
<expression>(\s+)(\/)(?![\s=])</expression>
<capture number="3" name="delimiter.balanced.slash.begin"/>
</starts-with>
<ends-with>
<expression>(/)([iomxneus]*)</expression>
<capture number="1" name="delimiter.balanced.slash.end"/>
<capture number="2" name="literal.regex.modifier"/>
</ends-with>
<subzones>
<include syntax="name.elliottcable.Espresso.Syntax.Expression.Regex"/>
</subzones>
</zone>
<zone name="literal.regex.percent-delimited.interpolated.parenthesis">
<starts-with>
<expression>(%)(r)(\()</expression>
<capture number="1" name="delimiter.literal.percent-delimiter"/>
<capture number="2" name="delimiter.literal.percent-delimited.qualifier"/>
<capture number="3" name="delimiter.balanced.percent-delimited.begin"/>
</starts-with>
<ends-with>
<expression>(\))([iomxneus]*)</expression>
<capture number="1" name="delimiter.balanced.percent-delimited.begin"/>
<capture number="2" name="literal.regex.modifier"/>
</ends-with>
<subzones>
<include syntax="name.elliottcable.Espresso.Syntax.Expression.Regex"/>
</subzones>
</zone>
<zone name="literal.regex.percent-delimited.interpolated.square-brace">
<starts-with>
<expression>(%)(r)(\[)</expression>
<capture number="1" name="delimiter.literal.percent-delimiter"/>
<capture number="2" name="delimiter.literal.percent-delimited.qualifier"/>
<capture number="3" name="delimiter.balanced.percent-delimited.begin"/>
</starts-with>
<ends-with>
<expression>(\])([iomxneus]*)</expression>
<capture number="1" name="delimiter.balanced.percent-delimited.begin"/>
<capture number="2" name="literal.regex.modifier"/>
</ends-with>
<subzones>
<include syntax="name.elliottcable.Espresso.Syntax.Expression.Regex"/>
</subzones>
</zone>
<zone name="literal.regex.percent-delimited.interpolated.curly-brace">
<starts-with>
<expression>(%)(r)(\{)</expression>
<capture number="1" name="delimiter.literal.percent-delimiter"/>
<capture number="2" name="delimiter.literal.percent-delimited.qualifier"/>
<capture number="3" name="delimiter.balanced.percent-delimited.begin"/>
</starts-with>
<ends-with>
<expression>(\})([iomxneus]*)</expression>
<capture number="1" name="delimiter.balanced.percent-delimited.begin"/>
<capture number="2" name="literal.regex.modifier"/>
</ends-with>
<subzones>
<include syntax="name.elliottcable.Espresso.Syntax.Expression.Regex"/>
</subzones>
</zone>
<zone name="literal.regex.percent-delimited.interpolated.angle-brace">
<starts-with>
<expression>(%)(r)(\<)</expression>
<capture number="1" name="delimiter.literal.percent-delimiter"/>
<capture number="2" name="delimiter.literal.percent-delimited.qualifier"/>
<capture number="3" name="delimiter.balanced.percent-delimited.begin"/>
</starts-with>
<ends-with>
<expression>(\>)([iomxneus]*)</expression>
<capture number="1" name="delimiter.balanced.percent-delimited.begin"/>
<capture number="2" name="literal.regex.modifier"/>
</ends-with>
<subzones>
<include syntax="name.elliottcable.Espresso.Syntax.Expression.Regex"/>
</subzones>
</zone>
<zone name="literal.regex.percent-delimited.interpolated">
<starts-with>
<expression>(%)(r)([`~!@#$%^&*-_=+\|'";:.,/?])</expression>
<capture number="1" name="delimiter.literal.percent-delimiter"/>
<capture number="2" name="delimiter.literal.percent-delimited.qualifier"/>
<capture number="3" name="delimiter.balanced.percent-delimited.begin"/>
</starts-with>
<ends-with>
<expression>(\3)([iomxneus]*)</expression>
<capture number="1" name="delimiter.balanced.percent-delimited.begin"/>
<capture number="2" name="literal.regex.modifier"/>
</ends-with>
<subzones>
<include syntax="name.elliottcable.Espresso.Syntax.Expression.Regex"/>
</subzones>
</zone>
</collection>
<collection name="literal.numeric">
<!--
I want to seperately hilight all the different types of
literal.numerics. So, we have to provide multiple similar definitions
of a literal.numeric.
-->
<!-- 01756 -->
<zone name="literal.numeric.integer.octal">
<expression>\b(0)([0-7]+)\b</expression>
<capture number="1" name="numeric.delimiter.octal.initial-zero"/>
<capture number="2" name="numeric.octal.value"/>
</zone>
<!-- 0b010010110 -->
<zone name="literal.numeric.integer.binary">
<expression>\b(0(?:b|B))([01]+)\b</expression>
<capture number="1" name="numeric.delimiter.binary.initial-zero-b"/>
<capture number="2" name="numeric.binary.value"/>
</zone>
<!-- 0xDEADBEEF586 -->
<zone name="literal.numeric.integer.hex">
<expression>\b(0(?:x|X))([0-9a-fA-F]+)\b</expression>
<capture number="1" name="numeric.delimiter.hexadecimal.initial-zero-x"/>
<capture number="2" name="numeric.hexadecimal.value"/>
</zone>
<!-- 142.87e3, 0.22e8 -->
<zone name="literal.numeric.float.with-exponent">
<expression>\b(0|[1-9][0-9]*)(\.)([0-9]+)(e|E)(-?[0-9]+)\b</expression>
<capture number="1" name="integral.value"/>
<capture number="2" name="delimiter.seperator.radix-point"/>
<capture number="3" name="fractional.value"/>
<capture number="4" name="literal.numeric.exponent.delimiter"/>
<capture number="5" name="literal.numeric.exponent.value"/>
</zone>
<!-- 142.87, 0.22 -->
<zone name="literal.numeric.float">
<expression>\b(0|[1-9][0-9]*)(\.)([0-9]+)\b</expression>
<capture number="1" name="integral.value"/>
<capture number="2" name="delimiter.seperator.radix-point"/>
<capture number="3" name="fractional.value"/>
</zone>
<!-- 142e3, 0e8 -->
<zone name="literal.numeric.integer.decimal.with-exponent">
<expression>\b(0|[1-9][0-9]*)(e|E)(-?[0-9]+)\b</expression>
<capture number="1" name="integral.value"/>
<capture number="2" name="literal.numeric.exponent.delimiter"/>
<capture number="3" name="literal.numeric.exponent.value"/>
</zone>
<!-- 142e3, 0e8 -->
<zone name="literal.numeric.integer.decimal">
<expression>\b(0|[1-9][0-9]*)\b</expression>
<capture number="1" name="integral.value"/>
</zone>
</collection>
<collection name="literal.keyword">
<!-- true -->
<zone name="literal.keyword.bool.true">
<expression>\btrue\b</expression>
</zone>
<!-- false -->
<zone name="literal.keyword.bool.false">
<expression>\bfalse\b</expression>
</zone>
<!-- nil -->
<zone name="literal.keyword.nothing.nil">
<expression>\bnil\b</expression>
</zone>
</collection>
<collection name="subzones.array.interpolation">
<zone name="array.interpolation">
<starts-with>
<expression>#(\{)</expression>
<capture number="1" name="delimiter.balanced.curly-brace.begin"/>
</starts-with>
<ends-with>
<expression>\}</expression>
<capture number="0" name="delimiter.balanced.curly-brace.end"/>
</ends-with>
<subzones>
<include syntax="name.elliottcable.Espresso.Syntax.Programming.Ruby"/>
</subzones>
</zone>
</collection>
<collection name="literal.collection.array">
<zone name="literal.collection.array">
<starts-with>
<expression>\[(?!\]\()</expression>
<capture number="0" name="delimiter.square-bracket.array.begin"/>
</starts-with>
<ends-with>
<expression>\](?!\()</expression>
<capture number="0" name="delimiter.square-bracket.array.end"/>
</ends-with>
<subzones>
<zone name="comma.delimiter">
<expression>,</expression>
</zone>
<include syntax="name.elliottcable.Espresso.Syntax.Programming.Ruby"/>
</subzones>
</zone>
<zone name="literal.collection.array.percent-delimited.interpolated.curly-brace">
<starts-with>
<expression>(%)(W)(\{)</expression>
<capture number="1" name="delimiter.literal.percent-delimiter"/>
<capture number="2" name="delimiter.literal.percent-delimited.qualifier"/>
<capture number="3" name="delimiter.balanced.percent-delimited.begin"/>
</starts-with>
<ends-with>
<expression>(\})</expression>
<capture number="1" name="delimiter.literal.percent-delimited.end"/>
</ends-with>
<subzones>
<include collection="subzones.array.interpolation"/>
</subzones>
</zone>
<zone name="literal.collection.array.percent-delimited.interpolated.parenthesis">
<starts-with>
<expression>(%)(W)(\()</expression>
<capture number="1" name="delimiter.literal.percent-delimiter"/>
<capture number="2" name="delimiter.literal.percent-delimited.qualifier"/>
<capture number="3" name="delimiter.balanced.percent-delimited.begin"/>
</starts-with>
<ends-with>
<expression>(\))</expression>
<capture number="1" name="delimiter.literal.percent-delimited.end"/>
</ends-with>
<subzones>
<include collection="subzones.array.interpolation"/>
</subzones>
</zone>
<zone name="literal.collection.array.percent-delimited.interpolated.square-brace">
<starts-with>
<expression>(%)(W)(\[)</expression>
<capture number="1" name="delimiter.literal.percent-delimiter"/>
<capture number="2" name="delimiter.literal.percent-delimited.qualifier"/>
<capture number="3" name="delimiter.balanced.percent-delimited.begin"/>
</starts-with>
<ends-with>
<expression>(\])</expression>
<capture number="1" name="delimiter.literal.percent-delimited.end"/>
</ends-with>
<subzones>
<include collection="subzones.array.interpolation"/>
</subzones>
</zone>
<zone name="literal.collection.array.percent-delimited.interpolated.angle-brace">
<starts-with>
<expression>(%)(W)(<)</expression>
<capture number="1" name="delimiter.literal.percent-delimiter"/>
<capture number="2" name="delimiter.literal.percent-delimited.qualifier"/>
<capture number="3" name="delimiter.balanced.percent-delimited.begin"/>
</starts-with>
<ends-with>
<expression>(>)</expression>
<capture number="1" name="delimiter.literal.percent-delimited.end"/>
</ends-with>
<subzones>
<include collection="subzones.array.interpolation"/>
</subzones>
</zone>
<zone name="literal.collection.array.percent-delimited.interpolated">
<starts-with>
<expression>(%)(W)([`~!@#$%^&*-_=+\|'";:.,/?])</expression>
<capture number="1" name="delimiter.literal.percent-delimiter"/>
<capture number="2" name="delimiter.literal.percent-delimited.qualifier"/>
<capture number="3" name="delimiter.balanced.percent-delimited.begin"/>
</starts-with>
<ends-with>
<expression>(\3)</expression>
<capture number="1" name="delimiter.literal.percent-delimited.end"/>
</ends-with>
<subzones>
<include collection="subzones.array.interpolation"/>
</subzones>
</zone>
<zone name="literal.collection.array.percent-delimited.non-interpolated.curly-brace">
<starts-with>
<expression>(%)(w)(\{)</expression>
<capture number="1" name="delimiter.literal.percent-delimiter"/>
<capture number="2" name="delimiter.literal.percent-delimited.qualifier"/>
<capture number="3" name="delimiter.balanced.percent-delimited.begin"/>
</starts-with>
<ends-with>
<expression>\}</expression>
<capture number="0" name="delimiter.literal.percent-delimited.end"/>
</ends-with>
</zone>
<zone name="literal.collection.array.percent-delimited.non-interpolated.parenthesis">
<starts-with>
<expression>(%)(w)(\()</expression>
<capture number="1" name="delimiter.literal.percent-delimiter"/>
<capture number="2" name="delimiter.literal.percent-delimited.qualifier"/>
<capture number="3" name="delimiter.balanced.percent-delimited.begin"/>
</starts-with>
<ends-with>
<expression>\)</expression>
<capture number="0" name="delimiter.literal.percent-delimited.end"/>
</ends-with>
</zone>
<zone name="literal.collection.array.percent-delimited.non-interpolated.angle-brace">
<starts-with>
<expression>(%)(w)(<)</expression>
<capture number="1" name="delimiter.literal.percent-delimiter"/>
<capture number="2" name="delimiter.literal.percent-delimited.qualifier"/>
<capture number="3" name="delimiter.balanced.percent-delimited.begin"/>
</starts-with>
<ends-with>
<expression>></expression>
<capture number="0" name="delimiter.literal.percent-delimited.end"/>
</ends-with>
</zone>
<zone name="literal.collection.array.percent-delimited.non-interpolated.square-brace">
<starts-with>
<expression>(%)(w)(\[)</expression>
<capture number="1" name="delimiter.literal.percent-delimiter"/>
<capture number="2" name="delimiter.literal.percent-delimited.qualifier"/>
<capture number="3" name="delimiter.balanced.percent-delimited.begin"/>
</starts-with>
<ends-with>
<expression>\]</expression>
<capture number="0" name="delimiter.literal.percent-delimited.end"/>
</ends-with>
</zone>
<zone name="literal.collection.array.percent-delimited.non-interpolated">
<starts-with>
<expression>(%)(w)([`~!@#$%^&*-_=+\|'";:.,/?])</expression>
<capture number="1" name="delimiter.literal.percent-delimiter"/>
<capture number="2" name="delimiter.literal.percent-delimited.qualifier"/>
<capture number="3" name="delimiter.balanced.percent-delimited.begin"/>
</starts-with>
<ends-with>
<expression>(\3)</expression>
<capture number="1" name="delimiter.literal.percent-delimited.end"/>
</ends-with>
</zone>
</collection>
<collection name="literal.collection.dictionary">
<!--
because hashes and blocks will be easily confused, check for equals
before or blank space to check it is a hash. Anything else is a block!
-->
<zone name="literal.collection.dictionary">
<!-- really not ideal, should maybe look at changing way blocks are handled -->
<!--<starts-with>^(.*=\s*|\s*)\{</starts-with>-->
<starts-with>
<expression>\{</expression>
<capture number="0" name="delimiter.curly-brace.hash.begin"/>
</starts-with>
<ends-with>
<expression>\}</expression>
<capture number="0" name="delimiter.curly-brace.hash.end"/>
</ends-with>
<subzones>
<zone name="rocket.delimiter">
<expression>=></expression>
</zone>
<include syntax="name.elliottcable.Espresso.Syntax.Programming.Ruby"/>
</subzones>
</zone>
</collection>
<!-- ===============
= Identifiers =
=============== -->
<collection name="identifier.variable">
<!-- Constant -->
<zone name="identifier.variable.constant">
<expression>[A-Z][A-Za-z0-9_]*</expression>
<capture number="0" name="constant.name"/>
</zone>
<!-- @var -->
<zone name="identifier.variable.instance">
<expression>@([A-Za-z0-9_]*)</expression>
<capture number="1" name="variable.name"/>
</zone>
<!-- @@var -->
<zone name="identifier.variable.instance.class">
<expression>@@([A-Za-z0-9_]*)</expression>
<capture number="1" name="variable.name"/>
</zone>
<!-- $var, $-w, $^ -->
<zone name="identifier.variable.global">
<expression>\$(.|-[A-Za-z0-9_]|[A-Za-z0-9_]*)</expression>
<capture number="1" name="variable.name"/>
</zone>
<!-- var -->
<zone name="identifier.variable.local">
<expression>[a-z_][A-Za-z0-9_]*</expression>
<capture number="0" name="variable.name"/>
</zone>
</collection>
<!--
Currently, we treat block params the same as method params. This is
incorrect, mostly due to the fact that blocks can't take block arguments
(&proc) in Ruby 1.8. There's also other small differences. We're
ignoring them all for now, for the sake of simplicity.
-->
<collection name="identifier.variable.parameter">
<!-- var -->
<zone name="identifier.variable.parameter">
<expression>[a-z_][A-Za-z0-9_]*</expression>
<capture number="0" name="variable.name"/>
</zone>
<!-- *vars -->
<zone name="identifier.variable.local.splat">
<expression>\*([a-z_][A-Za-z0-9_]*)</expression>
<capture number="1" name="variable.name"/>
</zone>
<!-- &proc -->
<zone name="identifier.variable.local.block">
<expression>&([a-z_][A-Za-z0-9_]*)</expression>
<capture number="1" name="variable.name"/>
</zone>
</collection>
<!-- ========
= Flow =
======== -->
<collection name="control.flow">
<zone name="control.flow.if">
<starts-with>
<expression>^\s*(?=\bif\b)</expression>
</starts-with>
<ends-with>
<expression>\bend\b</expression>
<capture number="0" name="keyword.control.flow.end"/>
</ends-with>
<subzones>
<include collection="subzones.flow.if"/>
<!-- for the navigator :( -->
<zone name="condition">
<starts-with>
<expression>\bif\b</expression>
<capture number="0" name="keyword.control.flow.if"/>
</starts-with>
<ends-with>$</ends-with>
<subzones>
<include syntax="name.elliottcable.Espresso.Syntax.Programming.Ruby"/>
</subzones>
</zone>
<include syntax="name.elliottcable.Espresso.Syntax.Programming.Ruby"/>
</subzones>
</zone>
<zone name="control.flow.unless">
<starts-with>
<expression>^\s*(?=\bunless\b)</expression>
</starts-with>
<ends-with>
<expression>\bend\b</expression>
<capture number="0" name="keyword.control.flow.end"/>
</ends-with>
<subzones>
<include collection="subzones.flow.unless"/>
<!-- for the navigator :( -->
<zone name="condition">
<starts-with>
<expression>\bunless\b</expression>
<capture number="0" name="keyword.control.flow.unless"/>
</starts-with>
<ends-with>$</ends-with>
<subzones>
<include syntax="name.elliottcable.Espresso.Syntax.Programming.Ruby"/>
</subzones>
</zone>
<include syntax="name.elliottcable.Espresso.Syntax.Programming.Ruby"/>
</subzones>
</zone>
</collection>
<!-- Keep elsif and else separate to mix with one above -->
<collection name="subzones.flow.if">
<zone name="keyword.control.flow.then">
<expression>\bthen\b</expression>
</zone>
<zone name="keyword.control.flow.else">
<expression>\belse\b</expression>
</zone>
<zone name="keyword.control.flow.elsif">
<expression>\belsif\b</expression>
</zone>
</collection>
<collection name="subzones.flow.unless">
<zone name="keyword.control.flow.then">
<expression>\bthen\b</expression>
</zone>
<zone name="keyword.control.flow.else">
<expression>\belse\b</expression>
</zone>
</collection>
<collection name="control.flow.exception">
<zone name="control.flow.exception">
<starts-with>
<expression>(?<=[^.])\bbegin\b</expression>
<capture number="0" name="keyword.control.flow.expection.begin"/>
</starts-with>
<ends-with>
<expression>(?<=[^.])\bend\b</expression>
<capture number="0" name="keyword.control.flow.expection.end"/>
</ends-with>
<subzones>
<zone name="keyword.control.flow.exception.rescue">
<expression>\brescue\b</expression>
</zone>
<zone name="keyword.control.flow.exception.ensure">
<expression>\bensure\b</expression>
</zone>
<include syntax="name.elliottcable.Espresso.Syntax.Programming.Ruby"/>
</subzones>
</zone>
</collection>
<collection name="control.flow.case">
<zone name="control.flow.case">
<starts-with>
<expression>\bcase\b</expression>
<capture number="0" name="keyword.control.flow.case"/>
</starts-with>
<ends-with>
<expression>\bend\b</expression>
<capture number="0" name="keyword.control.flow.end"/>
</ends-with>
<subzones>
<include syntax="name.elliottcable.Espresso.Syntax.Programming.Ruby"/>
</subzones>
</zone>
</collection>
<!-- ===========
= Keyword =
=========== -->
<collection name="keyword.control">
<zone name="keyword.control.flow.end">
<expression>\bend\b</expression>
</zone>
<zone name="keyword.control.flow.while">
<expression>\bwhile\b</expression>
</zone>
<zone name="keyword.control.flow.until">
<expression>\buntil\b</expression>
</zone>
<zone name="keyword.control.flow.rescue">
<expression>\brescue\b</expression>
</zone>
<zone name="keyword.control.flow.ensure">
<expression>\bensure\b</expression>
</zone>
<zone name="keyword.control.flow.for">
<expression>\bfor\b</expression>
</zone>
<zone name="keyword.control.flow.if">
<expression>\bif\b</expression>
</zone>
<zone name="keyword.control.flow.unless">
<expression>\bunless\b</expression>
</zone>
<zone name="keyword.control.flow.case">
<expression>\bcase\b</expression>
</zone>
<zone name="keyword.control.flow.when">
<expression>\bwhen\b</expression>
</zone>
<zone name="keyword.control.flow.then">
<expression>\bthen\b</expression>
</zone>
<zone name="keyword.control.flow.else">
<expression>\belse\b</expression>
</zone>
<zone name="keyword.control.flow.elsif">
<expression>\belsif\b</expression>
</zone>
</collection>
<!-- ==============
= Containers =
============== -->
<collection name="container.expression.parenthetical">
<zone name="container.function.parenthesis-delimited">
<starts-with>
<expression>\(</expression>
<capture number="0" name="delimiter.balanced.parenthesis.begin"/>
</starts-with>
<ends-with>
<expression>\)</expression>
<capture number="0" name="delimiter.balanced.parenthesis.end"/>
</ends-with>
<subzones>
<include syntax="name.elliottcable.Espresso.Syntax.Programming.Ruby"/>
</subzones>
</zone>
</collection>
<collection name="container.function">
<zone name="container.function">
<starts-with>
<expression>\b(def)\s+(<<|>>|<=>|>|<|\+|-|\/|\*{1,2}|%|[a-zA-Z_\[][\.A-Za-z0-9_\]]*[\?\!\=]?)</expression>
<capture number="1" name="keyword.definition.method.begin"/>
<capture number="2" name="name"/>
</starts-with>
<ends-with>
<expression>\bend\b</expression>
<capture number="0" name="keyword.definition.method.end"/>
</ends-with>
<subzones>
<zone name="parameters.block">
<starts-with>
<expression>(?<=(def\s+.+))\(</expression>
<capture number="0" name="delimiter.balanced.parenthesis.parameters.function.begin"/>
</starts-with>
<ends-with>
<expression>\)</expression>
<capture number="0" name="delimiter.balanced.parenthesis.parameters.function.end"/>
</ends-with>
<subzones>
<include collection="identifier.variable.parameter"/>
</subzones>
</zone>
<include syntax="name.elliottcable.Espresso.Syntax.Programming.Ruby"/>
</subzones>
</zone>
</collection>
<collection name="container.block">
<zone name="container.block.keyword-delimited">
<starts-with>
<expression>\bdo\b</expression>
<capture number="0" name="keyword.control.flow.block.begin"/>
</starts-with>
<ends-with>
<expression>\bend\b</expression>
<capture number="0" name="keyword.control.flow.block.end"/>
</ends-with>
<subzones>
<zone name="parameters.block">
<starts-with>
<expression>\|</expression>
<capture number="0" name="delimiter.balanced.bar.parameters.block.begin"/>
</starts-with>
<ends-with>
<expression>\|</expression>
<capture number="0" name="delimited.balanced.bar.parameters.block.end"/>
</ends-with>
<subzones>
<include collection="identifier.variable.parameter"/>
</subzones>
</zone>
<include syntax="name.elliottcable.Espresso.Syntax.Programming.Ruby"/>
</subzones>
</zone>
<zone name="container.block.bracket-delimited">
<starts-with>
<expression>(?<=[a-zA-Z0-9!?()]+\s*)(\{)</expression>
<capture number="1" name="method.name"/>
<capture number="2" name="delimiter.balanced.curly-brace.begin"/>
</starts-with>
<ends-with>
<expression>\}</expression>
<capture number="0" name="delimiter.balanced.curly-brace.end"/>
</ends-with>
<subzones>
<zone name="parameters.block">
<starts-with>
<expression>\|</expression>
<capture number="0" name="delimiter.balanced.bar.parameters.block.begin"/>
</starts-with>
<ends-with>
<expression>\|</expression>
<capture number="0" name="delimited.balanced.bar.parameters.block.end"/>
</ends-with>
<subzones>
<include collection="identifier.variable.parameter"/>
</subzones>
</zone>
<include syntax="name.elliottcable.Espresso.Syntax.Programming.Ruby"/>
</subzones>
</zone>
<!--
For now, due to the intricacies of keyword-delimited blocks versus
bracket-delimited blocks, as well as those of blocks with arguments
versus those without, we have to define several nearly identical zones
to describe each type.
-->
<zone name="container.block.keyword-delimited.with-arguments">
<starts-with>
<expression>(do)\s*(\|)</expression>
<capture number="1" name="keyword.control.flow.block.begin"/>
<capture number="2" name="delimiter.balanced.bar.parameters.block.begin"/>
</starts-with>
<ends-with>
<expression>\|</expression>
<capture number="0" name="delimiter.balanced.bar.parameters.block.end"/>
</ends-with>
<subzones>
<include collection="identifier.variable.parameter"/>
</subzones>
</zone>
<zone name="container.block.bracket-delimited.with-arguments">
<starts-with>
<expression>(\{)\s*(\|)</expression>
<capture number="1" name="delimiter.balanced.curly-brace.begin"/>
<capture number="2" name="delimiter.balanced.bar.parameters.block.begin"/>
</starts-with>
<ends-with>
<expression>\|</expression>
<capture number="0" name="delimiter.balanced.bar.parameters.block.end"/>
</ends-with>
<subzones>
<include collection="identifier.variable.parameter"/>
</subzones>
</zone>
<zone name="container.block.keyword-delimited.without-arguments">
<expression>\bdo\b</expression>
<capture number="0" name="keyword.control.flow.block.begin"/>
</zone>
</collection>
<collection name="container.class-module">
<zone name="container.class.inheritence">
<starts-with>
<expression>\b(class)\s+([A-Za-z0-9_\-?!]+)\s*(<)\s*([A-Za-z0-9_\-?!]+)</expression>
<capture number="1" name="keyword.control.class.begin"/>
<capture number="2" name="identifier.variable.constant.class.name"/>
<capture number="3" name="delimiter.class.inherited"/>
<capture number="4" name="identifier.variable.constant.class.name.inherited"/>
</starts-with>
<ends-with>
<expression>\bend\b</expression>
<capture number="0" name="keyword.control.class.end"/>
</ends-with>
<subzones>
<include syntax="name.elliottcable.Espresso.Syntax.Programming.Ruby"/>
</subzones>
</zone>
<zone name="container.class">
<starts-with>
<expression>\b(class)\s+([A-Za-z0-9_\-?!]+)</expression>
<capture number="1" name="keyword.control.class.begin"/>
<capture number="2" name="identifier.variable.constant.class.name"/>
</starts-with>
<ends-with>
<expression>\bend\b</expression>
<capture number="0" name="keyword.control.class.end"/>
</ends-with>
<subzones>
<include syntax="name.elliottcable.Espresso.Syntax.Programming.Ruby"/>
</subzones>
</zone>
<zone name="container.module">
<starts-with>
<expression>\b(module)\s+([A-Za-z0-9_\-?!]+)</expression>
<capture number="1" name="keyword.control.module.begin"/>
<capture number="2" name="identifier.variable.constant.module.name"/>
</starts-with>
<ends-with>
<expression>\bend\b</expression>
<capture number="0" name="keyword.control.module.end"/>
</ends-with>
<subzones>
<include syntax="name.elliottcable.Espresso.Syntax.Programming.Ruby"/>
</subzones>
</zone>
</collection>
<!-- ============
= Metadata =
============ -->
<collection name="metadata.comment.header">
<!-- # A comment\n# that takes\n# multiple lines -->
<zone name="metadata.comment.header">
<starts-with>
<expression>\A[ \t]*##</expression>
<capture number="0" name="metadata.comment.header.hash"/>
</starts-with>
<ends-with>
<expression>\A(?![ \t]*#)</expression>
</ends-with>
<subzones>
<include collection="metadata.processing.comment.code"/>
</subzones>
</zone>
</collection>
<collection name="metadata.comment">
<zone name="metadata.comment.block">
<starts-with>
<expression>#(?:[^\{])(.*)$</expression>
<capture number="0" name="metadata.comment.line.hash"/>
<capture number="1" name="metadata.comment.header"/>
</starts-with>
<ends-with>
<expression>\A(?![ \t]*#)</expression>
</ends-with>
</zone>
<!-- # A comment -->
<zone name="metadata.comment.line">
<starts-with>
<!--Should not capture #{}-->
<expression>#(?:[^\{])</expression>
<capture number="0" name="metadata.comment.line.hash"/>
</starts-with>
<ends-with>
<!-- Just having \Z causes weirdness -->
<expression>$</expression>
</ends-with>
<subzones>
<include collection="metadata.processing.comment.code"/>
</subzones>
</zone>
<!--
=begin
A comment block
=end
-->
<zone name="metadata.comment.block">
<starts-with>
<expression>\A=begin</expression>
<capture number="0" name="metadata.comment.block.begin"/>
</starts-with>
<ends-with>
<expression>\A(=end).*\Z</expression>
<capture number="1" name="metadata.comment.block.end"/>
</ends-with>
<subzones>
<include collection="metadata.processing.comment.code"/>
</subzones>
</zone>
</collection>
<collection name="metadata.processing.comment.code">
<!-- this only really causes problems for me
<zone name="metadata.processing.comment.code">
<starts-with>
<expression>`</expression>
<capture number="0" name="delimiter.quote.balanced.backtick.begin"/>
</starts-with>
<ends-with>
<expression>`</expression>
<capture number="0" name="delimiter.quote.balanced.backtick.end"/>
</ends-with>
<subzones>
<include syntax="name.elliottcable.Espresso.Syntax.Programming.Ruby"/>
</subzones>
</zone>
-->
</collection>
<!-- =============
= Operators =
============= -->
<collection name="operator">
<zone name="operator.comparator">
<expression>===|==|<|<=|>|>=|<=></expression>
</zone>
<zone name="operator.matcher">
<expression>=~</expression>
</zone>
<zone name="operator.accessor">
<expression>=|<<|>></expression>
</zone>
<zone name="operator.mathematical">
<expression>\+|-|\*\*|\*|/|%</expression>
</zone>
<zone name="operator.bitwise">
<expression>&|\||\^|~</expression>
</zone>
<zone name="operator.logical.and">
<expression>\band\b|&&</expression>
</zone>
<zone name="operator.logical.or">
<expression>\bor\b|\|\|</expression>
</zone>
<zone name="operator.logical.not">
<expression>\bnot\b|!</expression>
</zone>
</collection>
<!-- ==============
= Delimiters =
============== -->
<collection name="delimiter">
<zone name="delimiter.terminator">
<expression>\;</expression>
</zone>
<zone name="delimiter.seperator.comma">
<expression>,</expression>
</zone>
<zone name="delimiter.seperator.namespace">
<expression>::</expression>
</zone>
<zone name="delimiter.balanced.curly-brace.begin">
<expression>\{</expression>
</zone>
<zone name="delimiter.balanced.curly-brace.end">
<expression>\}</expression>
</zone>
<zone name="delimiter.balanced.square-brace.begin">
<expression>\[</expression>
</zone>
<zone name="delimiter.balanced.square-brace.end">
<expression>\]</expression>
</zone>
</collection>
</library>
</syntax>