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]+(\'[0-9]+)*\.[0-9]+(\'[0-9]+)*[eE][+-]?[0-9]+(\'[0-9]+)*|[0-9]+(\'[0-9]+)*\.[0-9]+(\'[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="('''\s*\n)(.|\n)*?(''')(?=\s*;)">
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:(")).*?(?i:("))">
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(?![<\/(])">
81 <token type="KeywordType" />
82 </rule>
83 <!-- T Types -->
84 <rule pattern="\b(?!=\.)(?i:(TSingleRec|TDoubleRec|TExtended80Rec|TByteArray|TTextBuf|TVarRec|TWordArray))\b(?![<\/(])">
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(?![<\/(])">
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(?![<\/(])">
93 <token type="KeywordType" />
94 </rule>
95 <!-- Result -->
96 <rule pattern="\b(?!=\.)(?i:(Result))\b(?![<\/(])">
97 <token type="GenericEmph" />
98 </rule>
99 <!-- Result Constants -->
100 <rule pattern="\b(?!=\.)(?i:(True|False))\b(?![<\/(])">
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="[\+\-\*\/\^<>\=\@]">
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="[&\#\$\%]">
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(?![<\/(])">
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(?![<\/(])">
129 <token type="Keyword" />
130 </rule>
131 <!-- Directives obsolete -->
132 <rule pattern="\b(?!=\.)(?i:(near|far|resident))\b(?![<\/(])">
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(?![<\/(])">
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>