<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE language SYSTEM "language.dtd">
<!--
========================================================================
D.XML supports syntax highlighting for the D programming language under Kate.
Updated 2007-2008 - Diggory Hardy <diggory.hardy @ g m a i l . c o m > (copyright kate project).
Copyright (C) 2007 - Aziz Köksal <aziz.koeksal @ g m a i l . c o m >
Copyright (C) 2007 - Jari-Matti Mäkelä <jmjm @ i k i . f i >
Copyright (C) 2004 - Simon J Mackenzie <project.katedxml @ s m a c k o z . f a s t m a i l . f m >
This code is released under the LGPL as part of tdelibs/kate.
========================================================================
D is a next generation language written by Walter Bright of Digital Mars fame.
Digital Mars C, C++ and D Compilers can be obtained from http://www.digitalmars.com/d/
========================================================================
UPDATE HISTORY:-
2008.09.22 - d.xml 1.61 - D 1.035/2.019 - Fix for identifiers starting _ and containing numbers.
2008.08.01 - d.xml 1.60 - D 1.033/2.017 - Merging ddoc.xml 1.14 since there is no advantage to having it separate.
2008.07.14 - uncommited - Added properties: .tupleof, .offsetof
2008.06.14 - D.XML 1.53 - D 1.030/2.014 - Added user keyword highlighting.
2008.06.06 - D.XML 1.53 - D 1.030/2.014 - Small fix involving floats starting . in embedded Ddoc.
- Added nothrow and pure attributes (D2.0 only).
2008.04.09 - D.XML 1.52 - D 1.028/2.012 - Added properties (especially for arrays).
- Added rules for C-Style indenter (thanks vektorboson!)
2008.02.22 - D.XML 1.51 - D 1.027/2.011 - Changed char rule behaviour on line end.
- Added support for strings ending with c, w or d (must have got lost at some point).
2008.02.22 - ddoc.xml 1.14 - Fixes/improvements for macros. Highlights first symbol and non-symbols
before as errors; matches embedded brackets () properly.
2008.01.09 - D.XML 1.50 - D 1.025/2.009 - Changed pragma, version, deprecated matching to use keyword not DetectString.
2007.12.18 - D.XML 1.49 - D 1.025/2.009 - Fixed some bugs to make the StartingLetter context exit correctly and match identifiers properly.
2007.12.12 - D.XML 1.48 - D 1.024/2.008 - Adjusted existing contexts somewhat (mostly cleanup).
- Implemented scope context to hightlight exit in scope(exit) etc.
- Adjusted deprecated keyword highlighting.
- Changed layout somewhat.
- Implemented extra highlighting rules for expressions, attributes, etc.
- Changed a lot of colours.
2007.11.15 - D.XML 1.47 - D 1.023/2.007 - Fixed a few unapperent "bugs" found by checkdtd.
2007.11.15 - ddoc.xml 1.13 - Fixed a couple of bugs found by checkdtd and changed the version number format.
2007.11.5 - ddoc.xml 1.12 - Fixed: correct matching of things like /***/ .
2007.10.11 - ddoc.xml 1.11 - Safety catch: check for unterminated code sections (i.e. check for end of
ddoc comment even in code sections).
- Used DetectIdentifier to (presumably) improve performance.
2007.10.09 - uncommited - ditto - Changed some context="#pop" tags to context="#stay" within the normal
context (bugfix for ddoc embedded code highlighting).
2007.10.9 - ddoc.xml 1.10 - Enabled embedded ddoc code highlighting
2007.10.9 - ddoc.xml 1.00 - Initial version
2007.10.08 - D.XML 1.46 - D 1.022/2.005 - Stole Alert and Region Marker highlighting from C++ syntax.
- Added support for DDoc highlighting.
- Reviewed the float regexps again! Tried to make the best of both versions.
2007.09.17 - D.XML 1.45 - D 1.021/2.004 - Reverted back to old regexps (but fixed hex floats).
Can't combine all float regexps into a single RegExpr element using the '|' operator.
It creates strange problems (like program lock-ups and wrong matches).
- Fix: '=' is allowed in import statements now.
- Fix: character literals are matched correctly now.
- The #line special token sequence is matched fully now (the filespec string needs special handling).
2007.09.10 - D.XML 1.44 - D 1.021/2.004 - Added __EOF__ to specialtokens.
- Replaced float regexps with more accurate ones. Not sure about speed.
- Fixed Octal regexp not to match 0_ .
2007.07.24 - D.XML 1.43 - D 1.020/2.003 - Added System to ltypes.
- Improved matching of version declarations.
- Fixed matching of hexadecimal floats.
- Deprecated style is stroked out again.
2007.07.21 - D.XML 1.42 - D 1.018/2.002 - d.xml validates again according to language.xml.
- HTML entities are highlighted now.
- Numbers before and after the slice operator are not highl. as floats anymore.
- Added C++ to ltypes.
- Improved matching of module/import declarations.
2007.07.01 - D.XML 1.41 - D 1.017/2.001 - fixed matching of numbers, added deprecated style, minor changes to styles, updated authors line
2007.07.01 - D.XML 1.40 - D 1.017/2.001 - matches now .di extensions, removed phobos-specific printf/writef and added
- library defined symbols string, wstring, dstring, size_t, ptrdiff_t, hash_t,
- Error, Exception, Object, TypeInfo and ClassInfo
2007.06.30 - D.XML 1.39 - D 1.017 - matching is much faster now, added "lib" to pragma types, added special tokens,
- /+ +/ can be nested now, numbers are matched more correctly, character literals don't span multiple lines anymore
- escape sequences inside strings and character literals are highlighted,
- non-hex characters in hex strings are highlighted with the Error style,
- using more default styles instead of custom ones
2007.04.11 - D.XML 1.38 - D 1.011 - ref, macro keywords are now supported, fixed \\ inside a string, updated author
2007.02.12 - D.XML 1.37 - D 1.006 - bool, foreach_reverse, lazy, scope and typeid keywords are now supported, fixed \"
- inside a string, fixed ending of wysiwyg strings.
2004.08.15 - D.XML 1.36 - D 0.98 - Current release of D.
- package, writef(strictly speaking writef isn't a keyword) - keywords are now supported.
2004.??.?? - D.XML 1.35 - D 0.?? - Not sure how this release got posted!
2004.05.23 - D.XML 1.34 - D 0.90 - updated.
2004.05.19 - D.XML 1.33 - D 0.89 - mixin - keyword is now supported.
2004.05.19 - D.XML 1.32 - D 0.77 - pragma, typeof - keywords are now supported.
2004.05.19 - D.XML 1.31 - D 0.76 - is - keyword is now supported.
2003.09.06 - D.XML 1.30 - D 0.71 - foreach - keyword is now supported.
2003.08.18 - D.XML 1.20 - D 0.69 - floats are now supported.
- embedded underscores in integer and float literals are now supported.
2003.08.11 - D.XML 1.10 - updated.
2003.07.18 - D.XML 1.00 - First released.
TODO:- Deliminated strings and Token strings (D2.0) are not supported.
========================================================================
-->
<language name= "D" version= "1.61" kateversion= "2.5" section= "Sources" extensions= "*.d;*.D;*.di;*.DI;" mimetype= "text/x-dsrc" casesensitive= "true" author= "Diggory Hardy (diggory.hardy@gmail.com), Aziz Köksal (aziz.koeksal@gmail.com), Jari-Matti Mäkelä (jmjm@iki.fi), Simon J Mackenzie (project.katedxml@smackoz.fastmail.fm)" license= "LGPL" >
<highlighting >
<!-- User - defined keywords (add identifiers you'd like highlighted here) -->
<list name= "userkeywords" >
</list>
<list name= "statements" >
<item > asm </item>
<item > body </item>
<item > break </item>
<item > case </item>
<item > catch </item>
<item > continue </item>
<item > default </item>
<item > do </item>
<item > else </item>
<item > finally </item>
<item > for </item>
<item > foreach </item>
<item > foreach_reverse </item>
<item > goto </item>
<item > if </item>
<item > mixin </item>
<item > return </item>
<item > switch </item>
<item > throw </item>
<item > try </item>
<item > while </item>
<item > with </item>
<!-- these are statements according to the spec, although I might call them attributes -->
<item > synchronized </item>
</list>
<list name= "attributes" >
<!-- also storage classes -->
<item > abstract </item>
<item > align </item>
<item > auto </item>
<item > const </item>
<item > export </item>
<item > final </item>
<item > inout </item>
<item > invariant </item>
<item > lazy </item>
<item > nothrow </item>
<item > override </item>
<item > package </item>
<item > private </item>
<item > protected </item>
<item > public </item>
<item > pure </item>
<item > ref </item>
<item > static </item>
<!-- these may be statements -->
<!-- in (more common to use as an expression since in attribute is only ever the default) -->
<item > out </item>
<item > scope </item>
</list>
<list name= "expressions" >
<!-- primary expressions -->
<item > false </item>
<item > null </item>
<item > super </item>
<item > this </item>
<item > true </item>
<item > typeid </item>
<!-- other expressions -->
<item > assert </item>
<item > cast </item>
<item > is </item>
<item > new </item>
<item > delete </item>
<item > in </item> <!-- also an attribute and a statement -->
<!-- sometimes declarators -->
<item > delegate </item>
<item > function </item>
</list>
<list name= "modules" >
<item > module </item>
<item > import </item> <!-- also an expression -->
</list>
<list name= "declarators" >
<item > alias </item>
<item > enum </item>
<item > typedef </item>
<item > class </item>
<item > interface </item>
<item > struct </item>
<item > union </item>
</list>
<list name= "types" >
<item > typeof </item>
<item > void </item>
<item > bool </item>
<item > byte </item>
<item > ubyte </item>
<item > short </item>
<item > ushort </item>
<item > int </item>
<item > uint </item>
<item > long </item>
<item > ulong </item>
<item > cent </item>
<item > ucent </item>
<item > float </item>
<item > double </item>
<item > real </item>
<item > ireal </item>
<item > ifloat </item>
<item > idouble </item>
<item > creal </item>
<item > cfloat </item>
<item > cdouble </item>
<item > char </item>
<item > wchar </item>
<item > dchar </item>
</list>
<list name= "templates" >
<item > macro </item> <!-- what's this? just reserved? -->
<item > template </item>
</list>
<list name= "properties" >
<item > init </item>
<item > sizeof </item>
<item > alignof </item>
<item > mangleof </item>
<item > stringof </item>
<item > tupleof </item>
<item > offsetof </item>
<item > max </item>
<item > min </item>
<item > infinity </item>
<item > nan </item>
<item > dig </item>
<item > epsilon </item>
<item > mant_dig </item>
<item > max_10_exp </item>
<item > max_exp </item>
<item > min_10_exp </item>
<item > min_exp </item>
<item > re </item>
<item > im </item>
<item > length </item>
<item > ptr </item>
<item > dup </item>
<item > idup </item>
<item > reverse </item>
<item > sort </item>
<item > keys </item>
<item > values </item>
<item > rehash </item>
</list>
<list name= "libsymbols" >
<!-- these are only symbols defined in object.d(i) -->
<item > size_t </item>
<item > ptrdiff_t </item>
<item > hash_t </item>
<item > Error </item>
<item > Exception </item>
<item > Object </item>
<item > TypeInfo </item>
<item > ClassInfo </item>
<item > ModuleInfo </item>
<item > Interface </item>
<item > OffsetTypeInfo </item>
<item > TypeInfo_Typedef </item>
<item > TypeInfo_Enum </item>
<item > TypeInfo_Pointer </item>
<item > TypeInfo_Array </item>
<item > TypeInfo_StaticArray </item>
<item > TypeInfo_AssociativeArray </item>
<item > TypeInfo_Function </item>
<item > TypeInfo_Delegate </item>
<item > TypeInfo_Class </item>
<item > TypeInfo_Interface </item>
<item > TypeInfo_Struct </item>
<item > TypeInfo_Tuple </item>
<!-- phobos only as of tango 0.99.3 -->
<item > string </item>
<item > wstring </item>
<item > dstring </item>
<item > bit </item>
<item > TypeInfo_Const </item>
<item > TypeInfo_Invariant </item>
</list>
<list name= "linkage" >
<item > extern </item>
</list>
<list name= "ltypes" >
<item > C </item>
<!-- <item> C++ </item> --> <!-- is handled specially in Linkage rule -->
<item > D </item>
<item > Windows </item>
<item > Pascal </item>
<item > System </item>
</list>
<list name= "ptypes" >
<item > msg </item>
<item > lib </item>
</list>
<list name= "scope_keywords" >
<item > exit </item>
<item > success </item>
<item > failure </item>
</list>
<list name= "vtypes" >
<item > DigitalMars </item>
<item > X86 </item>
<item > X86_64 </item>
<item > Windows </item>
<item > Win32 </item>
<item > Win64 </item>
<item > linux </item>
<item > LittleEndian </item>
<item > BigEndian </item>
<item > D_Coverage </item>
<item > D_InlineAsm_X86 </item>
<item > unittest </item>
<item > D_Version2 </item>
<item > none </item>
<item > all </item>
</list>
<list name= "specialtokens" >
<item > __FILE__ </item>
<item > __LINE__ </item>
<item > __DATE__ </item>
<item > __TIME__ </item>
<item > __TIMESTAMP__ </item>
<item > __VENDOR__ </item>
<item > __VERSION__ </item>
<item > __EOF__ </item>
</list>
<list name= "tests" >
<item > debug </item>
<item > unittest </item>
</list>
<list name= "pragma" >
<item > pragma </item>
</list>
<list name= "version" >
<item > version </item>
</list>
<list name= "deprecated" >
<item > deprecated </item>
<item > volatile </item> <!-- has been deprecated -->
</list>
<contexts >
<context name= "normal" attribute= "Normal Text" lineEndContext= "#stay" >
<DetectSpaces />
<!-- Performance improvement (probably): anything starting with a letter is matched separately -->
<RegExpr String= "[a-zA-Z_]" attribute= "Normal Text" context= "StartingLetter" lookAhead= "true" />
<HlCStringChar attribute= "EscapeSequence" context= "#stay" />
<Detect2Chars attribute= "EscapeSequence" context= "UnicodeShort" char= "\" char1= "u" />
<Detect2Chars attribute= "EscapeSequence" context= "UnicodeLong" char= "\" char1= "U" />
<Detect2Chars attribute= "EscapeSequence" context= "HTMLEntity" char= "\" char1= "&" />
<DetectChar attribute= "Char" context= "CharLiteral" char= "'" />
<DetectChar attribute= "String" context= "String" char= """ />
<DetectChar attribute= "BQString" context= "BQString" char= "`" />
<StringDetect attribute= "Region Marker" context= "Region Marker" String= "//BEGIN" beginRegion= "Region1" firstNonSpace= "true" />
<StringDetect attribute= "Region Marker" context= "Region Marker" String= "//END" endRegion= "Region1" firstNonSpace= "true" />
<IncludeRules context= "CommentRules" />
<!-- Match ... and .. before numbers are matched. -->
<!-- Now in symbols keywords section -->
<StringDetect attribute= "Normal Text" context= "#stay" String= "..." />
<Detect2Chars attribute= "Normal Text" char= "." char1= "." />
<!-- Float starting with a dot -->
<RegExpr attribute= "Float" context= "#stay" String= "\.\d[\d_]*([eE][-+]?\d[\d_]*)?[fFL]?i?" />
<!-- Try to match various built - in properties -->
<DetectChar char= "." attribute= "Normal Text" context= "Properties" />
<!-- Look ahead for a digit and switch to NumberLiteral context if found. -->
<RegExpr context= "NumberLiteral" String= "\d" attribute= "" lookAhead= "true" />
<!-- #line Integer [Filespec] -->
<StringDetect attribute= "Pragma" context= "LinePragma" String= "#line" />
<!-- Rules for the C - style indenter. Currently problems with /// and /++ comments. -->
<DetectChar attribute= "Symbol" context= "#stay" char= "{" beginRegion= "BraceA" />
<DetectChar attribute= "Symbol" context= "#stay" char= "}" endRegion= "BraceA" />
<AnyChar attribute= "Symbol" context= "#stay" String= ":!%&()+,-/.*<=>?[]|~^;" />
</context>
<context name= "StartingLetter" attribute= "Normal Text" lineEndContext= "#pop" >
<DetectSpaces />
<!-- fall - through should work now that DetectIdentifier is used (without infinite loops) -->
<!-- maybe not... got an infinite loop -->
<RegExpr String= "[^a-zA-Z_]" attribute= "Normal Text" context= "#pop" lookAhead= "true" />
<!-- detect whether scope, in, out, etc. are used as attributes or statements (etc.) -->
<!-- rules cannot match across newlines unfortunately -->
<RegExpr String= "in\s*(?=\{)" attribute= "Statement" context= "#stay" />
<RegExpr String= "out\s*(?=(\(([a-zA-Z_][\w_]*)?\)\s*)?\{)" attribute= "Statement" context= "#stay" />
<RegExpr String= "scope\s*(?=\()" attribute= "Statement" context= "Scope" />
<RegExpr String= "import\s*(?=\()" attribute= "Expression" context= "#stay" />
<RegExpr String= "function\s*(?=\()" attribute= "Declarator" context= "#stay" />
<RegExpr String= "delegate\s*(?=\()" attribute= "Declarator" context= "#stay" />
<keyword String= "statements" attribute= "Statement" context= "#stay" />
<keyword String= "attributes" attribute= "Attribute" context= "#stay" />
<keyword String= "expressions" attribute= "Expression" context= "#stay" />
<keyword String= "declarators" attribute= "Declarator" context= "#stay" />
<keyword String= "templates" attribute= "Template" context= "#stay" />
<keyword String= "modules" attribute= "Module" context= "ModuleName" />
<keyword String= "types" attribute= "Type" context= "#stay" />
<keyword String= "libsymbols" attribute= "LibrarySymbols" context= "#stay" />
<keyword String= "linkage" attribute= "Linkage" context= "Linkage" />
<keyword String= "specialtokens" attribute= "SpecialTokens" context= "#stay" />
<keyword String= "tests" attribute= "Tests" context= "#stay" />
<!-- These must use keyword not DetectString: DetectString does not check for word - break after string. -->
<keyword String= "pragma" attribute= "Pragma" context= "Pragma" />
<keyword String= "version" attribute= "Version" context= "Version" />
<keyword String= "deprecated" attribute= "Deprecated" context= "#stay" />
<Detect2Chars attribute= "RawString" context= "RawString" char= "r" char1= """ />
<Detect2Chars attribute= "HexString" context= "HexString" char= "x" char1= """ />
<!-- user highlighting: last so as not to interfere with anything else -->
<keyword String= "userkeywords" attribute= "UserKeywords" context= "#stay" />
<DetectIdentifier />
</context>
<context name= "Properties" attribute= "Normal Text" lineEndContext= "#stay" fallthrough= "true" fallthroughContext= "#pop" >
<keyword String= "properties" attribute= "Property" context= "#pop" />
</context>
<context name= "NumberLiteral" attribute= "Normal Text" lineEndContext= "#stay" fallthrough= "true" fallthroughContext= "#pop" >
<!-- Float literals -->
<!-- Floats must be matched before Binary|Octal|Hex|DecInteger -->
<RegExpr attribute= "Float" context= "#pop" String= "0[xX][\da-fA-F_]*(\.[\da-fA-F_]*)?[pP][-+]?\d[\d_]*[fFL]?i?" />
<!-- Float starting with a dot is matched in main context -->
<!-- All floats except integers -->
<!-- RegExpr is branched rather than using look aheads for efficiency at the expense of extra length -->
<RegExpr attribute= "Float" context= "#pop" String= "\d[_\d]*(\.(?!\.)[_\d]*([eE][-+]?\d[_\d]*)?[fFL]?i?|[eE][-+]?\d[_\d]*[fFL]?i?|[fF]i?|[fFL]?i)" />
<!-- Binary|Octal|Hex|DecInteger -->
<!-- Common, optional suffix: (L[uU]?|[uU]L?)? -->
<RegExpr attribute= "Binary" context= "#pop" String= "0[bB]_*[01][01_]*(L[uU]?|[uU]L?)?" />
<!-- Octal must be matched before DecInteger -->
<RegExpr attribute= "Octal" context= "#pop" String= "0[0-7_]+(L[uU]?|[uU]L?)?" />
<RegExpr attribute= "Hex" context= "#pop" String= "0[xX]_*[\da-fA-F][\da-fA-F_]*(L[uU]?|[uU]L?)?" />
<!-- Decimal integers must be matched last -->
<RegExpr attribute= "Integer" context= "#pop" String= "\d+[\d_]*(L[uU]?|[uU]L?)?" />
</context>
<context name= "LinePragma" attribute= "Pragma" lineEndContext= "#pop" >
<DetectSpaces />
<!-- Match an Integer -->
<RegExpr attribute= "Integer" context= "#stay" String= "((0([0-7_]+|[bB]_*[01][01_]*|[xX]_*[\da-fA-F][\da-fA-F_]*))|\d+[\d_]*)(L[uU]?|[uU]L?)?" />
<RegExpr attribute= "String" context= "#stay" String= ""[^"]*"" />
<keyword attribute= "SpecialTokens" context= "#stay" String= "specialtokens" />
<IncludeRules context= "CommentRules" />
<RegExpr attribute= "Error" context= "#pop" String= ".+" />
</context>
<!-- \u 4HexDigits -->
<context name= "UnicodeShort" attribute= "EscapeSequence" lineEndContext= "#pop" >
<RegExpr attribute= "EscapeSequence" context= "#pop" String= "[\da-fA-F]{4}" />
</context>
<!-- \U 8HexDigits -->
<context name= "UnicodeLong" attribute= "EscapeSequence" lineEndContext= "#pop" >
<RegExpr attribute= "EscapeSequence" context= "#pop" String= "[\da-fA-F]{8}" />
</context>
<!-- \& Alpha Alphanumerical+ ; -->
<context name= "HTMLEntity" attribute= "EscapeSequence" lineEndContext= "#pop" fallthrough= "true" fallthroughContext= "#pop" >
<RegExpr attribute= "EscapeSequence" context= "#pop" String= "[a-zA-Z]\w+;" />
</context>
<context name= "ModuleName" attribute= "Module Name" lineEndContext= "#stay" >
<DetectSpaces />
<IncludeRules context= "CommentRules" />
<RegExpr context= "#pop" String= "[^\s\w.:,=]" lookAhead= "true" />
</context>
<context name= "Linkage" attribute= "Normal Text" lineEndContext= "#stay" fallthrough= "true" fallthroughContext= "#pop" >
<DetectSpaces />
<DetectChar attribute= "Normal Text" context= "Linkage2" char= "(" />
<IncludeRules context= "CommentRules" />
</context>
<context name= "Linkage2" attribute= "Normal Text" lineEndContext= "#stay" >
<DetectSpaces />
<StringDetect attribute= "Linkage Type" context= "#pop#pop" String= "C++" />
<keyword attribute= "Linkage Type" context= "#pop#pop" String= "ltypes" />
<IncludeRules context= "CommentRules" />
<!-- Fall - through rules, highlighting errors: -->
<DetectChar char= ")" attribute= "Normal Text" context= "#pop#pop" />
<RegExpr String= "[^)\s\n]+" attribute= "Error" context= "#pop#pop" />
</context>
<context name= "Version" attribute= "Normal Text" lineEndContext= "#stay" >
<DetectSpaces />
<DetectChar attribute= "Normal Text" context= "Version2" char= "=" />
<DetectChar attribute= "Normal Text" context= "Version2" char= "(" />
<IncludeRules context= "CommentRules" />
<!-- Fall - through rules, highlighting errors: -->
<RegExpr String= "[^\s\n]+" attribute= "Error" context= "#pop" />
</context>
<context name= "Version2" attribute= "Normal Text" lineEndContext= "#stay" >
<DetectSpaces />
<keyword attribute= "Version Type" context= "#pop#pop" String= "vtypes" />
<DetectIdentifier attribute= "Normal Text" context= "#pop#pop" />
<RegExpr attribute= "Integer" context= "#pop#pop" String= "\d+[\d_]*(L[uU]?|[uU]L?)?" />
<IncludeRules context= "CommentRules" />
<!-- Fall - through rules, highlighting errors: -->
<DetectChar char= ")" attribute= "Normal Text" context= "#pop#pop" />
<RegExpr String= "[^)\s\n]+" attribute= "Error" context= "#pop#pop" />
</context>
<context name= "Scope" attribute= "Normal Text" lineEndContext= "#stay" fallthrough= "true" fallthroughContext= "#pop" >
<DetectSpaces />
<DetectChar attribute= "Normal Text" context= "Scope2" char= "(" />
<IncludeRules context= "CommentRules" />
</context>
<context name= "Scope2" attribute= "Normal Text" lineEndContext= "#stay" >
<DetectSpaces />
<keyword String= "scope_keywords" attribute= "Expression" context= "#pop#pop" />
<IncludeRules context= "CommentRules" />
<!-- Fall - through rules, highlighting errors: -->
<DetectChar char= ")" attribute= "Normal Text" context= "#pop#pop" />
<RegExpr String= "[^)\s\n]+" attribute= "Error" context= "#pop#pop" />
</context>
<context name= "Pragma" attribute= "Pragma" lineEndContext= "#stay" >
<DetectSpaces />
<DetectChar attribute= "Normal Text" context= "Pragma2" char= "(" />
<IncludeRules context= "CommentRules" />
<!-- Fall - through rules, highlighting errors: -->
<RegExpr String= "[^\s\n]+" attribute= "Error" context= "#pop" />
</context>
<context name= "Pragma2" attribute= "Pragma" lineEndContext= "#stay" >
<DetectSpaces />
<keyword attribute= "Version Type" context= "#pop#pop" String= "ptypes" />
<DetectIdentifier attribute= "Normal Text" context= "#pop#pop" />
<IncludeRules context= "CommentRules" />
<!-- Fall - through rules, highlighting errors: -->
<DetectChar char= ")" attribute= "Normal Text" context= "#pop#pop" />
<RegExpr String= "[^)\s\n]+" attribute= "Error" context= "#pop#pop" />
</context>
<!-- Strings -->
<!-- r"..." -->
<context name= "RawString" attribute= "RawString" lineEndContext= "#stay" >
<DetectChar attribute= "RawString" context= "#pop" char= """ />
</context>
<!-- `...` -->
<context name= "BQString" attribute= "BQString" lineEndContext= "#stay" >
<DetectChar attribute= "BQString" context= "#pop" char= "`" />
</context>
<!-- x"..." -->
<context name= "HexString" attribute= "HexString" lineEndContext= "#stay" >
<DetectChar attribute= "HexString" context= "#pop" char= """ />
<RegExpr attribute= "Error" context= "#stay" String= "[^\sa-fA-F\d"]+" />
</context>
<!-- '...' -->
<context name= "CharLiteral" attribute= "Char" lineEndContext= "CharLiteralClosing" fallthrough= "true" fallthroughContext= "#pop" >
<!-- Empty '' -->
<DetectChar attribute= "Char" context= "#pop" char= "'" />
<!-- \t \n \r etc. -->
<HlCStringChar attribute= "EscapeSequence" context= "CharLiteralClosing" />
<!-- \u 4HexDigits | \U 8HexDigits | HTMLEntity -->
<RegExpr attribute= "EscapeSequence" context= "CharLiteralClosing" String= "\\(u[\da-fA-F]{4}|U[\da-fA-F]{8}|&[a-zA-Z]\w+;)" />
<!-- Invalid escape sequences -->
<RegExpr attribute= "Error" context= "CharLiteralClosing" String= "\\." />
<!-- Any character -->
<RegExpr attribute= "Char" context= "CharLiteralClosing" String= "." />
</context>
<!-- Anything other than a closing ' is now be an error -->
<context name= "CharLiteralClosing" attribute= "Error" lineEndContext= "#pop#pop" fallthrough= "true" fallthroughContext= "#pop#pop" >
<DetectChar attribute= "Char" context= "#pop#pop" char= "'" />
</context>
<!-- "..." -->
<context name= "String" attribute= "String" lineEndContext= "#stay" >
<HlCStringChar attribute= "EscapeSequence" />
<Detect2Chars attribute= "String" context= "#pop" char= """ char1= "c" />
<Detect2Chars attribute= "String" context= "#pop" char= """ char1= "w" />
<Detect2Chars attribute= "String" context= "#pop" char= """ char1= "d" />
<DetectChar attribute= "String" context= "#pop" char= """ />
<Detect2Chars attribute= "EscapeSequence" context= "UnicodeShort" char= "\" char1= "u" />
<Detect2Chars attribute= "EscapeSequence" context= "UnicodeLong" char= "\" char1= "U" />
<Detect2Chars attribute= "EscapeSequence" context= "HTMLEntity" char= "\" char1= "&" />
</context>
<!-- Comments -->
<context name= "CommentRules" attribute= "Normal Text" lineEndContext= "#pop" >
<IncludeRules context= "DdocNormal" />
<Detect2Chars attribute= "Comment" context= "CommentLine" char= "/" char1= "/" />
<Detect2Chars attribute= "Comment" context= "CommentBlock" char= "/" char1= "*" beginRegion= "CommentBlock" />
<Detect2Chars attribute= "Comment" context= "CommentNested" char= "/" char1= "+" beginRegion= "CommentNested" />
<!-- This context is only for including rules from. -->
</context>
<context name= "Region Marker" attribute= "Region Marker" lineEndContext= "#pop" >
</context>
<context name= "CommentLine" attribute= "Comment" lineEndContext= "#pop" >
<DetectSpaces />
<IncludeRules context= "##Alerts" />
</context>
<context name= "CommentBlock" attribute= "Comment" lineEndContext= "#stay" >
<DetectSpaces />
<Detect2Chars attribute= "Comment" context= "#pop" char= "*" char1= "/" endRegion= "CommentBlock" />
<IncludeRules context= "##Alerts" />
</context>
<context name= "CommentNested" attribute= "Comment" lineEndContext= "#stay" >
<DetectSpaces />
<Detect2Chars attribute= "Comment" context= "CommentNested" char= "/" char1= "+" beginRegion= "CommentNested" />
<Detect2Chars attribute= "Comment" context= "#pop" char= "+" char1= "/" endRegion= "CommentNested" />
<IncludeRules context= "##Alerts" />
</context>
<!-- Ddoc contexts -->
<context name= "DdocNormal" attribute= "Normal Text" lineEndContext= "#stay" >
<RegExpr attribute= "Comment" context= "DdocLine" String= "/{3,}" />
<RegExpr attribute= "Comment" context= "DdocBlock" String= "/\*{2,}(?!/)" beginRegion= "DdocBlock" />
<RegExpr attribute= "Comment" context= "DdocNested" String= "/\+{2,}(?!/)" beginRegion= "DdocNested" />
</context>
<context name= "DdocLine" attribute= "Ddoc" lineEndContext= "#pop" >
<DetectSpaces />
<DetectIdentifier attribute= "Ddoc" />
<Detect2Chars attribute= "Macros" context= "DdocMacro" char= "$" char1= "(" />
<RegExpr attribute= "DdocSection" context= "#stay" String= "[\w_]+:($|\s)" />
<IncludeRules context= "##Alerts" />
</context>
<context name= "DdocBlock" attribute= "Ddoc" lineEndContext= "#stay" >
<DetectSpaces />
<DetectIdentifier attribute= "Ddoc" />
<RegExpr attribute= "Comment" context= "#pop" String= "\*+/" endRegion= "DdocBlock" />
<DetectChar attribute= "Comment" context= "#stay" char= "*" firstNonSpace= "true" />
<Detect2Chars attribute= "Macros" context= "DdocMacro" char= "$" char1= "(" />
<RegExpr attribute= "DdocSection" context= "#stay" String= "[\w_]+:($|\s)" />
<IncludeRules context= "##Alerts" />
<!-- Avoid matching this; do it this way since (^|\s) - * always matches . - and \s - * never
matches .- (spaces have already been matched); however -*($|\s) matches just fine.
Also can't use \b since - is not a word character. -->
<RegExpr attribute= "Ddoc" context= "#stay" String= "[^-]-{3,}" />
<RegExpr attribute= "Comment" context= "DdocBlockCode" String= "-{3,}($|\s)" />
</context>
<context name= "DdocNested" attribute= "Ddoc" lineEndContext= "#stay" >
<DetectSpaces />
<DetectIdentifier attribute= "Ddoc" />
<!-- Ddoc recognises nested comments/ddoc, but ignores them as far as formatting is concerned. -->
<Detect2Chars attribute= "Ddoc" context= "DdocNested2" char= "/" char1= "+" />
<RegExpr attribute= "Comment" context= "#pop" String= "\++/" endRegion= "DdocNested" />
<DetectChar attribute= "Comment" context= "#stay" char= "+" firstNonSpace= "true" />
<Detect2Chars attribute= "Macros" context= "DdocMacro" char= "$" char1= "(" />
<RegExpr attribute= "DdocSection" context= "#stay" String= "[\w_]+:($|\s)" />
<IncludeRules context= "##Alerts" />
<!-- As above. -->
<RegExpr attribute= "Ddoc" context= "#stay" String= "[^-]-{3,}" />
<RegExpr attribute= "Comment" context= "DdocNestedCode" String= "-{3,}($|\s)" />
</context>
<context name= "DdocNested2" attribute= "Ddoc" lineEndContext= "#stay" >
<DetectSpaces />
<DetectIdentifier attribute= "Ddoc" />
<!-- Identical to DdocNested except that nested comments don't recieve any formatting -->
<RegExpr attribute= "Ddoc" context= "#pop" String= "\++/" />
<!-- The above rules should match before the unwanted rule in DdocNested -->
<IncludeRules context= "DdocNested" />
</context>
<!-- When entering a macro: provides highlighting for first symbol (macro name) -->
<context name= "DdocMacro" attribute= "Error" lineEndContext= "#stay" >
<DetectSpaces attribute= "Macro Text" /> <!-- avoid showing space as an error -->
<DetectChar attribute= "Macros" context= "#pop" char= ")" /> <!-- early end of macro -->
<IncludeRules context= "MacroRules" />
<!-- first symbol of macro -->
<DetectIdentifier attribute= "Macros" context= "DdocMacro2" />
</context>
<!-- For rest of macro -->
<context name= "DdocMacro2" attribute= "Macro Text" lineEndContext= "#stay" >
<DetectChar attribute= "Macros" context= "#pop#pop" char= ")" /> <!-- end of macro -->
<IncludeRules context= "MacroRules" />
</context>
<!-- For embedded brackets (yeah, extra work to ignore them) -->
<context name= "DdocMacro3" attribute= "Macro Text" lineEndContext= "#stay" >
<DetectChar attribute= "Macro Text" context= "#pop" char= ")" /> <!-- end of embedded brackets -->
<IncludeRules context= "MacroRules" />
</context>
<!-- Rules common to all macros -->
<context name= "MacroRules" attribute= "Macro Text" lineEndContext= "#stay" >
<Detect2Chars attribute= "Macros" context= "DdocMacro" char= "$" char1= "(" /> <!-- embedded -->
<DetectChar attribute= "Macro Text" context= "DdocMacro3" char= "(" /> <!-- extra brackets -->
<DetectChar attribute= "Comment" context= "#stay" char= "*" firstNonSpace= "true" />
</context>
<context name= "DdocBlockCode" attribute= "DdocCode" lineEndContext= "#stay" >
<DetectSpaces />
<!-- See update 1.11 -->
<RegExpr attribute= "Comment" context= "#pop#pop" String= "\*+/" endRegion= "DdocBlock" />
<DetectChar attribute= "Comment" context= "#stay" char= "*" firstNonSpace= "true" />
<!-- As above. -->
<RegExpr attribute= "DdocCode" context= "#stay" String= "[^-]-{3,}" />
<RegExpr attribute= "Comment" context= "#pop" String= "-{3,}($|\s)" />
<IncludeRules context= "##D" />
</context>
<context name= "DdocNestedCode" attribute= "DdocCode" lineEndContext= "#stay" >
<DetectSpaces />
<!-- See update 1.11 -->
<RegExpr attribute= "Comment" context= "#pop#pop" String= "\++/" endRegion= "DdocNested" />
<DetectChar attribute= "Comment" context= "#stay" char= "+" firstNonSpace= "true" />
<!-- As above. -->
<RegExpr attribute= "DdocCode" context= "#stay" String= "[^-]-{3,}" />
<RegExpr attribute= "Comment" context= "#pop" String= "-{3,}($|\s)" />
<IncludeRules context= "##D" />
</context>
</contexts>
<itemDatas >
<itemData name= "Normal Text" defStyleNum= "dsNormal" />
<itemData name= "Symbol" defStyleNum= "dsNormal" />
<!-- keywords -->
<itemData name= "Statement" defStyleNum= "dsKeyword" />
<itemData name= "Expression" defStyleNum= "dsKeyword" color= "#000080" />
<itemData name= "Declarator" defStyleNum= "dsKeyword" color= "#800000" />
<itemData name= "Template" defStyleNum= "dsKeyword" color= "#008000" />
<itemData name= "Attribute" defStyleNum= "dsKeyword" color= "#800080" />
<itemData name= "Deprecated" defStyleNum= "dsKeyword" color= "#800080" strikeOut= "true" />
<itemData name= "Property" defStyleNum= "dsDataType" color= "#000080" />
<itemData name= "Type" defStyleNum= "dsDataType" />
<itemData name= "LibrarySymbols" defStyleNum= "dsDataType" italic= "1" />
<itemData name= "UserKeywords" defStyleNum= "dsDataType" italic= "1" />
<!-- module, import -->
<itemData name= "Module" defStyleNum= "dsKeyword" color= "#008000" />
<itemData name= "Module Name" defStyleNum= "dsNormal" color= "#008000" />
<!-- pragma, special tokens -->
<itemData name= "SpecialTokens" defStyleNum= "dsNormal" color= "#00aa00" />
<itemData name= "Pragma" defStyleNum= "dsKeyword" color= "#00aa00" />
<!-- version, extern -->
<itemData name= "Version" defStyleNum= "dsKeyword" color= "#808000" />
<itemData name= "Version Type" defStyleNum= "dsNormal" bold= "1" />
<itemData name= "Linkage" defStyleNum= "dsKeyword" color= "#808000" />
<itemData name= "Linkage Type" defStyleNum= "dsNormal" bold= "1" />
<itemData name= "Tests" defStyleNum= "dsKeyword" color= "#ff00ff" />
<itemData name= "Comment" defStyleNum= "dsComment" />
<itemData name= "Region Marker" defStyleNum= "dsRegionMarker" />
<itemData name= "Error" defStyleNum= "dsError" />
<!-- literals -->
<itemData name= "Integer" defStyleNum= "dsDecVal" />
<itemData name= "Binary" defStyleNum= "dsBaseN" />
<itemData name= "Octal" defStyleNum= "dsBaseN" />
<itemData name= "Hex" defStyleNum= "dsBaseN" />
<itemData name= "Float" defStyleNum= "dsFloat" />
<itemData name= "EscapeSequence" defStyleNum= "dsString" color= "#00aa88" selColor= "#ff0000" />
<itemData name= "String" defStyleNum= "dsString" />
<itemData name= "Char" defStyleNum= "dsChar" />
<itemData name= "RawString" defStyleNum= "dsString" color= "#a100a1" selColor= "#ff00ff" />
<itemData name= "BQString" defStyleNum= "dsString" color= "#a100a1" selColor= "#ff00ff" />
<itemData name= "HexString" defStyleNum= "dsString" color= "#a10022" selColor= "#ff0055" />
<!-- Ddoc specific -->
<itemData name= "Macros" defStyleNum= "dsOthers" color= "#bf5fbf" selColor= "#ffffff" bold= "1" italic= "0" />
<itemData name= "Macro Text" defStyleNum= "dsNormal" color= "#bf7fff" selColor= "#ffffff" bold= "0" italic= "0" />
<itemData name= "Ddoc" defStyleNum= "dsComment" color= "#7f7fff" />
<itemData name= "DdocSection" defStyleNum= "dsKeyword" color= "#7f7fff" bold= "1" />
<itemData name= "DdocCode" defStyleNum= "dsNormal" italic= "1" />
</itemDatas>
</highlighting>
<general >
<comments >
<comment name= "singleLine" start= "//" />
<comment name= "multiLine" start= "/+" end= "+/" region= "CommentNested" />
</comments>
<keywords casesensitive= "true" />
</general>
</language>