1 { 2 Copyright (c) 1998-2002 by Florian Klaempfl, Pierre Muller 3 4 Tokens used by the compiler 5 6 This program is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 2 of the License, or 9 (at your option) any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with this program; if not, write to the Free Software 18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19 **************************************************************************** 20 } 21 unit tokens; 22 23 {$i fpcdefs.inc} 24 25 interface 26 27 uses 28 globtype; 29 30 type 31 ttoken=(NOTOKEN, 32 { operators, which can also be overloaded } 33 _PLUS, 34 _MINUS, 35 _STAR, 36 _SLASH, 37 _EQ, 38 _GT, 39 _LT, 40 _GTE, 41 _LTE, 42 _NE, 43 _SYMDIF, 44 _STARSTAR, 45 _OP_AS, 46 _OP_IN, 47 _OP_IS, 48 _OP_OR, 49 _OP_AND, 50 _OP_DIV, 51 _OP_MOD, 52 _OP_NOT, 53 _OP_SHL, 54 _OP_SHR, 55 _OP_XOR, 56 _ASSIGNMENT, 57 _OP_EXPLICIT, 58 _OP_ENUMERATOR, 59 _OP_INITIALIZE, 60 _OP_FINALIZE, 61 _OP_ADDREF, 62 _OP_COPY, 63 _OP_INC, 64 _OP_DEC, 65 { special chars } 66 _CARET, 67 _LECKKLAMMER, 68 _RECKKLAMMER, 69 _POINT, 70 _COMMA, 71 _LKLAMMER, 72 _RKLAMMER, 73 _COLON, 74 _SEMICOLON, 75 _KLAMMERAFFE, 76 _POINTPOINT, 77 _POINTPOINTPOINT, 78 _PIPE, 79 _AMPERSAND, 80 _EOF, 81 _ID, 82 _NOID, 83 _REALNUMBER, 84 _INTCONST, 85 _CSTRING, 86 _CCHAR, 87 _CWSTRING, 88 _CWCHAR, 89 _LSHARPBRACKET, 90 _RSHARPBRACKET, 91 { C like operators } 92 _PLUSASN, 93 _MINUSASN, 94 _ANDASN, 95 _ORASN, 96 _STARASN, 97 _SLASHASN, 98 _MODASN, 99 _DIVASN, 100 _NOTASN, 101 _XORASN, 102 _GENERICSPECIALTOKEN, 103 { Normal words -- ATTENTION: These words must be sorted: } 104 { first in length order, then in alphabetical order. } 105 _C, 106 _AS, 107 _AT, 108 _DO, 109 _IF, 110 _IN, 111 _IS, 112 _OF, 113 _ON, 114 _OR, 115 _TO, 116 _ADD, 117 _AND, 118 _ASM, 119 _DEC, 120 _DIV, 121 _END, 122 _FAR, 123 _FOR, 124 _INC, 125 _MOD, 126 _NIL, 127 _NOT, 128 _OUT, 129 _SET, 130 _SHL, 131 _SHR, 132 _TRY, 133 _VAR, 134 _XOR, 135 _CASE, 136 _COPY, 137 _CVAR, 138 _ELSE, 139 _EXIT, 140 _FAIL, 141 _FILE, 142 _GOTO, 143 _HUGE, 144 _NAME, 145 _NEAR, 146 _READ, 147 _SELF, 148 _SYSV, 149 _THEN, 150 _TYPE, 151 _UNIT, 152 _UNIV, 153 _USES, 154 _WITH, 155 _ALIAS, 156 _ARRAY, 157 _BEGIN, 158 _BREAK, 159 _CDECL, 160 _CLASS, 161 _CONST, 162 _EQUAL, 163 _FAR16, 164 _FINAL, 165 _INDEX, 166 _LABEL, 167 _LOCAL, 168 _RAISE, 169 _UNTIL, 170 _WHILE, 171 _WRITE, 172 _ADDREF, 173 _CBLOCK, 174 _DISPID, 175 _DIVIDE, 176 _DOWNTO, 177 _EXCEPT, 178 _EXPORT, 179 _HELPER, 180 _INLINE, 181 _LEGACY, 182 _NESTED, 183 _OBJECT, 184 _PACKED, 185 _PASCAL, 186 _PUBLIC, 187 _RECORD, 188 _REPEAT, 189 _RESULT, 190 _RETURN, 191 _SEALED, 192 _STATIC, 193 _STORED, 194 _STRICT, 195 _STRING, 196 _SYSTEM, 197 _WINAPI, 198 _ASMNAME, 199 _BASEREG, 200 _CPPDECL, 201 _DEFAULT, 202 _DYNAMIC, 203 _EXPORTS, 204 _FINALLY, 205 _FORWARD, 206 _GENERIC, 207 _IOCHECK, 208 _LIBRARY, 209 _MESSAGE, 210 _MODULUS, 211 _PACKAGE, 212 _PRIVATE, 213 _PROGRAM, 214 _R12BASE, 215 _RTLPROC, 216 _SECTION, 217 _STDCALL, 218 _SYSCALL, 219 _VARARGS, 220 _VIRTUAL, 221 _ABSOLUTE, 222 _ABSTRACT, 223 _BASELAST, 224 _BASENONE, 225 _BASESYSV, 226 _CONSTREF, 227 _CONTAINS, 228 _CONTINUE, 229 _CPPCLASS, 230 _EXPLICIT, 231 _EXTERNAL, 232 _FINALIZE, 233 _FUNCTION, _IMPLICITnull234 _IMPLICIT, 235 _LESSTHAN, 236 _LOCATION, 237 _MULTIPLY, 238 _MWPASCAL, 239 _NEGATIVE, 240 _NORETURN, 241 _NOTEQUAL, 242 _OPERATOR, 243 _OPTIONAL, 244 _OVERLOAD, 245 _OVERRIDE, 246 _PLATFORM, 247 _POSITIVE, 248 _PROPERTY, 249 _READONLY, 250 _REGISTER, 251 _REQUIRED, 252 _REQUIRES, 253 _RESIDENT, 254 _SAFECALL, 255 _SUBTRACT, 256 _SYSVBASE, 257 _ASSEMBLER, 258 _BASEFIRST, 259 _BITPACKED, 260 _BITWISEOR, 261 _HARDFLOAT, 262 _INHERITED, 263 _INTDIVIDE, 264 _INTERFACE, 265 _INTERRUPT, 266 _LEFTSHIFT, 267 _LOGICALOR, 268 _NODEFAULT, 269 _OBJCCLASS, 270 _OTHERWISE, 271 _PROCEDURE, 272 _PROTECTED, 273 _PUBLISHED, 274 _REFERENCE, 275 _SOFTFLOAT, 276 _THREADVAR, 277 _WRITEONLY, 278 _BITWISEAND, 279 _BITWISEXOR, 280 _DEPRECATED, 281 _DESTRUCTOR, 282 _ENUMERATOR, 283 _IMPLEMENTS, 284 _INITIALIZE, 285 _INTERNPROC, 286 _LOGICALAND, 287 _LOGICALNOT, 288 _LOGICALXOR, 289 _OLDFPCCALL, 290 _OPENSTRING, 291 _RIGHTSHIFT, 292 _SPECIALIZE, 293 _VECTORCALL, 294 _CONSTRUCTOR, 295 _GREATERTHAN, 296 _INTERNCONST, 297 _REINTRODUCE, 298 _SHORTSTRING, 299 _COMPILERPROC, 300 _EXPERIMENTAL, 301 _FINALIZATION, 302 _MS_ABI_CDECL, 303 _NOSTACKFRAME, 304 _OBJCCATEGORY, 305 _OBJCPROTOCOL, 306 _WEAKEXTERNAL, 307 _DISPINTERFACE, 308 _UNIMPLEMENTED, 309 _IMPLEMENTATION, 310 _INITIALIZATION, 311 _MS_ABI_DEFAULT, 312 _RESOURCESTRING, 313 _SYSV_ABI_CDECL, 314 _LESSTHANOREQUAL, 315 _SYSV_ABI_DEFAULT, 316 _GREATERTHANOREQUAL 317 ); 318 319 { sub_expr(opmultiply) is need to get -1 ** 4 to be 320 read as - (1**4) and not (-1)**4 PM } 321 toperator_precedence=( 322 opcompare, 323 opaddition, 324 opmultiply, 325 oppower 326 ); 327 328 const 329 tokenlenmin = 1; 330 tokenlenmax = 18; 331 332 postfixoperator_tokens = [_CARET,_POINT,_LECKKLAMMER]; 333 334 { last operator which can be overloaded, the first_overloaded should 335 be declared directly after NOTOKEN } 336 first_overloaded = succ(NOTOKEN); 337 last_overloaded = _OP_DEC; 338 last_operator = _GENERICSPECIALTOKEN; 339 first_managment_operator = _OP_INITIALIZE; 340 last_managment_operator = _OP_COPY; 341 342 highest_precedence = oppower; 343 344 { Warning these stay be ordered !! } 345 operator_levels:array[Toperator_precedence] of set of NOTOKEN..last_operator= 346 ([_LT,_LTE,_GT,_GTE,_EQ,_NE,_OP_IN], 347 [_PLUS,_MINUS,_OP_OR,_PIPE,_OP_XOR], 348 [_CARET,_SYMDIF,_STARSTAR,_STAR,_SLASH, 349 _OP_AS,_OP_IS,_OP_AND,_AMPERSAND,_OP_DIV,_OP_MOD,_OP_SHL,_OP_SHR], 350 [_STARSTAR] ); 351 352 type 353 tokenrec=record 354 str : string[tokenlenmax]; 355 special : boolean; 356 keyword : tmodeswitches; 357 op : ttoken; 358 end; 359 360 ttokenarray=array[ttoken] of tokenrec; 361 ptokenarray=^ttokenarray; 362 363 tokenidxrec=record 364 first,last : ttoken; 365 end; 366 367 ptokenidx=^ttokenidx; 368 ttokenidx=array[tokenlenmin..tokenlenmax,'A'..'Z'] of tokenidxrec; 369 370 const 371 arraytokeninfo : ttokenarray =( 372 (str:'' ;special:true ;keyword:[m_none];op:NOTOKEN), 373 { Operators which can be overloaded } 374 (str:'+' ;special:true ;keyword:[m_none];op:NOTOKEN), 375 (str:'-' ;special:true ;keyword:[m_none];op:NOTOKEN), 376 (str:'*' ;special:true ;keyword:[m_none];op:NOTOKEN), 377 (str:'/' ;special:true ;keyword:[m_none];op:NOTOKEN), 378 (str:'=' ;special:true ;keyword:[m_none];op:NOTOKEN), 379 (str:'>' ;special:true ;keyword:[m_none];op:NOTOKEN), 380 (str:'<' ;special:true ;keyword:[m_none];op:NOTOKEN), 381 (str:'>=' ;special:true ;keyword:[m_none];op:NOTOKEN), 382 (str:'<=' ;special:true ;keyword:[m_none];op:NOTOKEN), 383 (str:'<>' ;special:true ;keyword:[m_none];op:NOTOKEN), 384 (str:'><' ;special:true ;keyword:[m_none];op:NOTOKEN), 385 (str:'**' ;special:true ;keyword:[m_none];op:NOTOKEN), 386 (str:'as' ;special:true ;keyword:[m_none];op:NOTOKEN), 387 (str:'in' ;special:true ;keyword:[m_none];op:NOTOKEN), 388 (str:'is' ;special:true ;keyword:[m_none];op:NOTOKEN), 389 (str:'or' ;special:true ;keyword:[m_none];op:NOTOKEN), 390 (str:'and' ;special:true ;keyword:[m_none];op:NOTOKEN), 391 (str:'div' ;special:true ;keyword:[m_none];op:NOTOKEN), 392 (str:'mod' ;special:true ;keyword:[m_none];op:NOTOKEN), 393 (str:'not' ;special:true ;keyword:[m_none];op:NOTOKEN), 394 (str:'shl' ;special:true ;keyword:[m_none];op:NOTOKEN), 395 (str:'shr' ;special:true ;keyword:[m_none];op:NOTOKEN), 396 (str:'xor' ;special:true ;keyword:[m_none];op:NOTOKEN), 397 (str:':=' ;special:true ;keyword:[m_none];op:NOTOKEN), 398 (str:'explicit' ;special:true ;keyword:[m_none];op:NOTOKEN), 399 (str:'enumerator' ;special:true ;keyword:[m_none];op:NOTOKEN), 400 (str:'initialize' ;special:true ;keyword:[m_none];op:NOTOKEN), 401 (str:'finalize' ;special:true ;keyword:[m_none];op:NOTOKEN), 402 (str:'addref' ;special:true ;keyword:[m_none];op:NOTOKEN), 403 (str:'copy' ;special:true ;keyword:[m_none];op:NOTOKEN), 404 (str:'inc' ;special:true ;keyword:[m_none];op:NOTOKEN), 405 (str:'dec' ;special:true ;keyword:[m_none];op:NOTOKEN), 406 { Special chars } 407 (str:'^' ;special:true ;keyword:[m_none];op:NOTOKEN), 408 (str:'[' ;special:true ;keyword:[m_none];op:NOTOKEN), 409 (str:']' ;special:true ;keyword:[m_none];op:NOTOKEN), 410 (str:'.' ;special:true ;keyword:[m_none];op:NOTOKEN), 411 (str:',' ;special:true ;keyword:[m_none];op:NOTOKEN), 412 (str:'(' ;special:true ;keyword:[m_none];op:NOTOKEN), 413 (str:')' ;special:true ;keyword:[m_none];op:NOTOKEN), 414 (str:':' ;special:true ;keyword:[m_none];op:NOTOKEN), 415 (str:';' ;special:true ;keyword:[m_none];op:NOTOKEN), 416 (str:'@' ;special:true ;keyword:[m_none];op:NOTOKEN), 417 (str:'..' ;special:true ;keyword:[m_none];op:NOTOKEN), 418 (str:'...' ;special:true ;keyword:[m_none];op:NOTOKEN), 419 (str:'|' ;special:true ;keyword:[m_none];op:NOTOKEN), 420 (str:'&' ;special:true ;keyword:[m_none];op:NOTOKEN), 421 (str:'end of file' ;special:true ;keyword:[m_none];op:NOTOKEN), 422 (str:'identifier' ;special:true ;keyword:[m_none];op:NOTOKEN), 423 (str:'non identifier';special:true ;keyword:[m_none];op:NOTOKEN), 424 (str:'const real' ;special:true ;keyword:[m_none];op:NOTOKEN), 425 (str:'ordinal const' ;special:true ;keyword:[m_none];op:NOTOKEN), 426 (str:'const string' ;special:true ;keyword:[m_none];op:NOTOKEN), 427 (str:'const char' ;special:true ;keyword:[m_none];op:NOTOKEN), 428 (str:'const wstring' ;special:true ;keyword:[m_none];op:NOTOKEN), 429 (str:'const wchar' ;special:true ;keyword:[m_none];op:NOTOKEN), 430 (str:'<' ;special:true ;keyword:[m_none];op:NOTOKEN), 431 (str:'>' ;special:true ;keyword:[m_none];op:NOTOKEN), 432 { C like operators } 433 (str:'+=' ;special:true ;keyword:[m_none];op:NOTOKEN), 434 (str:'-=' ;special:true ;keyword:[m_none];op:NOTOKEN), 435 (str:'&=' ;special:true ;keyword:[m_none];op:NOTOKEN), 436 (str:'|=' ;special:true ;keyword:[m_none];op:NOTOKEN), 437 (str:'*=' ;special:true ;keyword:[m_none];op:NOTOKEN), 438 (str:'/=' ;special:true ;keyword:[m_none];op:NOTOKEN), 439 (str:'' ;special:true ;keyword:[m_none];op:NOTOKEN), 440 (str:'' ;special:true ;keyword:[m_none];op:NOTOKEN), 441 (str:'' ;special:true ;keyword:[m_none];op:NOTOKEN), 442 (str:'' ;special:true ;keyword:[m_none];op:NOTOKEN), 443 (str:'gen. spec.' ;special:true ;keyword:[m_none];op:NOTOKEN), 444 { Normal words -- ATTENTION: These words must be sorted: } 445 { first in length order, then in alphabetical order. } 446 (str:'C' ;special:false;keyword:[m_none];op:NOTOKEN), 447 (str:'AS' ;special:false;keyword:[m_class];op:_OP_AS), 448 (str:'AT' ;special:false;keyword:[m_none];op:NOTOKEN), 449 (str:'DO' ;special:false;keyword:alllanguagemodes;op:NOTOKEN), 450 (str:'IF' ;special:false;keyword:alllanguagemodes;op:NOTOKEN), 451 (str:'IN' ;special:false;keyword:alllanguagemodes;op:_OP_IN), 452 (str:'IS' ;special:false;keyword:[m_class];op:_OP_IS), 453 (str:'OF' ;special:false;keyword:alllanguagemodes;op:NOTOKEN), 454 (str:'ON' ;special:false;keyword:[m_none];op:NOTOKEN), 455 (str:'OR' ;special:false;keyword:alllanguagemodes;op:_OP_OR), 456 (str:'TO' ;special:false;keyword:alllanguagemodes;op:NOTOKEN), 457 (str:'ADD' ;special:false;keyword:[m_none];op:NOTOKEN), { delphi operator name } 458 (str:'AND' ;special:false;keyword:alllanguagemodes;op:_OP_AND), 459 (str:'ASM' ;special:false;keyword:alllanguagemodes-[m_iso];op:NOTOKEN), 460 (str:'DEC' ;special:false;keyword:[m_none];op:NOTOKEN), { delphi operator name } 461 (str:'DIV' ;special:false;keyword:alllanguagemodes;op:_OP_DIV), 462 (str:'END' ;special:false;keyword:alllanguagemodes;op:NOTOKEN), 463 (str:'FAR' ;special:false;keyword:[m_none];op:NOTOKEN), 464 (str:'FOR' ;special:false;keyword:alllanguagemodes;op:NOTOKEN), 465 (str:'INC' ;special:false;keyword:[m_none];op:NOTOKEN), { delphi operator name } 466 (str:'MOD' ;special:false;keyword:alllanguagemodes;op:_OP_MOD), 467 (str:'NIL' ;special:false;keyword:alllanguagemodes;op:NOTOKEN), 468 (str:'NOT' ;special:false;keyword:alllanguagemodes;op:_OP_NOT), 469 (str:'OUT' ;special:false;keyword:[m_none];op:NOTOKEN), 470 (str:'SET' ;special:false;keyword:alllanguagemodes;op:NOTOKEN), 471 (str:'SHL' ;special:false;keyword:alllanguagemodes-[m_iso,m_extpas];op:_OP_SHL), 472 (str:'SHR' ;special:false;keyword:alllanguagemodes-[m_iso,m_extpas];op:_OP_SHR), 473 (str:'TRY' ;special:false;keyword:[m_except];op:NOTOKEN), 474 (str:'VAR' ;special:false;keyword:alllanguagemodes;op:NOTOKEN), 475 (str:'XOR' ;special:false;keyword:alllanguagemodes;op:_OP_XOR), 476 (str:'CASE' ;special:false;keyword:alllanguagemodes;op:NOTOKEN), 477 (str:'COPY' ;special:false;keyword:[m_none];op:NOTOKEN), 478 (str:'CVAR' ;special:false;keyword:[m_none];op:NOTOKEN), 479 (str:'ELSE' ;special:false;keyword:alllanguagemodes;op:NOTOKEN), 480 (str:'EXIT' ;special:false;keyword:[m_none];op:NOTOKEN), 481 (str:'FAIL' ;special:false;keyword:[m_none];op:NOTOKEN), { only set within constructors PM } 482 (str:'FILE' ;special:false;keyword:alllanguagemodes;op:NOTOKEN), 483 (str:'GOTO' ;special:false;keyword:alllanguagemodes;op:NOTOKEN), 484 (str:'HUGE' ;special:false;keyword:[m_none];op:NOTOKEN), 485 (str:'NAME' ;special:false;keyword:[m_none];op:NOTOKEN), 486 (str:'NEAR' ;special:false;keyword:[m_none];op:NOTOKEN), 487 (str:'READ' ;special:false;keyword:[m_none];op:NOTOKEN), 488 (str:'SELF' ;special:false;keyword:[m_none];op:NOTOKEN), {set inside methods only PM } 489 (str:'SYSV' ;special:false;keyword:[m_none];op:NOTOKEN), { Syscall variation on MorphOS } 490 (str:'THEN' ;special:false;keyword:alllanguagemodes;op:NOTOKEN), 491 (str:'TYPE' ;special:false;keyword:alllanguagemodes;op:NOTOKEN), 492 (str:'UNIT' ;special:false;keyword:alllanguagemodes-[m_iso,m_extpas];op:NOTOKEN), 493 (str:'UNIV' ;special:false;keyword:[m_mac];op:NOTOKEN), 494 (str:'USES' ;special:false;keyword:alllanguagemodes-[m_iso,m_extpas];op:NOTOKEN), 495 (str:'WITH' ;special:false;keyword:alllanguagemodes;op:NOTOKEN), 496 (str:'ALIAS' ;special:false;keyword:[m_none];op:NOTOKEN), 497 (str:'ARRAY' ;special:false;keyword:alllanguagemodes;op:NOTOKEN), 498 (str:'BEGIN' ;special:false;keyword:alllanguagemodes;op:NOTOKEN), 499 (str:'BREAK' ;special:false;keyword:[m_none];op:NOTOKEN), 500 (str:'CDECL' ;special:false;keyword:[m_none];op:NOTOKEN), 501 (str:'CLASS' ;special:false;keyword:[m_class];op:NOTOKEN), 502 (str:'CONST' ;special:false;keyword:alllanguagemodes;op:NOTOKEN), 503 (str:'EQUAL' ;special:false;keyword:[m_none];op:NOTOKEN), { delphi operator name } 504 (str:'FAR16' ;special:false;keyword:[m_none];op:NOTOKEN), 505 (str:'FINAL' ;special:false;keyword:[m_none];op:NOTOKEN), 506 (str:'INDEX' ;special:false;keyword:[m_none];op:NOTOKEN), 507 (str:'LABEL' ;special:false;keyword:alllanguagemodes;op:NOTOKEN), 508 (str:'LOCAL' ;special:false;keyword:[m_none];op:NOTOKEN), 509 (str:'RAISE' ;special:false;keyword:[m_except];op:NOTOKEN), 510 (str:'UNTIL' ;special:false;keyword:alllanguagemodes;op:NOTOKEN), 511 (str:'WHILE' ;special:false;keyword:alllanguagemodes;op:NOTOKEN), 512 (str:'WRITE' ;special:false;keyword:[m_none];op:NOTOKEN), 513 (str:'ADDREF' ;special:false;keyword:[m_none];op:NOTOKEN), 514 (str:'CBLOCK' ;special:false;keyword:[m_none];op:NOTOKEN), 515 (str:'DISPID' ;special:false;keyword:[m_none];op:NOTOKEN), 516 (str:'DIVIDE' ;special:false;keyword:[m_none];op:NOTOKEN), { delphi operator name } 517 (str:'DOWNTO' ;special:false;keyword:alllanguagemodes;op:NOTOKEN), 518 (str:'EXCEPT' ;special:false;keyword:[m_except];op:NOTOKEN), 519 (str:'EXPORT' ;special:false;keyword:[m_none];op:NOTOKEN), 520 (str:'HELPER' ;special:false;keyword:[m_none];op:NOTOKEN), 521 (str:'INLINE' ;special:false;keyword:[m_none];op:NOTOKEN), 522 (str:'LEGACY' ;special:false;keyword:[m_none];op:NOTOKEN), { Syscall variation on MorphOS } 523 (str:'NESTED' ;special:false;keyword:[m_none];op:NOTOKEN), 524 (str:'OBJECT' ;special:false;keyword:alllanguagemodes-[m_iso,m_extpas];op:NOTOKEN), 525 (str:'PACKED' ;special:false;keyword:alllanguagemodes;op:NOTOKEN), 526 (str:'PASCAL' ;special:false;keyword:[m_none];op:NOTOKEN), 527 (str:'PUBLIC' ;special:false;keyword:[m_none];op:NOTOKEN), 528 (str:'RECORD' ;special:false;keyword:alllanguagemodes;op:NOTOKEN), 529 (str:'REPEAT' ;special:false;keyword:alllanguagemodes;op:NOTOKEN), 530 (str:'RESULT' ;special:false;keyword:[m_none];op:NOTOKEN), 531 (str:'RETURN' ;special:false;keyword:[m_mac];op:NOTOKEN), 532 (str:'SEALED' ;special:false;keyword:[m_none];op:NOTOKEN), 533 (str:'STATIC' ;special:false;keyword:[m_none];op:NOTOKEN), 534 (str:'STORED' ;special:false;keyword:[m_none];op:NOTOKEN), 535 (str:'STRICT' ;special:false;keyword:[m_none];op:NOTOKEN), 536 (str:'STRING' ;special:false;keyword:alllanguagemodes-[m_iso,m_extpas];op:NOTOKEN), 537 (str:'SYSTEM' ;special:false;keyword:[m_none];op:NOTOKEN), 538 (str:'WINAPI' ;special:false;keyword:[m_none];op:NOTOKEN), 539 (str:'ASMNAME' ;special:false;keyword:[m_none];op:NOTOKEN), 540 (str:'BASEREG' ;special:false;keyword:[m_none];op:NOTOKEN), { Syscall variation on Amiga-likes } 541 (str:'CPPDECL' ;special:false;keyword:[m_none];op:NOTOKEN), 542 (str:'DEFAULT' ;special:false;keyword:[m_none];op:NOTOKEN), 543 (str:'DYNAMIC' ;special:false;keyword:[m_none];op:NOTOKEN), 544 (str:'EXPORTS' ;special:false;keyword:alllanguagemodes-[m_iso,m_extpas];op:NOTOKEN), 545 (str:'FINALLY' ;special:false;keyword:[m_except];op:NOTOKEN), 546 (str:'FORWARD' ;special:false;keyword:[m_none];op:NOTOKEN), 547 (str:'GENERIC' ;special:false;keyword:[m_none];op:NOTOKEN), 548 (str:'IOCHECK' ;special:false;keyword:[m_none];op:NOTOKEN), 549 (str:'LIBRARY' ;special:false;keyword:alllanguagemodes-[m_iso,m_extpas];op:NOTOKEN), 550 (str:'MESSAGE' ;special:false;keyword:[m_none];op:NOTOKEN), 551 (str:'MODULUS' ;special:false;keyword:[m_none];op:NOTOKEN), { delphi operator name } 552 (str:'PACKAGE' ;special:false;keyword:[m_none];op:NOTOKEN), 553 (str:'PRIVATE' ;special:false;keyword:[m_none];op:NOTOKEN), 554 (str:'PROGRAM' ;special:false;keyword:alllanguagemodes;op:NOTOKEN), 555 (str:'R12BASE' ;special:false;keyword:[m_none];op:NOTOKEN), { Syscall variation on MorphOS } 556 (str:'RTLPROC' ;special:false;keyword:[m_none];op:NOTOKEN), 557 (str:'SECTION' ;special:false;keyword:[m_none];op:NOTOKEN), 558 (str:'STDCALL' ;special:false;keyword:[m_none];op:NOTOKEN), 559 (str:'SYSCALL' ;special:false;keyword:[m_none];op:NOTOKEN), 560 (str:'VARARGS' ;special:false;keyword:[m_none];op:NOTOKEN), 561 (str:'VIRTUAL' ;special:false;keyword:[m_none];op:NOTOKEN), 562 (str:'ABSOLUTE' ;special:false;keyword:[m_none];op:NOTOKEN), 563 (str:'ABSTRACT' ;special:false;keyword:[m_none];op:NOTOKEN), 564 (str:'BASELAST' ;special:false;keyword:[m_none];op:NOTOKEN), { Syscall variation on Amiga-likes } 565 (str:'BASENONE' ;special:false;keyword:[m_none];op:NOTOKEN), { Syscall variation on Amiga-likes } 566 (str:'BASESYSV' ;special:false;keyword:[m_none];op:NOTOKEN), { Syscall variation on MorphOS } 567 (str:'CONSTREF' ;special:false;keyword:[m_none];op:NOTOKEN), 568 (str:'CONTAINS' ;special:false;keyword:[m_none];op:NOTOKEN), 569 (str:'CONTINUE' ;special:false;keyword:[m_none];op:NOTOKEN), 570 (str:'CPPCLASS' ;special:false;keyword:[m_fpc];op:NOTOKEN), 571 (str:'EXPLICIT' ;special:false;keyword:[m_none];op:NOTOKEN), { delphi operator name } 572 (str:'EXTERNAL' ;special:false;keyword:[m_none];op:NOTOKEN), 573 (str:'FINALIZE' ;special:false;keyword:[m_none];op:NOTOKEN), 574 (str:'FUNCTION' ;special:false;keyword:alllanguagemodes;op:NOTOKEN), 575 (str:'IMPLICIT' ;special:false;keyword:[m_none];op:NOTOKEN), { delphi operator name } 576 (str:'LESSTHAN' ;special:false;keyword:[m_none];op:NOTOKEN), { delphi operator name } 577 (str:'LOCATION' ;special:false;keyword:[m_none];op:NOTOKEN), 578 (str:'MULTIPLY' ;special:false;keyword:[m_none];op:NOTOKEN), { delphi operator name } 579 (str:'MWPASCAL' ;special:false;keyword:[m_none];op:NOTOKEN), 580 (str:'NEGATIVE' ;special:false;keyword:[m_none];op:NOTOKEN), { delphi operator name } 581 (str:'NORETURN' ;special:false;keyword:[m_none];op:NOTOKEN), 582 (str:'NOTEQUAL' ;special:false;keyword:[m_none];op:NOTOKEN), { delphi operator name } 583 (str:'OPERATOR' ;special:false;keyword:[m_fpc];op:NOTOKEN), 584 (str:'OPTIONAL' ;special:false;keyword:[m_none];op:NOTOKEN), { optional methods in an Objective-C protocol } 585 (str:'OVERLOAD' ;special:false;keyword:[m_none];op:NOTOKEN), 586 (str:'OVERRIDE' ;special:false;keyword:[m_none];op:NOTOKEN), 587 (str:'PLATFORM' ;special:false;keyword:[m_none];op:NOTOKEN), 588 (str:'POSITIVE' ;special:false;keyword:[m_none];op:NOTOKEN), { delphi operator name } 589 (str:'PROPERTY' ;special:false;keyword:[m_property];op:NOTOKEN), 590 (str:'READONLY' ;special:false;keyword:[m_none];op:NOTOKEN), 591 (str:'REGISTER' ;special:false;keyword:[m_none];op:NOTOKEN), 592 (str:'REQUIRED' ;special:false;keyword:[m_none];op:NOTOKEN), { required methods in an Objective-C protocol } 593 (str:'REQUIRES' ;special:false;keyword:[m_none];op:NOTOKEN), 594 (str:'RESIDENT' ;special:false;keyword:[m_none];op:NOTOKEN), 595 (str:'SAFECALL' ;special:false;keyword:[m_none];op:NOTOKEN), 596 (str:'SUBTRACT' ;special:false;keyword:[m_none];op:NOTOKEN), { delphi operator name } 597 (str:'SYSVBASE' ;special:false;keyword:[m_none];op:NOTOKEN), { Syscall variation on MorphOS } 598 (str:'ASSEMBLER' ;special:false;keyword:[m_none];op:NOTOKEN), 599 (str:'BASEFIRST' ;special:false;keyword:[m_none];op:NOTOKEN), { Syscall variation on Amiga-likes } 600 (str:'BITPACKED' ;special:false;keyword:alllanguagemodes-[m_iso,m_extpas];op:NOTOKEN), 601 (str:'BITWISEOR' ;special:false;keyword:[m_none];op:NOTOKEN), { delphi operator name } 602 (str:'HARDFLOAT' ;special:false;keyword:[m_none];op:NOTOKEN), 603 (str:'INHERITED' ;special:false;keyword:alllanguagemodes-[m_iso,m_extpas];op:NOTOKEN), 604 (str:'INTDIVIDE' ;special:false;keyword:[m_none];op:NOTOKEN), { delphi operator name } 605 (str:'INTERFACE' ;special:false;keyword:alllanguagemodes-[m_iso,m_extpas];op:NOTOKEN), 606 (str:'INTERRUPT' ;special:false;keyword:[m_none];op:NOTOKEN), 607 (str:'LEFTSHIFT' ;special:false;keyword:[m_none];op:NOTOKEN), { delphi operator name } 608 (str:'LOGICALOR' ;special:false;keyword:[m_none];op:NOTOKEN), { delphi operator name } 609 (str:'NODEFAULT' ;special:false;keyword:[m_none];op:NOTOKEN), 610 (str:'OBJCCLASS' ;special:false;keyword:[m_objectivec1];op:NOTOKEN), 611 (str:'OTHERWISE' ;special:false;keyword:alllanguagemodes-[m_iso];op:NOTOKEN), 612 (str:'PROCEDURE' ;special:false;keyword:alllanguagemodes;op:NOTOKEN), 613 (str:'PROTECTED' ;special:false;keyword:[m_none];op:NOTOKEN), 614 (str:'PUBLISHED' ;special:false;keyword:[m_none];op:NOTOKEN), 615 (str:'REFERENCE' ;special:false;keyword:[m_none];op:NOTOKEN), 616 (str:'SOFTFLOAT' ;special:false;keyword:[m_none];op:NOTOKEN), 617 (str:'THREADVAR' ;special:false;keyword:alllanguagemodes-[m_iso,m_extpas];op:NOTOKEN), 618 (str:'WRITEONLY' ;special:false;keyword:[m_none];op:NOTOKEN), 619 (str:'BITWISEAND' ;special:false;keyword:[m_none];op:NOTOKEN), { delphi operator name } 620 (str:'BITWISEXOR' ;special:false;keyword:[m_none];op:NOTOKEN), { delphi operator name } 621 (str:'DEPRECATED' ;special:false;keyword:[m_none];op:NOTOKEN), 622 (str:'DESTRUCTOR' ;special:false;keyword:alllanguagemodes-[m_iso,m_extpas];op:NOTOKEN), 623 (str:'ENUMERATOR' ;special:false;keyword:[m_none];op:_OP_ENUMERATOR), 624 (str:'IMPLEMENTS' ;special:false;keyword:[m_none];op:NOTOKEN), 625 (str:'INITIALIZE' ;special:false;keyword:[m_none];op:NOTOKEN), 626 (str:'INTERNPROC' ;special:false;keyword:[m_none];op:NOTOKEN), 627 (str:'LOGICALAND' ;special:false;keyword:[m_none];op:NOTOKEN), { delphi operator name } 628 (str:'LOGICALNOT' ;special:false;keyword:[m_none];op:NOTOKEN), { delphi operator name } 629 (str:'LOGICALXOR' ;special:false;keyword:[m_none];op:NOTOKEN), { delphi operator name } 630 (str:'OLDFPCCALL' ;special:false;keyword:[m_none];op:NOTOKEN), 631 (str:'OPENSTRING' ;special:false;keyword:[m_none];op:NOTOKEN), 632 (str:'RIGHTSHIFT' ;special:false;keyword:[m_none];op:NOTOKEN), { delphi operator name } 633 (str:'SPECIALIZE' ;special:false;keyword:[m_none];op:NOTOKEN), 634 (str:'VECTORCALL' ;special:false;keyword:[m_none];op:NOTOKEN), 635 (str:'CONSTRUCTOR' ;special:false;keyword:alllanguagemodes-[m_iso,m_extpas];op:NOTOKEN), 636 (str:'GREATERTHAN' ;special:false;keyword:[m_none];op:NOTOKEN), { delphi operator name } 637 (str:'INTERNCONST' ;special:false;keyword:[m_none];op:NOTOKEN), 638 (str:'REINTRODUCE' ;special:false;keyword:[m_none];op:NOTOKEN), 639 (str:'SHORTSTRING' ;special:false;keyword:[m_none];op:NOTOKEN), 640 (str:'COMPILERPROC' ;special:false;keyword:[m_none];op:NOTOKEN), 641 (str:'EXPERIMENTAL' ;special:false;keyword:[m_none];op:NOTOKEN), 642 (str:'FINALIZATION' ;special:false;keyword:[m_initfinal];op:NOTOKEN), 643 (str:'MS_ABI_CDECL' ;special:false;keyword:[m_none];op:NOTOKEN), 644 (str:'NOSTACKFRAME' ;special:false;keyword:[m_none];op:NOTOKEN), 645 (str:'OBJCCATEGORY' ;special:false;keyword:[m_objectivec1];op:NOTOKEN), { Objective-C category } 646 (str:'OBJCPROTOCOL' ;special:false;keyword:[m_objectivec1];op:NOTOKEN), { Objective-C protocol } 647 (str:'WEAKEXTERNAL' ;special:false;keyword:[m_none];op:NOTOKEN), 648 (str:'DISPINTERFACE' ;special:false;keyword:[m_class];op:NOTOKEN), 649 (str:'UNIMPLEMENTED' ;special:false;keyword:[m_none];op:NOTOKEN), 650 (str:'IMPLEMENTATION';special:false;keyword:alllanguagemodes-[m_iso,m_extpas];op:NOTOKEN), 651 (str:'INITIALIZATION';special:false;keyword:[m_initfinal];op:NOTOKEN), 652 (str:'MS_ABI_DEFAULT';special:false;keyword:[m_none];op:NOTOKEN), 653 (str:'RESOURCESTRING';special:false;keyword:alllanguagemodes-[m_iso,m_extpas];op:NOTOKEN), 654 (str:'SYSV_ABI_CDECL';special:false;keyword:[m_none];op:NOTOKEN), 655 (str:'LESSTHANOREQUAL';special:false;keyword:[m_none];op:NOTOKEN), { delphi operator name } 656 (str:'SYSV_ABI_DEFAULT';special:false;keyword:[m_none];op:NOTOKEN), 657 (str:'GREATERTHANOREQUAL';special:false;keyword:[m_none];op:NOTOKEN) { delphi operator name } 658 ); 659 660 661 {$ifdef jvm} 662 { reserved JVM tokens: keywords, true/false, and "null"; the commented out 663 ones are also Pascal keywords in all modes } 664 njvmtokens = 40; 665 jvmreservedwords: array[1..njvmtokens] of string[12] = 666 ( 667 // 'DO', 668 // 'IF', 669 // 'FOR', 670 'INT', 671 'NEW', 672 'TRY', 673 'BYTE', 674 // 'CASE', 675 'CHAR', 676 // 'ELSE', 677 // 'GOTO', 678 'LONG', 679 'NULL', 680 'THIS', 681 'VOID', 682 'BREAK', 683 'CATCH', 684 'CLASS', 685 // 'CONST', 686 'FINAL', 687 'FLOAT', 688 'SHORT', 689 'SUPER', 690 'THROW', 691 // 'WHILE', 692 'DOUBLE', 693 'IMPORT', 694 'NATIVE', 695 'PUBLIC', 696 'RETURN', 697 'STATIC', 698 'SWITCH', 699 'THROWS', 700 'BOOLEAN', 701 'DEFAULT', 702 'EXTENDS', 703 'FINALLY', 704 'PACKAGE', 705 'PRIVATE', 706 'ABSTRACT', 707 'CONTINUE', 708 'STRICTFP', 709 'VOLATILE', 710 // 'INTERFACE', 711 'PROTECTED', 712 'TRANSIENT', 713 'IMPLEMENTS', 714 'INSTANCEOF', 715 'SYNCHRONIZED' 716 ); 717 718 jvmtokenlenmin = 3; 719 jvmtokenlenmax = 12; 720 721 type 722 tjvmtokenidxrec = record 723 first, last: longint; 724 end; 725 tjmvtokenarray=array[1..njvmtokens] of string[12]; 726 pjvmtokenidx= ^tjvmtokenidx; 727 tjvmtokenidx=array[jvmtokenlenmin..jvmtokenlenmax] of tjvmtokenidxrec; 728 {$endif jvm} 729 730 var 731 tokeninfo:ptokenarray; 732 tokenidx:ptokenidx; 733 {$ifdef jvm} 734 jvmtokenidx: pjvmtokenidx; 735 {$endif jvm} 736 737 738 procedure inittokens; 739 procedure donetokens; 740 procedure create_tokenidx; 741 742 743 implementation 744 745 procedure create_tokenidx; 746 { create an index with the first and last token for every possible token 747 length, so a search only will be done in that small part } 748 var 749 t : ttoken; 750 i : longint; 751 c : char; 752 {$ifdef jvm} 753 j : longint; 754 {$endif jvm} 755 begin 756 fillchar(tokenidx^,sizeof(tokenidx^),0); 757 for t:=low(ttoken) to high(ttoken) do 758 begin 759 if not arraytokeninfo[t].special then 760 begin 761 i:=length(arraytokeninfo[t].str); 762 c:=arraytokeninfo[t].str[1]; 763 if ord(tokenidx^[i,c].first)=0 then 764 tokenidx^[i,c].first:=t; 765 tokenidx^[i,c].last:=t; 766 end; 767 end; 768 {$ifdef jvm} 769 fillchar(jvmtokenidx^,sizeof(jvmtokenidx^),0); 770 for j:=low(jvmreservedwords) to high(jvmreservedwords) do 771 begin 772 i:=length(jvmreservedwords[j]); 773 if jvmtokenidx^[i].first=0 then 774 jvmtokenidx^[i].first:=j; 775 jvmtokenidx^[i].last:=j; 776 end; 777 {$endif jvm} 778 end; 779 780 781 procedure inittokens; 782 begin 783 if tokenidx = nil then 784 begin 785 tokeninfo:=@arraytokeninfo; 786 new(tokenidx); 787 {$ifdef jvm} 788 new(jvmtokenidx); 789 {$endif jvm} 790 create_tokenidx; 791 end; 792 end; 793 794 795 procedure donetokens; 796 begin 797 if tokenidx <> nil then 798 begin 799 tokeninfo:=nil; 800 dispose(tokenidx); 801 tokenidx:=nil; 802 {$ifdef jvm} 803 dispose(jvmtokenidx); 804 jvmtokenidx:=nil; 805 {$endif jvm} 806 end; 807 end; 808 809 end. 810