1. <lexer>
    
  2.   <config>
    
  3.     <name>ObjectPascal</name>
    
  4.     <alias>objectpascal</alias>
    
  5.     <filename>*.pas</filename>
    
  6.     <filename>*.pp</filename>
    
  7.     <filename>*.inc</filename>
    
  8.     <filename>*.dpr</filename>
    
  9.     <filename>*.dpk</filename>
    
  10.     <filename>*.lpr</filename>
    
  11.     <filename>*.lpk</filename>
    
  12.     <mime_type>text/x-pascal</mime_type>
    
  13.   </config>
    
  14.   <rules>
    
  15.     <state name="root">
    
  16.       <!-- TextWhitespace -->
    
  17.       <rule pattern="[^\S\n]+">
    
  18.         <token type="TextWhitespace" />
    
  19.       </rule>
    
  20.       <rule pattern="\n">
    
  21.         <token type="Text"/>
    
  22.       </rule>
    
  23.       <rule pattern="\s+">
    
  24.         <token type="Text"/>
    
  25.       </rule>
    
  26.       <!-- Magic Number (BOM) -->
    
  27.       <rule pattern="[^\u0000-\u007F]+">
    
  28.         <token type="Text"/>
    
  29.       </rule>
    
  30.       <!-- Compiler Directive -->
    
  31.       <rule pattern="\{[$].*?\}|\{[-](NOD|EXT|OBJ).*?\}|\([*][$].*?[*]\)">
    
  32.         <token type="CommentPreproc" />
    
  33.       </rule>
    
  34.       <!-- Comment Single -->
    
  35.       <rule pattern="(//.*?)(\n)">
    
  36.         <bygroups>
    
  37.           <token type="CommentSingle" />
    
  38.           <token type="TextWhitespace" />
    
  39.         </bygroups>
    
  40.       </rule>
    
  41.       <!-- Comment Multiline Block -->
    
  42.       <rule pattern="\([*](.|\n)*?[*]\)">
    
  43.         <token type="CommentMultiline"/>
    
  44.       </rule>
    
  45.       <!-- Comment Multiline Source Documentation -->
    
  46.       <rule pattern="[{](.|\n)*?[}]">
    
  47.         <token type="CommentMultiline"/>
    
  48.       </rule>
    
  49.       <!-- Range Indicator -->
    
  50.       <rule pattern="(?i:(\.\.))">
    
  51.         <token type="Operator" />
    
  52.       </rule>
    
  53.       <!-- Control Character -->
    
  54.       <rule pattern="[\#][0-9a-fA-F]*|[0-9]+[xX][0-9a-fA-F]*">
    
  55.         <token type="LiteralStringEscape" />
    
  56.       </rule>
    
  57.       <!-- Numbers -->
    
  58.       <rule pattern="[\$][0-9a-fA-F]*[xX][0-9a-fA-F]*|[\$][0-9a-fA-F]*|([0-9]+[0-9a-fA-F]+(?=[hH]))">
    
  59.         <token type="LiteralNumberHex" />
    
  60.       </rule>
    
  61.       <rule pattern="[0-9]+(\&#39;[0-9]+)*\.[0-9]+(\&#39;[0-9]+)*[eE][+-]?[0-9]+(\&#39;[0-9]+)*|[0-9]+(\&#39;[0-9]+)*\.[0-9]+(\&#39;[0-9]+)*|\d+[eE][+-]?[0-9]+">
    
  62.         <token type="LiteralNumberFloat" />
    
  63.       </rule>
    
  64.       <rule pattern="0|[1-9][0-9_]*?">
    
  65.         <token type="LiteralNumberInteger" />
    
  66.       </rule>
    
  67.       <!-- Multiline string Literal -->
    
  68.       <rule pattern="(&#39;&#39;&#39;\s*\n)(.|\n)*?(&#39;&#39;&#39;)(?=\s*&#59;)">
    
  69.         <token type="LiteralString" />
    
  70.       </rule>
    
  71.       <!-- string -->
    
  72.       <rule pattern="(?i:(\')).*?(?i:(\'))">
    
  73.         <token type="LiteralString" />
    
  74.       </rule>
    
  75.       <!-- string (Special case for Delphi Assembler)-->
    
  76.       <rule pattern="(?i:(&#34;)).*?(?i:(&#34;))">
    
  77.         <token type="LiteralString" />
    
  78.       </rule>
    
  79.       <!-- Simple Types -->
    
  80.       <rule pattern="\b(?!=\.)(?i:(NativeInt|NativeUInt|LongInt|LongWord|Integer|Int64|Cardinal|UInt64|ShortInt|SmallInt|FixedInt|Byte|Word|FixedUInt|Int8|Int16|Int32|UInt8|UInt16|UInt32|Real48|Single|Double|Real|Extended|Comp|Currency|Char|AnsiChar|WideChar|UCS2Char|UCS4Char|string|ShortString|AnsiString|UnicodeString|WideString|RawByteString|UTF8String|File|TextFile|Text|Boolean|ByteBool|WordBool|LongBool|Pointer|Variant|OleVariant))\b(?![&#60;\/(])">
    
  81.         <token type="KeywordType" />
    
  82.       </rule>
    
  83.       <!-- T Types -->
    
  84.       <rule pattern="\b(?!=\.)(?i:(TSingleRec|TDoubleRec|TExtended80Rec|TByteArray|TTextBuf|TVarRec|TWordArray))\b(?![&#60;\/(])">
    
  85.         <token type="KeywordType" />
    
  86.       </rule>
    
  87.       <!-- Pointer Types -->
    
  88.       <rule pattern="\b(?!=\.)(?i:(PChar|PAnsiChar|PWideChar|PRawByteString|PUnicodeString|PString|PAnsiString|PShortString|PTextBuf|PWideString|PByte|PShortInt|PWord|PSmallInt|PCardinal|PLongWord|PFixedUInt|PLongint|PFixedInt|PUInt64|PInt64|PNativeUInt|PNativeInt|PByteArray|PCurrency|PDouble|PExtended|PSingle|PInteger|POleVariant|PVarRec|PVariant|PWordArray|PBoolean|PWordBool|PLongBool|PPointer))\b(?![&#60;\/(])">
    
  89.         <token type="KeywordType" />
    
  90.       </rule>
    
  91.       <!-- More Types -->
    
  92.       <rule pattern="\b(?!=\.)(?i:(IntPtr|UIntPtr|Float32|Float64|_ShortStr|_ShortString|_AnsiStr|_AnsiString|_AnsiChr|_AnsiChar|_WideStr|_WideString|_PAnsiChr|_PAnsiChar|UTF8Char|_AnsiChar|PUTF8Char|_PAnsiChar|MarshaledString|MarshaledAString))\b(?![&#60;\/(])">
    
  93.         <token type="KeywordType" />
    
  94.       </rule>
    
  95.       <!-- Result -->
    
  96.       <rule pattern="\b(?!=\.)(?i:(Result))\b(?![&#60;\/(])">
    
  97.         <token type="GenericEmph" />
    
  98.       </rule>      
    
  99.       <!-- Result Constants -->
    
  100.       <rule pattern="\b(?!=\.)(?i:(True|False))\b(?![&#60;\/(])">
    
  101.         <token type="NameConstant" />
    
  102.       </rule>
    
  103.       <!-- Operator (Assign) -->
    
  104.       <rule pattern="[(\:\=)]">
    
  105.         <token type="Operator" />
    
  106.       </rule>      
    
  107.       <!-- Operators (Arithmetic, Unary Arithmetic, String, Pointer, Set, Relational, Address) -->
    
  108.       <rule pattern="[\+\-\*\/\^&#60;&#62;\=\@]">
    
  109.         <token type="Operator" />
    
  110.       </rule>
    
  111.       <!-- Operators (Arithmetic, Boolean, Logical (Bitwise), Set) -->
    
  112.       <rule pattern="\b(?i:([div][mod][not][and][or][xor][shl][shr][in]))\b">
    
  113.         <token type="OperatorWord" />
    
  114.       </rule>
    
  115.       <!-- Special Symbols (Escape, Literal Chr, Hex Value, Binary Numeral Expression Indicator) -->
    
  116.       <rule pattern="[&#38;\#\$\%]">
    
  117.         <token type="Operator" />
    
  118.       </rule>
    
  119.       <!-- Special Symbols (Punctuation) -->
    
  120.       <rule pattern="[\(\)\,\.\:\;\[\]]">
    
  121.         <token type="Punctuation" />
    
  122.       </rule>
    
  123.       <!-- Reserved Words -->
    
  124.       <rule pattern="\b(?!=\.)(?i:(and|end|interface|record|var|array|except|is|repeat|while|as|exports|label|resourcestring|with|asm|file|library|set|xor|begin|finalization|mod|shl|case|finally|nil|shr|class|for|not|string|const|function|object|then|constructor|goto|of|threadvar|destructor|if|or|to|dispinterface|implementation|packed|try|div|in|procedure|type|do|inherited|program|unit|downto|initialization|property|until|else|inline|raise|uses))\b(?![&#60;\/(])">
    
  125.         <token type="KeywordReserved" />
    
  126.       </rule>
    
  127.       <!-- Directives -->
    
  128.       <rule pattern="\b(?!=\.)(?i:(absolute|export|name|public|stdcall|abstract|external|published|strict|assembler|nodefault|read|stored|automated|final|operator|readonly|unsafe|cdecl|forward|out|reference|varargs|contains|helper|overload|register|virtual|default|implements|override|reintroduce|winapi|delayed|index|package|requires|write|deprecated|inline|pascal|writeonly|dispid|library|platform|safecall|dynamic|local|private|sealed|experimental|message|protected|static))\b(?![&#60;\/(])">
    
  129.         <token type="Keyword" />
    
  130.       </rule>
    
  131.       <!-- Directives obsolete -->
    
  132.       <rule pattern="\b(?!=\.)(?i:(near|far|resident))\b(?![&#60;\/(])">
    
  133.         <token type="Keyword" />
    
  134.       </rule>
    
  135.       <!-- Constant Expressions -->
    
  136.       <rule pattern="\b(?!=\.)(?i:(Abs|High|Low|Pred|Succ|Chr|Length|Odd|Round|Swap|Hi|Lo|Ord|SizeOf|Trunc))\b(?![&#60;\/(])">
    
  137.         <token type="KeywordConstant" />
    
  138.       </rule>
    
  139.       <!-- everything else -->
    
  140.       <rule pattern="([^\W\d]|\$)[\w$]*">
    
  141.         <token type="Text" />
    
  142.       </rule>
    
  143.     </state>
    
  144.   </rules>
    
  145. </lexer>