summaryrefslogtreecommitdiff
path: root/compiler/tokens.pas
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/tokens.pas')
-rw-r--r--compiler/tokens.pas538
1 files changed, 538 insertions, 0 deletions
diff --git a/compiler/tokens.pas b/compiler/tokens.pas
new file mode 100644
index 0000000000..53c8f69f2f
--- /dev/null
+++ b/compiler/tokens.pas
@@ -0,0 +1,538 @@
+{
+ Copyright (c) 1998-2002 by Florian Klaempfl, Pierre Muller
+
+ Tokens used by the compiler
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ ****************************************************************************
+}
+unit tokens;
+
+{$i fpcdefs.inc}
+
+interface
+
+uses
+ globtype;
+
+type
+ ttoken=(NOTOKEN,
+ { operators, which can also be overloaded }
+ _PLUS,
+ _MINUS,
+ _STAR,
+ _SLASH,
+ _EQUAL,
+ _GT,
+ _LT,
+ _GTE,
+ _LTE,
+ _SYMDIF,
+ _STARSTAR,
+ _OP_AS,
+ _OP_IN,
+ _OP_IS,
+ _OP_OR,
+ _OP_AND,
+ _OP_DIV,
+ _OP_MOD,
+ _OP_NOT,
+ _OP_SHL,
+ _OP_SHR,
+ _OP_XOR,
+ _ASSIGNMENT,
+ { special chars }
+ _CARET,
+ _UNEQUAL,
+ _LECKKLAMMER,
+ _RECKKLAMMER,
+ _POINT,
+ _COMMA,
+ _LKLAMMER,
+ _RKLAMMER,
+ _COLON,
+ _SEMICOLON,
+ _KLAMMERAFFE,
+ _POINTPOINT,
+ _POINTPOINTPOINT,
+ _PIPE,
+ _AMPERSAND,
+ _EOF,
+ _ID,
+ _NOID,
+ _REALNUMBER,
+ _INTCONST,
+ _CSTRING,
+ _CCHAR,
+ _CWSTRING,
+ _CWCHAR,
+ { C like operators }
+ _PLUSASN,
+ _MINUSASN,
+ _ANDASN,
+ _ORASN,
+ _STARASN,
+ _SLASHASN,
+ _MODASN,
+ _DIVASN,
+ _NOTASN,
+ _XORASN,
+ { Normal words -- ATTENTION: These words must be sorted: }
+ { first in length order, then in alphabetical order. }
+ _C,
+ _AS,
+ _AT,
+ _DO,
+ _IF,
+ _IN,
+ _IS,
+ _OF,
+ _ON,
+ _OR,
+ _TO,
+ _AND,
+ _ASM,
+ _DIV,
+ _END,
+ _FAR,
+ _FOR,
+ _MOD,
+ _NIL,
+ _NOT,
+ _OUT,
+ _SET,
+ _SHL,
+ _SHR,
+ _TRY,
+ _VAR,
+ _XOR,
+ _CASE,
+ _CVAR,
+ _ELSE,
+ _EXIT,
+ _FAIL,
+ _FILE,
+ _GOTO,
+ _NAME,
+ _NEAR,
+ _READ,
+ _SELF,
+ _SYSV,
+ _THEN,
+ _TRUE,
+ _TYPE,
+ _UNIT,
+ _UNIV,
+ _USES,
+ _WITH,
+ _ALIAS,
+ _ARRAY,
+ _BEGIN,
+ _BREAK,
+ _CDECL,
+ _CLASS,
+ _CONST,
+ _FALSE,
+ _FAR16,
+ _INDEX,
+ _LABEL,
+ _RAISE,
+ _UNTIL,
+ _WHILE,
+ _WRITE,
+ _DISPID,
+ _DOWNTO,
+ _EXCEPT,
+ _EXPORT,
+ _INLINE,
+ _LEGACY,
+ _OBJECT,
+ _PACKED,
+ _PASCAL,
+ _PUBLIC,
+ _RECORD,
+ _REPEAT,
+ _RESULT,
+ _STATIC,
+ _STORED,
+ _STRICT,
+ _STRING,
+ _SYSTEM,
+ _ASMNAME,
+ _CPPDECL,
+ _DEFAULT,
+ _DYNAMIC,
+ _EXPORTS,
+ _FINALLY,
+ _FORWARD,
+ _IOCHECK,
+ _LIBRARY,
+ _MESSAGE,
+ _PACKAGE,
+ _PRIVATE,
+ _PROGRAM,
+ _R12BASE,
+ _STDCALL,
+ _SYSCALL,
+ _VARARGS,
+ _VIRTUAL,
+ _ABSOLUTE,
+ _ABSTRACT,
+ _BASESYSV,
+ _CONTAINS,
+ _CONTINUE,
+ _CPPCLASS,
+ _EXTERNAL,
+ _FUNCTION,
+ _LOCATION,
+ _MWPASCAL,
+ _OPERATOR,
+ _OVERLOAD,
+ _OVERRIDE,
+ _PLATFORM,
+ _PROPERTY,
+ _REGISTER,
+ _REQUIRES,
+ _RESIDENT,
+ _SAFECALL,
+ _SYSVBASE,
+ _ASSEMBLER,
+ _INHERITED,
+ _INTERFACE,
+ _INTERRUPT,
+ _NODEFAULT,
+ _OTHERWISE,
+ _PROCEDURE,
+ _PROTECTED,
+ _PUBLISHED,
+ _SOFTFLOAT,
+ _THREADVAR,
+ _DEPRECATED,
+ _DESTRUCTOR,
+ _IMPLEMENTS,
+ _INTERNPROC,
+ _OLDFPCCALL,
+ _OPENSTRING,
+ _CONSTRUCTOR,
+ _INTERNCONST,
+ _REINTRODUCE,
+ _SHORTSTRING,
+ _COMPILERPROC,
+ _FINALIZATION,
+ _NOSTACKFRAME,
+ _DISPINTERFACE,
+ _UNIMPLEMENTED,
+ _IMPLEMENTATION,
+ _INITIALIZATION,
+ _RESOURCESTRING
+ );
+
+const
+ tokenlenmin = 1;
+ tokenlenmax = 14;
+
+ { last operator which can be overloaded, the first_overloaded should
+ be declared directly after NOTOKEN }
+ first_overloaded = succ(NOTOKEN);
+ last_overloaded = _ASSIGNMENT;
+
+type
+ tokenrec=record
+ str : string[tokenlenmax];
+ special : boolean;
+ keyword : tmodeswitch;
+ op : ttoken;
+ end;
+
+ ttokenarray=array[ttoken] of tokenrec;
+ ptokenarray=^ttokenarray;
+
+ tokenidxrec=record
+ first,last : ttoken;
+ end;
+
+ ptokenidx=^ttokenidx;
+ ttokenidx=array[tokenlenmin..tokenlenmax,'A'..'Z'] of tokenidxrec;
+
+const
+ arraytokeninfo : ttokenarray =(
+ (str:'' ;special:true ;keyword:m_none;op:NOTOKEN),
+ { Operators which can be overloaded }
+ (str:'+' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'-' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'*' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'/' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'=' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'>' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'<' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'>=' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'<=' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'><' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'**' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'as' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'in' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'is' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'or' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'and' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'div' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'mod' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'not' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'shl' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'shr' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'xor' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:':=' ;special:true ;keyword:m_none;op:NOTOKEN),
+ { Special chars }
+ (str:'^' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'<>' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'[' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:']' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'.' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:',' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'(' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:')' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:':' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:';' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'@' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'..' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'...' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'|' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'&' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'end of file' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'identifier' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'non identifier';special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'const real' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'ordinal const' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'const string' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'const char' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'const wstring' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'const wchar' ;special:true ;keyword:m_none;op:NOTOKEN),
+ { C like operators }
+ (str:'+=' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'-=' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'&=' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'|=' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'*=' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'/=' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'' ;special:true ;keyword:m_none;op:NOTOKEN),
+ (str:'' ;special:true ;keyword:m_none;op:NOTOKEN),
+ { Normal words -- ATTENTION: These words must be sorted: }
+ { first in length order, then in alphabetical order. }
+ (str:'C' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'AS' ;special:false;keyword:m_class;op:_OP_AS),
+ (str:'AT' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'DO' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'IF' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'IN' ;special:false;keyword:m_all;op:_OP_IN),
+ (str:'IS' ;special:false;keyword:m_class;op:_OP_IS),
+ (str:'OF' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'ON' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'OR' ;special:false;keyword:m_all;op:_OP_OR),
+ (str:'TO' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'AND' ;special:false;keyword:m_all;op:_OP_AND),
+ (str:'ASM' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'DIV' ;special:false;keyword:m_all;op:_OP_DIV),
+ (str:'END' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'FAR' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'FOR' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'MOD' ;special:false;keyword:m_all;op:_OP_MOD),
+ (str:'NIL' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'NOT' ;special:false;keyword:m_all;op:_OP_NOT),
+ (str:'OUT' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'SET' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'SHL' ;special:false;keyword:m_all;op:_OP_SHL),
+ (str:'SHR' ;special:false;keyword:m_all;op:_OP_SHR),
+ (str:'TRY' ;special:false;keyword:m_class;op:NOTOKEN),
+ (str:'VAR' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'XOR' ;special:false;keyword:m_all;op:_OP_XOR),
+ (str:'CASE' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'CVAR' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'ELSE' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'EXIT' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'FAIL' ;special:false;keyword:m_none;op:NOTOKEN), { only set within constructors PM }
+ (str:'FILE' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'GOTO' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'NAME' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'NEAR' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'READ' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'SELF' ;special:false;keyword:m_none;op:NOTOKEN), {set inside methods only PM }
+ (str:'SYSV' ;special:false;keyword:m_none;op:NOTOKEN), { Syscall variation on MorphOS }
+ (str:'THEN' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'TRUE' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'TYPE' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'UNIT' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'UNIV' ;special:false;keyword:m_mac;op:NOTOKEN),
+ (str:'USES' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'WITH' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'ALIAS' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'ARRAY' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'BEGIN' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'BREAK' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'CDECL' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'CLASS' ;special:false;keyword:m_class;op:NOTOKEN),
+ (str:'CONST' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'FALSE' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'FAR16' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'INDEX' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'LABEL' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'RAISE' ;special:false;keyword:m_class;op:NOTOKEN),
+ (str:'UNTIL' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'WHILE' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'WRITE' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'DISPID' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'DOWNTO' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'EXCEPT' ;special:false;keyword:m_class;op:NOTOKEN),
+ (str:'EXPORT' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'INLINE' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'LEGACY' ;special:false;keyword:m_none;op:NOTOKEN), { Syscall variation on MorphOS }
+ (str:'OBJECT' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'PACKED' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'PASCAL' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'PUBLIC' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'RECORD' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'REPEAT' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'RESULT' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'STATIC' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'STORED' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'STRICT' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'STRING' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'SYSTEM' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'ASMNAME' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'CPPDECL' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'DEFAULT' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'DYNAMIC' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'EXPORTS' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'FINALLY' ;special:false;keyword:m_class;op:NOTOKEN),
+ (str:'FORWARD' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'IOCHECK' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'LIBRARY' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'MESSAGE' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'PACKAGE' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'PRIVATE' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'PROGRAM' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'R12BASE' ;special:false;keyword:m_none;op:NOTOKEN), { Syscall variation on MorphOS }
+ (str:'STDCALL' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'SYSCALL' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'VARARGS' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'VIRTUAL' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'ABSOLUTE' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'ABSTRACT' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'BASESYSV' ;special:false;keyword:m_none;op:NOTOKEN), { Syscall variation on MorphOS }
+ (str:'CONTAINS' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'CONTINUE' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'CPPCLASS' ;special:false;keyword:m_fpc;op:NOTOKEN),
+ (str:'EXTERNAL' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'FUNCTION' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'LOCATION' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'MWPASCAL' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'OPERATOR' ;special:false;keyword:m_fpc;op:NOTOKEN),
+ (str:'OVERLOAD' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'OVERRIDE' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'PLATFORM' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'PROPERTY' ;special:false;keyword:m_class;op:NOTOKEN),
+ (str:'REGISTER' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'REQUIRES' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'RESIDENT' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'SAFECALL' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'SYSVBASE' ;special:false;keyword:m_none;op:NOTOKEN), { Syscall variation on MorphOS }
+ (str:'ASSEMBLER' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'INHERITED' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'INTERFACE' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'INTERRUPT' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'NODEFAULT' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'OTHERWISE' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'PROCEDURE' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'PROTECTED' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'PUBLISHED' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'SOFTFLOAT' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'THREADVAR' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'DEPRECATED' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'DESTRUCTOR' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'IMPLEMENTS' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'INTERNPROC' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'OLDFPCCALL' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'OPENSTRING' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'CONSTRUCTOR' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'INTERNCONST' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'REINTRODUCE' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'SHORTSTRING' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'COMPILERPROC' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'FINALIZATION' ;special:false;keyword:m_initfinal;op:NOTOKEN),
+ (str:'NOSTACKFRAME' ;special:false;keyword:m_none;op:NOTOKEN),
+ (str:'DISPINTERFACE' ;special:false;keyword:m_class;op:NOTOKEN),
+ (str:'UNIMPLEMENTED' ;special:false;keyword:m_all;op:NOTOKEN),
+ (str:'IMPLEMENTATION';special:false;keyword:m_all;op:NOTOKEN),
+ (str:'INITIALIZATION';special:false;keyword:m_initfinal;op:NOTOKEN),
+ (str:'RESOURCESTRING';special:false;keyword:m_class;op:NOTOKEN)
+ );
+
+
+var
+ tokeninfo:ptokenarray;
+ tokenidx:ptokenidx;
+
+procedure inittokens;
+procedure donetokens;
+procedure create_tokenidx;
+
+
+implementation
+
+procedure create_tokenidx;
+{ create an index with the first and last token for every possible token
+ length, so a search only will be done in that small part }
+var
+ t : ttoken;
+ i : longint;
+ c : char;
+begin
+ fillchar(tokenidx^,sizeof(tokenidx^),0);
+ for t:=low(ttoken) to high(ttoken) do
+ begin
+ if not arraytokeninfo[t].special then
+ begin
+ i:=length(arraytokeninfo[t].str);
+ c:=arraytokeninfo[t].str[1];
+ if ord(tokenidx^[i,c].first)=0 then
+ tokenidx^[i,c].first:=t;
+ tokenidx^[i,c].last:=t;
+ end;
+ end;
+end;
+
+
+procedure inittokens;
+begin
+ if tokenidx = nil then
+ begin
+ tokeninfo:=@arraytokeninfo;
+ new(tokenidx);
+ create_tokenidx;
+ end;
+end;
+
+
+procedure donetokens;
+begin
+ if tokenidx <> nil then
+ begin
+ tokeninfo:=nil;
+ dispose(tokenidx);
+ tokenidx:=nil;
+ end;
+end;
+
+end.