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 -->
35 <rule pattern="//.*">
36 <token type="CommentSingle" />
37 </rule>
38 <!-- Comment Multiline Block -->
39 <rule pattern="\([*](.|\n)*?[*]\)">
40 <token type="CommentMultiline"/>
41 </rule>
42 <!-- Comment Multiline Source Documentation -->
43 <rule pattern="[{](.|\n)*?[}]">
44 <token type="CommentMultiline"/>
45 </rule>
46 <!-- Range Indicator -->
47 <rule pattern="(?i:(\.\.))">
48 <token type="Operator" />
49 </rule>
50 <!-- Control Character -->
51 <rule pattern="[\#][0-9a-fA-F]*|[0-9]+[xX][0-9a-fA-F]*">
52 <token type="LiteralStringEscape" />
53 </rule>
54 <!-- Numbers -->
55 <rule pattern="[\$][0-9a-fA-F]*[xX][0-9a-fA-F]*|[\$][0-9a-fA-F]*|([0-9]+[0-9a-fA-F]+(?=[hH]))">
56 <token type="LiteralNumberHex" />
57 </rule>
58 <rule pattern="[0-9]+(\'[0-9]+)*\.[0-9]+(\'[0-9]+)*[eE][+-]?[0-9]+(\'[0-9]+)*|[0-9]+(\'[0-9]+)*\.[0-9]+(\'[0-9]+)*|\d+[eE][+-]?[0-9]+">
59 <token type="LiteralNumberFloat" />
60 </rule>
61 <rule pattern="0|[1-9][0-9_]*?">
62 <token type="LiteralNumberInteger" />
63 </rule>
64 <!-- Multiline string Literal -->
65 <rule pattern="('''\s*\n)(.|\n)*?(''')(?=\s*;)">
66 <token type="LiteralString" />
67 </rule>
68 <!-- string -->
69 <rule pattern="(?i:(\')).*?(?i:(\'))">
70 <token type="LiteralString" />
71 </rule>
72 <!-- string (Special case for Delphi Assembler)-->
73 <rule pattern="(?i:(")).*?(?i:("))">
74 <token type="LiteralString" />
75 </rule>
76 <!-- Simple Types -->
77 <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(?![<\/(])">
78 <token type="KeywordType" />
79 </rule>
80 <!-- T Types -->
81 <rule pattern="\b(?!=\.)(?i:(TSingleRec|TDoubleRec|TExtended80Rec|TByteArray|TTextBuf|TVarRec|TWordArray))\b(?![<\/(])">
82 <token type="KeywordType" />
83 </rule>
84 <!-- Pointer Types -->
85 <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(?![<\/(])">
86 <token type="KeywordType" />
87 </rule>
88 <!-- More Types -->
89 <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(?![<\/(])">
90 <token type="KeywordType" />
91 </rule>
92 <!-- Result -->
93 <rule pattern="\b(?!=\.)(?i:(Result))\b(?![<\/(])">
94 <token type="GenericEmph" />
95 </rule>
96 <!-- Result Constants -->
97 <rule pattern="\b(?!=\.)(?i:(True|False))\b(?![<\/(])">
98 <token type="NameConstant" />
99 </rule>
100 <!-- Operator (Assign) -->
101 <rule pattern="[(\:\=)]">
102 <token type="Operator" />
103 </rule>
104 <!-- Operators (Arithmetic, Unary Arithmetic, String, Pointer, Set, Relational, Address) -->
105 <rule pattern="[\+\-\*\/\^<>\=\@]">
106 <token type="Operator" />
107 </rule>
108 <!-- Operators (Arithmetic, Boolean, Logical (Bitwise), Set) -->
109 <rule pattern="\b(?i:([div][mod][not][and][or][xor][shl][shr][in]))\b">
110 <token type="OperatorWord" />
111 </rule>
112 <!-- Special Symbols (Escape, Literal Chr, Hex Value, Binary Numeral Expression Indicator) -->
113 <rule pattern="[&\#\$\%]">
114 <token type="Operator" />
115 </rule>
116 <!-- Special Symbols (Punctuation) -->
117 <rule pattern="[\(\)\,\.\:\;\[\]]">
118 <token type="Punctuation" />
119 </rule>
120 <!-- Reserved Words -->
121 <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(?![<\/(])">
122 <token type="KeywordReserved" />
123 </rule>
124 <!-- Directives -->
125 <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(?![<\/(])">
126 <token type="Keyword" />
127 </rule>
128 <!-- Directives obsolete -->
129 <rule pattern="\b(?!=\.)(?i:(near|far|resident))\b(?![<\/(])">
130 <token type="Keyword" />
131 </rule>
132 <!-- Constant Expressions -->
133 <rule pattern="\b(?!=\.)(?i:(Abs|High|Low|Pred|Succ|Chr|Length|Odd|Round|Swap|Hi|Lo|Ord|SizeOf|Trunc))\b(?![<\/(])">
134 <token type="KeywordConstant" />
135 </rule>
136 <!-- everything else -->
137 <rule pattern="([^\W\d]|\$)[\w$]*">
138 <token type="Text" />
139 </rule>
140 </state>
141 </rules>
142</lexer>