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